or-tools 0.1.3 → 0.1.4
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 +4 -4
- data/CHANGELOG.md +4 -0
- data/README.md +357 -299
- data/ext/or-tools/ext.cpp +109 -11
- data/lib/or-tools.rb +1 -0
- data/lib/or_tools/bool_var.rb +9 -0
- data/lib/or_tools/cp_solver.rb +6 -1
- data/lib/or_tools/cp_solver_solution_callback.rb +4 -0
- data/lib/or_tools/ext.bundle +0 -0
- data/lib/or_tools/linear_expr.rb +8 -0
- data/lib/or_tools/version.rb +1 -1
- metadata +3 -2
data/ext/or-tools/ext.cpp
CHANGED
@@ -117,7 +117,7 @@ operations_research::sat::LinearExpr from_ruby<operations_research::sat::LinearE
|
|
117
117
|
Object o = cvar[0];
|
118
118
|
std::string type = ((String) o.call("class").call("name")).str();
|
119
119
|
if (type == "ORTools::BoolVar") {
|
120
|
-
expr.
|
120
|
+
expr.AddTerm(from_ruby<operations_research::sat::BoolVar>(cvar[0]), from_ruby<int64>(cvar[1]));
|
121
121
|
} else if (type == "Integer") {
|
122
122
|
expr.AddConstant(from_ruby<int64>(cvar[0]));
|
123
123
|
} else {
|
@@ -125,7 +125,12 @@ operations_research::sat::LinearExpr from_ruby<operations_research::sat::LinearE
|
|
125
125
|
}
|
126
126
|
}
|
127
127
|
} else {
|
128
|
-
|
128
|
+
std::string type = ((String) x.call("class").call("name")).str();
|
129
|
+
if (type == "ORTools::BoolVar") {
|
130
|
+
expr = from_ruby<operations_research::sat::BoolVar>(x);
|
131
|
+
} else {
|
132
|
+
expr = from_ruby<operations_research::sat::IntVar>(x);
|
133
|
+
}
|
129
134
|
}
|
130
135
|
|
131
136
|
return expr;
|
@@ -239,6 +244,50 @@ IntVarSpan from_ruby<IntVarSpan>(Object x)
|
|
239
244
|
return IntVarSpan(x);
|
240
245
|
}
|
241
246
|
|
247
|
+
// need a wrapper class since absl::Span doesn't own
|
248
|
+
class IntervalVarSpan {
|
249
|
+
std::vector<operations_research::sat::IntervalVar> vec;
|
250
|
+
public:
|
251
|
+
IntervalVarSpan(Object x) {
|
252
|
+
Array a = Array(x);
|
253
|
+
for (std::size_t i = 0; i < a.size(); ++i) {
|
254
|
+
vec.push_back(from_ruby<operations_research::sat::IntervalVar>(a[i]));
|
255
|
+
}
|
256
|
+
}
|
257
|
+
operator absl::Span<const operations_research::sat::IntervalVar>() {
|
258
|
+
return absl::Span<const operations_research::sat::IntervalVar>(vec);
|
259
|
+
}
|
260
|
+
};
|
261
|
+
|
262
|
+
template<>
|
263
|
+
inline
|
264
|
+
IntervalVarSpan from_ruby<IntervalVarSpan>(Object x)
|
265
|
+
{
|
266
|
+
return IntervalVarSpan(x);
|
267
|
+
}
|
268
|
+
|
269
|
+
// need a wrapper class since absl::Span doesn't own
|
270
|
+
class BoolVarSpan {
|
271
|
+
std::vector<operations_research::sat::BoolVar> vec;
|
272
|
+
public:
|
273
|
+
BoolVarSpan(Object x) {
|
274
|
+
Array a = Array(x);
|
275
|
+
for (std::size_t i = 0; i < a.size(); ++i) {
|
276
|
+
vec.push_back(from_ruby<operations_research::sat::BoolVar>(a[i]));
|
277
|
+
}
|
278
|
+
}
|
279
|
+
operator absl::Span<const operations_research::sat::BoolVar>() {
|
280
|
+
return absl::Span<const operations_research::sat::BoolVar>(vec);
|
281
|
+
}
|
282
|
+
};
|
283
|
+
|
284
|
+
template<>
|
285
|
+
inline
|
286
|
+
BoolVarSpan from_ruby<BoolVarSpan>(Object x)
|
287
|
+
{
|
288
|
+
return BoolVarSpan(x);
|
289
|
+
}
|
290
|
+
|
242
291
|
extern "C"
|
243
292
|
void Init_ext()
|
244
293
|
{
|
@@ -338,10 +387,15 @@ void Init_ext()
|
|
338
387
|
.define_method("solution_value", &MPVariable::solution_value)
|
339
388
|
.define_method(
|
340
389
|
"+",
|
341
|
-
*[](MPVariable& self,
|
390
|
+
*[](MPVariable& self, LinearExpr& other) {
|
342
391
|
LinearExpr s(&self);
|
343
|
-
|
344
|
-
|
392
|
+
return s + other;
|
393
|
+
})
|
394
|
+
.define_method(
|
395
|
+
"-",
|
396
|
+
*[](MPVariable& self, LinearExpr& other) {
|
397
|
+
LinearExpr s(&self);
|
398
|
+
return s - other;
|
345
399
|
})
|
346
400
|
.define_method(
|
347
401
|
"*",
|
@@ -368,6 +422,17 @@ void Init_ext()
|
|
368
422
|
LinearExpr o(&other);
|
369
423
|
return self + o;
|
370
424
|
})
|
425
|
+
.define_method(
|
426
|
+
"_gte_double",
|
427
|
+
*[](LinearExpr& self, double other) {
|
428
|
+
LinearExpr o(other);
|
429
|
+
return self >= o;
|
430
|
+
})
|
431
|
+
.define_method(
|
432
|
+
"_gte_linear_expr",
|
433
|
+
*[](LinearExpr& self, LinearExpr& other) {
|
434
|
+
return self >= other;
|
435
|
+
})
|
371
436
|
.define_method(
|
372
437
|
"_lte_double",
|
373
438
|
*[](LinearExpr& self, double other) {
|
@@ -422,6 +487,11 @@ void Init_ext()
|
|
422
487
|
.define_method("iterations", &MPSolver::iterations)
|
423
488
|
.define_method("nodes", &MPSolver::nodes)
|
424
489
|
.define_method("objective", &MPSolver::MutableObjective)
|
490
|
+
.define_method(
|
491
|
+
"maximize",
|
492
|
+
*[](MPSolver& self, LinearExpr& expr) {
|
493
|
+
return self.MutableObjective()->MaximizeLinearExpr(expr);
|
494
|
+
})
|
425
495
|
.define_method(
|
426
496
|
"minimize",
|
427
497
|
*[](MPSolver& self, LinearExpr& expr) {
|
@@ -461,13 +531,18 @@ void Init_ext()
|
|
461
531
|
}
|
462
532
|
});
|
463
533
|
|
464
|
-
// not to be confused with operations_research::IntVar
|
465
534
|
define_class_under<operations_research::sat::IntVar>(rb_mORTools, "SatIntVar")
|
466
535
|
.define_method("name", &operations_research::sat::IntVar::Name);
|
467
536
|
|
537
|
+
define_class_under<operations_research::sat::IntervalVar>(rb_mORTools, "SatIntervalVar")
|
538
|
+
.define_method("name", &operations_research::sat::IntervalVar::Name);
|
539
|
+
|
540
|
+
define_class_under<operations_research::sat::Constraint>(rb_mORTools, "SatConstraint");
|
541
|
+
|
468
542
|
define_class_under<BoolVar>(rb_mORTools, "BoolVar")
|
469
543
|
.define_method("name", &BoolVar::Name)
|
470
544
|
.define_method("index", &BoolVar::index)
|
545
|
+
.define_method("not", &BoolVar::Not)
|
471
546
|
.define_method(
|
472
547
|
"inspect",
|
473
548
|
*[](BoolVar& self) {
|
@@ -488,6 +563,11 @@ void Init_ext()
|
|
488
563
|
*[](CpModelBuilder& self, std::string name) {
|
489
564
|
return self.NewBoolVar().WithName(name);
|
490
565
|
})
|
566
|
+
.define_method(
|
567
|
+
"new_interval_var",
|
568
|
+
*[](CpModelBuilder& self, operations_research::sat::IntVar start, operations_research::sat::IntVar size, operations_research::sat::IntVar end, std::string name) {
|
569
|
+
return self.NewIntervalVar(start, size, end).WithName(name);
|
570
|
+
})
|
491
571
|
.define_method(
|
492
572
|
"add_equality",
|
493
573
|
*[](CpModelBuilder& self, operations_research::sat::LinearExpr x, operations_research::sat::LinearExpr y) {
|
@@ -523,6 +603,22 @@ void Init_ext()
|
|
523
603
|
*[](CpModelBuilder& self, IntVarSpan vars) {
|
524
604
|
self.AddAllDifferent(vars);
|
525
605
|
})
|
606
|
+
.define_method(
|
607
|
+
"add_max_equality",
|
608
|
+
*[](CpModelBuilder& self, operations_research::sat::IntVar target, IntVarSpan vars) {
|
609
|
+
self.AddMaxEquality(target, vars);
|
610
|
+
})
|
611
|
+
.define_method(
|
612
|
+
"add_no_overlap",
|
613
|
+
*[](CpModelBuilder& self, IntervalVarSpan vars) {
|
614
|
+
self.AddNoOverlap(vars);
|
615
|
+
})
|
616
|
+
.define_method(
|
617
|
+
"add_bool_or",
|
618
|
+
*[](CpModelBuilder& self, BoolVarSpan literals) {
|
619
|
+
self.AddBoolOr(literals);
|
620
|
+
})
|
621
|
+
.define_method("add_implication", &CpModelBuilder::AddImplication)
|
526
622
|
.define_method(
|
527
623
|
"maximize",
|
528
624
|
*[](CpModelBuilder& self, operations_research::sat::LinearExpr expr) {
|
@@ -537,13 +633,15 @@ void Init_ext()
|
|
537
633
|
define_class_under(rb_mORTools, "CpSolver")
|
538
634
|
.define_method(
|
539
635
|
"_solve_with_observer",
|
540
|
-
*[](Object self, CpModelBuilder& model, Object callback) {
|
636
|
+
*[](Object self, CpModelBuilder& model, Object callback, bool all_solutions) {
|
541
637
|
operations_research::sat::Model m;
|
542
638
|
|
543
|
-
|
544
|
-
|
545
|
-
|
546
|
-
|
639
|
+
if (all_solutions) {
|
640
|
+
// set parameters for SearchForAllSolutions
|
641
|
+
SatParameters parameters;
|
642
|
+
parameters.set_enumerate_all_solutions(true);
|
643
|
+
m.Add(NewSatParameters(parameters));
|
644
|
+
}
|
547
645
|
|
548
646
|
m.Add(NewFeasibleSolutionObserver(
|
549
647
|
[callback](const CpSolverResponse& r) {
|
data/lib/or-tools.rb
CHANGED
data/lib/or_tools/cp_solver.rb
CHANGED
@@ -15,8 +15,13 @@ module ORTools
|
|
15
15
|
_solution_integer_value(@response, var)
|
16
16
|
end
|
17
17
|
|
18
|
+
def solve_with_solution_callback(model, observer)
|
19
|
+
@response = _solve_with_observer(model, observer, false)
|
20
|
+
@response.status
|
21
|
+
end
|
22
|
+
|
18
23
|
def search_for_all_solutions(model, observer)
|
19
|
-
@response = _solve_with_observer(model, observer)
|
24
|
+
@response = _solve_with_observer(model, observer, true)
|
20
25
|
@response.status
|
21
26
|
end
|
22
27
|
end
|
data/lib/or_tools/ext.bundle
CHANGED
Binary file
|
data/lib/or_tools/linear_expr.rb
CHANGED
data/lib/or_tools/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: or-tools
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Kane
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-04-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rice
|
@@ -94,6 +94,7 @@ files:
|
|
94
94
|
- ext/or-tools/ext.cpp
|
95
95
|
- ext/or-tools/extconf.rb
|
96
96
|
- lib/or-tools.rb
|
97
|
+
- lib/or_tools/bool_var.rb
|
97
98
|
- lib/or_tools/comparison.rb
|
98
99
|
- lib/or_tools/comparison_operators.rb
|
99
100
|
- lib/or_tools/cp_model.rb
|