43 std::shared_ptr<Output::OutputWriter> writer,
44 std::shared_ptr<MathLoggerDriver> mathLoggerDriver);
46 void set_solver_log_file(
const std::filesystem::path& log_file);
48 double execution_time()
const;
49 virtual std::string BendersName()
const = 0;
52 WorkerMasterDataVect AllCuts()
const;
55 LogData GetBestIterationData()
const;
57 int MasterRowIndex(
const std::string& row_name)
const;
58 void MasterChangeRhs(
int id_row,
double val)
const;
60 void MasterGetRhs(
double& rhs,
int id_row)
const;
62 const VariableMap& MasterVariables()
const
64 return master_variable_map_;
67 std::vector<double> MasterObjectiveFunctionCoeffs()
const;
68 void MasterRowsCoeffs(std::vector<int>& mstart,
69 std::vector<int>& mclind,
70 std::vector<double>& dmatval,
72 std::vector<int>& nels,
75 int MasterGetNElems()
const;
76 void MasterAddRows(
const std::vector<char>& qrtype_p,
77 const std::vector<double>& rhs_p,
78 const std::vector<double>& range_p,
79 const std::vector<int>& mstart_p,
80 const std::vector<int>& mclind_p,
81 const std::vector<double>& dmatval_p,
82 const std::vector<std::string>& row_names = {})
const;
83 void MasterGetRowType(std::vector<char>& qrtype,
int first,
int last)
const;
84 void ResetMasterFromLastIteration();
85 std::filesystem::path LastMasterPath()
const;
86 bool MasterIsEmpty()
const;
88 void DoFreeProblems(
bool free_problems)
90 free_problems_ = free_problems;
93 int MasterGetnrows()
const;
94 int MasterGetncols()
const;
96 void SetMasterObjectiveFunctionCoeffsToZeros()
const;
97 void SetMasterObjectiveFunction(
const double* coeffs,
int first,
int last)
const;
98 virtual void InitializeProblems() = 0;
100 void SetMaxIteration(
int max_iteration)
102 _options.MAX_ITERATIONS = max_iteration;
110 virtual void free() = 0;
112 int GetBendersRunNumber()
const
114 return _data.criteria_current_iteration_data.benders_num_run;
121 std::vector<double> GetOuterLoopCriterionAtBestBenders()
const;
123 void init_data(
double external_loop_lambda,
124 double external_loop_lambda_min,
125 double external_loop_lambda_max);
127 void SaveOuterLoopSolutionInOutputFile()
const;
128 void SaveCurrentOuterLoopIterationInOutputFile()
const;
129 void SetBilevelBestub(
double bilevel_best_ub);
130 void UpdateOuterLoopSolution();
132 bool isExceptionRaised()
const;
133 void UpdateOverallCosts();
135 std::shared_ptr<Output::OutputWriter> _writer;
136 std::shared_ptr<MathLoggerDriver> mathLoggerDriver_;
137 std::once_flag variable_indice_once_flag;
138 void setCriterionComputationInputs(
142 bool exception_raised_ =
false;
144 WorkerMasterDataVect workerMasterDataVect_;
147 VariableMap master_variable_map_;
148 CouplingMap coupling_map_;
150 bool init_data_ =
true;
151 bool init_problems_ =
true;
152 bool free_problems_ =
true;
155 std::vector<std::vector<double>> criteria_vector_for_each_iteration_;
156 bool is_bilevel_check_all_ =
false;
158 std::vector<SubProblemNamesInCut> split_subproblem_data_pairs(
159 const std::vector<SubProblemDataMap>& gathered_subproblem_map,
162 virtual void Run() = 0;
164 bool ShouldBendersStop();
165 bool is_initial_relaxation_requested()
const;
166 bool SwitchToIntegerMaster(
bool is_relaxed)
const;
167 virtual void HandleInitialMasterRelaxation();
169 virtual void ComputeXCut();
171 void ComputeInvestCost();
172 virtual void compute_ub();
175 void GetSubproblemCutFast(SubProblemDataMap& subproblem_data_map);
176 std::pair<std::vector<int>, std::vector<int>> GetProblemBasis(
177 const std::shared_ptr<SubproblemWorker>& worker)
const;
178 std::shared_ptr<SubproblemWorker>
BuildProblem(
const std::pair<std::string, VariableMap>& kvp,
179 const std::string& name);
180 std::shared_ptr<SubproblemWorker> makeSubproblemWorker(
181 const std::pair<std::string, VariableMap>& kvp)
const;
182 void GetSubproblemCutCache(SubProblemDataMap& subproblem_data_map);
183 virtual void post_run_actions()
const;
184 void BuildCutFull(
const SubProblemDataMap& subproblem_data_map);
185 virtual void DeactivateIntegrityConstraints()
const;
186 virtual void ActivateIntegrityConstraints()
const;
187 virtual void SetDataPreRelaxation();
188 virtual void ResetDataPostRelaxation();
189 [[nodiscard]] std::filesystem::path
GetSubproblemPath(
const std::string& subproblem_name)
const;
190 [[nodiscard]]
double SubproblemWeight(
int subproblem_count,
const std::string& name)
const;
192 [[nodiscard]] std::filesystem::path get_structure_path()
const;
195 template<
typename T,
typename... Args>
196 void reset_master(Args&&... args)
198 _master = std::make_shared<T>(std::forward<Args>(args)...);
199 master_is_empty_ =
false;
203 void free_subproblems();
204 void AddSubproblem(
const std::pair<std::string, VariableMap>& kvp);
205 [[nodiscard]]
virtual WorkerMasterPtr get_master()
const;
206 void MatchProblemToId();
207 void AddSubproblemName(
const std::string& name);
208 [[nodiscard]] std::string get_master_name()
const;
209 [[nodiscard]] std::string get_solver_name()
const;
210 [[nodiscard]]
int get_log_level()
const;
211 [[nodiscard]]
bool is_trace()
const;
212 [[nodiscard]] Point get_x_cut()
const;
213 void set_x_cut(
const Point& x0);
214 [[nodiscard]] Point get_x_out()
const;
215 void set_x_out(
const Point& x0);
216 [[nodiscard]]
double GetSubproblemCost()
const;
217 void SetSubproblemCost(
const double& subproblem_cost);
218 bool IsResumeMode()
const;
220 std::filesystem::path LastIterationFile()
const
222 return std::filesystem::path(_options.LAST_ITERATION_JSON_FILE);
225 void UpdateMaxNumberIterationResumeMode(
int nb_iteration_done);
226 void SaveCurrentIterationInOutputFile()
const;
227 void SaveSolutionInOutputFile()
const;
228 void PrintCurrentIterationCsv();
231 void ChecksResumeMode();
232 virtual void SaveCurrentBendersData();
233 void ClearCurrentIterationCutTrace();
234 virtual void EndWritingInOutputFile()
const;
236 [[nodiscard]]
int GetNumIterationsBeforeRestart()
const
238 return iterations_before_resume;
241 double GetBendersTime()
const;
242 virtual void write_basis()
const;
245 SubproblemsMapPtr GetSubProblemMap()
const
247 return subproblem_map;
250 StrVector GetSubProblemNames()
const
255 double AbsoluteGap()
const
257 return _options.ABSOLUTE_GAP;
260 double RelativeGap()
const
262 return _options.RELATIVE_GAP;
265 double RelaxedGap()
const
267 return _options.RELAXED_GAP;
270 DblVector GetAlpha_i()
const
272 return _data.single_subpb_costs_under_approx;
275 void SetAlpha_i(
const DblVector& single_subpb_costs_under_approx)
277 _data.single_subpb_costs_under_approx = single_subpb_costs_under_approx;
280 int ProblemToId(
const std::string& problem_name)
const
282 return _problem_to_id.at(problem_name);
288 int GetNumOfSubProblemsSolvedBeforeResume()
290 return cumulative_number_of_subproblem_resolved_before_resume;
294 void ResetSimplexIterationsBounds();
296 SubproblemsMapPtr subproblem_map;
300 const std::string& name,
301 const std::shared_ptr<SubproblemWorker>& worker);
319 void build_all_aggregated_cuts(
const std::vector<SubProblemNamesInCut>& subproblem_names,
320 const std::vector<SubProblemDataMap>& gathered_subproblem_map);
323 void print_master_and_cut(std::ostream& file,
327 void print_master_csv(std::ostream& stream,
329 const Point& xopt)
const;
330 void check_status(
const SubProblemDataMap& subproblem_data_map)
const;
331 int SetAggregation(
int max_aggregation)
const;
332 [[nodiscard]]
LogData build_log_data_from_data()
const;
335 [[nodiscard]] std::string status_from_criterion()
const;
336 void compute_cut_aggregate(
const SubProblemDataMap& subproblem_data_map);
337 void compute_cut(
const SubProblemDataMap& subproblem_data_map);
338 [[nodiscard]] std::map<std::string, int> get_master_variable_map(
339 const std::map<std::string, std::map<std::string, int>>& input_map)
const;
340 [[nodiscard]]
virtual bool shouldParallelize()
const = 0;
344 bool master_is_empty_ =
true;
345 int _totalNbProblems = 0;
346 WorkerMasterPtr _master;
347 VariableMap _problem_to_id;
348 StrVector subproblems;
349 std::ofstream _csv_file;
350 std::filesystem::path _csv_file_path;
352 int iterations_before_resume = 0;
353 int cumulative_number_of_subproblem_resolved_before_resume = 0;
356 std::unordered_map<std::string, std::pair<std::vector<int>, std::vector<int>>> basiss_;