Skip to content

Commit 67fe666

Browse files
committed
Various changes
1. Include name and fixed values when expanding variables 2. Various API extensions 3. Always store variable_map,variable_array, parameter_map and parameter_array objects on a Model object. 4. Added missing Model::add_parameter methods 5. Many extensions to pybind11 to capture compact models.
1 parent bba0e78 commit 67fe666

22 files changed

+236
-87
lines changed

Diff for: lib/coek/coek/api/expression.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -282,9 +282,11 @@ Variable Variable::expand()
282282
{
283283
#ifdef COEK_WITH_COMPACT_MODEL
284284
auto var = Variable()
285+
.name(this->name())
285286
.lower(this->lower_expression().expand())
286287
.upper(this->upper_expression().expand())
287288
.value(this->value_expression().expand())
289+
.fixed(this->fixed())
288290
.within(this->within());
289291
return var;
290292
#else

Diff for: lib/coek/coek/api/parameter_array.cpp

+5-2
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,8 @@ ParameterArray::ParameterArray(const std::initializer_list<size_t>& shape)
114114

115115
std::shared_ptr<ParameterAssocArrayRepn> ParameterArray::get_repn() { return repn; }
116116

117+
const std::shared_ptr<ParameterAssocArrayRepn> ParameterArray::get_repn() const { return repn; }
118+
117119
Parameter ParameterArray::index(const IndexVector& args) { return repn->index(args); }
118120

119121
std::shared_ptr<ParameterTerm> ParameterArrayRepn::index(const IndexVector& args)
@@ -179,6 +181,8 @@ ParameterArray& ParameterArray::name(const std::string& name)
179181
return *this;
180182
}
181183

184+
std::string ParameterArray::name() const { return repn->value_template.repn->name; }
185+
182186
//
183187
// OTHER
184188
//
@@ -197,8 +201,7 @@ ParameterArray& Model::add_parameter(ParameterArray& params)
197201
params.repn->expand();
198202
if (repn->name_generation_policy == Model::NameGeneration::eager)
199203
params.generate_names();
200-
else if (repn->name_generation_policy == Model::NameGeneration::lazy)
201-
repn->parameter_arrays.push_back(params);
204+
repn->parameter_arrays.push_back(params);
202205
return params;
203206
}
204207

Diff for: lib/coek/coek/api/parameter_array.hpp

