or-tools 0.5.0 → 0.5.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -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;
@@ -28,130 +26,75 @@ using Rice::Symbol;
28
26
  Class rb_cBoolVar;
29
27
  Class rb_cSatIntVar;
30
28
 
31
- template<>
32
- inline
33
- LinearExpr from_ruby<LinearExpr>(Object x)
29
+ namespace Rice::detail
34
30
  {
35
- LinearExpr expr;
36
-
37
- if (x.respond_to("to_i")) {
38
- expr = from_ruby<int64_t>(x.call("to_i"));
39
- } else if (x.respond_to("vars")) {
40
- Array vars = x.call("vars");
41
- for (auto const& var: vars) {
42
- auto cvar = (Array) var;
43
- Object o = cvar[0];
44
- if (o.is_a(rb_cBoolVar)) {
45
- expr.AddTerm(from_ruby<BoolVar>(cvar[0]), from_ruby<int64_t>(cvar[1]));
46
- } else if (o.is_a(rb_cInteger)) {
47
- expr.AddConstant(from_ruby<int64_t>(cvar[0]) * from_ruby<int64_t>(cvar[1]));
48
- } else {
49
- expr.AddTerm(from_ruby<IntVar>(cvar[0]), from_ruby<int64_t>(cvar[1]));
50
- }
31
+ template<>
32
+ struct Type<LinearExpr>
33
+ {
34
+ static bool verify()
35
+ {
36
+ return true;
51
37
  }
52
- } else if (x.is_a(rb_cBoolVar)) {
53
- expr = from_ruby<BoolVar>(x);
54
- } else {
55
- expr = from_ruby<IntVar>(x);
56
- }
38
+ };
57
39
 
58
- return expr;
59
- }
60
-
61
- // need a wrapper class since absl::Span doesn't own
62
- class IntVarSpan {
63
- std::vector<IntVar> vec;
40
+ template<>
41
+ class From_Ruby<LinearExpr>
42
+ {
64
43
  public:
65
- IntVarSpan(Object x) {
66
- Array a = Array(x);
67
- vec.reserve(a.size());
68
- for (std::size_t i = 0; i < a.size(); ++i) {
69
- vec.push_back(from_ruby<IntVar>(a[i]));
70
- }
71
- }
72
- operator absl::Span<const IntVar>() {
73
- return absl::Span<const IntVar>(vec);
74
- }
75
- };
44
+ LinearExpr convert(VALUE v)
45
+ {
46
+ Object x(v);
47
+ LinearExpr expr;
76
48
 
77
- template<>
78
- inline
79
- IntVarSpan from_ruby<IntVarSpan>(Object x)
80
- {
81
- return IntVarSpan(x);
82
- }
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());
83
58
 
84
- // need a wrapper class since absl::Span doesn't own
85
- class IntervalVarSpan {
86
- std::vector<IntervalVar> vec;
87
- public:
88
- IntervalVarSpan(Object x) {
89
- Array a = Array(x);
90
- vec.reserve(a.size());
91
- for (std::size_t i = 0; i < a.size(); ++i) {
92
- 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
+ }
93
73
  }
94
- }
95
- operator absl::Span<const IntervalVar>() {
96
- return absl::Span<const IntervalVar>(vec);
97
- }
98
- };
99
74
 
100
- template<>
101
- inline
102
- IntervalVarSpan from_ruby<IntervalVarSpan>(Object x)
103
- {
104
- return IntervalVarSpan(x);
105
- }
106
-
107
- // need a wrapper class since absl::Span doesn't own
108
- class LinearExprSpan {
109
- std::vector<LinearExpr> vec;
110
- public:
111
- LinearExprSpan(Object x) {
112
- Array a = Array(x);
113
- vec.reserve(a.size());
114
- for (std::size_t i = 0; i < a.size(); ++i) {
115
- vec.push_back(from_ruby<LinearExpr>(a[i]));
116
- }
117
- }
118
- operator absl::Span<const LinearExpr>() {
119
- return absl::Span<const LinearExpr>(vec);
75
+ return expr;
120
76
  }
121
- };
77
+ };
122
78
 
