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