Skip to content

Commit b0b9760

Browse files
committed
Several changes
1. Extending pycoek to setup data/param/var data with SequenceContext objects 2. Enable expand() logic for Parameter's
1 parent c4aa19b commit b0b9760

File tree

6 files changed

+100
-36
lines changed

6 files changed

+100
-36
lines changed

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

+8
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,14 @@ Parameter& Parameter::name(const std::string& name)
4646
return *this;
4747
}
4848

49+
Parameter Parameter::expand()
50+
{
51+
#ifdef COEK_WITH_COMPACT_MODEL
52+
value(this->value_expression().expand());
53+
#endif
54+
return *this;
55+
}
56+
4957
std::ostream& operator<<(std::ostream& ostr, const Parameter& arg)
5058
{
5159
write_expr(arg.repn, ostr);

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

+3
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,9 @@ class Parameter {
140140
/** \returns \c false because this is not a contant */
141141
bool is_constant() const { return false; }
142142

143+
/** \returns an expanded Parameter */
144+
Parameter expand();
145+
143146
/**
144147
* \name Stream operator
145148
*

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include <unordered_map>
22

3+
#include "coek/util/io_utils.hpp"
34
#include "coek/ast/compact_terms.hpp"
45
#include "coek/api/parameter_assoc_array_repn.hpp"
56
#include "coek/compact/coek_sets.hpp"
@@ -27,7 +28,6 @@ class ParameterMapRepn : public ParameterAssocArrayRepn {
2728
#endif
2829
}
2930

30-
// ParameterMapRepn(const SequenceContext& _arg) : concrete_set(_arg.index_set())
3131
ParameterMapRepn(const SequenceContext& _arg) : context(_arg), index_sequence(context)
3232
{
3333
index_set = context.index_set();
@@ -92,8 +92,8 @@ void ParameterMapRepn::generate_names()
9292
void ParameterMapRepn::expand()
9393
{
9494
if (first_expand) {
95+
// std::cout << "HERE - Expanding " << value_template.name() << std::endl;
9596
first_expand = false;
96-
// ParameterAssocArrayRepn::expand();
9797

9898
size_t _dim = dim();
9999
IndexVector x(_dim);

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ expr_pointer_t visit_IndexParameterTerm(const expr_pointer_t& expr)
3030
else
3131
throw std::runtime_error(
3232
"Unexpected index parameter in an expression being converted, with a non-numeric "
33-
"value.");
33+
"value: "
34+
+ tmp->name);
3435
}
3536

3637
expr_pointer_t visit_VariableRefTerm(const expr_pointer_t& expr)

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

+8-7
Original file line numberDiff line numberDiff line change
@@ -257,8 +257,7 @@ Model CompactModel::expand()
257257
if (auto eval = std::get_if<Parameter>(&val)) {
258258
// NOTE: Are we expanding this data in place? Do we need to create a copy
259259
// of this parameter within all expressions?
260-
Expression value = eval->value_expression().expand();
261-
eval->value(value.value());
260+
eval->expand();
262261
// model.add_parameter(*eval);
263262
}
264263
else
@@ -287,15 +286,16 @@ Model CompactModel::expand()
287286
}
288287
}
289288

289+
// std::cout << "Expanding parameters " << repn->parameters.size() << std::endl;
290290
for (auto& val : repn->parameters) {
291291
if (auto eval = std::get_if<Parameter>(&val)) {
292-
// NOTE: Are we expanding this parameter in place? Do we need to create a copy
293-
// of this parameter within all expressions?
294-
Expression value = eval->value_expression().expand();
295-
eval->value(value.value());
296-
// model.add_parameter(*eval);
292+
// std::cout << "Parameter " << eval->name() << std::endl;
293+
// NOTE: We are expanding this parameter in place so we do not need to create a copy
294+
// of this parameter within all expressions
295+
eval->expand();
297296
}
298297
else if (auto eval = std::get_if<ParameterMap>(&val)) {
298+
// std::cout << "HERE x" << std::endl;
299299
eval->expand();
300300
for (auto param : *eval) {
301301
// NOTE: Are we changing the values of these maps in place?
@@ -305,6 +305,7 @@ Model CompactModel::expand()
305305
model.repn->parameter_maps.push_back(*eval);
306306
}
307307
else if (auto eval = std::get_if<ParameterArray>(&val)) {
308+
// std::cout << "HERE y" << std::endl;
308309
eval->expand();
309310
for (auto param : *eval) {
310311
// NOTE: Are we changing the values of these maps in place?

Diff for: lib/pycoek/pybind11/pycoek_pybind11.cpp

+77-26
Original file line numberDiff line numberDiff line change
@@ -293,18 +293,46 @@ py::list to_nested_list(std::list<std::string>::iterator& it, std::list<std::str
293293
return tmp;
294294
}
295295

296-
template <typename TYPE>
297-
void parse_varargs(py::kwargs kwargs, const char* name, TYPE& lb, TYPE _default)
296+
bool parse_varargs(py::kwargs kwargs, const char* name, bool _default)
298297
{
299-
lb = _default;
298+
bool ans(_default);
300299
try {
301-
auto _lb = kwargs[name];
302-
if (_lb.is_none())
303-
return;
304-
lb = _lb.cast<TYPE>();
300+
auto _val = kwargs[name];
301+
if (_val.is_none())
302+
return ans;
303+
try {
304+
ans = _val.cast<double>();
305+
}
306+
catch (std::exception& err) {
307+
}
308+
}
309+
catch (std::exception& err) {
310+
}
311+
return ans;
312+
}
313+
314+
coek::Expression parse_varargs(py::kwargs kwargs, const char* name, double _default)
315+
{
316+
coek::Expression ans(_default);
317+
try {
318+
auto _val = kwargs[name];
319+
if (_val.is_none())
320+
return ans;
321+
try {
322+
double val = _val.cast<double>();
323+
return coek::Expression(val);
324+
}
325+
catch (std::exception& err) {
326+
}
327+
try {
328+
return _val.cast<Expression>();
329+
}
330+
catch (std::exception& err) {
331+
}
305332
}
306333
catch (std::exception& err) {
307334
}
335+
return ans;
308336
}
309337

310338
class VecKeyIterator {
@@ -509,14 +537,12 @@ VariableArray* variable_fn(int n, py::kwargs kwargs)
509537
template <class TYPE>
510538
void set_kwargs(TYPE& var, py::kwargs kwargs)
511539
{
512-
double lb, ub, value;
513-
bool binary, integer, fixed;
514-
parse_varargs<double>(kwargs, "lb", lb, -COEK_INFINITY);
515-
parse_varargs<double>(kwargs, "ub", ub, COEK_INFINITY);
516-
parse_varargs<double>(kwargs, "value", value, NAN);
517-
parse_varargs<bool>(kwargs, "binary", binary, false);
518-
parse_varargs<bool>(kwargs, "integer", integer, false);
519-
parse_varargs<bool>(kwargs, "fixed", fixed, false);
540+
auto lb = parse_varargs(kwargs, "lb", -COEK_INFINITY);
541+
auto ub = parse_varargs(kwargs, "ub", COEK_INFINITY);
542+
auto value = parse_varargs(kwargs, "value", NAN);
543+
auto binary = parse_varargs(kwargs, "binary", false);
544+
auto integer = parse_varargs(kwargs, "integer", false);
545+
auto fixed = parse_varargs(kwargs, "fixed", false);
520546

521547
try {
522548
var.value(value).bounds(lb, ub).fixed(fixed);
@@ -542,8 +568,7 @@ void set_kwargs(TYPE& var, py::kwargs kwargs)
542568
template <class TYPE>
543569
void set_param_kwargs(TYPE& param, py::kwargs kwargs)
544570
{
545-
double value;
546-
parse_varargs<double>(kwargs, "value", value, NAN);
571+
auto value = parse_varargs(kwargs, "value", NAN);
547572

548573
try {
549574
param.value(value);
@@ -566,13 +591,11 @@ void set_param_kwargs(TYPE& param, py::kwargs kwargs)
566591
template <class TYPE>
567592
void set_kwargs_varmap(TYPE& var, py::kwargs kwargs)
568593
{
569-
double lb, ub, value;
570-
bool binary, integer;
571-
parse_varargs<double>(kwargs, "lb", lb, -COEK_INFINITY);
572-
parse_varargs<double>(kwargs, "ub", ub, COEK_INFINITY);
573-
parse_varargs<double>(kwargs, "value", value, NAN);
574-
parse_varargs<bool>(kwargs, "binary", binary, false);
575-
parse_varargs<bool>(kwargs, "integer", integer, false);
594+
auto lb = parse_varargs(kwargs, "lb", -COEK_INFINITY);
595+
auto ub = parse_varargs(kwargs, "ub", COEK_INFINITY);
596+
auto value = parse_varargs(kwargs, "value", NAN);
597+
auto binary = parse_varargs(kwargs, "binary", false);
598+
auto integer = parse_varargs(kwargs, "integer", false);
576599
// parse_varargs<bool>(kwargs, "fixed", fixed, false);
577600

578601
try {
@@ -603,11 +626,17 @@ VariableMap variable_fn(coek::ConcreteSet& index_set, py::kwargs kwargs)
603626
return tmp;
604627
}
605628

629+
VariableMap variable_fn(coek::SequenceContext& context, py::kwargs kwargs)
630+
{
631+
VariableMap tmp(context);
632+
set_kwargs_varmap(tmp, kwargs);
633+
return tmp;
634+
}
635+
606636
template <class TYPE>
607637
void set_kwargs_parammap(TYPE& param, py::kwargs kwargs)
608638
{
609-
double value;
610-
parse_varargs<double>(kwargs, "value", value, NAN);
639+
auto value = parse_varargs(kwargs, "value", NAN);
611640

612641
try {
613642
param.value(value);
@@ -633,12 +662,26 @@ ParameterMap parameter_fn(coek::ConcreteSet& index_set, py::kwargs kwargs)
633662
return tmp;
634663
}
635664

665+
ParameterMap parameter_fn(coek::SequenceContext& context, py::kwargs kwargs)
666+
{
667+
ParameterMap tmp(context);
668+
set_kwargs_parammap(tmp, kwargs);
669+
return tmp;
670+
}
671+
636672
DataMap data_fn(coek::ConcreteSet& index_set, py::kwargs kwargs)
637673
{
638674
DataMap tmp(index_set);
639675
set_kwargs_parammap(tmp, kwargs);
640676
return tmp;
641677
}
678+
679+
DataMap data_fn(coek::SequenceContext& context, py::kwargs kwargs)
680+
{
681+
DataMap tmp(context);
682+
set_kwargs_parammap(tmp, kwargs);
683+
return tmp;
684+
}
642685
#endif
643686

644687
VariableArray variable_fn(std::vector<int>& dimen, py::kwargs kwargs)
@@ -874,11 +917,19 @@ PYBIND11_MODULE(pycoek_pybind11, m)
874917
m.def("variable_", [](coek::ConcreteSet& index_set, py::kwargs kw) {
875918
return coek::variable_fn(index_set, kw);
876919
});
920+
m.def("variable_", [](coek::SequenceContext& context, py::kwargs kw) {
921+
return coek::variable_fn(context, kw);
922+
});
923+
m.def("parameter_", [](coek::SequenceContext& contxt, py::kwargs kw) {
924+
return coek::parameter_fn(contxt, kw);
925+
});
877926
m.def("parameter_", [](coek::ConcreteSet& index_set, py::kwargs kw) {
878927
return coek::parameter_fn(index_set, kw);
879928
});
880929
m.def("data_",
881930
[](coek::ConcreteSet& index_set, py::kwargs kw) { return coek::data_fn(index_set, kw); });
931+
m.def("data_",
932+
[](coek::SequenceContext& context, py::kwargs kw) { return coek::data_fn(context, kw); });
882933
#endif
883934
m.def("affine_expression", [](std::vector<double>& coef, std::vector<coek::Variable>& var,
884935
double offset) { return affine_expression(coef, var, offset); });

0 commit comments

Comments
 (0)