45 std::shared_ptr<Output::OutputWriter> writer,
46 std::shared_ptr<MathLoggerDriver> mathLoggerDriver,
47 std::shared_ptr<ICommunicationStrategy> communication_strategy =
nullptr);
49 void set_solver_log_file(
const std::filesystem::path& log_file);
50 void SetPlugin(std::shared_ptr<BendersPlugin> benders_plugin);
51 double execution_time()
const;
52 virtual std::string BendersName()
const = 0;
55 WorkerMasterDataVect AllCuts()
const;
58 LogData GetBestIterationData()
const;
60 int MasterRowIndex(
const std::string& row_name)
const;
61 void MasterChangeRhs(
int id_row,
double val)
const;
62 void MasterGetRhs(
double& rhs,
int id_row)
const;
64 const VariableMap& MasterVariables()
const
66 return master_variable_map_;
69 std::vector<double> MasterObjectiveFunctionCoeffs()
const;
70 void MasterRowsCoeffs(std::vector<int>& mstart,
71 std::vector<int>& mclind,
72 std::vector<double>& dmatval,
74 std::vector<int>& nels,
77 int MasterGetNElems()
const;
78 void MasterAddRows(
const std::vector<char>& qrtype_p,
79 const std::vector<double>& rhs_p,
80 const std::vector<double>& range_p,
81 const std::vector<int>& mstart_p,
82 const std::vector<int>& mclind_p,
83 const std::vector<double>& dmatval_p,
84 const std::vector<std::string>& row_names = {})
const;
85 void MasterGetRowType(std::vector<char>& qrtype,
int first,
int last)
const;
86 void ResetMasterFromLastIteration();
87 std::filesystem::path LastMasterPath()
const;
88 bool MasterIsEmpty()
const;
90 void DoFreeProblems(
bool free_problems)
92 free_problems_ = free_problems;
95 int MasterGetnrows()
const;
96 int MasterGetncols()
const;
98 void SetMasterObjectiveFunctionCoeffsToZeros()
const;
99 void SetMasterObjectiveFunction(
const double* coeffs,
int first,
int last)
const;
100 virtual void InitializeProblems() = 0;
102 void SetMaxIteration(
int max_iteration)
104 _options.MAX_ITERATIONS = max_iteration;
112 virtual void free() = 0;
114 int GetBendersRunNumber()
const
116 return _data.criteria_current_iteration_data.benders_num_run;
119 void IncrementBendersRunNumber()
121 ++_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 std::once_flag variable_indice_once_flag;
145 void setCriterionComputationInputs(
148 [[nodiscard]] std::shared_ptr<ICommunicationStrategy> GetCommunicationStrategy()
const
150 return communication_strategy_;
154 bool exception_raised_ =
false;
156 WorkerMasterDataVect workerMasterDataVect_;
157 WorkerMasterPtr _master;
158 std::shared_ptr<BendersPlugin> benders_plugin_;
161 VariableMap master_variable_map_;
162 CouplingMap coupling_map_;
163 VariableMap _problem_to_id;
166 bool init_data_ =
true;
167 bool init_problems_ =
true;
168 bool free_problems_ =
true;
171 std::vector<std::vector<double>> criteria_vector_for_each_iteration_;
172 bool is_bilevel_check_all_ =
false;
174 virtual void Run() = 0;
176 bool ShouldBendersStop();
177 bool is_initial_relaxation_requested()
const;
178 bool SwitchToIntegerMaster(
bool is_relaxed)
const;
179 virtual void HandleInitialMasterRelaxation();
181 virtual void ComputeXCut();
183 void ComputeInvestCost();
184 virtual void compute_ub();
187 void GetSubproblemCutFast(SubProblemDataMap& subproblem_data_map);
188 std::pair<std::vector<int>, std::vector<int>> GetProblemBasis(
189 const std::shared_ptr<SubproblemWorker>& worker)
const;
190 std::shared_ptr<SubproblemWorker>
BuildProblem(
const std::pair<std::string, VariableMap>& kvp,
191 const std::string& name);
192 std::shared_ptr<SubproblemWorker> makeSubproblemWorker(
193 const std::pair<std::string, VariableMap>& kvp)
const;
194 void SetBasisForSubproblem(
const std::string& name,
195 const std::vector<int>& rstatus,
196 const std::vector<int>& cstatus);
197 void GetSubproblemCutCache(SubProblemDataMap& subproblem_data_map);
198 virtual void post_run_actions()
const;
199 void BuildCutFull(
const SubProblemDataMap& subproblem_data_map);
200 virtual void DeactivateIntegrityConstraints()
const;
201 virtual void ActivateIntegrityConstraints()
const;
202 virtual void SetDataPreRelaxation();
203 virtual void ResetDataPostRelaxation();
204 [[nodiscard]] std::filesystem::path
GetSubproblemPath(
const std::string& subproblem_name)
const;
205 [[nodiscard]]
double SubproblemWeight(
int subproblem_count,
const std::string& name)
const;
207 [[nodiscard]] std::filesystem::path get_structure_path()
const;
210 template<
typename T,
typename... Args>
211 void reset_master(Args&&... args)
213 _master = std::make_shared<T>(std::forward<Args>(args)...);
214 master_is_empty_ =
false;
218 void free_subproblems();
219 void AddSubproblem(
const std::pair<std::string, VariableMap>& kvp);
220 [[nodiscard]]
virtual WorkerMasterPtr get_master()
const;
221 void MatchProblemToId();
222 void AddSubproblemName(
const std::string& name);
223 [[nodiscard]] std::string get_master_name()
const;
224 [[nodiscard]] std::string get_solver_name()
const;
225 [[nodiscard]]
int get_log_level()
const;
226 [[nodiscard]]
bool is_trace()
const;
227 [[nodiscard]] Point get_x_cut()
const;
228 void set_x_cut(
const Point& x0);
229 [[nodiscard]] Point get_x_out()
const;
230 void set_x_out(
const Point& x0);
231 [[nodiscard]]
double GetSubproblemCost()
const;
232 void SetSubproblemCost(
const double& subproblem_cost);
233 bool IsResumeMode()
const;
235 std::filesystem::path LastIterationFile()
const
237 return std::filesystem::path(_options.LAST_ITERATION_JSON_FILE);
240 void UpdateMaxNumberIterationResumeMode(
int nb_iteration_done);
241 void SaveCurrentIterationInOutputFile()
const;
242 void SaveSolutionInOutputFile()
const;
243 void PrintCurrentIterationCsv();
246 void ChecksResumeMode();
247 virtual void SaveCurrentBendersData();
248 void ClearCurrentIterationCutTrace();
249 virtual void EndWritingInOutputFile()
const;
251 [[nodiscard]]
int GetNumIterationsBeforeRestart()
const
253 return iterations_before_resume;
256 double GetBendersTime()
const;
257 virtual void write_basis()
const;
260 SubproblemsMapPtr GetSubProblemMap()
const
262 return subproblem_map;
265 StrVector GetSubProblemNames()
const
270 double AbsoluteGap()
const
272 return _options.ABSOLUTE_GAP;
275 double RelativeGap()
const
277 return _options.RELATIVE_GAP;
280 double RelaxedGap()
const
282 return _options.RELAXED_GAP;
285 DblVector GetAlpha_i()
const
287 return _data.single_subpb_costs_under_approx;
290 void SetAlpha_i(
const DblVector& single_subpb_costs_under_approx)
292 _data.single_subpb_costs_under_approx = single_subpb_costs_under_approx;
295 int ProblemToId(
const std::string& problem_name)
const
297 return _problem_to_id.at(problem_name);
303 int GetNumOfSubProblemsSolvedBeforeResume()
305 return cumulative_number_of_subproblem_resolved_before_resume;
309 void ResetSimplexIterationsBounds();
311 SubproblemsMapPtr subproblem_map;
315 const std::string& name,
316 const std::shared_ptr<SubproblemWorker>& worker);
334 void build_all_aggregated_cuts(
const std::vector<SubProblemNamesInCut>& subproblem_names,
335 const std::vector<SubProblemDataMap>& gathered_subproblem_map);
337 int SetAggregation(
int max_aggregation)
const;
339 std::map<int, double> GetSubCutTolerance()
const;
342 void print_master_and_cut(std::ostream& file,
346 void print_master_csv(std::ostream& stream,
348 const Point& xopt)
const;
349 void check_status(
const SubProblemDataMap& subproblem_data_map)
const;
350 [[nodiscard]]
LogData build_log_data_from_data()
const;
353 [[nodiscard]] std::string status_from_criterion()
const;
354 void compute_cut_aggregate(
const SubProblemDataMap& subproblem_data_map);
355 void compute_cut(
const SubProblemDataMap& subproblem_data_map);
356 [[nodiscard]] std::map<std::string, int> get_master_variable_map(
357 const std::map<std::string, std::map<std::string, int>>& input_map)
const;
358 [[nodiscard]]
virtual bool shouldParallelize()
const;
363 bool master_is_empty_ =
true;
364 int _totalNbProblems = 0;
365 StrVector subproblems;
366 std::ofstream _csv_file;
367 std::filesystem::path _csv_file_path;
369 int iterations_before_resume = 0;
370 int cumulative_number_of_subproblem_resolved_before_resume = 0;
373 std::unordered_map<std::string, std::pair<std::vector<int>, std::vector<int>>> basiss_;
374 std::shared_ptr<ICommunicationStrategy> communication_strategy_;