or-tools 0.4.2 → 0.4.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 +7 -0
- data/ext/or-tools/constraint.cpp +72 -29
- data/ext/or-tools/vendor.rb +15 -4
- data/lib/or_tools/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7a1064c39ae0b5431b303db41b4fe03da7f80d26beeab576b33b85fe47dee4d8
|
4
|
+
data.tar.gz: 5819ef15c9ec8b1b507fb4e4596397a8f2e562fa72de6580b1e78188a404a3db
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 797f8fdba98a3843f3da03acdee070445e6f4a37650936a700ebab3af58bc779cd57c44b3b68341f28203beb986e6818a884d65588fa14264d0eb89463183d2e
|
7
|
+
data.tar.gz: acd539cc1f14467ddd2edfaa65723590a216c709aa3085d2257472600e023e7757109eeade70f995131f26f9769250807c998d0d5e30d8ce51af90536063cf3b
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
## 0.4.3 (2021-03-26)
|
2
|
+
|
3
|
+
- Added `add_assumption`, `add_assumptions`, and `clear_assumptions` to `CpModel`
|
4
|
+
- Added `add_hint` and `clear_hints` to `CpModel`
|
5
|
+
- Added `only_enforce_if` to `SatConstraint`
|
6
|
+
- Fixed installation for Debian
|
7
|
+
|
1
8
|
## 0.4.2 (2021-03-03)
|
2
9
|
|
3
10
|
- Updated OR-Tools to 8.2
|
data/ext/or-tools/constraint.cpp
CHANGED
@@ -128,6 +128,8 @@ LinearExprSpan from_ruby<LinearExprSpan>(Object x)
|
|
128
128
|
return LinearExprSpan(x);
|
129
129
|
}
|
130
130
|
|
131
|
+
Rice::Class rb_cSatIntVar;
|
132
|
+
|
131
133
|
// need a wrapper class since absl::Span doesn't own
|
132
134
|
class BoolVarSpan {
|
133
135
|
std::vector<BoolVar> vec;
|
@@ -136,7 +138,11 @@ class BoolVarSpan {
|
|
136
138
|
Array a = Array(x);
|
137
139
|
vec.reserve(a.size());
|
138
140
|
for (std::size_t i = 0; i < a.size(); ++i) {
|
139
|
-
|
141
|
+
if (((Object) a[i]).is_a(rb_cSatIntVar)) {
|
142
|
+
vec.push_back(from_ruby<IntVar>(a[i]).ToBoolVar());
|
143
|
+
} else {
|
144
|
+
vec.push_back(from_ruby<BoolVar>(a[i]));
|
145
|
+
}
|
140
146
|
}
|
141
147
|
}
|
142
148
|
operator absl::Span<const BoolVar>() {
|
@@ -152,13 +158,25 @@ BoolVarSpan from_ruby<BoolVarSpan>(Object x)
|
|
152
158
|
}
|
153
159
|
|
154
160
|
void init_constraint(Rice::Module& m) {
|
155
|
-
Rice::define_class_under<IntVar>(m, "SatIntVar")
|
161
|
+
rb_cSatIntVar = Rice::define_class_under<IntVar>(m, "SatIntVar")
|
156
162
|
.define_method("name", &IntVar::Name);
|
157
163
|
|
158
164
|
Rice::define_class_under<IntervalVar>(m, "SatIntervalVar")
|
159
165
|
.define_method("name", &IntervalVar::Name);
|
160
166
|
|
161
|
-
Rice::define_class_under<Constraint>(m, "SatConstraint")
|
167
|
+
Rice::define_class_under<Constraint>(m, "SatConstraint")
|
168
|
+
.define_method(
|
169
|
+
"only_enforce_if",
|
170
|
+
*[](Constraint& self, Object literal) {
|
171
|
+
if (literal.is_a(rb_cSatIntVar)) {
|
172
|
+
return self.OnlyEnforceIf(from_ruby<IntVar>(literal).ToBoolVar());
|
173
|
+
} else if (literal.is_a(rb_cArray)) {
|
174
|
+
// TODO support IntVarSpan
|
175
|
+
return self.OnlyEnforceIf(from_ruby<BoolVarSpan>(literal));
|
176
|
+
} else {
|
177
|
+
return self.OnlyEnforceIf(from_ruby<BoolVar>(literal));
|
178
|
+
}
|
179
|
+
});
|
162
180
|
|
163
181
|
Rice::define_class_under<BoolVar>(m, "BoolVar")
|
164
182
|
.define_method("name", &BoolVar::Name)
|
@@ -182,13 +200,13 @@ void init_constraint(Rice::Module& m) {
|
|
182
200
|
.define_constructor(Rice::Constructor<CpModelBuilder>())
|
183
201
|
.define_method(
|
184
202
|
"new_int_var",
|
185
|
-
*[](CpModelBuilder& self, int64 start, int64 end, std::string name) {
|
203
|
+
*[](CpModelBuilder& self, int64 start, int64 end, const std::string& name) {
|
186
204
|
const operations_research::Domain domain(start, end);
|
187
205
|
return self.NewIntVar(domain).WithName(name);
|
188
206
|
})
|
189
207
|
.define_method(
|
190
208
|
"new_bool_var",
|
191
|
-
*[](CpModelBuilder& self, std::string name) {
|
209
|
+
*[](CpModelBuilder& self, const std::string& name) {
|
192
210
|
return self.NewBoolVar().WithName(name);
|
193
211
|
})
|
194
212
|
.define_method(
|
@@ -208,124 +226,124 @@ void init_constraint(Rice::Module& m) {
|
|
208
226
|
})
|
209
227
|
.define_method(
|
210
228
|
"new_interval_var",
|
211
|
-
*[](CpModelBuilder& self, IntVar start, IntVar size, IntVar end, std::string name) {
|
229
|
+
*[](CpModelBuilder& self, IntVar start, IntVar size, IntVar end, const std::string& name) {
|
212
230
|
return self.NewIntervalVar(start, size, end).WithName(name);
|
213
231
|
})
|
214
232
|
.define_method(
|
215
233
|
"new_optional_interval_var",
|
216
|
-
*[](CpModelBuilder& self, IntVar start, IntVar size, IntVar end, BoolVar presence, std::string name) {
|
234
|
+
*[](CpModelBuilder& self, IntVar start, IntVar size, IntVar end, BoolVar presence, const std::string& name) {
|
217
235
|
return self.NewOptionalIntervalVar(start, size, end, presence).WithName(name);
|
218
236
|
})
|
219
237
|
.define_method(
|
220
238
|
"add_bool_or",
|
221
239
|
*[](CpModelBuilder& self, BoolVarSpan literals) {
|
222
|
-
self.AddBoolOr(literals);
|
240
|
+
return self.AddBoolOr(literals);
|
223
241
|
})
|
224
242
|
.define_method(
|
225
243
|
"add_bool_and",
|
226
244
|
*[](CpModelBuilder& self, BoolVarSpan literals) {
|
227
|
-
self.AddBoolAnd(literals);
|
245
|
+
return self.AddBoolAnd(literals);
|
228
246
|
})
|
229
247
|
.define_method(
|
230
248
|
"add_bool_xor",
|
231
249
|
*[](CpModelBuilder& self, BoolVarSpan literals) {
|
232
|
-
self.AddBoolXor(literals);
|
250
|
+
return self.AddBoolXor(literals);
|
233
251
|
})
|
234
252
|
.define_method(
|
235
253
|
"add_implication",
|
236
254
|
*[](CpModelBuilder& self, BoolVar a, BoolVar b) {
|
237
|
-
self.AddImplication(a, b);
|
255
|
+
return self.AddImplication(a, b);
|
238
256
|
})
|
239
257
|
.define_method(
|
240
258
|
"add_equality",
|
241
259
|
*[](CpModelBuilder& self, LinearExpr x, LinearExpr y) {
|
242
|
-
self.AddEquality(x, y);
|
260
|
+
return self.AddEquality(x, y);
|
243
261
|
})
|
244
262
|
.define_method(
|
245
263
|
"add_greater_or_equal",
|
246
264
|
*[](CpModelBuilder& self, LinearExpr x, LinearExpr y) {
|
247
|
-
self.AddGreaterOrEqual(x, y);
|
265
|
+
return self.AddGreaterOrEqual(x, y);
|
248
266
|
})
|
249
267
|
.define_method(
|
250
268
|
"add_greater_than",
|
251
269
|
*[](CpModelBuilder& self, LinearExpr x, LinearExpr y) {
|
252
|
-
self.AddGreaterThan(x, y);
|
270
|
+
return self.AddGreaterThan(x, y);
|
253
271
|
})
|
254
272
|
.define_method(
|
255
273
|
"add_less_or_equal",
|
256
274
|
*[](CpModelBuilder& self, LinearExpr x, LinearExpr y) {
|
257
|
-
self.AddLessOrEqual(x, y);
|
275
|
+
return self.AddLessOrEqual(x, y);
|
258
276
|
})
|
259
277
|
.define_method(
|
260
278
|
"add_less_than",
|
261
279
|
*[](CpModelBuilder& self, LinearExpr x, LinearExpr y) {
|
262
|
-
self.AddLessThan(x, y);
|
280
|
+
return self.AddLessThan(x, y);
|
263
281
|
})
|
264
282
|
// TODO add domain
|
265
283
|
// .define_method(
|
266
284
|
// "add_linear_constraint",
|
267
285
|
// *[](CpModelBuilder& self, LinearExpr expr, Domain domain) {
|
268
|
-
// self.AddLinearConstraint(expr, domain);
|
286
|
+
// return self.AddLinearConstraint(expr, domain);
|
269
287
|
// })
|
270
288
|
.define_method(
|
271
289
|
"add_not_equal",
|
272
290
|
*[](CpModelBuilder& self, LinearExpr x, LinearExpr y) {
|
273
|
-
self.AddNotEqual(x, y);
|
291
|
+
return self.AddNotEqual(x, y);
|
274
292
|
})
|
275
293
|
.define_method(
|
276
294
|
"add_all_different",
|
277
295
|
*[](CpModelBuilder& self, IntVarSpan vars) {
|
278
|
-
self.AddAllDifferent(vars);
|
296
|
+
return self.AddAllDifferent(vars);
|
279
297
|
})
|
280
298
|
.define_method(
|
281
299
|
"add_inverse_constraint",
|
282
300
|
*[](CpModelBuilder& self, IntVarSpan variables, IntVarSpan inverse_variables) {
|
283
|
-
self.AddInverseConstraint(variables, inverse_variables);
|
301
|
+
return self.AddInverseConstraint(variables, inverse_variables);
|
284
302
|
})
|
285
303
|
.define_method(
|
286
304
|
"add_min_equality",
|
287
305
|
*[](CpModelBuilder& self, IntVar target, IntVarSpan vars) {
|
288
|
-
self.AddMinEquality(target, vars);
|
306
|
+
return self.AddMinEquality(target, vars);
|
289
307
|
})
|
290
308
|
.define_method(
|
291
309
|
"add_lin_min_equality",
|
292
310
|
*[](CpModelBuilder& self, LinearExpr target, LinearExprSpan exprs) {
|
293
|
-
self.AddLinMinEquality(target, exprs);
|
311
|
+
return self.AddLinMinEquality(target, exprs);
|
294
312
|
})
|
295
313
|
.define_method(
|
296
314
|
"add_max_equality",
|
297
315
|
*[](CpModelBuilder& self, IntVar target, IntVarSpan vars) {
|
298
|
-
self.AddMaxEquality(target, vars);
|
316
|
+
return self.AddMaxEquality(target, vars);
|
299
317
|
})
|
300
318
|
.define_method(
|
301
319
|
"add_lin_max_equality",
|
302
320
|
*[](CpModelBuilder& self, LinearExpr target, LinearExprSpan exprs) {
|
303
|
-
self.AddLinMaxEquality(target, exprs);
|
321
|
+
return self.AddLinMaxEquality(target, exprs);
|
304
322
|
})
|
305
323
|
.define_method(
|
306
324
|
"add_division_equality",
|
307
325
|
*[](CpModelBuilder& self, IntVar target, IntVar numerator, IntVar denominator) {
|
308
|
-
self.AddDivisionEquality(target, numerator, denominator);
|
326
|
+
return self.AddDivisionEquality(target, numerator, denominator);
|
309
327
|
})
|
310
328
|
.define_method(
|
311
329
|
"add_abs_equality",
|
312
330
|
*[](CpModelBuilder& self, IntVar target, IntVar var) {
|
313
|
-
self.AddAbsEquality(target, var);
|
331
|
+
return self.AddAbsEquality(target, var);
|
314
332
|
})
|
315
333
|
.define_method(
|
316
334
|
"add_modulo_equality",
|
317
335
|
*[](CpModelBuilder& self, IntVar target, IntVar var, IntVar mod) {
|
318
|
-
self.AddModuloEquality(target, var, mod);
|
336
|
+
return self.AddModuloEquality(target, var, mod);
|
319
337
|
})
|
320
338
|
.define_method(
|
321
339
|
"add_product_equality",
|
322
340
|
*[](CpModelBuilder& self, IntVar target, IntVarSpan vars) {
|
323
|
-
self.AddProductEquality(target, vars);
|
341
|
+
return self.AddProductEquality(target, vars);
|
324
342
|
})
|
325
343
|
.define_method(
|
326
344
|
"add_no_overlap",
|
327
345
|
*[](CpModelBuilder& self, IntervalVarSpan vars) {
|
328
|
-
self.AddNoOverlap(vars);
|
346
|
+
return self.AddNoOverlap(vars);
|
329
347
|
})
|
330
348
|
.define_method(
|
331
349
|
"maximize",
|
@@ -342,6 +360,31 @@ void init_constraint(Rice::Module& m) {
|
|
342
360
|
*[](CpModelBuilder& self, double scaling) {
|
343
361
|
self.ScaleObjectiveBy(scaling);
|
344
362
|
})
|
363
|
+
.define_method(
|
364
|
+
"add_hint",
|
365
|
+
*[](CpModelBuilder& self, IntVar var, int64 value) {
|
366
|
+
self.AddHint(var, value);
|
367
|
+
})
|
368
|
+
.define_method(
|
369
|
+
"clear_hints",
|
370
|
+
*[](CpModelBuilder& self) {
|
371
|
+
self.ClearHints();
|
372
|
+
})
|
373
|
+
.define_method(
|
374
|
+
"add_assumption",
|
375
|
+
*[](CpModelBuilder& self, BoolVar lit) {
|
376
|
+
self.AddAssumption(lit);
|
377
|
+
})
|
378
|
+
.define_method(
|
379
|
+
"add_assumptions",
|
380
|
+
*[](CpModelBuilder& self, BoolVarSpan literals) {
|
381
|
+
self.AddAssumptions(literals);
|
382
|
+
})
|
383
|
+
.define_method(
|
384
|
+
"clear_assumptions",
|
385
|
+
*[](CpModelBuilder& self) {
|
386
|
+
self.ClearAssumptions();
|
387
|
+
})
|
345
388
|
.define_method(
|
346
389
|
"to_s",
|
347
390
|
*[](CpModelBuilder& self) {
|
data/ext/or-tools/vendor.rb
CHANGED
@@ -18,16 +18,25 @@ else
|
|
18
18
|
filename = "or-tools_ubuntu-18.04_v#{version}.tar.gz"
|
19
19
|
checksum = "0d052deb2ba4491c29e86242fb5d61d0fe14bac847c2feaa35fbeff925ea40a0"
|
20
20
|
elsif os == "Debian" && os_version == "10"
|
21
|
-
filename = "or-tools_debian-10_v#{version}.tar.gz
|
21
|
+
filename = "or-tools_debian-10_v#{version}.tar.gz"
|
22
22
|
checksum = "1f2ec99181c92859ab46e68a6231babce92ded949fd1d08ee31afa4db04c43b3"
|
23
23
|
elsif os == "CentOS" && os_version == "8"
|
24
24
|
filename = "or-tools_centos-8_v#{version}.tar.gz"
|
25
25
|
checksum = "be638a20b36f6da81aa29fd24c69c4a66afc980b8a221b1cbabb3910b9827718"
|
26
26
|
else
|
27
|
+
platform =
|
28
|
+
if Gem.win_platform?
|
29
|
+
"Windows"
|
30
|
+
elsif os || os_version
|
31
|
+
"#{os} #{os_version}"
|
32
|
+
else
|
33
|
+
"Unknown"
|
34
|
+
end
|
35
|
+
|
27
36
|
# there is a binary download for Windows
|
28
37
|
# however, it's compiled with Visual Studio rather than MinGW (which RubyInstaller uses)
|
29
38
|
raise <<~MSG
|
30
|
-
Binary installation not available for this platform
|
39
|
+
Binary installation not available for this platform: #{platform}
|
31
40
|
|
32
41
|
Build the OR-Tools C++ library from source, then run:
|
33
42
|
bundle config build.or-tools --with-or-tools-dir=/path/to/or-tools
|
@@ -41,7 +50,9 @@ url = "https://github.com/google/or-tools/releases/download/v#{short_version}/#{
|
|
41
50
|
|
42
51
|
$stdout.sync = true
|
43
52
|
|
44
|
-
def download_file(url, download_path)
|
53
|
+
def download_file(url, download_path, redirects = 0)
|
54
|
+
raise "Too many redirects" if redirects > 10
|
55
|
+
|
45
56
|
uri = URI(url)
|
46
57
|
location = nil
|
47
58
|
|
@@ -70,7 +81,7 @@ def download_file(url, download_path)
|
|
70
81
|
end
|
71
82
|
|
72
83
|
# outside of Net::HTTP block to close previous connection
|
73
|
-
download_file(location, download_path) if location
|
84
|
+
download_file(location, download_path, redirects + 1) if location
|
74
85
|
end
|
75
86
|
|
76
87
|
# download
|
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.4.
|
4
|
+
version: 0.4.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Kane
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-03-
|
11
|
+
date: 2021-03-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rice
|