Antares Xpansion
Investment simulations for Antares studies
Loading...
Searching...
No Matches
Benders_MICRO_ITERS.h
1/*
2This header file contains the necessary classes and structure to implement the benders plugin
3mechanism for the micro iteration. As some of necessary code components for micro iterations is
4written in Julia, this code will be compiled into a dynamic library, loaded into
5Benders_MICRO_ITERS class.
6*/
7
8#pragma once
9#include <chrono>
10#ifdef _WIN32
11#include <windows.h>
12#else
13#include <dlfcn.h>
14#endif
15#include <filesystem>
16#include <map>
17#include <memory>
18#include <vector>
19
20#include <boost/serialization/map.hpp>
21#include <boost/serialization/string.hpp>
22
23#include "antares-xpansion/benders/benders_core/CouplingMapGenerator.h"
24#include "antares-xpansion/benders/benders_core/SimulationOptions.h"
25#include "antares-xpansion/benders/benders_core/SubproblemConstraintsManager.h"
26#include "antares-xpansion/benders/benders_mpi/common_mpi.h"
27#include "antares-xpansion/benders/plugins/BendersPlugin.h"
28#include "antares-xpansion/xpansion_interfaces/ILogger.h"
29
30/*
31 This structure will be used to set the subproblems ids on the Julia side
32 @members :
33 - subProblems_ids : a pointer to an array of c-style string
34 - n_subproblems : number of subproblems
35*/
37{
38 const char** subProblems_ids;
39 int n_subproblems;
40};
41
42using on_Benders_start_Func = void (*)(SubProblemIds,
43 int,
44 std::filesystem::path,
45 std::filesystem::path,
46 bool,
47 mpi::communicator*,
48 int);
49using on_Benders_end_Func = void (*)();
50using on_Benders_iteration_start = void (*)();
51using on_Benders_iteration_end = void (*)();
52using on_Benders_master_resolution_start = void (*)();
53using on_Benders_master_resolution_end = void (*)(std::map<std::string, double>&,
54 int&,
55 mpi::communicator*,
56 std::map<std::string, std::vector<std::string>>&,
57 std::filesystem::path input_root);
58
59using on_Benders_micro_iteration_start = void (*)();
60using on_Benders_micro_iteration_end = void (*)(std::string sub_name,
61 bool& added_rows,
62 std::string solving_time,
63 std::vector<double> sub_solution,
64 std::vector<int> variables_indices_vector,
65 std::vector<std::string>& variables_names_vector,
66 std::filesystem::path input_root,
67 std::vector<std::string>& contraints_to_add_vec,
68 int,
69 int);
70using on_Benders_sub_resolution_start = void (*)();
71using on_Benders_sub_resolution_end = void (*)(std::string sub_name, int num_micro_iter);
72
73/*
74 Implementation of BendersPlugin to manage the microiterations workflow
75*/
76
78{
79public:
80 /*
81 Constructor
82 Inputs :
83 - options : study options
84 - coupling_map : coupling map (master and sub to variables)
85 */
87 const CouplingMap& coupling_map,
88 mpi::communicator* world);
89
90 /*
91 Default destrucor
92 */
93 virtual ~Benders_MICRO_ITERS() = default;
94
95 /*
96 Implementation of benders start call back
97 */
98 void OnBendersStart(const SubproblemsMapPtr& subproblem_map,
99 const Logger& logger,
100 const BendersBaseOptions& options,
101 const SolverLogManager& solver_log_manager) override;
102
103 void OnBendersIterationStart() override;
104 void OnBendersIterationEnd() override;
105
106 /*
107 Implementation of benders end call back
108 */
109 void OnBendersEnd() override;
110
111 /*
112 Implementation of master resolution end call back
113 */
114 void OnBendersMasterResolutionEnd(std::map<std::string, double>& master_out,
115 int& num_iter) override;
116
117 /*
118 Implementation of master resolution start call back
119 */
120 void OnBendersMasterResolutionStart() override;
121
122 /*
123 Implementation of micro iteration start call back
124 */
125 void OnBendersMicroIterationStart() override;
126
127 /*
128 Implementation of micro iteration end callback
129 */
130 void OnBendersMicroIterationEnd(std::string sub_name,
131 bool& added_rows,
132 std::string solving_time,
133 int num_master_iter,
134 int num_micro_iter) override;
135
136 void OnBendersSubResolutionStart() override;
137 void OnBendersSubResolutionEnd(std::string sub_name, int num_micro_iter) override;
138
139 /*
140 This functions sets sub_pb_ids_ which is necessary in handeling the julia code
141 @inputs
142 - subs_ids : a pointer to an array of c-style string which are the subproblem ids
143 - n_subs : number of sub problem
144 */
145 void SetSubProblemIDs(const char** subs_ids, int n_subs);
146
147private:
148 /*
149 This function is used to get the constraints to add to the subproblem from
150 the list of constraint key computed after solving the subproblem
151 @inputs :
152 - constraints_to_add : list of the constraints key returned by the Julia code
153 - sub_name : name of the subproblem
154 // */
155 // std::vector<std::string> get_constraints_to_add(ViolatedFlowConstraints& constraints_to_add,
156 // std::string sub_name);
157
158 /*
159 This function is used to build the SubproblemConstraintsManager objects associated to each
160 subproblem
161 @inputs :
162 - subproblem_map : the map to the subproblem workers
163 - options : study options
164 - solver_log_manager : solver log manger
165 */
166 void BuildSubproblemConstraintsManagerMap(const SubproblemsMapPtr& subproblem_map,
167 const BendersBaseOptions& options,
168 const SolverLogManager& solver_log_manager);
169
170 void read_micro_iteration_config_file();
171
172 void read_variables_to_follow_ids();
173 void read_variable_names_to_follow();
174 void build_variables_to_follow_indices_vector();
175 const std::map<std::string, std::vector<int>>& get_variables_to_follow_indeices_vector();
176
177 mpi::communicator* _world;
178#ifdef _WIN32
179 HMODULE handle_;
180#else
181 void* handle_;
182#endif
183
184 on_Benders_start_Func onBendersStartPlugin_;
185 on_Benders_end_Func OnBendersEndPlugin_;
186 on_Benders_iteration_start OnBendersIterationStart_;
187 on_Benders_iteration_end OnBendersIterationEnd_;
188 on_Benders_master_resolution_start OnBendersMasterResolutionStart_;
189 on_Benders_master_resolution_end OnBendersMasterResolutionEnd_;
190 on_Benders_micro_iteration_start OnBendersMicroIterationStart_;
191 on_Benders_micro_iteration_end OnBendersMicroIterationEnd_;
192 on_Benders_sub_resolution_start OnBendersSubResolutionStart_;
193 on_Benders_sub_resolution_end OnBendersSubResolutionEnd_;
194 std::map<std::string, std::vector<int>> variables_to_follow_indices_per_sub_;
195 const SimulationOptions& options_;
196 std::filesystem::path input_root_;
197 std::filesystem::path variables_dictionary_path_;
198 SubProblemIds sub_pb_ids_;
199 std::map<std::string, std::string> binary_variables_ids_map_;
200 std::vector<std::string> sub_ids_storage_;
201 std::vector<const char*> sub_ids_ptrs_;
202 std::map<std::string, std::vector<std::string>> added_constraints_per_sub_;
203 std::map<std::string, std::string> micro_iterations_config_;
204 std::vector<std::string> variables_to_follow_;
205 CouplingMap coupling_map_;
206 CouplingMap constraints_coupling_map_;
207 SubProblemConstraintMap subproblem_constraint_map_;
208 SubproblemConstraintsManagerPtrMap constraints_map_;
209 Logger _logger;
210 bool warm_start_;
211};
Definition BendersPlugin.h:14
Definition Benders_MICRO_ITERS.h:78
Definition SimulationOptions.h:6
Definition SolverAbstract.h:20
Definition common.h:207
Definition Benders_MICRO_ITERS.h:37