123
- template<>
124
- inline
125
- LinearExprSpan from_ruby<LinearExprSpan>(Object x)
126
- {
127
- return LinearExprSpan(x);
128
- }
129
-
130
- // need a wrapper class since absl::Span doesn't own
131
- class BoolVarSpan {
132
- std::vector<BoolVar> vec;
79
+ template<>
80
+ class From_Ruby<std::vector<BoolVar>>
81
+ {
133
82
  public:
134
- BoolVarSpan(Object x) {
135
- Array a = Array(x);
83
+ std::vector<BoolVar> convert(VALUE v)
84
+ {
85
+ auto a = Array(v);
86
+ std::vector<BoolVar> vec;
136
87
  vec.reserve(a.size());
137
- for (std::size_t i = 0; i < a.size(); ++i) {
138
- if (((Object) a[i]).is_a(rb_cSatIntVar)) {
139
- 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());
140
91
  } else {
141
- vec.push_back(from_ruby<BoolVar>(a[i]));
92
+ vec.push_back(From_Ruby<BoolVar>().convert(v.value()));
142
93
  }
143
94
  }
95
+ return vec;
144
96
  }
145
- operator absl::Span<const BoolVar>() {
146
- return absl::Span<const BoolVar>(vec);
147
- }
148
- };
149
-
150
- template<>
151
- inline
152
- BoolVarSpan from_ruby<BoolVarSpan>(Object x)
153
- {
154
- return BoolVarSpan(x);
97
+ };
155
98
  }
156
99
 
