or-tools 0.5.2 → 0.6.1

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: 4e179505f9df7d80af6a316ca719594fa2a99839c8c26b0f33ee1551b4e7b2d3
4
- data.tar.gz: b05dc3c553d11112e55855bb91b0382a3a648a14848e5c9d6e3805bf52e009fb
3
+ metadata.gz: '018061d137668676a2aca20c0ea0b1bbf01cfb19e02e0f7a532e9e4d800fb735'
4
+ data.tar.gz: 05e1f19947935d6ccf13c551cbf24cccd4fe3aa989d9bbbb31612c15837eb837
5
5
  SHA512:
6
- metadata.gz: fa77b818baf408c3cf30b56065f0b9b7f877358e1f0d39718a3ebc1f49fc4dae78da9678875c340895427f189074939e220ffa320207bea76bd0d7921f0675d7
7
- data.tar.gz: 7c174df348ad0835c93a56ecb51a6f9763aaba43f0d3fc3eaf0b8b745922a204d86ee6fae6ba3fba632b284179251decbbfce17b2a1dd1e608d91b96cf3ff9ec
6
+ metadata.gz: 4c32d4c6171f9c67011c4be7ec730583b1ea81cff00ab4ef865185b42fc5b0b7f843305e8bad31bcf22ad054fc0f7813e4d2ef84d0416bf42612c91800df699d
7
+ data.tar.gz: e13cb7b42a02d010f733e7f1b12d36fc79abf1718c3a8064b5d2d97d63b93f6e80c73f54743d6a290856d014c5f6a1141328e671c78fc9679a543fcc178ee2d5
data/CHANGELOG.md CHANGED
@@ -1,3 +1,25 @@
1
+ ## 0.6.1 (2022-01-22)
2
+
3
+ - Added installation instructions for Mac ARM
4
+ - Removed dependency on `lsb_release` for binary installation on Linux
5
+
6
+ ## 0.6.0 (2021-12-16)
7
+
8
+ - Updated OR-Tools to 9.2
9
+ - Renamed `add_product_equality` to `add_multiplication_equality`
10
+ - Removed `scale_objective_by`
11
+
12
+ ## 0.5.4 (2021-10-01)
13
+
14
+ - Updated OR-Tools to 9.1
15
+ - Added binary installation for Debian 11
16
+ - Deprecated `solve_with_solution_callback` and `search_for_all_solutions`
17
+
18
+ ## 0.5.3 (2021-08-02)
19
+
20
+ - Added more methods to `IntVar`, `IntervalVar`, and `Constraint`
21
+ - Added `RoutingModelParameters`
22
+
1
23
  ## 0.5.2 (2021-07-07)
2
24
 
3
25
  - Added `export_model_as_lp_format` and `export_model_as_mps_format` to `Solver`
data/README.md CHANGED
@@ -1,8 +1,8 @@
1
- # OR-Tools
1
+ # OR-Tools Ruby
2
2
 
