or-tools 0.4.1 → 0.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7ce5b035a9a0f52391ef97cd12d32ec7632101940fde4e2f19de4887900a4dc1
4
- data.tar.gz: c63b37906fb5337cd805c627266422ccfc698d3759456327e2414f5e31e4ab52
3
+ metadata.gz: 4e179505f9df7d80af6a316ca719594fa2a99839c8c26b0f33ee1551b4e7b2d3
4
+ data.tar.gz: b05dc3c553d11112e55855bb91b0382a3a648a14848e5c9d6e3805bf52e009fb
5
5
  SHA512:
6
- metadata.gz: 5eda4c29a50790d7c569e67b9538ac2c13a6cd20af1580cd679a68d386244b5cd1bbafa311c52fe9cad519652bbfb6666aed09e6a5ae1f7c71cc666491644d4f
7
- data.tar.gz: 5241d2788f6883ca0349967e4f953382cd03564fe4856e853888518427a2ed5ec8a8cf948aac34a02b39f413c787eeb98ff22284f59359f7cf9a9aa73b449188
6
+ metadata.gz: fa77b818baf408c3cf30b56065f0b9b7f877358e1f0d39718a3ebc1f49fc4dae78da9678875c340895427f189074939e220ffa320207bea76bd0d7921f0675d7
7
+ data.tar.gz: 7c174df348ad0835c93a56ecb51a6f9763aaba43f0d3fc3eaf0b8b745922a204d86ee6fae6ba3fba632b284179251decbbfce17b2a1dd1e608d91b96cf3ff9ec
data/CHANGELOG.md CHANGED
@@ -1,3 +1,28 @@
1
+ ## 0.5.2 (2021-07-07)
2
+
3
+ - Added `export_model_as_lp_format` and `export_model_as_mps_format` to `Solver`
4
+
5
+ ## 0.5.1 (2021-05-23)
6
+
7
+ - Updated to Rice 4
8
+
9
+ ## 0.5.0 (2021-04-30)
10
+
11
+ - Updated OR-Tools to 9.0
12
+ - Added binary installation for CentOS 7
13
+ - Added `sufficient_assumptions_for_infeasibility` to `CpSolver`
14
+
15
+ ## 0.4.3 (2021-03-26)
16
+
17
+ - Added `add_assumption`, `add_assumptions`, and `clear_assumptions` to `CpModel`
18
+ - Added `add_hint` and `clear_hints` to `CpModel`
19
+ - Added `only_enforce_if` to `SatConstraint`
20
+ - Fixed installation for Debian
21
+
22
+ ## 0.4.2 (2021-03-03)
23
+
24
+ - Updated OR-Tools to 8.2
25
+
1
26
  ## 0.4.1 (2021-02-23)
2
27
 
3
28
  - Added solution printers
@@ -1,12 +1,9 @@
1
1
  #include <ortools/graph/assignment.h>
2
2
 
3
- #include <rice/Array.hpp>
4
- #include <rice/Constructor.hpp>
5
- #include <rice/Module.hpp>
3
+ #include "ext.h"
6
4
 
7
5
  using operations_research::SimpleLinearSumAssignment;
8
6
 
9
- using Rice::Array;
10
7
  using Rice::Symbol;
11
8
 
