45 std::shared_ptr<Output::OutputWriter> writer,
46 std::shared_ptr<MathLoggerDriver> mathLoggerDriver);
48 void set_solver_log_file(
const std::filesystem::path& log_file);
50 [[nodiscard]] std::filesystem::path solver_log_file()
const
52 return solver_log_file_;
55 double execution_time()
const;
56 virtual std::string BendersName()
const = 0;
59 WorkerMasterDataVect AllCuts()
const;
62 LogData GetBestIterationData()
const;
64 int MasterRowIndex(
const std::string& row_name)
const;
65 void MasterChangeRhs(
int id_row,
double val)
const;
67 void MasterGetRhs(
double& rhs,
int id_row)
const;
69 const VariableMap& MasterVariables()
const
71 return master_variable_map_;
74 std::vector<double> MasterObjectiveFunctionCoeffs()
const;
75 void MasterRowsCoeffs(std::vector<int>& mstart,
76 std::vector<int>& mclind,
77 std::vector<double>& dmatval,
79 std::vector<int>& nels,
82 int MasterGetNElems()
const;
83 void MasterAddRows(
const std::vector<char>& qrtype_p,
84 const std::vector<double>& rhs_p,
85 const std::vector<double>& range_p,
86 const std::vector<int>& mstart_p,
87 const std::vector<int>& mclind_p,
88 const std::vector<double>& dmatval_p,
89 const std::vector<std::string>& row_names = {})
const;
90 void MasterGetRowType(std::vector<char>& qrtype,
int first,
int last)
const;
91 void ResetMasterFromLastIteration();
92 std::filesystem::path LastMasterPath()
const;
93 bool MasterIsEmpty()
const;
95 void DoFreeProblems(
bool free_problems)
97 free_problems_ = free_problems;
100 int MasterGetnrows()
const;
101 int MasterGetncols()
const;
103 void SetMasterObjectiveFunctionCoeffsToZeros()
const;
104 void SetMasterObjectiveFunction(
const double* coeffs,
int first,
int last)
const;
105 virtual void InitializeProblems() = 0;
107 void SetMaxIteration(
int max_iteration)
109 _options.MAX_ITERATIONS = max_iteration;
117 virtual void free() = 0;
119 int GetBendersRunNumber()
const
121 return _data.criteria_current_iteration_data.benders_num_run;
128 std::vector<double> GetOuterLoopCriterionAtBestBenders()
const;
130 void init_data(
double external_loop_lambda,
131 double external_loop_lambda_min,
132 double external_loop_lambda_max);
134 void SaveOuterLoopSolutionInOutputFile()
const;
135 void SaveCurrentOuterLoopIterationInOutputFile()
const;
136 void SetBilevelBestub(
double bilevel_best_ub);
137 void UpdateOuterLoopSolution();
139 bool isExceptionRaised()
const;
140 void UpdateOverallCosts();
142 std::shared_ptr<Output::OutputWriter> _writer;
143 std::shared_ptr<MathLoggerDriver> mathLoggerDriver_;
144 void setCriterionComputationInputs(
148 bool exception_raised_ =
false;
150 WorkerMasterDataVect workerMasterDataVect_;
153 VariableMap master_variable_map_;
154 CouplingMap coupling_map_;
156 bool init_data_ =
true;
157 bool init_problems_ =
true;
158 bool free_problems_ =
true;
160 std::vector<std::vector<double>> criteria_vector_for_each_iteration_;
161 bool is_bilevel_check_all_ =
false;
163 virtual void Run() = 0;
165 bool ShouldBendersStop();
166 bool is_initial_relaxation_requested()
const;
167 bool SwitchToIntegerMaster(
bool is_relaxed)
const;
169 virtual void ComputeXCut();
170 void ComputeInvestCost();
171 virtual void compute_ub();
174 virtual void post_run_actions()
const;
175 void BuildCutFull(
const SubProblemDataMap& subproblem_data_map);
176 virtual void DeactivateIntegrityConstraints()
const;
177 virtual void ActivateIntegrityConstraints()
const;
178 virtual void SetDataPreRelaxation();
179 virtual void ResetDataPostRelaxation();
180 [[nodiscard]] std::filesystem::path
GetSubproblemPath(
const std::string& subproblem_name)
const;
181 [[nodiscard]]
double SubproblemWeight(
int subproblem_count,
const std::string& name)
const;
183 [[nodiscard]] std::filesystem::path get_structure_path()
const;
186 template<
typename T,
typename... Args>
187 void reset_master(Args&&... args)
189 _master = std::make_shared<T>(std::forward<Args>(args)...);
190 master_is_empty_ =
false;
194 void free_subproblems();
195 void AddSubproblem(
const std::pair<std::string, VariableMap>& kvp);
196 [[nodiscard]]
virtual WorkerMasterPtr get_master()
const;
197 void MatchProblemToId();
198 void AddSubproblemName(
const std::string& name);
199 [[nodiscard]] std::string get_master_name()
const;
200 [[nodiscard]] std::string get_solver_name()
const;
201 [[nodiscard]]
int get_log_level()
const;
202 [[nodiscard]]
bool is_trace()
const;
203 [[nodiscard]] Point get_x_cut()
const;
204 void set_x_cut(
const Point& x0);
205 [[nodiscard]] Point get_x_out()
const;
206 void set_x_out(
const Point& x0);
207 [[nodiscard]]
double GetSubproblemCost()
const;
208 void SetSubproblemCost(
const double& subproblem_cost);
209 bool IsResumeMode()
const;
211 std::filesystem::path LastIterationFile()
const
213 return std::filesystem::path(_options.LAST_ITERATION_JSON_FILE);
216 void UpdateMaxNumberIterationResumeMode(
int nb_iteration_done);
217 void SaveCurrentIterationInOutputFile()
const;
218 void SaveSolutionInOutputFile()
const;
219 void PrintCurrentIterationCsv();
222 void ChecksResumeMode();
223 virtual void SaveCurrentBendersData();
224 void ClearCurrentIterationCutTrace();
225 virtual void EndWritingInOutputFile()
const;
227 [[nodiscard]]
int GetNumIterationsBeforeRestart()
const
229 return iterations_before_resume;
232 double GetBendersTime()
const;
233 virtual void write_basis()
const;
236 SubproblemsMapPtr GetSubProblemMap()
const
238 return subproblem_map;
241 StrVector GetSubProblemNames()
const
246 double AbsoluteGap()
const
248 return _options.ABSOLUTE_GAP;
251 double RelativeGap()
const
253 return _options.RELATIVE_GAP;
256 double RelaxedGap()
const
258 return _options.RELAXED_GAP;
261 DblVector GetAlpha_i()
const
263 return _data.single_subpb_costs_under_approx;
266 void SetAlpha_i(
const DblVector& single_subpb_costs_under_approx)
268 _data.single_subpb_costs_under_approx = single_subpb_costs_under_approx;
271 int ProblemToId(
const std::string& problem_name)
const
273 return _problem_to_id.at(problem_name);
279 int GetNumOfSubProblemsSolvedBeforeResume()
281 return cumulative_number_of_subproblem_resolved_before_resume;
285 void ResetSimplexIterationsBounds();
287 SubproblemsMapPtr subproblem_map;
291 const std::string& name,
292 const std::shared_ptr<SubproblemWorker>& worker);
310 void print_master_and_cut(std::ostream& file,
314 void print_master_csv(std::ostream& stream,
316 const Point& xopt)
const;
317 void check_status(
const SubProblemDataMap& subproblem_data_map)
const;
318 [[nodiscard]]
LogData build_log_data_from_data()
const;
321 [[nodiscard]] std::string status_from_criterion()
const;
322 void compute_cut_aggregate(
const SubProblemDataMap& subproblem_data_map);
323 void compute_cut(
const SubProblemDataMap& subproblem_data_map);
324 [[nodiscard]] std::map<std::string, int> get_master_variable_map(
325 const std::map<std::string, std::map<std::string, int>>& input_map)
const;
326 [[nodiscard]]
virtual bool shouldParallelize()
const = 0;
330 bool master_is_empty_ =
true;
332 int _totalNbProblems = 0;
333 std::filesystem::path solver_log_file_ =
"";
334 WorkerMasterPtr _master;
335 VariableMap _problem_to_id;
336 StrVector subproblems;
337 std::ofstream _csv_file;
338 std::filesystem::path _csv_file_path;
340 int iterations_before_resume = 0;
341 int cumulative_number_of_subproblem_resolved_before_resume = 0;