3
3
  [OR-Tools](https://github.com/google/or-tools) - operations research tools - for Ruby
4
4
 
5
- [![Build Status](https://github.com/ankane/or-tools/workflows/build/badge.svg?branch=master)](https://github.com/ankane/or-tools/actions)
5
+ [![Build Status](https://github.com/ankane/or-tools-ruby/workflows/build/badge.svg?branch=master)](https://github.com/ankane/or-tools-ruby/actions)
6
6
 
7
7
  ## Installation
8
8
 
@@ -12,7 +12,7 @@ Add this line to your application’s Gemfile:
12
12
  gem 'or-tools'
13
13
  ```
14
14
 
15
- Installation can take a few minutes as OR-Tools downloads and builds.
15
+ Installation can take a few minutes as OR-Tools downloads and builds. For Mac ARM, also follow [these instructions](#additional-instructions).
16
16
 
17
17
  ## Higher Level Interfaces
18
18
 
@@ -2139,7 +2139,7 @@ model.add(seats[[0, 0]] == 1)
2139
2139
  # Solve model
2140
2140
  solver = ORTools::CpSolver.new
2141
2141
  solution_printer = WeddingChartPrinter.new(seats, names, num_tables, num_guests)
2142
- solver.solve_with_solution_callback(model, solution_printer)
2142
+ solver.solve(model, solution_printer)
2143
2143
 
2144
2144
  puts "Statistics"
2145
2145
  puts " - conflicts : %i" % solver.num_conflicts
@@ -2201,24 +2201,35 @@ possible_tables.each do |table|
2201
2201
  end
2202
2202
  ```
2203
2203
 
2204
+ ## Additional Instructions
2205
+
2206
+ ### Mac ARM
2207
+
2208
+ ARM binaries are not available for Mac yet, so use Homebrew to install OR-Tools before installing the gem.
2209
+
2210
+ ```sh
2211
+ brew install or-tools
2212
+ bundle config build.or-tools --with-or-tools-dir=/opt/homebrew
2213
+ ```
2214
+
2204
2215
  ## History
2205
2216
 
2206
- View the [changelog](https://github.com/ankane/or-tools/blob/master/CHANGELOG.md)
2217
+ View the [changelog](https://github.com/ankane/or-tools-ruby/blob/master/CHANGELOG.md)
2207
2218
 
2208
2219
  ## Contributing
2209
2220
 
2210
2221
  Everyone is encouraged to help improve this project. Here are a few ways you can help:
2211
2222
 
2212
- - [Report bugs](https://github.com/ankane/or-tools/issues)
2213
- - Fix bugs and [submit pull requests](https://github.com/ankane/or-tools/pulls)
2223
+ - [Report bugs](https://github.com/ankane/or-tools-ruby/issues)
2224
+ - Fix bugs and [submit pull requests](https://github.com/ankane/or-tools-ruby/pulls)
2214
2225
  - Write, clarify, or fix documentation
2215
2226
  - Suggest or add new features
2216
2227
 
2217
2228
  To get started with development:
2218
2229
 
2219
2230
  ```sh
2220
- git clone https://github.com/ankane/or-tools.git
2221
- cd or-tools
2231
+ git clone https://github.com/ankane/or-tools-ruby.git
2232
+ cd or-tools-ruby
2222
2233
  bundle install
2223
2234
  bundle exec rake compile
2224
2235
  bundle exec rake test
@@ -131,10 +131,21 @@ void init_constraint(Rice::Module& m) {
131
131
 
132
132
  Rice::define_class_under<SatParameters>(m, "SatParameters")
133
133
  .define_constructor(Rice::Constructor<SatParameters>())
134
- .define_method("max_time_in_seconds=",
135
- [](SatParameters& self, double value) {
136
- self.set_max_time_in_seconds(value);
137
- });
134
+ .define_method(
135
+ "max_time_in_seconds=",
136
+ [](SatParameters& self, double value) {
137
+ self.set_max_time_in_seconds(value);
138
+ })
139
+ .define_method(
140
+ "enumerate_all_solutions=",
141
+ [](SatParameters& self, bool value) {
142
+ self.set_enumerate_all_solutions(value);
143
+ })
144
+ .define_method(
145
+ "enumerate_all_solutions",
146
+ [](SatParameters& self) {
147
+ return self.enumerate_all_solutions();
148
+ });
138
149
 
139
150
  Rice::define_class_under<CpModelBuilder>(m, "CpModel")
140
151
  .define_constructor(Rice::Constructor<CpModelBuilder>())
@@ -276,9 +287,9 @@ void init_constraint(Rice::Module& m) {
276
287
  return self.AddModuloEquality(target, var, mod);
277
288
  })
278
289
  .define_method(
279
- "add_product_equality",
290
+ "add_multiplication_equality",
280
291
  [](CpModelBuilder& self, IntVar target, std::vector<IntVar> vars) {
281
- return self.AddProductEquality(target, vars);
292
+ return self.AddMultiplicationEquality(target, vars);
282
293
  })
283
294
  .define_method(
284
295
  "add_no_overlap",
@@ -295,11 +306,6 @@ void init_constraint(Rice::Module& m) {
295
306
  [](CpModelBuilder& self, LinearExpr expr) {
296
307
  self.Minimize(expr);
297
308
  })
298
- .define_method(
299
- "scale_objective_by",
300
- [](CpModelBuilder& self, double scaling) {
301
- self.ScaleObjectiveBy(scaling);
302
- })
303
309
  .define_method(
304
310
  "add_hint",
305
311
  [](CpModelBuilder& self, IntVar var, int64_t value) {
@@ -377,29 +383,23 @@ void init_constraint(Rice::Module& m) {
377
383
 
378
384
  Rice::define_class_under(m, "CpSolver")
379
385
  .define_method(
380
- "_solve_with_observer",
381
- [](Object self, CpModelBuilder& model, SatParameters& parameters, Object callback, bool all_solutions) {
386
+ "_solve",
387
+ [](Object self, CpModelBuilder& model, SatParameters& parameters, Object callback) {
382
388
  Model m;
383
389
 
384
- if (all_solutions) {
385
- // set parameters for SearchForAllSolutions
386
- parameters.set_enumerate_all_solutions(true);
390
+ if (!callback.is_nil()) {
391
+ // TODO figure out how to use callback with multiple cores
392
+ parameters.set_num_search_workers(1);
393
+
394
+ m.Add(NewFeasibleSolutionObserver(
395
+ [callback](const CpSolverResponse& r) {
396
+ // TODO find a better way to do this
397
+ callback.call("response=", r);
398
+ callback.call("on_solution_callback");
399
+ })
400
+ );
387
401
  }
388
- m.Add(NewSatParameters(parameters));
389
402
 
390
- m.Add(NewFeasibleSolutionObserver(
391
- [callback](const CpSolverResponse& r) {
392
- // TODO find a better way to do this
393
- callback.call("response=", r);
394
- callback.call("on_solution_callback");
395
- })
396
- );
397
- return SolveCpModel(model.Build(), &m);
398
- })
399
- .define_method(
400
- "_solve",
401
- [](Object self, CpModelBuilder& model, SatParameters& parameters) {
402
- Model m;
403
403
  m.Add(NewSatParameters(parameters));
404
404
  return SolveCpModel(model.Build(), &m);
405
405
  })
@@ -4,12 +4,14 @@
4
4
  #include "ext.h"
5
5
 
6
6
  using operations_research::Assignment;
7
+ using operations_research::ConstraintSolverParameters;
7
8
  using operations_research::DefaultRoutingSearchParameters;
8
9
  using operations_research::FirstSolutionStrategy;
9
10
  using operations_research::LocalSearchMetaheuristic;
10
11
  using operations_research::RoutingDimension;
11
12
  using operations_research::RoutingIndexManager;
12
13
  using operations_research::RoutingModel;
14
+ using operations_research::RoutingModelParameters;
13
15
  using operations_research::RoutingNodeIndex;
14
16
  using operations_research::RoutingSearchParameters;
15
17
 
@@ -163,19 +165,45 @@ void init_routing(Rice::Module& m) {
163
165
 
164
166
  // not to be confused with operations_research::sat::IntVar
165
167
  rb_cIntVar
168
+ .define_method("var?", &operations_research::IntVar::IsVar)
169
+ .define_method("value", &operations_research::IntVar::Value)
170
+ .define_method("remove_value", &operations_research::IntVar::RemoveValue)
171
+ .define_method("remove_interval", &operations_research::IntVar::RemoveInterval)
172
+ .define_method("remove_values", &operations_research::IntVar::RemoveValues)
173
+ .define_method("set_values", &operations_research::IntVar::SetValues)
174
+ .define_method("size", &operations_research::IntVar::Size)
175
+ .define_method("contains", &operations_research::IntVar::Contains)
176
+ .define_method("old_min", &operations_research::IntVar::OldMin)
177
+ .define_method("old_max", &operations_research::IntVar::OldMax)
166
178
  .define_method(
167
179
  "set_range",
168
180
  [](operations_research::IntVar& self, int64_t new_min, int64_t new_max) {
169
181
  self.SetRange(new_min, new_max);
170
182
  });
171
183
 
172
- Rice::define_class_under<operations_research::IntervalVar>(m, "IntervalVar");
184
+ Rice::define_class_under<operations_research::IntervalVar>(m, "IntervalVar")
185
+ .define_method("start_min", &operations_research::IntervalVar::StartMin)
186
+ .define_method("start_max", &operations_research::IntervalVar::StartMax)
187
+ .define_method("set_start_min", &operations_research::IntervalVar::SetStartMin)
188
+ .define_method("set_start_max", &operations_research::IntervalVar::SetStartMax)
189
+ .define_method("set_start_range", &operations_research::IntervalVar::SetStartRange)
190
+ .define_method("old_start_min", &operations_research::IntervalVar::OldStartMin)
191
+ .define_method("old_start_max", &operations_research::IntervalVar::OldStartMax)
192
+ .define_method("end_min", &operations_research::IntervalVar::EndMin)
193
+ .define_method("end_max", &operations_research::IntervalVar::EndMax)
194
+ .define_method("set_end_min", &operations_research::IntervalVar::SetEndMin)
195
+ .define_method("set_end_max", &operations_research::IntervalVar::SetEndMax)
196
+ .define_method("set_end_range", &operations_research::IntervalVar::SetEndRange)
197
+ .define_method("old_end_min", &operations_research::IntervalVar::OldEndMin)
198
+ .define_method("old_end_max", &operations_research::IntervalVar::OldEndMax);
173
199
 
174
200
  Rice::define_class_under<RoutingDimension>(m, "RoutingDimension")
175
201
  .define_method("global_span_cost_coefficient=", &RoutingDimension::SetGlobalSpanCostCoefficient)
176
202
  .define_method("cumul_var", &RoutingDimension::CumulVar);
177
203
 
178
- Rice::define_class_under<operations_research::Constraint>(m, "Constraint");
204
+ Rice::define_class_under<operations_research::Constraint>(m, "Constraint")
205
+ .define_method("post", &operations_research::Constraint::Post)
206
+ .define_method("debug_string", &operations_research::Constraint::DebugString);
179
207
 
180
208
  Rice::define_class_under<operations_research::Solver>(m, "Solver2")
181
209
  .define_method(
@@ -209,8 +237,33 @@ void init_routing(Rice::Module& m) {
209
237
  return self.MakeCumulative(intervals, demands, capacity, name);
210
238
  });
211
239
 
240
+ Rice::define_class_under<ConstraintSolverParameters>(m, "ConstraintSolverParameters")
241
+ .define_method(
242
+ "trace_propagation=",
243
+ [](ConstraintSolverParameters& self, bool value) {
244
+ self.set_trace_propagation(value);
245
+ })
246
+ .define_method(
247
+ "trace_search=",
248
+ [](ConstraintSolverParameters& self, bool value) {
249
+ self.set_trace_search(value);
250
+ });
251
+
252
+ Rice::define_class_under<RoutingModelParameters>(m, "RoutingModelParameters")
253
+ .define_method(
254
+ "solver_parameters",
255
+ [](RoutingModelParameters& self) {
256
+ return self.mutable_solver_parameters();
257
+ });
258
+
259
+ m.define_singleton_function(
260
+ "default_routing_model_parameters",
261
+ []() {
262
+ return operations_research::DefaultRoutingModelParameters();
263
+ });
264
+
212
265
  Rice::define_class_under<RoutingModel>(m, "RoutingModel")
213
- .define_constructor(Rice::Constructor<RoutingModel, RoutingIndexManager>())
266
+ .define_constructor(Rice::Constructor<RoutingModel, RoutingIndexManager, RoutingModelParameters>(), Rice::Arg("index_manager"), Rice::Arg("parameters") = operations_research::DefaultRoutingModelParameters())
214
267
  .define_method(
215
268
  "register_transit_callback",
216
269
  [](RoutingModel& self, Object callback) {
@@ -1,31 +1,54 @@
1
+ require "csv"
1
2
  require "digest"
2
3
  require "fileutils"
3
4
  require "net/http"
4
5
  require "tmpdir"
5
6
 
6
- version = "9.0.9048"
7
+ version = "9.2.9972"
7
8
 
8
9
  if RbConfig::CONFIG["host_os"] =~ /darwin/i
9
- filename = "or-tools_MacOsX-11.2.3_v#{version}.tar.gz"
10
- checksum = "adf73a00d4ec49558b67be5ce3cfc8f30268da2253b35feb11d0d40700550bf6"
10
+ if RbConfig::CONFIG["host_cpu"] =~ /arm|aarch64/i
11
+ raise <<~MSG
12
+ Binary installation not available for this platform: Mac ARM
13
+
14
+ Run:
15
+ brew install or-tools
16
+ bundle config build.or-tools --with-or-tools-dir=/opt/homebrew
17
+
18
+ MSG
19
+ else
20
+ filename = "or-tools_MacOsX-12.0.1_v#{version}.tar.gz"
21
+ checksum = "796791a8ef84507d62e193e647cccb1c7725dae4f1474476e1777fe4a44ee3e0"
22
+ end
11
23
  else
12
- os = %x[lsb_release -is].chomp rescue nil
13
- os_version = %x[lsb_release -rs].chomp rescue nil
14
- if os == "Ubuntu" && os_version == "20.04"
15
- filename = "or-tools_ubuntu-20.04_v#{version}.tar.gz"
16
- checksum = "5565343c1c310d2885a40ce850ae7e3468299b3fee97ae8eed8425ce06bd4960"
17
- elsif os == "Ubuntu" && os_version == "18.04"
18
- filename = "or-tools_ubuntu-18.04_v#{version}.tar.gz"
19
- checksum = "08cf548d0179f7fa814bb7458be94cd1b8a3de14985e6a9faf6118a1d8571539"
20
- elsif os == "Debian" && os_version == "10"
21
- filename = "or-tools_debian-10_v#{version}.tar.gz"
22
- checksum = "063fb1d8765ae23b0bb25b9c561e904532713416fe0458f7db45a0f72190eb50"
23
- elsif os == "CentOS" && os_version == "8"
24
- filename = "or-tools_centos-8_v#{version}.tar.gz"
25
- checksum = "c98212ed4fc699d8ae70c1f53cd1d8dacd28e52970336fab5b86dedf7406f215"
26
- elsif os == "CentOS" && os_version == "7"
27
- filename = "or-tools_centos-7_v#{version}.tar.gz"
28
- checksum = "b992bda4614bbc703583b0e9edcd2ade54bacfb9909399b20c8aa95ff7197d68"
24
+ # try /etc/os-release with fallback to /usr/lib/os-release
25
+ # https://www.freedesktop.org/software/systemd/man/os-release.html
26
+ os_filename = File.exist?("/etc/os-release") ? "/etc/os-release" : "/usr/lib/os-release"
27
+
28
+ # for safety, parse rather than source
29
+ os_info = CSV.read(os_filename, col_sep: "=").to_h rescue {}
30
+
31
+ os = os_info["ID"]
32
+ os_version = os_info["VERSION_ID"]
33
+
34
+ if os == "ubuntu" && os_version == "20.04"
35
+ filename = "or-tools_amd64_ubuntu-20.04_v#{version}.tar.gz"
36
+ checksum = "985e3036eaecacfc8a0258ec2ebef429240491577d4e0896d68fc076e65451ec"
37
+ elsif os == "ubuntu" && os_version == "18.04"
38
+ filename = "or-tools_amd64_ubuntu-18.04_v#{version}.tar.gz"
39
+ checksum = "e36406c4fe8c111e1ace0ede9d0787ff0e98f11afd7db9cc074adfd0f55628a6"
40
+ elsif os == "debian" && os_version == "11"
41
+ filename = "or-tools_amd64_debian-11_v#{version}.tar.gz"
42
+ checksum = "bd49ee916213b2140ab255414d35a28f19dff7caf87632309753d3fc553f85dd"
43
+ elsif os == "debian" && os_version == "10"
44
+ filename = "or-tools_amd64_debian-10_v#{version}.tar.gz"
45
+ checksum = "b152fee584f0c8228fe2ff21b74c789870ff9b7064e42ca26305c6b5653f0064"
46
+ elsif os == "centos" && os_version == "8"
47
+ filename = "or-tools_amd64_centos-8_v#{version}.tar.gz"
48
+ checksum = "66ed4bb800acf92c672f7e68acdf4ea27bbfdb17bbddc02f8326cd55a97305f6"
49
+ elsif os == "centos" && os_version == "7"
50
+ filename = "or-tools_amd64_centos-7_v#{version}.tar.gz"
51
+ checksum = "4a5c1b1639a2828cd7e1ba82a574ef37876557b59e8aab8b81811bb750d53035"
29
52
  else
30
53
  platform =
31
54
  if Gem.win_platform?
@@ -6,8 +6,8 @@ module ORTools
6
6
 
7
7
  def_delegators :@response, :objective_value, :num_conflicts, :num_branches, :wall_time
8
8
 
9
- def solve(model)
10
- @response = _solve(model, parameters)
9
+ def solve(model, observer = nil)
10
+ @response = _solve(model, parameters, observer)
11
11
  @response.status
12
12
  end
13
13
 
@@ -20,13 +20,19 @@ module ORTools
20
20
  end
21
21
 
22
22
  def solve_with_solution_callback(model, observer)
23
- @response = _solve_with_observer(model, parameters, observer, false)
24
- @response.status
23
+ warn "[or-tools] solve_with_solution_callback is deprecated; use solve(model, callback)"
24
+ solve(model, observer)
25
25
  end
26
26
 
27
27
  def search_for_all_solutions(model, observer)
28
- @response = _solve_with_observer(model, parameters, observer, true)
29
- @response.status
28
+ warn "[or-tools] search_for_all_solutions is deprecated; use solve() with solver.parameters.enumerate_all_solutions = true"
29
+ previous_value = parameters.enumerate_all_solutions
30
+ begin
31
+ parameters.enumerate_all_solutions = true
32
+ solve(model, observer)
33
+ ensure
34
+ parameters.enumerate_all_solutions = previous_value
35
+ end
30
36
  end
31
37
 
32
38
  def sufficient_assumptions_for_infeasibility
@@ -1,3 +1,3 @@
1
1
  module ORTools
2
- VERSION = "0.5.2"
2
+ VERSION = "0.6.1"
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.5.2
4
+ version: 0.6.1
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-07-07 00:00:00.000000000 Z
11
+ date: 2022-01-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rice
@@ -68,7 +68,7 @@ files:
68
68
  - lib/or_tools/var_array_and_objective_solution_printer.rb
69
69
  - lib/or_tools/var_array_solution_printer.rb
70
70
  - lib/or_tools/version.rb
71
- homepage: https://github.com/ankane/or-tools
71
+ homepage: https://github.com/ankane/or-tools-ruby
72
72
  licenses:
73
73
  - MIT
74
74
  metadata: {}
@@ -87,7 +87,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
87
87
  - !ruby/object:Gem::Version
88
88
  version: '0'
89
89
  requirements: []
90
- rubygems_version: 3.2.3
90
+ rubygems_version: 3.3.3
91
91
  signing_key:
92
92
  specification_version: 4
93
93
  summary: Operations research tools for Ruby