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 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