12
9
  void init_assignment(Rice::Module& m) {
@@ -23,7 +20,7 @@ void init_assignment(Rice::Module& m) {
23
20
  .define_method("assignment_cost", &SimpleLinearSumAssignment::AssignmentCost)
24
21
  .define_method(
25
22
  "solve",
26
- *[](SimpleLinearSumAssignment& self) {
23
+ [](SimpleLinearSumAssignment& self) {
27
24
  auto status = self.Solve();
28
25
 
29
26
  if (status == SimpleLinearSumAssignment::Status::OPTIMAL) {
@@ -1,8 +1,6 @@
1
1
  #include <ortools/algorithms/knapsack_solver.h>
2
2
 
3
- #include <rice/Array.hpp>
4
- #include <rice/Constructor.hpp>
5
- #include <rice/Module.hpp>
3
+ #include "ext.h"
6
4
 
7
5
  using operations_research::KnapsackSolver;
8
6
 
@@ -10,16 +8,31 @@ using Rice::Array;
10
8
  using Rice::Object;
11
9
  using Rice::Symbol;
12
10
 
13
- template<>
14
- inline
15
- KnapsackSolver::SolverType from_ruby<KnapsackSolver::SolverType>(Object x)
11
+ namespace Rice::detail
16
12
  {
17
- std::string s = Symbol(x).str();
18
- if (s == "branch_and_bound") {
19
- return KnapsackSolver::KNAPSACK_MULTIDIMENSION_BRANCH_AND_BOUND_SOLVER;
20
- } else {
21
- throw std::runtime_error("Unknown solver type: " + s);
22
- }
13
+ template<>
14
+ struct Type<KnapsackSolver::SolverType>
15
+ {
16
+ static bool verify()
17
+ {
18
+ return true;
19
+ }
20
+ };
21
+
22
+ template<>
23
+ class From_Ruby<KnapsackSolver::SolverType>
24
+ {
25
+ public:
26
+ KnapsackSolver::SolverType convert(VALUE x)
27
+ {
28
+ auto s = Symbol(x).str();
29
+ if (s == "branch_and_bound") {
30
+ return KnapsackSolver::KNAPSACK_MULTIDIMENSION_BRANCH_AND_BOUND_SOLVER;
31
+ } else {
32
+ throw std::runtime_error("Unknown solver type: " + s);
33
+ }
34
+ }
35
+ };
23
36
  }
24
37
 
25
38
  void init_bin_packing(Rice::Module& m) {
@@ -29,27 +42,7 @@ void init_bin_packing(Rice::Module& m) {
29
42
  .define_method("best_solution_contains?", &KnapsackSolver::BestSolutionContains)
30
43
  .define_method(
31
44
  "init",
32
- *[](KnapsackSolver& self, Array rb_values, Array rb_weights, Array rb_capacities) {
33
- std::vector<int64> values;
34
- for (std::size_t i = 0; i < rb_values.size(); ++i) {
35
- values.push_back(from_ruby<int64>(rb_values[i]));
36
- }
37
-
38
- std::vector<std::vector<int64>> weights;
39
- for (std::size_t i = 0; i < rb_weights.size(); ++i) {
40
- Array rb_w = Array(rb_weights[i]);
41
- std::vector<int64> w;
42
- for (std::size_t j = 0; j < rb_w.size(); ++j) {
43
- w.push_back(from_ruby<int64>(rb_w[j]));
44
- }
45
- weights.push_back(w);
46
- }
47
-
48
- std::vector<int64> capacities;
49
- for (std::size_t i = 0; i < rb_capacities.size(); ++i) {
50
- capacities.push_back(from_ruby<int64>(rb_capacities[i]));
51
- }
52
-
45
+ [](KnapsackSolver& self, std::vector<int64_t> values, std::vector<std::vector<int64_t>> weights, std::vector<int64_t> capacities) {
53
46
  self.Init(values, weights, capacities);
54
47
  });
55
48
  }
@@ -1,9 +1,7 @@
1
1
  #include <google/protobuf/text_format.h>
2
2
  #include <ortools/sat/cp_model.h>
3
3
 
4
- #include <rice/Array.hpp>
5
- #include <rice/Constructor.hpp>
6
- #include <rice/Module.hpp>
4
+ #include "ext.h"
7
5
 
8
6
  using operations_research::sat::BoolVar;
9
7
  using operations_research::sat::Constraint;
@@ -20,153 +18,113 @@ using operations_research::sat::SolutionBooleanValue;
20
18
  using operations_research::sat::SolutionIntegerValue;
21
19
 
22
20
  using Rice::Array;
21
+ using Rice::Class;
23
22
  using Rice::Object;
24
23
  using Rice::String;
25
24
  using Rice::Symbol;
26
25
 
27
- template<>
28
- inline
29
- LinearExpr from_ruby<LinearExpr>(Object x)
30
- {
31
- LinearExpr expr;
26
+ Class rb_cBoolVar;
27
+ Class rb_cSatIntVar;
32
28
 
33
- if (x.respond_to("to_i")) {
34
- expr = from_ruby<int64>(x.call("to_i"));
35
- } else if (x.respond_to("vars")) {
36
- Array vars = x.call("vars");
37
- for(auto const& var: vars) {
38
- auto cvar = (Array) var;
39
- // TODO clean up
40
- Object o = cvar[0];
41
- std::string type = ((String) o.call("class").call("name")).str();
42
- if (type == "ORTools::BoolVar") {
43
- expr.AddTerm(from_ruby<BoolVar>(cvar[0]), from_ruby<int64>(cvar[1]));
44
- } else if (type == "Integer") {
45
- expr.AddConstant(from_ruby<int64>(cvar[0]) * from_ruby<int64>(cvar[1]));
46
- } else {
47
- expr.AddTerm(from_ruby<IntVar>(cvar[0]), from_ruby<int64>(cvar[1]));
48
- }
49
- }
50
- } else {
51
- std::string type = ((String) x.call("class").call("name")).str();
52
- if (type == "ORTools::BoolVar") {
53
- expr = from_ruby<BoolVar>(x);
54
- } else {
55
- expr = from_ruby<IntVar>(x);
29
+ namespace Rice::detail
30
+ {
31
+ template<>
32
+ struct Type<LinearExpr>
33
+ {
34
+ static bool verify()
35
+ {
36
+ return true;
56
37
  }
57
- }
58
-
59
- return expr;
60
- }
38
+ };
61
39
 
62
- // need a wrapper class since absl::Span doesn't own
63
- class IntVarSpan {
64
- std::vector<IntVar> vec;
40
+ template<>
41
+ class From_Ruby<LinearExpr>
42
+ {
65
43
  public:
66
- IntVarSpan(Object x) {
67
- Array a = Array(x);
68
- vec.reserve(a.size());
69
- for (std::size_t i = 0; i < a.size(); ++i) {
70
- vec.push_back(from_ruby<IntVar>(a[i]));
71
- }
72
- }
73
- operator absl::Span<const IntVar>() {
74
- return absl::Span<const IntVar>(vec);
75
- }
76
- };
44
+ LinearExpr convert(VALUE v)
45
+ {
46
+ Object x(v);
47
+ LinearExpr expr;
77
48
 
78
- template<>
79
- inline
80
- IntVarSpan from_ruby<IntVarSpan>(Object x)
81
- {
82
- return IntVarSpan(x);
83
- }
49
+ if (x.respond_to("to_i")) {
50
+ expr = From_Ruby<int64_t>().convert(x.call("to_i").value());
51
+ } else if (x.respond_to("vars")) {
52
+ Array vars = x.call("vars");
53
+ for (const auto& v : vars) {
54
+ // TODO clean up
55
+ auto cvar = (Array) v;
56
+ Object var = cvar[0];
57
+ auto coeff = From_Ruby<int64_t>().convert(cvar[1].value());
84
58
 
85
- // need a wrapper class since absl::Span doesn't own
86
- class IntervalVarSpan {
87
- std::vector<IntervalVar> vec;
88
- public:
89
- IntervalVarSpan(Object x) {
90
- Array a = Array(x);
91
- vec.reserve(a.size());
92
- for (std::size_t i = 0; i < a.size(); ++i) {
93
- vec.push_back(from_ruby<IntervalVar>(a[i]));
59
+ if (var.is_a(rb_cBoolVar)) {
60
+ expr.AddTerm(From_Ruby<BoolVar>().convert(var.value()), coeff);
61
+ } else if (var.is_a(rb_cInteger)) {
62
+ expr.AddConstant(From_Ruby<int64_t>().convert(var.value()) * coeff);
63
+ } else {
64
+ expr.AddTerm(From_Ruby<IntVar>().convert(var.value()), coeff);
65
+ }
66
+ }
67
+ } else {
68
+ if (x.is_a(rb_cBoolVar)) {
69
+ expr = From_Ruby<BoolVar>().convert(x.value());
70
+ } else {
71
+ expr = From_Ruby<IntVar>().convert(x.value());
72
+ }
94
73
  }
95
- }
96
- operator absl::Span<const IntervalVar>() {
97
- return absl::Span<const IntervalVar>(vec);
98
- }
99
- };
100
74
 
101
- template<>
102
- inline
103
- IntervalVarSpan from_ruby<IntervalVarSpan>(Object x)
104
- {
105
- return IntervalVarSpan(x);
106
- }
107
-
108
- // need a wrapper class since absl::Span doesn't own
109
- class LinearExprSpan {
110
- std::vector<LinearExpr> vec;
111
- public:
112
- LinearExprSpan(Object x) {
113
- Array a = Array(x);
114
- vec.reserve(a.size());
115
- for (std::size_t i = 0; i < a.size(); ++i) {
116
- vec.push_back(from_ruby<LinearExpr>(a[i]));
117
- }
118
- }
119
- operator absl::Span<const LinearExpr>() {
120
- return absl::Span<const LinearExpr>(vec);
75
+ return expr;
121
76
  }
122
- };
77
+ };
123
78
 
124
- template<>
125
- inline
126
- LinearExprSpan from_ruby<LinearExprSpan>(Object x)
127
- {
128
- return LinearExprSpan(x);
129
- }
130
-
131
- // need a wrapper class since absl::Span doesn't own
132
- class BoolVarSpan {
133
- std::vector<BoolVar> vec;
79
+ template<>
80
+ class From_Ruby<std::vector<BoolVar>>
81
+ {
134
82
  public:
135
- BoolVarSpan(Object x) {
136
- Array a = Array(x);
83
+ std::vector<BoolVar> convert(VALUE v)
84
+ {
85
+ auto a = Array(v);
86
+ std::vector<BoolVar> vec;
137
87
  vec.reserve(a.size());
138
- for (std::size_t i = 0; i < a.size(); ++i) {
139
- vec.push_back(from_ruby<BoolVar>(a[i]));
88
+ for (const Object v : a) {
89
+ if (v.is_a(rb_cSatIntVar)) {
90
+ vec.push_back(From_Ruby<IntVar>().convert(v.value()).ToBoolVar());
91
+ } else {
92
+ vec.push_back(From_Ruby<BoolVar>().convert(v.value()));
93
+ }
140
94
  }
95
+ return vec;
141
96
  }
142
- operator absl::Span<const BoolVar>() {
143
- return absl::Span<const BoolVar>(vec);
144
- }
145
- };
146
-
147
- template<>
148
- inline
149
- BoolVarSpan from_ruby<BoolVarSpan>(Object x)
150
- {
151
- return BoolVarSpan(x);
97
+ };
152
98
  }
153
99
 
154
100
  void init_constraint(Rice::Module& m) {
155
- Rice::define_class_under<IntVar>(m, "SatIntVar")
101
+ rb_cSatIntVar = Rice::define_class_under<IntVar>(m, "SatIntVar")
156
102
  .define_method("name", &IntVar::Name);
157
103
 
158
104
  Rice::define_class_under<IntervalVar>(m, "SatIntervalVar")
159
105
  .define_method("name", &IntervalVar::Name);
160
106
 
161
- Rice::define_class_under<Constraint>(m, "SatConstraint");
107
+ Rice::define_class_under<Constraint>(m, "SatConstraint")
108
+ .define_method(
109
+ "only_enforce_if",
110
+ [](Constraint& self, Object literal) {
111
+ if (literal.is_a(rb_cSatIntVar)) {
112
+ return self.OnlyEnforceIf(Rice::detail::From_Ruby<IntVar>().convert(literal).ToBoolVar());
113
+ } else if (literal.is_a(rb_cArray)) {
114
+ // TODO support IntVarSpan
115
+ return self.OnlyEnforceIf(Rice::detail::From_Ruby<std::vector<BoolVar>>().convert(literal));
116
+ } else {
117
+ return self.OnlyEnforceIf(Rice::detail::From_Ruby<BoolVar>().convert(literal));
118
+ }
119
+ });
162
120
 
163
- Rice::define_class_under<BoolVar>(m, "BoolVar")
121
+ rb_cBoolVar = Rice::define_class_under<BoolVar>(m, "BoolVar")
164
122
  .define_method("name", &BoolVar::Name)
165
123
  .define_method("index", &BoolVar::index)
166
124
  .define_method("not", &BoolVar::Not)
167
125
  .define_method(
168
126
  "inspect",
169
- *[](BoolVar& self) {
127
+ [](BoolVar& self) {
170
128
  String name(self.Name());
171
129
  return "#<ORTools::BoolVar @name=" + name.inspect().str() + ">";
172
130
  });
@@ -174,7 +132,7 @@ void init_constraint(Rice::Module& m) {
174
132
  Rice::define_class_under<SatParameters>(m, "SatParameters")
175
133
  .define_constructor(Rice::Constructor<SatParameters>())
176
134
  .define_method("max_time_in_seconds=",
177
- *[](SatParameters& self, double value) {
135
+ [](SatParameters& self, double value) {
178
136
  self.set_max_time_in_seconds(value);
179
137
  });
180
138
 
@@ -182,178 +140,245 @@ void init_constraint(Rice::Module& m) {
182
140
  .define_constructor(Rice::Constructor<CpModelBuilder>())
183
141
  .define_method(
184
142
  "new_int_var",
185
- *[](CpModelBuilder& self, int64 start, int64 end, std::string name) {
143
+ [](CpModelBuilder& self, int64_t start, int64_t end, const std::string& name) {
186
144
  const operations_research::Domain domain(start, end);
187
145
  return self.NewIntVar(domain).WithName(name);
188
146
  })
189
147
  .define_method(
190
148
  "new_bool_var",
191
- *[](CpModelBuilder& self, std::string name) {
149
+ [](CpModelBuilder& self, const std::string& name) {
192
150
  return self.NewBoolVar().WithName(name);
193
151
  })
194
152
  .define_method(
195
153
  "new_constant",
196
- *[](CpModelBuilder& self, int64 value) {
154
+ [](CpModelBuilder& self, int64_t value) {
197
155
  return self.NewConstant(value);
198
156
  })
199
157
  .define_method(
200
158
  "true_var",
201
- *[](CpModelBuilder& self) {
159
+ [](CpModelBuilder& self) {
202
160
  return self.TrueVar();
203
161
  })
204
162
  .define_method(
205
163
  "false_var",
206
- *[](CpModelBuilder& self) {
164
+ [](CpModelBuilder& self) {
207
165
  return self.FalseVar();
208
166
  })
209
167
  .define_method(
210
168
  "new_interval_var",
211
- *[](CpModelBuilder& self, IntVar start, IntVar size, IntVar end, std::string name) {
169
+ [](CpModelBuilder& self, IntVar start, IntVar size, IntVar end, const std::string& name) {
212
170
  return self.NewIntervalVar(start, size, end).WithName(name);
213
171
  })
214
172
  .define_method(
215
173
  "new_optional_interval_var",
216
- *[](CpModelBuilder& self, IntVar start, IntVar size, IntVar end, BoolVar presence, std::string name) {
174
+ [](CpModelBuilder& self, IntVar start, IntVar size, IntVar end, BoolVar presence, const std::string& name) {
217
175
  return self.NewOptionalIntervalVar(start, size, end, presence).WithName(name);
218
176
  })
219
177
  .define_method(
220
178
  "add_bool_or",
221
- *[](CpModelBuilder& self, BoolVarSpan literals) {
222
- self.AddBoolOr(literals);
179
+ [](CpModelBuilder& self, std::vector<BoolVar> literals) {
180
+ return self.AddBoolOr(literals);
223
181
  })
224
182
  .define_method(
225
183
  "add_bool_and",
226
- *[](CpModelBuilder& self, BoolVarSpan literals) {
227
- self.AddBoolAnd(literals);
184
+ [](CpModelBuilder& self, std::vector<BoolVar> literals) {
185
+ return self.AddBoolAnd(literals);
228
186
  })
229
187
  .define_method(
230
188
  "add_bool_xor",
231
- *[](CpModelBuilder& self, BoolVarSpan literals) {
232
- self.AddBoolXor(literals);
189
+ [](CpModelBuilder& self, std::vector<BoolVar> literals) {
190
+ return self.AddBoolXor(literals);
233
191
  })
234
192
  .define_method(
235
193
  "add_implication",
236
- *[](CpModelBuilder& self, BoolVar a, BoolVar b) {
237
- self.AddImplication(a, b);
194
+ [](CpModelBuilder& self, BoolVar a, BoolVar b) {
195
+ return self.AddImplication(a, b);
238
196
  })
239
197
  .define_method(
240
198
  "add_equality",
241
- *[](CpModelBuilder& self, LinearExpr x, LinearExpr y) {
242
- self.AddEquality(x, y);
199
+ [](CpModelBuilder& self, LinearExpr x, LinearExpr y) {
200
+ return self.AddEquality(x, y);
243
201
  })
244
202
  .define_method(
245
203
  "add_greater_or_equal",
246
- *[](CpModelBuilder& self, LinearExpr x, LinearExpr y) {
247
- self.AddGreaterOrEqual(x, y);
204
+ [](CpModelBuilder& self, LinearExpr x, LinearExpr y) {
205
+ return self.AddGreaterOrEqual(x, y);
248
206
  })
249
207
  .define_method(
250
208
  "add_greater_than",
251
- *[](CpModelBuilder& self, LinearExpr x, LinearExpr y) {
252
- self.AddGreaterThan(x, y);
209
+ [](CpModelBuilder& self, LinearExpr x, LinearExpr y) {
210
+ return self.AddGreaterThan(x, y);
253
211
  })
254
212
  .define_method(
255
213
  "add_less_or_equal",
256
- *[](CpModelBuilder& self, LinearExpr x, LinearExpr y) {
257
- self.AddLessOrEqual(x, y);
214
+ [](CpModelBuilder& self, LinearExpr x, LinearExpr y) {
215
+ return self.AddLessOrEqual(x, y);
258
216
  })
259
217
  .define_method(
260
218
  "add_less_than",
261
- *[](CpModelBuilder& self, LinearExpr x, LinearExpr y) {
262
- self.AddLessThan(x, y);
219
+ [](CpModelBuilder& self, LinearExpr x, LinearExpr y) {
220
+ return self.AddLessThan(x, y);
263
221
  })
264
222
  // TODO add domain
265
223
  // .define_method(
266
224
  // "add_linear_constraint",
267
- // *[](CpModelBuilder& self, LinearExpr expr, Domain domain) {
268
- // self.AddLinearConstraint(expr, domain);
225
+ // [](CpModelBuilder& self, LinearExpr expr, Domain domain) {
226
+ // return self.AddLinearConstraint(expr, domain);
269
227
  // })
270
228
  .define_method(
271
229
  "add_not_equal",
272
- *[](CpModelBuilder& self, LinearExpr x, LinearExpr y) {
273
- self.AddNotEqual(x, y);
230
+ [](CpModelBuilder& self, LinearExpr x, LinearExpr y) {
231
+ return self.AddNotEqual(x, y);
274
232
  })
275
233
  .define_method(
276
234
  "add_all_different",
277
- *[](CpModelBuilder& self, IntVarSpan vars) {
278
- self.AddAllDifferent(vars);
235
+ [](CpModelBuilder& self, std::vector<IntVar> vars) {
236
+ return self.AddAllDifferent(vars);
279
237
  })
280
238
  .define_method(
281
239
  "add_inverse_constraint",
282
- *[](CpModelBuilder& self, IntVarSpan variables, IntVarSpan inverse_variables) {
283
- self.AddInverseConstraint(variables, inverse_variables);
240
+ [](CpModelBuilder& self, std::vector<IntVar> variables, std::vector<IntVar> inverse_variables) {
241
+ return self.AddInverseConstraint(variables, inverse_variables);
284
242
  })
285
243
  .define_method(
286
244
  "add_min_equality",
287
- *[](CpModelBuilder& self, IntVar target, IntVarSpan vars) {
288
- self.AddMinEquality(target, vars);
245
+ [](CpModelBuilder& self, IntVar target, std::vector<IntVar> vars) {
246
+ return self.AddMinEquality(target, vars);
289
247
  })
290
248
  .define_method(
291
249
  "add_lin_min_equality",
292
- *[](CpModelBuilder& self, LinearExpr target, LinearExprSpan exprs) {
293
- self.AddLinMinEquality(target, exprs);
250
+ [](CpModelBuilder& self, LinearExpr target, std::vector<LinearExpr> exprs) {
251
+ return self.AddLinMinEquality(target, exprs);
294
252
  })
295
253
  .define_method(
296
254
  "add_max_equality",
297
- *[](CpModelBuilder& self, IntVar target, IntVarSpan vars) {
298
- self.AddMaxEquality(target, vars);
255
+ [](CpModelBuilder& self, IntVar target, std::vector<IntVar> vars) {
256
+ return self.AddMaxEquality(target, vars);
299
257
  })
300
258
  .define_method(
301
259
  "add_lin_max_equality",
302
- *[](CpModelBuilder& self, LinearExpr target, LinearExprSpan exprs) {
303
- self.AddLinMaxEquality(target, exprs);
260
+ [](CpModelBuilder& self, LinearExpr target, std::vector<LinearExpr> exprs) {
261
+ return self.AddLinMaxEquality(target, exprs);
304
262
  })
305
263
  .define_method(
306
264
  "add_division_equality",
307
- *[](CpModelBuilder& self, IntVar target, IntVar numerator, IntVar denominator) {
308
- self.AddDivisionEquality(target, numerator, denominator);
265
+ [](CpModelBuilder& self, IntVar target, IntVar numerator, IntVar denominator) {
266
+ return self.AddDivisionEquality(target, numerator, denominator);
309
267
  })
310
268
  .define_method(
311
269
  "add_abs_equality",
312
- *[](CpModelBuilder& self, IntVar target, IntVar var) {
313
- self.AddAbsEquality(target, var);
270
+ [](CpModelBuilder& self, IntVar target, IntVar var) {
271
+ return self.AddAbsEquality(target, var);
314
272
  })
315
273
  .define_method(
316
274
  "add_modulo_equality",
317
- *[](CpModelBuilder& self, IntVar target, IntVar var, IntVar mod) {
318
- self.AddModuloEquality(target, var, mod);
275
+ [](CpModelBuilder& self, IntVar target, IntVar var, IntVar mod) {
276
+ return self.AddModuloEquality(target, var, mod);
319
277
  })
320
278
  .define_method(
321
279
  "add_product_equality",
322
- *[](CpModelBuilder& self, IntVar target, IntVarSpan vars) {
323
- self.AddProductEquality(target, vars);
280
+ [](CpModelBuilder& self, IntVar target, std::vector<IntVar> vars) {
281
+ return self.AddProductEquality(target, vars);
324
282
  })
325
283
  .define_method(
326
284
  "add_no_overlap",
327
- *[](CpModelBuilder& self, IntervalVarSpan vars) {
328
- self.AddNoOverlap(vars);
285
+ [](CpModelBuilder& self, std::vector<IntervalVar> vars) {
286
+ return self.AddNoOverlap(vars);
329
287
  })
330
288
  .define_method(
331
289
  "maximize",
332
- *[](CpModelBuilder& self, LinearExpr expr) {
290
+ [](CpModelBuilder& self, LinearExpr expr) {
333
291
  self.Maximize(expr);
334
292
  })
335
293
  .define_method(
336
294
  "minimize",
337
- *[](CpModelBuilder& self, LinearExpr expr) {
295
+ [](CpModelBuilder& self, LinearExpr expr) {
338
296
  self.Minimize(expr);
339
297
  })
340
298
  .define_method(
341
299
  "scale_objective_by",
342
- *[](CpModelBuilder& self, double scaling) {
300
+ [](CpModelBuilder& self, double scaling) {
343
301
  self.ScaleObjectiveBy(scaling);
344
302
  })
303
+ .define_method(
304
+ "add_hint",
305
+ [](CpModelBuilder& self, IntVar var, int64_t value) {
306
+ self.AddHint(var, value);
307
+ })
308
+ .define_method(
309
+ "clear_hints",
310
+ [](CpModelBuilder& self) {
311
+ self.ClearHints();
312
+ })
313
+ .define_method(
314
+ "add_assumption",
315
+ [](CpModelBuilder& self, BoolVar lit) {
316
+ self.AddAssumption(lit);
317
+ })
318
+ .define_method(
319
+ "add_assumptions",
320
+ [](CpModelBuilder& self, std::vector<BoolVar> literals) {
321
+ self.AddAssumptions(literals);
322
+ })
323
+ .define_method(
324
+ "clear_assumptions",
325
+ [](CpModelBuilder& self) {
326
+ self.ClearAssumptions();
327
+ })
345
328
  .define_method(
346
329
  "to_s",
347
- *[](CpModelBuilder& self) {
330
+ [](CpModelBuilder& self) {
348
331
  std::string proto_string;
349
332
  google::protobuf::TextFormat::PrintToString(self.Proto(), &proto_string);
350
333
  return proto_string;
351
334
  });
352
335
 
336
+ Rice::define_class_under<CpSolverResponse>(m, "CpSolverResponse")
337
+ .define_method("objective_value", &CpSolverResponse::objective_value)
338
+ .define_method("num_conflicts", &CpSolverResponse::num_conflicts)
339
+ .define_method("num_branches", &CpSolverResponse::num_branches)
340
+ .define_method("wall_time", &CpSolverResponse::wall_time)
341
+ .define_method(
342
+ "solution_integer_value",
343
+ [](CpSolverResponse& self, IntVar& x) {
344
+ LinearExpr expr(x);
345
+ return SolutionIntegerValue(self, expr);
346
+ })
347
+ .define_method("solution_boolean_value", &SolutionBooleanValue)
348
+ .define_method(
349
+ "status",
350
+ [](CpSolverResponse& self) {
351
+ auto status = self.status();
352
+
353
+ if (status == CpSolverStatus::OPTIMAL) {
354
+ return Symbol("optimal");
355
+ } else if (status == CpSolverStatus::FEASIBLE) {
356
+ return Symbol("feasible");
357
+ } else if (status == CpSolverStatus::INFEASIBLE) {
358
+ return Symbol("infeasible");
359
+ } else if (status == CpSolverStatus::MODEL_INVALID) {
360
+ return Symbol("model_invalid");
361
+ } else if (status == CpSolverStatus::UNKNOWN) {
362
+ return Symbol("unknown");
363
+ } else {
364
+ throw std::runtime_error("Unknown solver status");
365
+ }
366
+ })
367
+ .define_method(
368
+ "sufficient_assumptions_for_infeasibility",
369
+ [](CpSolverResponse& self) {
370
+ auto a = Array();
371
+ auto assumptions = self.sufficient_assumptions_for_infeasibility();
372
+ for (const auto& v : assumptions) {
373
+ a.push(v);
374
+ }
375
+ return a;
376
+ });
377
+
353
378
  Rice::define_class_under(m, "CpSolver")
354
379
  .define_method(
355
380
  "_solve_with_observer",
356
- *[](Object self, CpModelBuilder& model, SatParameters& parameters, Object callback, bool all_solutions) {
381
+ [](Object self, CpModelBuilder& model, SatParameters& parameters, Object callback, bool all_solutions) {
357
382
  Model m;
358
383
 
359
384
  if (all_solutions) {
@@ -373,51 +398,19 @@ void init_constraint(Rice::Module& m) {
373
398
  })
374
399
  .define_method(
375
400
  "_solve",
376
- *[](Object self, CpModelBuilder& model, SatParameters& parameters) {
401
+ [](Object self, CpModelBuilder& model, SatParameters& parameters) {
377
402
  Model m;
378
403
  m.Add(NewSatParameters(parameters));
379
404
  return SolveCpModel(model.Build(), &m);
380
405
  })
381
406
  .define_method(
382
407
  "_solution_integer_value",
383
- *[](Object self, CpSolverResponse& response, IntVar& x) {
408
+ [](Object self, CpSolverResponse& response, IntVar& x) {
384
409
  return SolutionIntegerValue(response, x);
385
410
  })
386
411
  .define_method(
387
412
  "_solution_boolean_value",
388
- *[](Object self, CpSolverResponse& response, BoolVar& x) {
413
+ [](Object self, CpSolverResponse& response, BoolVar& x) {
389
414
  return SolutionBooleanValue(response, x);
390
415
  });
391
-
392
- Rice::define_class_under<CpSolverResponse>(m, "CpSolverResponse")
393
- .define_method("objective_value", &CpSolverResponse::objective_value)
394
- .define_method("num_conflicts", &CpSolverResponse::num_conflicts)
395
- .define_method("num_branches", &CpSolverResponse::num_branches)
396
- .define_method("wall_time", &CpSolverResponse::wall_time)
397
- .define_method(
398
- "solution_integer_value",
399
- *[](CpSolverResponse& self, IntVar& x) {
400
- LinearExpr expr(x);
401
- return SolutionIntegerValue(self, expr);
402
- })
403
- .define_method("solution_boolean_value", &SolutionBooleanValue)
404
- .define_method(
405
- "status",
406
- *[](CpSolverResponse& self) {
407
- auto status = self.status();
408
-
409
- if (status == CpSolverStatus::OPTIMAL) {
410
- return Symbol("optimal");
411
- } else if (status == CpSolverStatus::FEASIBLE) {
412
- return Symbol("feasible");
413
- } else if (status == CpSolverStatus::INFEASIBLE) {
414
- return Symbol("infeasible");
415
- } else if (status == CpSolverStatus::MODEL_INVALID) {
416
- return Symbol("model_invalid");
417
- } else if (status == CpSolverStatus::UNKNOWN) {
418
- return Symbol("unknown");
419
- } else {
420
- throw std::runtime_error("Unknown solver status");
421
- }
422
- });
423
416
  }