or-tools 0.4.3 → 0.5.3

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: 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
  }