157
100
  void init_constraint(Rice::Module& m) {
@@ -164,14 +107,14 @@ void init_constraint(Rice::Module& m) {
164
107
  Rice::define_class_under<Constraint>(m, "SatConstraint")
165
108
  .define_method(
166
109
  "only_enforce_if",
167
- *[](Constraint& self, Object literal) {
110
+ [](Constraint& self, Object literal) {
168
111
  if (literal.is_a(rb_cSatIntVar)) {
169
- return self.OnlyEnforceIf(from_ruby<IntVar>(literal).ToBoolVar());
112
+ return self.OnlyEnforceIf(Rice::detail::From_Ruby<IntVar>().convert(literal).ToBoolVar());
170
113
  } else if (literal.is_a(rb_cArray)) {
171
114
  // TODO support IntVarSpan
172
- return self.OnlyEnforceIf(from_ruby<BoolVarSpan>(literal));
115
+ return self.OnlyEnforceIf(Rice::detail::From_Ruby<std::vector<BoolVar>>().convert(literal));
173
116
  } else {
174
- return self.OnlyEnforceIf(from_ruby<BoolVar>(literal));
117
+ return self.OnlyEnforceIf(Rice::detail::From_Ruby<BoolVar>().convert(literal));
175
118
  }
176
119
  });
177
120
 
@@ -181,254 +124,226 @@ void init_constraint(Rice::Module& m) {
181
124
  .define_method("not", &BoolVar::Not)
182
125
  .define_method(
183
126
  "inspect",
184
- *[](BoolVar& self) {
127
+ [](BoolVar& self) {
185
128
  String name(self.Name());
186
129
  return "#<ORTools::BoolVar @name=" + name.inspect().str() + ">";
187
130
  });
188
131
 
189
132
  Rice::define_class_under<SatParameters>(m, "SatParameters")
190
133
  .define_constructor(Rice::Constructor<SatParameters>())
191
- .define_method("max_time_in_seconds=",
192
- *[](SatParameters& self, double value) {
193
- self.set_max_time_in_seconds(value);
194
- });
134
+ .define_method(
135
+ "max_time_in_seconds=",
136
+ [](SatParameters& self, double value) {
137
+ self.set_max_time_in_seconds(value);
138
+ })
139
+ .define_method(
140
+ "enumerate_all_solutions=",
141
+ [](SatParameters& self, bool value) {
142
+ self.set_enumerate_all_solutions(value);
143
+ })
144
+ .define_method(
145
+ "enumerate_all_solutions",
146
+ [](SatParameters& self) {
147
+ return self.enumerate_all_solutions();
148
+ });
195
149
 
196
150
  Rice::define_class_under<CpModelBuilder>(m, "CpModel")
197
151
  .define_constructor(Rice::Constructor<CpModelBuilder>())
198
152
  .define_method(
199
153
  "new_int_var",
200
- *[](CpModelBuilder& self, int64_t start, int64_t end, const std::string& name) {
154
+ [](CpModelBuilder& self, int64_t start, int64_t end, const std::string& name) {
201
155
  const operations_research::Domain domain(start, end);
202
156
  return self.NewIntVar(domain).WithName(name);
203
157
  })
204
158
  .define_method(
205
159
  "new_bool_var",
206
- *[](CpModelBuilder& self, const std::string& name) {
160
+ [](CpModelBuilder& self, const std::string& name) {
207
161
  return self.NewBoolVar().WithName(name);
208
162
  })
209
163
  .define_method(
210
164
  "new_constant",
211
- *[](CpModelBuilder& self, int64_t value) {
165
+ [](CpModelBuilder& self, int64_t value) {
212
166
  return self.NewConstant(value);
213
167
  })
214
168
  .define_method(
215
169
  "true_var",
216
- *[](CpModelBuilder& self) {
170
+ [](CpModelBuilder& self) {
217
171
  return self.TrueVar();
218
172
  })
219
173
  .define_method(
220
174
  "false_var",
221
- *[](CpModelBuilder& self) {
175
+ [](CpModelBuilder& self) {
222
176
  return self.FalseVar();
223
177
  })
224
178
  .define_method(
225
179
  "new_interval_var",
226
- *[](CpModelBuilder& self, IntVar start, IntVar size, IntVar end, const std::string& name) {
180
+ [](CpModelBuilder& self, IntVar start, IntVar size, IntVar end, const std::string& name) {
227
181
  return self.NewIntervalVar(start, size, end).WithName(name);
228
182
  })
229
183
  .define_method(
230
184
  "new_optional_interval_var",
231
- *[](CpModelBuilder& self, IntVar start, IntVar size, IntVar end, BoolVar presence, const std::string& name) {
185
+ [](CpModelBuilder& self, IntVar start, IntVar size, IntVar end, BoolVar presence, const std::string& name) {
232
186
  return self.NewOptionalIntervalVar(start, size, end, presence).WithName(name);
233
187
  })
234
188
  .define_method(
235
189
  "add_bool_or",
236
- *[](CpModelBuilder& self, BoolVarSpan literals) {
190
+ [](CpModelBuilder& self, std::vector<BoolVar> literals) {
237
191
  return self.AddBoolOr(literals);
238
192
  })
239
193
  .define_method(
240
194
  "add_bool_and",
241
- *[](CpModelBuilder& self, BoolVarSpan literals) {
195
+ [](CpModelBuilder& self, std::vector<BoolVar> literals) {
242
196
  return self.AddBoolAnd(literals);
243
197
  })
244
198
  .define_method(
245
199
  "add_bool_xor",
246
- *[](CpModelBuilder& self, BoolVarSpan literals) {
200
+ [](CpModelBuilder& self, std::vector<BoolVar> literals) {
247
201
  return self.AddBoolXor(literals);
248
202
  })
249
203
  .define_method(
250
204
  "add_implication",
251
- *[](CpModelBuilder& self, BoolVar a, BoolVar b) {
205
+ [](CpModelBuilder& self, BoolVar a, BoolVar b) {
252
206
  return self.AddImplication(a, b);
253
207
  })
254
208
  .define_method(
255
209
  "add_equality",
256
- *[](CpModelBuilder& self, LinearExpr x, LinearExpr y) {
210
+ [](CpModelBuilder& self, LinearExpr x, LinearExpr y) {
257
211
  return self.AddEquality(x, y);
258
212
  })
259
213
  .define_method(
260
214
  "add_greater_or_equal",
261
- *[](CpModelBuilder& self, LinearExpr x, LinearExpr y) {
215
+ [](CpModelBuilder& self, LinearExpr x, LinearExpr y) {
262
216
  return self.AddGreaterOrEqual(x, y);
263
217
  })
264
218
  .define_method(
265
219
  "add_greater_than",
266
- *[](CpModelBuilder& self, LinearExpr x, LinearExpr y) {
220
+ [](CpModelBuilder& self, LinearExpr x, LinearExpr y) {
267
221
  return self.AddGreaterThan(x, y);
268
222
  })
269
223
  .define_method(
270
224
  "add_less_or_equal",
271
- *[](CpModelBuilder& self, LinearExpr x, LinearExpr y) {
225
+ [](CpModelBuilder& self, LinearExpr x, LinearExpr y) {
272
226
  return self.AddLessOrEqual(x, y);
273
227
  })
274
228
  .define_method(
275
229
  "add_less_than",
276
- *[](CpModelBuilder& self, LinearExpr x, LinearExpr y) {
230
+ [](CpModelBuilder& self, LinearExpr x, LinearExpr y) {
277
231
  return self.AddLessThan(x, y);
278
232
  })
279
233
  // TODO add domain
280
234
  // .define_method(
281
235
  // "add_linear_constraint",
282
- // *[](CpModelBuilder& self, LinearExpr expr, Domain domain) {
236
+ // [](CpModelBuilder& self, LinearExpr expr, Domain domain) {
283
237
  // return self.AddLinearConstraint(expr, domain);
284
238
  // })
285
239
  .define_method(
286
240
  "add_not_equal",
287
- *[](CpModelBuilder& self, LinearExpr x, LinearExpr y) {
241
+ [](CpModelBuilder& self, LinearExpr x, LinearExpr y) {
288
242
  return self.AddNotEqual(x, y);
289
243
  })
290
244
  .define_method(
291
245
  "add_all_different",
292
- *[](CpModelBuilder& self, IntVarSpan vars) {
246
+ [](CpModelBuilder& self, std::vector<IntVar> vars) {
293
247
  return self.AddAllDifferent(vars);
294
248
  })
295
249
  .define_method(
296
250
  "add_inverse_constraint",
297
- *[](CpModelBuilder& self, IntVarSpan variables, IntVarSpan inverse_variables) {
251
+ [](CpModelBuilder& self, std::vector<IntVar> variables, std::vector<IntVar> inverse_variables) {
298
252
  return self.AddInverseConstraint(variables, inverse_variables);
299
253
  })
300
254
  .define_method(
301
255
  "add_min_equality",
302
- *[](CpModelBuilder& self, IntVar target, IntVarSpan vars) {
256
+ [](CpModelBuilder& self, IntVar target, std::vector<IntVar> vars) {
303
257
  return self.AddMinEquality(target, vars);
304
258
  })
305
259
  .define_method(
306
260
  "add_lin_min_equality",
307
- *[](CpModelBuilder& self, LinearExpr target, LinearExprSpan exprs) {
261
+ [](CpModelBuilder& self, LinearExpr target, std::vector<LinearExpr> exprs) {
308
262
  return self.AddLinMinEquality(target, exprs);
309
263
  })
310
264
  .define_method(
311
265
  "add_max_equality",
312
- *[](CpModelBuilder& self, IntVar target, IntVarSpan vars) {
266
+ [](CpModelBuilder& self, IntVar target, std::vector<IntVar> vars) {
313
267
  return self.AddMaxEquality(target, vars);
314
268
  })
315
269
  .define_method(
316
270
  "add_lin_max_equality",
317
- *[](CpModelBuilder& self, LinearExpr target, LinearExprSpan exprs) {
271
+ [](CpModelBuilder& self, LinearExpr target, std::vector<LinearExpr> exprs) {
318
272
  return self.AddLinMaxEquality(target, exprs);
319
273
  })
320
274
  .define_method(
321
275
  "add_division_equality",
322
- *[](CpModelBuilder& self, IntVar target, IntVar numerator, IntVar denominator) {
276
+ [](CpModelBuilder& self, IntVar target, IntVar numerator, IntVar denominator) {
323
277
  return self.AddDivisionEquality(target, numerator, denominator);
324
278
  })
325
279
  .define_method(
326
280
  "add_abs_equality",
327
- *[](CpModelBuilder& self, IntVar target, IntVar var) {
281
+ [](CpModelBuilder& self, IntVar target, IntVar var) {
328
282
  return self.AddAbsEquality(target, var);
329
283
  })
330
284
  .define_method(
331
285
  "add_modulo_equality",
332
- *[](CpModelBuilder& self, IntVar target, IntVar var, IntVar mod) {
286
+ [](CpModelBuilder& self, IntVar target, IntVar var, IntVar mod) {
333
287
  return self.AddModuloEquality(target, var, mod);
334
288
  })
335
289
  .define_method(
336
290
  "add_product_equality",
337
- *[](CpModelBuilder& self, IntVar target, IntVarSpan vars) {
291
+ [](CpModelBuilder& self, IntVar target, std::vector<IntVar> vars) {
338
292
  return self.AddProductEquality(target, vars);
339
293
  })
340
294
  .define_method(
341
295
  "add_no_overlap",
342
- *[](CpModelBuilder& self, IntervalVarSpan vars) {
296
+ [](CpModelBuilder& self, std::vector<IntervalVar> vars) {
343
297
  return self.AddNoOverlap(vars);
344
298
  })
345
299
  .define_method(
346
300
  "maximize",
347
- *[](CpModelBuilder& self, LinearExpr expr) {
301
+ [](CpModelBuilder& self, LinearExpr expr) {
348
302
  self.Maximize(expr);
349
303
  })
350
304
  .define_method(
351
305
  "minimize",
352
- *[](CpModelBuilder& self, LinearExpr expr) {
306
+ [](CpModelBuilder& self, LinearExpr expr) {
353
307
  self.Minimize(expr);
354
308
  })
355
309
  .define_method(
356
310
  "scale_objective_by",
357
- *[](CpModelBuilder& self, double scaling) {
311
+ [](CpModelBuilder& self, double scaling) {
358
312
  self.ScaleObjectiveBy(scaling);
359
313
  })
360
314
  .define_method(
361
315
  "add_hint",
362
- *[](CpModelBuilder& self, IntVar var, int64_t value) {
316
+ [](CpModelBuilder& self, IntVar var, int64_t value) {
363
317
  self.AddHint(var, value);
364
318
  })
365
319
  .define_method(
366
320
  "clear_hints",
367
- *[](CpModelBuilder& self) {
321
+ [](CpModelBuilder& self) {
368
322
  self.ClearHints();
369
323
  })
370
324
  .define_method(
371
325
  "add_assumption",
372
- *[](CpModelBuilder& self, BoolVar lit) {
326
+ [](CpModelBuilder& self, BoolVar lit) {
373
327
  self.AddAssumption(lit);
374
328
  })
375
329
  .define_method(
376
330
  "add_assumptions",
377
- *[](CpModelBuilder& self, BoolVarSpan literals) {
331
+ [](CpModelBuilder& self, std::vector<BoolVar> literals) {
378
332
  self.AddAssumptions(literals);
379
333
  })
380
334
  .define_method(
381
335
  "clear_assumptions",
382
- *[](CpModelBuilder& self) {
336
+ [](CpModelBuilder& self) {
383
337
  self.ClearAssumptions();
384
338
  })
385
339
  .define_method(
386
340
  "to_s",
387
- *[](CpModelBuilder& self) {
341
+ [](CpModelBuilder& self) {
388
342
  std::string proto_string;
389
343
  google::protobuf::TextFormat::PrintToString(self.Proto(), &proto_string);
390
344
  return proto_string;
391
345
  });
392
346
 
393
- Rice::define_class_under(m, "CpSolver")
394
- .define_method(
395
- "_solve_with_observer",
396
- *[](Object self, CpModelBuilder& model, SatParameters& parameters, Object callback, bool all_solutions) {
397
- Model m;
398
-
399
- if (all_solutions) {
400
- // set parameters for SearchForAllSolutions
401
- parameters.set_enumerate_all_solutions(true);
402
- }
403
- m.Add(NewSatParameters(parameters));
404
-
405
- m.Add(NewFeasibleSolutionObserver(
406
- [callback](const CpSolverResponse& r) {
407
- // TODO find a better way to do this
408
- callback.call("response=", r);
409
- callback.call("on_solution_callback");
410
- })
411
- );
412
- return SolveCpModel(model.Build(), &m);
413
- })
414
- .define_method(
415
- "_solve",
416
- *[](Object self, CpModelBuilder& model, SatParameters& parameters) {
417
- Model m;
418
- m.Add(NewSatParameters(parameters));
419
- return SolveCpModel(model.Build(), &m);
420
- })
421
- .define_method(
422
- "_solution_integer_value",
423
- *[](Object self, CpSolverResponse& response, IntVar& x) {
424
- return SolutionIntegerValue(response, x);
425
- })
426
- .define_method(
427
- "_solution_boolean_value",
428
- *[](Object self, CpSolverResponse& response, BoolVar& x) {
429
- return SolutionBooleanValue(response, x);
430
- });
431
-
432
347
  Rice::define_class_under<CpSolverResponse>(m, "CpSolverResponse")
433
348
  .define_method("objective_value", &CpSolverResponse::objective_value)
434
349
  .define_method("num_conflicts", &CpSolverResponse::num_conflicts)
@@ -436,14 +351,14 @@ void init_constraint(Rice::Module& m) {
436
351
  .define_method("wall_time", &CpSolverResponse::wall_time)
437
352
  .define_method(
438
353
  "solution_integer_value",
439
- *[](CpSolverResponse& self, IntVar& x) {
354
+ [](CpSolverResponse& self, IntVar& x) {
440
355
  LinearExpr expr(x);
441
356
  return SolutionIntegerValue(self, expr);
442
357
  })
443
358
  .define_method("solution_boolean_value", &SolutionBooleanValue)
444
359
  .define_method(
445
360
  "status",
446
- *[](CpSolverResponse& self) {
361
+ [](CpSolverResponse& self) {
447
362
  auto status = self.status();
448
363
 
449
364
  if (status == CpSolverStatus::OPTIMAL) {
@@ -462,12 +377,45 @@ void init_constraint(Rice::Module& m) {
462
377
  })
463
378
  .define_method(
464
379
  "sufficient_assumptions_for_infeasibility",
465
- *[](CpSolverResponse& self) {
380
+ [](CpSolverResponse& self) {
466
381
  auto a = Array();
467
382
  auto assumptions = self.sufficient_assumptions_for_infeasibility();
468
- for (auto const& v : assumptions) {
383
+ for (const auto& v : assumptions) {
469
384
  a.push(v);
470
385
  }
471
386
  return a;
472
387
  });
388
+
389
+ Rice::define_class_under(m, "CpSolver")
390
+ .define_method(
391
+ "_solve",
392
+ [](Object self, CpModelBuilder& model, SatParameters& parameters, Object callback) {
393
+ Model m;
394
+
395
+ if (!callback.is_nil()) {
396
+ // TODO figure out how to use callback with multiple cores
397
+ parameters.set_num_search_workers(1);
398
+
399
+ m.Add(NewFeasibleSolutionObserver(
400
+ [callback](const CpSolverResponse& r) {
401
+ // TODO find a better way to do this
402
+ callback.call("response=", r);
403
+ callback.call("on_solution_callback");
404
+ })
405
+ );
406
+ }
407
+
408
+ m.Add(NewSatParameters(parameters));
409
+ return SolveCpModel(model.Build(), &m);
410
+ })
411
+ .define_method(
412
+ "_solution_integer_value",
413
+ [](Object self, CpSolverResponse& response, IntVar& x) {
414
+ return SolutionIntegerValue(response, x);
415
+ })
416
+ .define_method(
417
+ "_solution_boolean_value",
418
+ [](Object self, CpSolverResponse& response, BoolVar& x) {
419
+ return SolutionBooleanValue(response, x);
420
+ });
473
421
  }
data/ext/or-tools/ext.cpp CHANGED
@@ -1,6 +1,6 @@
1
1
  #include <ortools/base/version.h>
2
2
 
3
- #include <rice/Module.hpp>
3
+ #include "ext.h"
4
4
 
5
5
  void init_assignment(Rice::Module& m);
6
6
  void init_bin_packing(Rice::Module& m);
@@ -14,9 +14,9 @@ void Init_ext()
14
14
  {
15
15
  auto m = Rice::define_module("ORTools");
16
16
 
17
- m.define_singleton_method(
17
+ m.define_singleton_function(
18
18
  "lib_version",
19
- *[]() {
19
+ []() {
20
20
  return std::to_string(operations_research::OrToolsMajorVersion()) + "."
21
21
  + std::to_string(operations_research::OrToolsMinorVersion());
22
22
  });
@@ -0,0 +1,4 @@
1
+ #pragma once
2
+
3
+ #include <rice/rice.hpp>
4
+ #include <rice/stl.hpp>
@@ -1,8 +1,6 @@
1
1
  require "mkmf-rice"
2
2
 
3
- raise "Missing stdc++" unless have_library("stdc++")
4
-
5
- $CXXFLAGS << " -std=c++17 -DUSE_CBC"
3
+ $CXXFLAGS << " -std=c++17 $(optflags) -DUSE_CBC"
6
4
 
7
5
  # or-tools warnings
8
6
  $CXXFLAGS << " -Wno-sign-compare -Wno-shorten-64-to-32 -Wno-ignored-qualifiers"