or-tools 0.4.3 → 0.5.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7a1064c39ae0b5431b303db41b4fe03da7f80d26beeab576b33b85fe47dee4d8
4
- data.tar.gz: 5819ef15c9ec8b1b507fb4e4596397a8f2e562fa72de6580b1e78188a404a3db
3
+ metadata.gz: c16581924f813458dc535d2a8804bf02a7f0a605fac108d14894f13ed7af984a
4
+ data.tar.gz: 28bd124da203c4dd0ac50ee86aca3deb7ba283a1cbd711521985972a02bdcaa1
5
5
  SHA512:
6
- metadata.gz: 797f8fdba98a3843f3da03acdee070445e6f4a37650936a700ebab3af58bc779cd57c44b3b68341f28203beb986e6818a884d65588fa14264d0eb89463183d2e
7
- data.tar.gz: acd539cc1f14467ddd2edfaa65723590a216c709aa3085d2257472600e023e7757109eeade70f995131f26f9769250807c998d0d5e30d8ce51af90536063cf3b
6
+ metadata.gz: 0612e5bfcf96ba9ec2591dab7bbfe175625f874ff89e87a168d771a0f81948cb4d8d29e31de0487470eb3b993ef53b793ac25a0b078c5cc54385d4cd3bb159f9
7
+ data.tar.gz: dd548021defe7c1249ecee70790cb29f4c85a5ec04cace94cc9bfa0192b24d68e20040a7dd355b148f75f443bf882cc41ec3ea6613785a24aeb4a37674ca8017
data/CHANGELOG.md CHANGED
@@ -1,3 +1,22 @@
1
+ ## 0.5.3 (2021-08-02)
2
+
3
+ - Added more methods to `IntVar`, `IntervalVar`, and `Constraint`
4
+ - Added `RoutingModelParameters`
5
+
6
+ ## 0.5.2 (2021-07-07)
7
+
8
+ - Added `export_model_as_lp_format` and `export_model_as_mps_format` to `Solver`
9
+
10
+ ## 0.5.1 (2021-05-23)
11
+
12
+ - Updated to Rice 4
13
+
14
+ ## 0.5.0 (2021-04-30)
15
+
16
+ - Updated OR-Tools to 9.0
17
+ - Added binary installation for CentOS 7
18
+ - Added `sufficient_assumptions_for_infeasibility` to `CpSolver`
19
+
1
20
  ## 0.4.3 (2021-03-26)
2
21
 
3
22
  - Added `add_assumption`, `add_assumptions`, and `clear_assumptions` to `CpModel`
@@ -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,141 +18,83 @@ 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
-
101
- template<>
102
- inline
103
- IntervalVarSpan from_ruby<IntervalVarSpan>(Object x)
104
- {
105
- return IntervalVarSpan(x);
106
- }
107
74
 
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
- };
123
-
124
- template<>
125
- inline
126
- LinearExprSpan from_ruby<LinearExprSpan>(Object x)
127
- {
128
- return LinearExprSpan(x);
129
- }
77
+ };
130
78
 
