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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 187c4661b540b302b0b61fe7925c841342044906602a565d11855bbc0d407510
4
- data.tar.gz: ad2ac0aa8f426ff09144c5194ec5f278cf3ec8178dfe270c6b853a6795bb3447
3
+ metadata.gz: 7a1064c39ae0b5431b303db41b4fe03da7f80d26beeab576b33b85fe47dee4d8
4
+ data.tar.gz: 5819ef15c9ec8b1b507fb4e4596397a8f2e562fa72de6580b1e78188a404a3db
5
5
  SHA512:
6
- metadata.gz: 98764f3d32b697cca083f3f521b109f070fe760123ebaff0926e4729fbe161d95e264ec19313da114b3801fe8f0a8cf8ad7fff31ed2e87b5422d90235b78f508
7
- data.tar.gz: d299fe041dfaa8a54bbe879beb079e1bb19fe36d2453805562cae95be5ffe7ddf292cf07a305d0aaa760cab0d80506923f90714df17fc96c1dde05f8afd55241
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
@@ -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
- vec.push_back(from_ruby<BoolVar>(a[i]));
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) {
@@ -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
@@ -1,3 +1,3 @@
1
1
  module ORTools
2
- VERSION = "0.4.2"
2
+ VERSION = "0.4.3"
3
3
  end
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.2
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-03 00:00:00.000000000 Z
11
+ date: 2021-03-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rice