+5-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ class ParameterArray : public ParameterAssocArray {
1515
public:
1616
std::shared_ptr<ParameterArrayRepn> repn;
1717
std::shared_ptr<ParameterAssocArrayRepn> get_repn();
18+
const std::shared_ptr<ParameterAssocArrayRepn> get_repn() const;
1819

1920
Parameter index(const IndexVector& args);
2021
void index_error(size_t i);
@@ -104,7 +105,7 @@ class ParameterArray : public ParameterAssocArray {
104105
if (dim() != nargs)
105106
index_error(nargs);
106107
collect_refargs(static_cast<size_t>(0), args...);
107-
return create_paramref(reftmp);
108+
return create_ref(reftmp);
108109
}
109110
#endif
110111

@@ -149,6 +150,9 @@ class ParameterArray : public ParameterAssocArray {
149150

150151
/** Set the name of the parameter. \returns the parameter object */
151152
ParameterArray& name(const std::string& name);
153+
/** Get the name of the parameter. \returns the parameter string name */
154+
std::string name() const;
155+
152156
};
153157

154158
ParameterArray parameter(size_t n);

Diff for: lib/coek/coek/api/parameter_assoc_array.cpp

+5-5
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,22 @@
55

66
namespace coek {
77

8-
size_t ParameterAssocArray::size() { return get_repn()->size(); }
8+
size_t ParameterAssocArray::size() const { return get_repn()->size(); }
99

10-
size_t ParameterAssocArray::dim() { return get_repn()->dim(); }
10+
size_t ParameterAssocArray::dim() const { return get_repn()->dim(); }
1111

1212
std::vector<Parameter>::iterator ParameterAssocArray::begin() { return get_repn()->values.begin(); }
1313

1414
std::vector<Parameter>::iterator ParameterAssocArray::end() { return get_repn()->values.end(); }
1515

1616
#ifdef COEK_WITH_COMPACT_MODEL
17-
expr_pointer_t create_paramref(const std::vector<refarg_types>& indices, const std::string& name,
17+
expr_pointer_t create_ref(const std::vector<refarg_types>& indices, const std::string& name,
1818
std::shared_ptr<AssocArrayBase<ParameterTerm>> var);
1919

20-
Expression ParameterAssocArray::create_paramref(const std::vector<refarg_types>& args)
20+
Expression ParameterAssocArray::create_ref(const std::vector<refarg_types>& args)
2121
{
2222
auto repn = get_repn();
23-
return coek::create_paramref(args, repn->value_template.name(), repn);
23+
return coek::create_ref(args, repn->value_template.name(), repn);
2424
}
2525
#endif
2626

Diff for: lib/coek/coek/api/parameter_assoc_array.hpp

+4-3
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,20 @@ namespace coek {
77
class ParameterAssocArray {
88
public:
99
virtual std::shared_ptr<ParameterAssocArrayRepn> get_repn() = 0;
10+
virtual const std::shared_ptr<ParameterAssocArrayRepn> get_repn() const = 0;
1011
IndexVector tmp;
1112
std::vector<refarg_types> reftmp;
1213

1314
public:
1415
std::vector<Parameter>::iterator begin();
1516
std::vector<Parameter>::iterator end();
1617

17-
size_t size();
18-
size_t dim();
18+
size_t size() const;
19+
size_t dim() const;
1920

2021
// virtual Parameter index(const IndexVector& args) = 0;
2122
#ifdef COEK_WITH_COMPACT_MODEL
22-
Expression create_paramref(const std::vector<refarg_types>& indices);
23+
Expression create_ref(const std::vector<refarg_types>& indices);
2324
#endif
2425
};
2526

Diff for: lib/coek/coek/api/parameter_assoc_array_repn.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class ParameterAssocArrayRepn : public AssocArrayBase<ParameterTerm> {
2626
void name(const std::string& name);
2727

2828
#ifdef COEK_WITH_COMPACT_MODEL
29-
expr_pointer_t create_paramref(const std::vector<refarg_types>& indices);
29+
expr_pointer_t create_ref(const std::vector<refarg_types>& indices);
3030
#endif
3131
};
3232

Diff for: lib/coek/coek/api/variable_array.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -280,8 +280,7 @@ VariableArray& Model::add_variable(VariableArray& vars)
280280
vars.expand();
281281
if (repn->name_generation_policy == Model::NameGeneration::eager)
282282
vars.generate_names();
283-
else if (repn->name_generation_policy == Model::NameGeneration::lazy)
284-
repn->variable_arrays.push_back(vars);
283+
repn->variable_arrays.push_back(vars);
285284
for (auto& var : vars.repn->values)
286285
add_variable(var);
287286
return vars;

Diff for: lib/coek/coek/api/variable_array.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ class VariableArray : public VariableAssocArray {
112112
if (dim() != nargs)
113113
index_error(nargs);
114114
collect_refargs(static_cast<size_t>(0), args...);
115-
return create_varref(reftmp);
115+
return create_ref(reftmp);
116116
}
117117
#endif
118118

Diff for: lib/coek/coek/api/variable_assoc_array.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,13 @@ std::vector<Variable>::iterator VariableAssocArray::begin() { return get_repn()-
1616
std::vector<Variable>::iterator VariableAssocArray::end() { return get_repn()->values.end(); }
1717

1818
#ifdef COEK_WITH_COMPACT_MODEL
19-
expr_pointer_t create_varref(const std::vector<refarg_types>& indices, const std::string& name,
19+
expr_pointer_t create_ref(const std::vector<refarg_types>& indices, const std::string& name,
2020
std::shared_ptr<AssocArrayBase<VariableTerm>> var);
2121

22-
Expression VariableAssocArray::create_varref(const std::vector<refarg_types>& args)
22+
Expression VariableAssocArray::create_ref(const std::vector<refarg_types>& args)
2323
{
2424
auto repn = get_repn();
25-
return coek::create_varref(args, get_repn()->value_template.name(), repn);
25+
return coek::create_ref(args, get_repn()->value_template.name(), repn);
2626
}
2727
#endif
2828

Diff for: lib/coek/coek/api/variable_assoc_array.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class VariableAssocArray {
2121
void expand();
2222

2323
#ifdef COEK_WITH_COMPACT_MODEL
24-
Expression create_varref(const std::vector<refarg_types>& indices);
24+
Expression create_ref(const std::vector<refarg_types>& indices);
2525
#endif
2626
};
2727

Diff for: lib/coek/coek/api/variable_assoc_array_repn.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,11 @@ void VariableAssocArrayRepn::name(const std::string& name)
146146
}
147147
}
148148

149+
std::string VariableAssocArrayRepn::name()
150+
{
151+
return value_template.name();
152+
}
153+
149154
void VariableAssocArrayRepn::within(VariableTypes vtype)
150155
{
151156
value_template.within(vtype);

Diff for: lib/coek/coek/api/variable_assoc_array_repn.hpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,14 @@ class VariableAssocArrayRepn : public AssocArrayBase<VariableTerm> {
4646

4747
/** Set the name of the variable. \returns the variable object */
4848
void name(const std::string& name);
49+
/** Get the name of the variable. */
50+
std::string name();
4951

5052
/** Set the variable type. \returns the variable object */
5153
void within(VariableTypes vtype);
5254

5355
#ifdef COEK_WITH_COMPACT_MODEL
54-
expr_pointer_t create_varref(const std::vector<refarg_types>& indices);
56+
expr_pointer_t create_ref(const std::vector<refarg_types>& indices);
5557
#endif
5658
};
5759

Diff for: lib/coek/coek/ast/compact_terms.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ expr_pointer_t ParameterRefTerm::get_concrete_parameter()
3838
return param->index(tmp);
3939
}
4040

41-
expr_pointer_t create_paramref(const std::vector<refarg_types>& indices, const std::string& name,
41+
expr_pointer_t create_ref(const std::vector<refarg_types>& indices, const std::string& name,
4242
std::shared_ptr<AssocArrayBase<ParameterTerm>> param)
4343
{
4444
return CREATE_POINTER(ParameterRefTerm, indices, name, param);
@@ -79,7 +79,7 @@ expr_pointer_t VariableRefTerm::get_concrete_variable()
7979
return var->index(tmp);
8080
}
8181

82-
expr_pointer_t create_varref(const std::vector<refarg_types>& indices, const std::string& name,
82+
expr_pointer_t create_ref(const std::vector<refarg_types>& indices, const std::string& name,
8383
std::shared_ptr<AssocArrayBase<VariableTerm>> var)
8484
{
8585
return CREATE_POINTER(VariableRefTerm, indices, name, var);

Diff for: lib/coek/coek/ast/value_terms.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
namespace coek {
88

9+
//void xyz();
10+
911
namespace {
1012

1113
//

Diff for: lib/coek/coek/compact/parameter_map.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -179,8 +179,7 @@ ParameterMap& Model::add_parameter(ParameterMap& params)
179179
params.repn->expand();
180180
if (repn->name_generation_policy == Model::NameGeneration::eager)
181181
params.generate_names();
182-
else if (repn->name_generation_policy == Model::NameGeneration::lazy)
183-
repn->parameter_maps.push_back(params);
182+
repn->parameter_maps.push_back(params);
184183
return params;
185184
}
186185

Diff for: lib/coek/coek/compact/parameter_map.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ class ParameterMap : public ParameterAssocArray {
9191
if (dim() != nargs)
9292
index_error(nargs);
9393
collect_refargs(static_cast<size_t>(0), args...);
94-
return create_paramref(reftmp);
94+
return create_ref(reftmp);
9595
}
9696

9797
template <typename... ARGTYPES>

Diff for: lib/coek/coek/compact/variable_map.cpp

+9-2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010

1111
namespace coek {
1212

13+
//void xyz();
14+
1315
//
1416
// VariableMapRepn
1517
//
@@ -50,6 +52,7 @@ class VariableMapRepn : public VariableAssocArrayRepn {
5052

5153
void VariableMapRepn::generate_names()
5254
{
55+
//xyz();
5356
// If no name has been provided to this map object,
5457
// then we do not try to generate names. The default/simple
5558
// variable names will be used.
@@ -235,6 +238,11 @@ VariableMap& VariableMap::name(const std::string& name)
235238
return *this;
236239
}
237240

241+
std::string VariableMap::name()
242+
{
243+
return repn->name();
244+
}
245+
238246
VariableMap& VariableMap::within(VariableTypes vtype)
239247
{
240248
repn->within(vtype);
@@ -254,8 +262,7 @@ VariableMap& Model::add_variable(VariableMap& vars)
254262
vars.repn->expand();
255263
if (repn->name_generation_policy == Model::NameGeneration::eager)
256264
vars.generate_names();
257-
else if (repn->name_generation_policy == Model::NameGeneration::lazy)
258-
repn->variable_maps.push_back(vars);
265+
repn->variable_maps.push_back(vars);
259266
for (auto& var : vars.repn->values)
260267
add_variable(var);
261268
return vars;

Diff for: lib/coek/coek/compact/variable_map.hpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ class VariableMap : public VariableAssocArray {
9292
if (dim() != nargs)
9393
index_error(nargs);
9494
collect_refargs(static_cast<size_t>(0), args...);
95-
return create_varref(reftmp);
95+
return create_ref(reftmp);
9696
}
9797

9898
template <typename... ARGTYPES>
@@ -154,6 +154,8 @@ class VariableMap : public VariableAssocArray {
154154

155155
/** Set the name of the variable. \returns the variable object */
156156
VariableMap& name(const std::string& name);
157+
/** Get the name of the variable. */
158+
std::string name();
157159

158160
/** Set the variable type. \returns the variable object */
159161
VariableMap& within(VariableTypes vtype);

Diff for: lib/coek/coek/model/compact_model.cpp

+5-6
Original file line numberDiff line numberDiff line change
@@ -212,19 +212,18 @@ void CompactModel::add(ConstraintSequence&& seq) { repn->constraints.push_back(s
212212

213213
Model CompactModel::expand()
214214
{
215+
//std::cout << "CompactModel::expand()" << std::endl;
215216
Model model;
216217

217218
for (auto& val : repn->parameters) {
218-
/*
219219
if (auto eval = std::get_if<Parameter>(&val)) {
220220
// NOTE: Are we expanding this parameter in place? Do we need to create a copy
221221
// of this parameter within all expressions?
222222
Expression value = eval->value_expression().expand();
223223
eval->value(value.value());
224224
//model.add_parameter(*eval);
225225
}
226-
else */
227-
if (auto eval = std::get_if<ParameterMap>(&val)) {
226+
else if (auto eval = std::get_if<ParameterMap>(&val)) {
228227
for (auto param : *eval) {
229228
// NOTE: Are we changing the values of these maps in place?
230229
Expression value = param.value_expression().expand();
@@ -242,7 +241,7 @@ Model CompactModel::expand()
242241
}
243242
}
244243

245-
// std::cerr << "VARIABLES " << repn->variables.size() << std::endl;
244+
//std::cout << "VARIABLES " << repn->variables.size() << std::endl;
246245
for (auto& val : repn->variables) {
247246
if (auto eval = std::get_if<Variable>(&val)) {
248247
auto var = eval->expand();
@@ -261,12 +260,12 @@ Model CompactModel::expand()
261260
}
262261
}
263262
else if (auto eval = std::get_if<VariableMap>(&val)) {
264-
// std::cerr << "VARIABLEMAP " << eval->size() << std::endl;
263+
//std::cout << "VARIABLE_MAP " << eval->name() << " " << eval->size() << std::endl;
265264
eval->expand();
266265
model.add_variable(*eval);
267266
}
268267
else if (auto eval = std::get_if<VariableArray>(&val)) {
269-
// std::cerr << "VARIABLEARRAY " << eval->size() << std::endl;
268+
//std::cerr << "VARIABLE_ARRAY " << eval->name() << " " << eval->size() << std::endl;
270269
eval->expand();
271270
model.add_variable(*eval);
272271
}

Diff for: lib/coek/coek/model/model.cpp

+12-4
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
namespace coek {
1818

19+
//void xyz(){}
20+
1921
//
2022
// Model
2123
//
@@ -76,6 +78,10 @@ std::string Model::name() const { return repn->name; }
7678

7779
void Model::name(const std::string& name) { repn->name = name; }
7880

81+
// NOTE: THESE TWO METHODS DO NOT STORE SINGLETON PARAMETERS ON THE MODEL
82+
Parameter& Model::add_parameter(Parameter& param) { return param; }
83+
Parameter& Model::add(Parameter& param) { return param; }
84+
7985
#if __cpp_lib_variant
8086
ParameterArray& Model::add(ParameterArray& param) { return add_parameter(param); }
8187
ParameterArray& Model::add(ParameterArray&& param) { return add_parameter(param); }
@@ -320,21 +326,23 @@ std::map<std::string, Constraint>& Model::get_constraints_by_name()
320326

321327
void Model::generate_names()
322328
{
323-
if (repn->name_generation_policy == Model::NameGeneration::lazy) {
324-
#if __cpp_lib_variant
329+
//std::cout << "MODEL generate_names()" << std::endl;
330+
if (repn->name_generation_policy != Model::NameGeneration::simple) {
331+
//std::cout << "NOT SIMPLE " << repn->parameter_arrays.size() << " " << repn->variable_arrays.size() << " " << repn->parameter_maps.size() << " " << repn->variable_maps.size() << std::endl;
325332
for (auto& parray : repn->parameter_arrays)
326333
parray.generate_names();
327334
for (auto& varray : repn->variable_arrays)
328335
varray.generate_names();
329336
# ifdef COEK_WITH_COMPACT_MODEL
330337
for (auto& pmap : repn->parameter_maps)
331338
pmap.generate_names();
332-
for (auto& vmap : repn->variable_maps)
339+
for (auto& vmap : repn->variable_maps) {
340+
//std::cout << "Var " << vmap.name() << std::endl;
333341
vmap.generate_names();
342+
}
334343
# endif
335344
for (auto& cmap : repn->constraint_maps)
336345
cmap.generate_names();
337-
#endif
338346
}
339347

340348
repn->variables_by_name.clear();

0 commit comments

Comments
 (0)