@@ -293,18 +293,46 @@ py::list to_nested_list(std::list<std::string>::iterator& it, std::list<std::str
293
293
return tmp;
294
294
}
295
295
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)
298
297
{
299
- lb = _default;
298
+ bool ans ( _default) ;
300
299
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
+ }
305
332
}
306
333
catch (std::exception & err) {
307
334
}
335
+ return ans;
308
336
}
309
337
310
338
class VecKeyIterator {
@@ -509,14 +537,12 @@ VariableArray* variable_fn(int n, py::kwargs kwargs)
509
537
template <class TYPE >
510
538
void set_kwargs (TYPE& var, py::kwargs kwargs)
511
539
{
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 );
520
546
521
547
try {
522
548
var.value (value).bounds (lb, ub).fixed (fixed);
@@ -542,8 +568,7 @@ void set_kwargs(TYPE& var, py::kwargs kwargs)
542
568
template <class TYPE >
543
569
void set_param_kwargs (TYPE& param, py::kwargs kwargs)
544
570
{
545
- double value;
546
- parse_varargs<double >(kwargs, " value" , value, NAN);
571
+ auto value = parse_varargs (kwargs, " value" , NAN);
547
572
548
573
try {
549
574
param.value (value);
@@ -566,13 +591,11 @@ void set_param_kwargs(TYPE& param, py::kwargs kwargs)
566
591
template <class TYPE >
567
592
void set_kwargs_varmap (TYPE& var, py::kwargs kwargs)
568
593
{
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 );
576
599
// parse_varargs<bool>(kwargs, "fixed", fixed, false);
577
600
578
601
try {
@@ -603,11 +626,17 @@ VariableMap variable_fn(coek::ConcreteSet& index_set, py::kwargs kwargs)
603
626
return tmp;
604
627
}
605
628
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
+
606
636
template <class TYPE >
607
637
void set_kwargs_parammap (TYPE& param, py::kwargs kwargs)
608
638
{
609
- double value;
610
- parse_varargs<double >(kwargs, " value" , value, NAN);
639
+ auto value = parse_varargs (kwargs, " value" , NAN);
611
640
612
641
try {
613
642
param.value (value);
@@ -633,12 +662,26 @@ ParameterMap parameter_fn(coek::ConcreteSet& index_set, py::kwargs kwargs)
633
662
return tmp;
634
663
}
635
664
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
+
636
672
DataMap data_fn (coek::ConcreteSet& index_set, py::kwargs kwargs)
637
673
{
638
674
DataMap tmp (index_set);
639
675
set_kwargs_parammap (tmp, kwargs);
640
676
return tmp;
641
677
}
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
+ }
642
685
#endif
643
686
644
687
VariableArray variable_fn (std::vector<int >& dimen, py::kwargs kwargs)
@@ -874,11 +917,19 @@ PYBIND11_MODULE(pycoek_pybind11, m)
874
917
m.def (" variable_" , [](coek::ConcreteSet& index_set, py::kwargs kw) {
875
918
return coek::variable_fn (index_set, kw);
876
919
});
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
+ });
877
926
m.def (" parameter_" , [](coek::ConcreteSet& index_set, py::kwargs kw) {
878
927
return coek::parameter_fn (index_set, kw);
879
928
});
880
929
m.def (" data_" ,
881
930
[](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); });
882
933
#endif
883
934
m.def (" affine_expression" , [](std::vector<double >& coef, std::vector<coek::Variable>& var,
884
935
double offset) { return affine_expression (coef, var, offset); });
0 commit comments