Antares Xpansion
Investment simulations for Antares studies
All Classes Namespaces Files Functions Variables Typedefs Pages
MergeMPS.h
1#pragma once
2
3#include "antares-xpansion/benders/benders_core/common.h"
4#include "antares-xpansion/benders/factories/WriterFactories.h"
5#include "antares-xpansion/helpers/solver_utils.h"
6
7enum Attribute
8{
9 INT_VALUE,
10 INT_VECTOR,
11 CHAR_VECTOR,
12 DBL_VECTOR,
13 MAX_ATTRIBUTE
14};
15
16enum IntAttribute
17{
18 NROWS,
19 NCOLS,
20 NELES,
21 MAX_INT_ATTRIBUTE
22};
23
24enum IntVectorAttribute
25{
26 MSTART,
27 MINDEX,
28 MAX_INT_VECTOR_ATTRIBUTE,
29};
30
31enum CharVectorAttribute
32{
33 ROWTYPE,
34 COLTYPE,
35 MAX_CHAR_VECTOR_ATTRIBUTE
36};
37
38enum DblVectorAttribute
39{
40 MVALUE,
41 RHS,
42 RANGE,
43 OBJ,
44 LB,
45 UB,
46 MAX_DBL_VECTOR_ATTRIBUTE
47};
48
49using raw_standard_lp_data = std::
50 tuple<IntVector, std::vector<IntVector>, std::vector<CharVector>, std::vector<DblVector>>;
51
53{
54private:
55 std::vector<std::string> _colNames;
56
57public:
58 // to be used in boost serialization for mpi transfer
59 raw_standard_lp_data _data;
60 static size_t appendCNT;
61
62public:
63 void init()
64 {
65 initialise_int_values_with_zeros();
66 initialise_int_vectors();
67 initialise_char_vectors();
68 initialise_dbl_vectors();
69 }
70
71 explicit StandardLp(SolverAbstract& solver_p)
72 {
73 init();
74
75 int ncols = solver_p.get_ncols();
76 int nrows = solver_p.get_nrows();
77 int nelems = solver_p.get_nelems();
78
79 std::get<Attribute::INT_VALUE>(_data)[IntAttribute::NCOLS] = ncols;
80 std::get<Attribute::INT_VALUE>(_data)[IntAttribute::NROWS] = nrows;
81 std::get<Attribute::INT_VALUE>(_data)[IntAttribute::NELES] = nelems;
82
83 _colNames = solver_p.get_col_names();
84
85 std::get<Attribute::INT_VECTOR>(_data)[IntVectorAttribute::MSTART].clear();
86 std::get<Attribute::INT_VECTOR>(_data)[IntVectorAttribute::MSTART].resize(nrows + 1);
87
88 std::get<Attribute::INT_VECTOR>(_data)[IntVectorAttribute::MINDEX].clear();
89 std::get<Attribute::INT_VECTOR>(_data)[IntVectorAttribute::MINDEX].resize(nelems);
90
91 std::get<Attribute::CHAR_VECTOR>(_data)[CharVectorAttribute::COLTYPE].clear();
92 std::get<Attribute::CHAR_VECTOR>(_data)[CharVectorAttribute::COLTYPE].resize(ncols);
93
94 std::get<Attribute::CHAR_VECTOR>(_data)[CharVectorAttribute::ROWTYPE].clear();
95 std::get<Attribute::CHAR_VECTOR>(_data)[CharVectorAttribute::ROWTYPE].resize(nrows);
96
97 std::get<Attribute::DBL_VECTOR>(_data)[DblVectorAttribute::MVALUE].clear();
98 std::get<Attribute::DBL_VECTOR>(_data)[DblVectorAttribute::MVALUE].resize(nelems);
99
100 std::get<Attribute::DBL_VECTOR>(_data)[DblVectorAttribute::RHS].clear();
101 std::get<Attribute::DBL_VECTOR>(_data)[DblVectorAttribute::RHS].resize(nrows);
102
103 // Range constraint don't exist in a sparse matrix formulation
104 std::get<Attribute::DBL_VECTOR>(_data)[DblVectorAttribute::RANGE].clear();
105 std::get<Attribute::DBL_VECTOR>(_data)[DblVectorAttribute::RANGE].resize(nrows);
106
107 std::get<Attribute::DBL_VECTOR>(_data)[DblVectorAttribute::OBJ].clear();
108 std::get<Attribute::DBL_VECTOR>(_data)[DblVectorAttribute::OBJ].resize(ncols);
109
110 std::get<Attribute::DBL_VECTOR>(_data)[DblVectorAttribute::LB].clear();
111 std::get<Attribute::DBL_VECTOR>(_data)[DblVectorAttribute::LB].resize(ncols);
112
113 std::get<Attribute::DBL_VECTOR>(_data)[DblVectorAttribute::UB].clear();
114 std::get<Attribute::DBL_VECTOR>(_data)[DblVectorAttribute::UB].resize(ncols);
115
116 solver_getrows(solver_p,
117 std::get<Attribute::INT_VECTOR>(_data)[IntVectorAttribute::MSTART],
118 std::get<Attribute::INT_VECTOR>(_data)[IntVectorAttribute::MINDEX],
119 std::get<Attribute::DBL_VECTOR>(_data)[DblVectorAttribute::MVALUE],
120 0,
121 std::get<Attribute::INT_VALUE>(_data)[IntAttribute::NROWS] - 1);
122
123 solver_getrowtype(solver_p,
124 std::get<Attribute::CHAR_VECTOR>(_data)[CharVectorAttribute::ROWTYPE],
125 0,
126 std::get<Attribute::INT_VALUE>(_data)[IntAttribute::NROWS] - 1);
127
128 solver_getrhs(solver_p,
129 std::get<Attribute::DBL_VECTOR>(_data)[DblVectorAttribute::RHS],
130 0,
131 std::get<Attribute::INT_VALUE>(_data)[IntAttribute::NROWS] - 1);
132
133 solver_getcolinfo(solver_p,
134 std::get<Attribute::CHAR_VECTOR>(_data)[CharVectorAttribute::COLTYPE],
135 std::get<Attribute::DBL_VECTOR>(_data)[DblVectorAttribute::LB],
136 std::get<Attribute::DBL_VECTOR>(_data)[DblVectorAttribute::UB],
137 0,
138 std::get<Attribute::INT_VALUE>(_data)[IntAttribute::NCOLS] - 1);
139
140 solver_get_obj_func_coeffs(solver_p,
141 std::get<Attribute::DBL_VECTOR>(_data)[DblVectorAttribute::OBJ],
142 0,
143 std::get<Attribute::INT_VALUE>(_data)[IntAttribute::NCOLS] - 1);
144
145 assert(std::get<Attribute::INT_VECTOR>(_data)[IntVectorAttribute::MSTART].size()
146 == 1 + std::get<Attribute::INT_VALUE>(_data)[IntAttribute::NROWS]);
147
148 assert(std::get<Attribute::CHAR_VECTOR>(_data)[CharVectorAttribute::COLTYPE].size()
149 == std::get<Attribute::INT_VALUE>(_data)[IntAttribute::NCOLS]);
150 assert(std::get<Attribute::CHAR_VECTOR>(_data)[CharVectorAttribute::ROWTYPE].size()
151 == std::get<Attribute::INT_VALUE>(_data)[IntAttribute::NROWS]);
152
153 assert(std::get<Attribute::DBL_VECTOR>(_data)[DblVectorAttribute::MVALUE].size()
154 == std::get<Attribute::INT_VALUE>(_data)[IntAttribute::NELES]);
155 assert(std::get<Attribute::DBL_VECTOR>(_data)[DblVectorAttribute::RHS].size()
156 == std::get<Attribute::INT_VALUE>(_data)[IntAttribute::NROWS]);
157
158 assert(std::get<Attribute::DBL_VECTOR>(_data)[DblVectorAttribute::OBJ].size()
159 == std::get<Attribute::INT_VALUE>(_data)[IntAttribute::NCOLS]);
160 assert(std::get<Attribute::DBL_VECTOR>(_data)[DblVectorAttribute::LB].size()
161 == std::get<Attribute::INT_VALUE>(_data)[IntAttribute::NCOLS]);
162 assert(std::get<Attribute::DBL_VECTOR>(_data)[DblVectorAttribute::UB].size()
163 == std::get<Attribute::INT_VALUE>(_data)[IntAttribute::NCOLS]);
164 }
165
166 int append_in(SolverAbstract::Ptr containingSolver_p, const std::string& prefix_p = "") const
167 {
168 // simply increment the columns indices
169 IntVector newmindex(std::get<Attribute::INT_VECTOR>(_data)[IntVectorAttribute::MINDEX]);
170 int nbExistingCols(containingSolver_p->get_ncols());
171 for (auto& i: newmindex)
172 {
173 i += nbExistingCols;
174 }
175
176 // rename variables
177 std::string prefix_l = (prefix_p != "") ? prefix_p : ("prob" + std::to_string(appendCNT));
178 std::vector<std::string> newNames;
179 newNames.resize(_colNames.size());
180 std::transform(_colNames.begin(),
181 _colNames.end(),
182 newNames.begin(),
183 [&prefix_l](std::string varName_p) -> std::string
184 { return prefix_l + varName_p; });
185
186 std::vector<int> mstart(std::get<Attribute::INT_VALUE>(_data)[IntAttribute::NCOLS], 0);
187 solver_addcols(*containingSolver_p,
188 std::get<Attribute::DBL_VECTOR>(_data)[DblVectorAttribute::OBJ],
189 mstart,
190 IntVector(0, 0),
191 DblVector(0, 0.0),
192 std::get<Attribute::DBL_VECTOR>(_data)[DblVectorAttribute::LB],
193 std::get<Attribute::DBL_VECTOR>(_data)[DblVectorAttribute::UB],
194 std::get<Attribute::CHAR_VECTOR>(_data)[CharVectorAttribute::COLTYPE],
195 newNames);
196
197 solver_addrows(*containingSolver_p,
198 std::get<Attribute::CHAR_VECTOR>(_data)[CharVectorAttribute::ROWTYPE],
199 std::get<Attribute::DBL_VECTOR>(_data)[DblVectorAttribute::RHS],
200 {},
201 std::get<Attribute::INT_VECTOR>(_data)[IntVectorAttribute::MSTART],
202 newmindex,
203 std::get<Attribute::DBL_VECTOR>(_data)[DblVectorAttribute::MVALUE]);
204
205 ++appendCNT;
206
207 return nbExistingCols;
208 }
209
210private:
211 void initialise_int_values_with_zeros()
212 {
213 std::get<Attribute::INT_VALUE>(_data).assign(IntAttribute::MAX_INT_ATTRIBUTE, 0);
214 }
215
216 void initialise_int_vectors()
217 {
218 std::get<Attribute::INT_VECTOR>(_data).assign(IntVectorAttribute::MAX_INT_VECTOR_ATTRIBUTE,
219 IntVector());
220 }
221
222 void initialise_char_vectors()
223 {
224 std::get<Attribute::CHAR_VECTOR>(_data)
225 .assign(CharVectorAttribute::MAX_CHAR_VECTOR_ATTRIBUTE, CharVector());
226 }
227
228 void initialise_dbl_vectors()
229 {
230 std::get<Attribute::DBL_VECTOR>(_data).assign(DblVectorAttribute::MAX_DBL_VECTOR_ATTRIBUTE,
231 DblVector());
232 }
233};
234
236{
237public:
238 MergeMPS(MergeMPSOptions options, Logger logger, std::shared_ptr<Output::OutputWriter> writer);
239
240 void launch();
241
242 double slave_weight(int nslaves, const std::string& name) const;
243
244 MergeMPSOptions _options;
245 Logger _logger;
246 std::shared_ptr<Output::OutputWriter> _writer;
247};
Definition MergeMPS.h:236
void launch()
Definition MergeMPS.cpp:21
double slave_weight(int nslaves, const std::string &name) const
Return slave weight value.
Definition MergeMPS.cpp:247
Definition SolverAbstract.h:200
virtual std::vector< std::string > get_col_names(int first, int last)=0
Returns the names of columns from index first to last cannot be declared as const because of some sol...
virtual int get_nrows() const =0
returns number of rows of the problem
virtual int get_nelems() const =0
returns number of non zeros elements in the matrix, excluding objective
virtual int get_ncols() const =0
returns number of columns of the problem
std::shared_ptr< SolverAbstract > Ptr
Definition SolverAbstract.h:215
Definition MergeMPS.h:53
Definition common.h:180