or-tools 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- 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
|