131
- Rice::Class rb_cSatIntVar;
132
-
133
- // need a wrapper class since absl::Span doesn't own
134
- class BoolVarSpan {
135
- std::vector<BoolVar> vec;
79
+ template<>
80
+ class From_Ruby<std::vector<BoolVar>>
81
+ {
136
82
  public:
137
- BoolVarSpan(Object x) {
138
- Array a = Array(x);
83
+ std::vector<BoolVar> convert(VALUE v)
84
+ {
85
+ auto a = Array(v);
86
+ std::vector<BoolVar> vec;
139
87
  vec.reserve(a.size());
140
- for (std::size_t i = 0; i < a.size(); ++i) {
141
- if (((Object) a[i]).is_a(rb_cSatIntVar)) {
142
- vec.push_back(from_ruby<IntVar>(a[i]).ToBoolVar());
88
+ for (const Object v : a) {
89
+ if (v.is_a(rb_cSatIntVar)) {
90
+ vec.push_back(From_Ruby<IntVar>().convert(v.value()).ToBoolVar());
143
91
  } else {
144
- vec.push_back(from_ruby<BoolVar>(a[i]));
92
+ vec.push_back(From_Ruby<BoolVar>().convert(v.value()));
145
93
  }
146
94
  }
95
+ return vec;
147
96
  }
148
- operator absl::Span<const BoolVar>() {
149
- return absl::Span<const BoolVar>(vec);
150
- }
151
- };
152
-
153
- template<>
154
- inline
155
- BoolVarSpan from_ruby<BoolVarSpan>(Object x)
156
- {
157
- return BoolVarSpan(x);
97
+ };
158
98
  }
159
99
 
160
100
  void init_constraint(Rice::Module& m) {
@@ -167,24 +107,24 @@ void init_constraint(Rice::Module& m) {
167
107
  Rice::define_class_under<Constraint>(m, "SatConstraint")
168
108
  .define_method(
169
109
  "only_enforce_if",
170
- *[](Constraint& self, Object literal) {
110
+ [](Constraint& self, Object literal) {
171
111
  if (literal.is_a(rb_cSatIntVar)) {
172
- return self.OnlyEnforceIf(from_ruby<IntVar>(literal).ToBoolVar());
112
+ return self.OnlyEnforceIf(Rice::detail::From_Ruby<IntVar>().convert(literal).ToBoolVar());
173
113
  } else if (literal.is_a(rb_cArray)) {
174
114
  // TODO support IntVarSpan
175
- return self.OnlyEnforceIf(from_ruby<BoolVarSpan>(literal));
115
+ return self.OnlyEnforceIf(Rice::detail::From_Ruby<std::vector<BoolVar>>().convert(literal));
176
116
  } else {
177
- return self.OnlyEnforceIf(from_ruby<BoolVar>(literal));
117
+ return self.OnlyEnforceIf(Rice::detail::From_Ruby<BoolVar>().convert(literal));
178
118
  }
179
119
  });
180
120
 
181
- Rice::define_class_under<BoolVar>(m, "BoolVar")
121
+ rb_cBoolVar = Rice::define_class_under<BoolVar>(m, "BoolVar")
182
122
  .define_method("name", &BoolVar::Name)
183
123
  .define_method("index", &BoolVar::index)
184
124
  .define_method("not", &BoolVar::Not)
185
125
  .define_method(
186
126
  "inspect",
187
- *[](BoolVar& self) {
127
+ [](BoolVar& self) {
188
128
  String name(self.Name());
189
129
  return "#<ORTools::BoolVar @name=" + name.inspect().str() + ">";
190
130
  });
@@ -192,7 +132,7 @@ void init_constraint(Rice::Module& m) {
192
132
  Rice::define_class_under<SatParameters>(m, "SatParameters")
193
133
  .define_constructor(Rice::Constructor<SatParameters>())
194
134
  .define_method("max_time_in_seconds=",
195
- *[](SatParameters& self, double value) {
135
+ [](SatParameters& self, double value) {
196
136
  self.set_max_time_in_seconds(value);
197
137
  });
198
138
 
@@ -200,203 +140,245 @@ void init_constraint(Rice::Module& m) {
200
140
  .define_constructor(Rice::Constructor<CpModelBuilder>())
201
141
  .define_method(
202
142
  "new_int_var",
203
- *[](CpModelBuilder& self, int64 start, int64 end, const std::string& name) {
143
+ [](CpModelBuilder& self, int64_t start, int64_t end, const std::string& name) {
204
144
  const operations_research::Domain domain(start, end);
205
145
  return self.NewIntVar(domain).WithName(name);
206
146
  })
207
147
  .define_method(
208
148
  "new_bool_var",
209
- *[](CpModelBuilder& self, const std::string& name) {
149
+ [](CpModelBuilder& self, const std::string& name) {
210
150
  return self.NewBoolVar().WithName(name);
211
151
  })
212
152
  .define_method(
213
153
  "new_constant",
214
- *[](CpModelBuilder& self, int64 value) {
154
+ [](CpModelBuilder& self, int64_t value) {
215
155
  return self.NewConstant(value);
216
156
  })
217
157
  .define_method(
218
158
  "true_var",
219
- *[](CpModelBuilder& self) {
159
+ [](CpModelBuilder& self) {
220
160
  return self.TrueVar();
221
161
  })
222
162
  .define_method(
223
163
  "false_var",
224
- *[](CpModelBuilder& self) {
164
+ [](CpModelBuilder& self) {
225
165
  return self.FalseVar();
226
166
  })
227
167
  .define_method(
228
168
  "new_interval_var",
229
- *[](CpModelBuilder& self, IntVar start, IntVar size, IntVar end, const std::string& name) {
169
+ [](CpModelBuilder& self, IntVar start, IntVar size, IntVar end, const std::string& name) {
230
170
  return self.NewIntervalVar(start, size, end).WithName(name);
231
171
  })
232
172
  .define_method(
233
173
  "new_optional_interval_var",
234
- *[](CpModelBuilder& self, IntVar start, IntVar size, IntVar end, BoolVar presence, const std::string& name) {
174
+ [](CpModelBuilder& self, IntVar start, IntVar size, IntVar end, BoolVar presence, const std::string& name) {
235
175
  return self.NewOptionalIntervalVar(start, size, end, presence).WithName(name);
236
176
  })
237
177
  .define_method(
238
178
  "add_bool_or",
239
- *[](CpModelBuilder& self, BoolVarSpan literals) {
179
+ [](CpModelBuilder& self, std::vector<BoolVar> literals) {
240
180
  return self.AddBoolOr(literals);
241
181
  })
242
182
  .define_method(
243
183
  "add_bool_and",
244
- *[](CpModelBuilder& self, BoolVarSpan literals) {
184
+ [](CpModelBuilder& self, std::vector<BoolVar> literals) {
245
185
  return self.AddBoolAnd(literals);
246
186
  })
247
187
  .define_method(
248
188
  "add_bool_xor",
249
- *[](CpModelBuilder& self, BoolVarSpan literals) {
189
+ [](CpModelBuilder& self, std::vector<BoolVar> literals) {
250
190
  return self.AddBoolXor(literals);
251
191
  })
252
192
  .define_method(
253
193
  "add_implication",
254
- *[](CpModelBuilder& self, BoolVar a, BoolVar b) {
194
+ [](CpModelBuilder& self, BoolVar a, BoolVar b) {
255
195
  return self.AddImplication(a, b);
256
196
  })
257
197
  .define_method(
258
198
  "add_equality",
259
- *[](CpModelBuilder& self, LinearExpr x, LinearExpr y) {
199
+ [](CpModelBuilder& self, LinearExpr x, LinearExpr y) {
260
200
  return self.AddEquality(x, y);
261
201
  })
262
202
  .define_method(
263
203
  "add_greater_or_equal",
264
- *[](CpModelBuilder& self, LinearExpr x, LinearExpr y) {
204
+ [](CpModelBuilder& self, LinearExpr x, LinearExpr y) {
265
205
  return self.AddGreaterOrEqual(x, y);
266
206
  })
267
207
  .define_method(
268
208
  "add_greater_than",
269
- *[](CpModelBuilder& self, LinearExpr x, LinearExpr y) {
209
+ [](CpModelBuilder& self, LinearExpr x, LinearExpr y) {
270
210
  return self.AddGreaterThan(x, y);
271
211
  })
272
212
  .define_method(
273
213
  "add_less_or_equal",
274
- *[](CpModelBuilder& self, LinearExpr x, LinearExpr y) {
214
+ [](CpModelBuilder& self, LinearExpr x, LinearExpr y) {
275
215
  return self.AddLessOrEqual(x, y);
276
216
  })
277
217
  .define_method(
278
218
  "add_less_than",
279
- *[](CpModelBuilder& self, LinearExpr x, LinearExpr y) {
219
+ [](CpModelBuilder& self, LinearExpr x, LinearExpr y) {
280
220
  return self.AddLessThan(x, y);
281
221
  })
282
222
  // TODO add domain
283
223
  // .define_method(
284
224
  // "add_linear_constraint",
285
- // *[](CpModelBuilder& self, LinearExpr expr, Domain domain) {
225
+ // [](CpModelBuilder& self, LinearExpr expr, Domain domain) {
286
226
  // return self.AddLinearConstraint(expr, domain);
287
227
  // })
288
228
  .define_method(
289
229
  "add_not_equal",
290
- *[](CpModelBuilder& self, LinearExpr x, LinearExpr y) {
230
+ [](CpModelBuilder& self, LinearExpr x, LinearExpr y) {
291
231
  return self.AddNotEqual(x, y);
292
232
  })
293
233
  .define_method(
294
234
  "add_all_different",
295
- *[](CpModelBuilder& self, IntVarSpan vars) {
235
+ [](CpModelBuilder& self, std::vector<IntVar> vars) {
296
236
  return self.AddAllDifferent(vars);
297
237
  })
298
238
  .define_method(
299
239
  "add_inverse_constraint",
300
- *[](CpModelBuilder& self, IntVarSpan variables, IntVarSpan inverse_variables) {
240
+ [](CpModelBuilder& self, std::vector<IntVar> variables, std::vector<IntVar> inverse_variables) {
301
241
  return self.AddInverseConstraint(variables, inverse_variables);
302
242
  })
303
243
  .define_method(
304
244
  "add_min_equality",
305
- *[](CpModelBuilder& self, IntVar target, IntVarSpan vars) {
245
+ [](CpModelBuilder& self, IntVar target, std::vector<IntVar> vars) {
306
246
  return self.AddMinEquality(target, vars);
307
247
  })
308
248
  .define_method(
309
249
  "add_lin_min_equality",
310
- *[](CpModelBuilder& self, LinearExpr target, LinearExprSpan exprs) {
250
+ [](CpModelBuilder& self, LinearExpr target, std::vector<LinearExpr> exprs) {
311
251
  return self.AddLinMinEquality(target, exprs);
312
252
  })
313
253
  .define_method(
314
254
  "add_max_equality",
315
- *[](CpModelBuilder& self, IntVar target, IntVarSpan vars) {
255
+ [](CpModelBuilder& self, IntVar target, std::vector<IntVar> vars) {
316
256
  return self.AddMaxEquality(target, vars);
317
257
  })
318
258
  .define_method(
319
259
  "add_lin_max_equality",
320
- *[](CpModelBuilder& self, LinearExpr target, LinearExprSpan exprs) {
260
+ [](CpModelBuilder& self, LinearExpr target, std::vector<LinearExpr> exprs) {
321
261
  return self.AddLinMaxEquality(target, exprs);
322
262
  })
323
263
  .define_method(
324
264
  "add_division_equality",
325
- *[](CpModelBuilder& self, IntVar target, IntVar numerator, IntVar denominator) {
265
+ [](CpModelBuilder& self, IntVar target, IntVar numerator, IntVar denominator) {
326
266
  return self.AddDivisionEquality(target, numerator, denominator);
327
267
  })
328
268
  .define_method(
329
269
  "add_abs_equality",
330
- *[](CpModelBuilder& self, IntVar target, IntVar var) {
270
+ [](CpModelBuilder& self, IntVar target, IntVar var) {
331
271
  return self.AddAbsEquality(target, var);
332
272
  })
333
273
  .define_method(
334
274
  "add_modulo_equality",
335
- *[](CpModelBuilder& self, IntVar target, IntVar var, IntVar mod) {
275
+ [](CpModelBuilder& self, IntVar target, IntVar var, IntVar mod) {
336
276
  return self.AddModuloEquality(target, var, mod);
337
277
  })
338
278
  .define_method(
339
279
  "add_product_equality",
340
- *[](CpModelBuilder& self, IntVar target, IntVarSpan vars) {
280
+ [](CpModelBuilder& self, IntVar target, std::vector<IntVar> vars) {
341
281
  return self.AddProductEquality(target, vars);
342
282
  })
343
283
  .define_method(
344
284
  "add_no_overlap",
345
- *[](CpModelBuilder& self, IntervalVarSpan vars) {
285
+ [](CpModelBuilder& self, std::vector<IntervalVar> vars) {
346
286
  return self.AddNoOverlap(vars);
347
287
  })
348
288
  .define_method(
349
289
  "maximize",
350
- *[](CpModelBuilder& self, LinearExpr expr) {
290
+ [](CpModelBuilder& self, LinearExpr expr) {
351
291
  self.Maximize(expr);
352
292
  })
353
293
  .define_method(
354
294
  "minimize",
355
- *[](CpModelBuilder& self, LinearExpr expr) {
295
+ [](CpModelBuilder& self, LinearExpr expr) {
356
296
  self.Minimize(expr);
357
297
  })
358
298
  .define_method(
359
299
  "scale_objective_by",
360
- *[](CpModelBuilder& self, double scaling) {
300
+ [](CpModelBuilder& self, double scaling) {
361
301
  self.ScaleObjectiveBy(scaling);
362
302
  })
363
303
  .define_method(
364
304
  "add_hint",
365
- *[](CpModelBuilder& self, IntVar var, int64 value) {
305
+ [](CpModelBuilder& self, IntVar var, int64_t value) {
366
306
  self.AddHint(var, value);
367
307
  })
368
308
  .define_method(
369
309
  "clear_hints",
370
- *[](CpModelBuilder& self) {
310
+ [](CpModelBuilder& self) {
371
311
  self.ClearHints();
372
312
  })
373
313
  .define_method(
374
314
  "add_assumption",
375
- *[](CpModelBuilder& self, BoolVar lit) {
315
+ [](CpModelBuilder& self, BoolVar lit) {
376
316
  self.AddAssumption(lit);
377
317
  })
378
318
  .define_method(
379
319
  "add_assumptions",
380
- *[](CpModelBuilder& self, BoolVarSpan literals) {
320
+ [](CpModelBuilder& self, std::vector<BoolVar> literals) {
381
321
  self.AddAssumptions(literals);
382
322
  })
383
323
  .define_method(
384
324
  "clear_assumptions",
385
- *[](CpModelBuilder& self) {
325
+ [](CpModelBuilder& self) {
386
326
  self.ClearAssumptions();
387
327
  })
388
328
  .define_method(
389
329
  "to_s",
390
- *[](CpModelBuilder& self) {
330
+ [](CpModelBuilder& self) {
391
331
  std::string proto_string;
392
332
  google::protobuf::TextFormat::PrintToString(self.Proto(), &proto_string);
393
333
  return proto_string;
394
334
  });
395
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
+
396
378
  Rice::define_class_under(m, "CpSolver")
397
379
  .define_method(
398
380
  "_solve_with_observer",
399
- *[](Object self, CpModelBuilder& model, SatParameters& parameters, Object callback, bool all_solutions) {
381
+ [](Object self, CpModelBuilder& model, SatParameters& parameters, Object callback, bool all_solutions) {
400
382
  Model m;
401
383
 
402
384
  if (all_solutions) {
@@ -416,51 +398,19 @@ void init_constraint(Rice::Module& m) {
416
398
  })
417
399
  .define_method(
418
400
  "_solve",
419
- *[](Object self, CpModelBuilder& model, SatParameters& parameters) {
401
+ [](Object self, CpModelBuilder& model, SatParameters& parameters) {
420
402
  Model m;
421
403
  m.Add(NewSatParameters(parameters));
422
404
  return SolveCpModel(model.Build(), &m);
423
405
  })
424
406
  .define_method(
425
407
  "_solution_integer_value",
426
- *[](Object self, CpSolverResponse& response, IntVar& x) {
408
+ [](Object self, CpSolverResponse& response, IntVar& x) {
427
409
  return SolutionIntegerValue(response, x);
428
410
  })
429
411
  .define_method(
430
412
  "_solution_boolean_value",
431
- *[](Object self, CpSolverResponse& response, BoolVar& x) {
413
+ [](Object self, CpSolverResponse& response, BoolVar& x) {
432
414
  return SolutionBooleanValue(response, x);
433
415
  });
434
-
435
- Rice::define_class_under<CpSolverResponse>(m, "CpSolverResponse")
436
- .define_method("objective_value", &CpSolverResponse::objective_value)
437
- .define_method("num_conflicts", &CpSolverResponse::num_conflicts)
438
- .define_method("num_branches", &CpSolverResponse::num_branches)
439
- .define_method("wall_time", &CpSolverResponse::wall_time)
440
- .define_method(
441
- "solution_integer_value",
442
- *[](CpSolverResponse& self, IntVar& x) {
443
- LinearExpr expr(x);
444
- return SolutionIntegerValue(self, expr);
445
- })
446
- .define_method("solution_boolean_value", &SolutionBooleanValue)
447
- .define_method(
448
- "status",
449
- *[](CpSolverResponse& self) {
450
- auto status = self.status();
451
-
452
- if (status == CpSolverStatus::OPTIMAL) {
453
- return Symbol("optimal");
454
- } else if (status == CpSolverStatus::FEASIBLE) {
455
- return Symbol("feasible");
456
- } else if (status == CpSolverStatus::INFEASIBLE) {
457
- return Symbol("infeasible");
458
- } else if (status == CpSolverStatus::MODEL_INVALID) {
459
- return Symbol("model_invalid");
460
- } else if (status == CpSolverStatus::UNKNOWN) {
461
- return Symbol("unknown");
462
- } else {
463
- throw std::runtime_error("Unknown solver status");
464
- }
465
- });
466
416
  }