or-tools 0.5.2 → 0.6.1

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