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 +4 -4
- data/CHANGELOG.md +19 -0
- data/ext/or-tools/assignment.cpp +2 -5
- data/ext/or-tools/bin_packing.cpp +26 -33
- data/ext/or-tools/constraint.cpp +149 -199
- data/ext/or-tools/ext.cpp +3 -3
- data/ext/or-tools/ext.h +4 -0
- data/ext/or-tools/extconf.rb +1 -3
- data/ext/or-tools/linear.cpp +74 -67
- data/ext/or-tools/network_flows.cpp +7 -9
- data/ext/or-tools/routing.cpp +123 -147
- data/ext/or-tools/vendor.rb +10 -7
- data/lib/or_tools/cp_solver.rb +4 -0
- data/lib/or_tools/seating.rb +1 -1
- data/lib/or_tools/version.rb +1 -1
- metadata +6 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c16581924f813458dc535d2a8804bf02a7f0a605fac108d14894f13ed7af984a
|
4
|
+
data.tar.gz: 28bd124da203c4dd0ac50ee86aca3deb7ba283a1cbd711521985972a02bdcaa1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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`
|
data/ext/or-tools/assignment.cpp
CHANGED
@@ -1,12 +1,9 @@
|
|
1
1
|
#include <ortools/graph/assignment.h>
|
2
2
|
|
3
|
-
#include
|
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
|
-
|
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
|
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
|
-
|
14
|
-
inline
|
15
|
-
KnapsackSolver::SolverType from_ruby<KnapsackSolver::SolverType>(Object x)
|
11
|
+
namespace Rice::detail
|
16
12
|
{
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
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
|
-
|
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
|
}
|
data/ext/or-tools/constraint.cpp
CHANGED
@@ -1,9 +1,7 @@
|
|
1
1
|
#include <google/protobuf/text_format.h>
|
2
2
|
#include <ortools/sat/cp_model.h>
|
3
3
|
|
4
|
-
#include
|
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
|
-
|
28
|
-
|
29
|
-
LinearExpr from_ruby<LinearExpr>(Object x)
|
30
|
-
{
|
31
|
-
LinearExpr expr;
|
26
|
+
Class rb_cBoolVar;
|
27
|
+
Class rb_cSatIntVar;
|
32
28
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
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
|
-
|
63
|
-
class
|
64
|
-
|
40
|
+
template<>
|
41
|
+
class From_Ruby<LinearExpr>
|
42
|
+
{
|
65
43
|
public:
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
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
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
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
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
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
|
-
|
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
|
-
|
132
|
-
|
133
|
-
|
134
|
-
class BoolVarSpan {
|
135
|
-
std::vector<BoolVar> vec;
|
79
|
+
template<>
|
80
|
+
class From_Ruby<std::vector<BoolVar>>
|
81
|
+
{
|
136
82
|
public:
|
137
|
-
|
138
|
-
|
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 (
|
141
|
-
if (
|
142
|
-
vec.push_back(
|
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(
|
92
|
+
vec.push_back(From_Ruby<BoolVar>().convert(v.value()));
|
145
93
|
}
|
146
94
|
}
|
95
|
+
return vec;
|
147
96
|
}
|
148
|
-
|
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
|
-
|
110
|
+
[](Constraint& self, Object literal) {
|
171
111
|
if (literal.is_a(rb_cSatIntVar)) {
|
172
|
-
return self.OnlyEnforceIf(
|
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(
|
115
|
+
return self.OnlyEnforceIf(Rice::detail::From_Ruby<std::vector<BoolVar>>().convert(literal));
|
176
116
|
} else {
|
177
|
-
return self.OnlyEnforceIf(
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
154
|
+
[](CpModelBuilder& self, int64_t value) {
|
215
155
|
return self.NewConstant(value);
|
216
156
|
})
|
217
157
|
.define_method(
|
218
158
|
"true_var",
|
219
|
-
|
159
|
+
[](CpModelBuilder& self) {
|
220
160
|
return self.TrueVar();
|
221
161
|
})
|
222
162
|
.define_method(
|
223
163
|
"false_var",
|
224
|
-
|
164
|
+
[](CpModelBuilder& self) {
|
225
165
|
return self.FalseVar();
|
226
166
|
})
|
227
167
|
.define_method(
|
228
168
|
"new_interval_var",
|
229
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
189
|
+
[](CpModelBuilder& self, std::vector<BoolVar> literals) {
|
250
190
|
return self.AddBoolXor(literals);
|
251
191
|
})
|
252
192
|
.define_method(
|
253
193
|
"add_implication",
|
254
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
//
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
285
|
+
[](CpModelBuilder& self, std::vector<IntervalVar> vars) {
|
346
286
|
return self.AddNoOverlap(vars);
|
347
287
|
})
|
348
288
|
.define_method(
|
349
289
|
"maximize",
|
350
|
-
|
290
|
+
[](CpModelBuilder& self, LinearExpr expr) {
|
351
291
|
self.Maximize(expr);
|
352
292
|
})
|
353
293
|
.define_method(
|
354
294
|
"minimize",
|
355
|
-
|
295
|
+
[](CpModelBuilder& self, LinearExpr expr) {
|
356
296
|
self.Minimize(expr);
|
357
297
|
})
|
358
298
|
.define_method(
|
359
299
|
"scale_objective_by",
|
360
|
-
|
300
|
+
[](CpModelBuilder& self, double scaling) {
|
361
301
|
self.ScaleObjectiveBy(scaling);
|
362
302
|
})
|
363
303
|
.define_method(
|
364
304
|
"add_hint",
|
365
|
-
|
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
|
-
|
310
|
+
[](CpModelBuilder& self) {
|
371
311
|
self.ClearHints();
|
372
312
|
})
|
373
313
|
.define_method(
|
374
314
|
"add_assumption",
|
375
|
-
|
315
|
+
[](CpModelBuilder& self, BoolVar lit) {
|
376
316
|
self.AddAssumption(lit);
|
377
317
|
})
|
378
318
|
.define_method(
|
379
319
|
"add_assumptions",
|
380
|
-
|
320
|
+
[](CpModelBuilder& self, std::vector<BoolVar> literals) {
|
381
321
|
self.AddAssumptions(literals);
|
382
322
|
})
|
383
323
|
.define_method(
|
384
324
|
"clear_assumptions",
|
385
|
-
|
325
|
+
[](CpModelBuilder& self) {
|
386
326
|
self.ClearAssumptions();
|
387
327
|
})
|
388
328
|
.define_method(
|
389
329
|
"to_s",
|
390
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
}
|