or-tools 0.5.1 → 0.6.0

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: 0a848cf114ad9ca6d778daf6cb19ff78b3c4015c4b39eb6b6274e61c4175b87d
4
- data.tar.gz: bb3c6b79787a0793367ab900b95caf8fa0b242f76fd0c2adc2a434056648e1e9
3
+ metadata.gz: 1775ae46a18be137ae64fce870d29c17c3ae385c61f295f79d7ded40ed0be0bd
4
+ data.tar.gz: 28262f8b77a8dd0dc085e16a261005a47e1352d8f9f5c148ed524c348daec8db
5
5
  SHA512:
6
- metadata.gz: 571acd73a42c0e3181e256d30c42f8b18d7bcf01ada104a181c7e2b4034358d14409ba1904017c31a4c3c07b15744ac8eeb9422f5d8074c9e2c818bc38bf7ec3
7
- data.tar.gz: 762bfc272f728f1b04af4d153591b52798415c2729d4111445779b66c356b9714a4b88eb8ba6546bc43c017184868cf9adcb91df980c105be3a72f2555a8d7f2
6
+ metadata.gz: 771d9a78ace00ce16d8f5e71f595a4523fd8613c81b8e09691d231cb1e7881ce94e8cdd0e21dd60168a58d40e0135891988cfc47fac33d511b551cf932819bae
7
+ data.tar.gz: 5231109d9afb080481f608bd784b3e86cdfc0b336f828d9fad714b5fa37eda0c4f02495e3718eeb9b0c05135b5b344a7084df55c7f26674ef2e73653ad7d8a3d
data/CHANGELOG.md CHANGED
@@ -1,3 +1,24 @@
1
+ ## 0.6.0 (2021-12-16)
2
+
3
+ - Updated OR-Tools to 9.2
4
+ - Renamed `add_product_equality` to `add_multiplication_equality`
5
+ - Removed `scale_objective_by`
6
+
7
+ ## 0.5.4 (2021-10-01)
8
+
9
+ - Updated OR-Tools to 9.1
10
+ - Added binary installation for Debian 11
11
+ - Deprecated `solve_with_solution_callback` and `search_for_all_solutions`
12
+
13
+ ## 0.5.3 (2021-08-02)
14
+
15
+ - Added more methods to `IntVar`, `IntervalVar`, and `Constraint`
16
+ - Added `RoutingModelParameters`
17
+
18
+ ## 0.5.2 (2021-07-07)
19
+
20
+ - Added `export_model_as_lp_format` and `export_model_as_mps_format` to `Solver`
21
+
1
22
  ## 0.5.1 (2021-05-23)
2
23
 
3
24
  - Updated to Rice 4
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
 
@@ -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
@@ -2203,22 +2203,22 @@ end
2203
2203
 
2204
2204
  ## History
2205
2205
 
2206
- View the [changelog](https://github.com/ankane/or-tools/blob/master/CHANGELOG.md)
2206
+ View the [changelog](https://github.com/ankane/or-tools-ruby/blob/master/CHANGELOG.md)
2207
2207
 
2208
2208
  ## Contributing
2209
2209
 
2210
2210
  Everyone is encouraged to help improve this project. Here are a few ways you can help:
2211
2211
 
2212
- - [Report bugs](https://github.com/ankane/or-tools/issues)
2213
- - Fix bugs and [submit pull requests](https://github.com/ankane/or-tools/pulls)
2212
+ - [Report bugs](https://github.com/ankane/or-tools-ruby/issues)
2213
+ - Fix bugs and [submit pull requests](https://github.com/ankane/or-tools-ruby/pulls)
2214
2214
  - Write, clarify, or fix documentation
2215
2215
  - Suggest or add new features
2216
2216
 
2217
2217
  To get started with development:
2218
2218
 
2219
2219
  ```sh
2220
- git clone https://github.com/ankane/or-tools.git
2221
- cd or-tools
2220
+ git clone https://github.com/ankane/or-tools-ruby.git
2221
+ cd or-tools-ruby
2222
2222
  bundle install
2223
2223
  bundle exec rake compile
2224
2224
  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
  })
@@ -197,5 +197,23 @@ void init_linear(Rice::Module& m) {
197
197
  } else {
198
198
  throw std::runtime_error("Unknown status");
199
199
  }
200
+ })
201
+ .define_method(
202
+ "export_model_as_lp_format",
203
+ [](MPSolver& self, bool obfuscate) {
204
+ std::string model_str;
205
+ if (!self.ExportModelAsLpFormat(obfuscate, &model_str)) {
206
+ throw std::runtime_error("Export failed");
207
+ }
208
+ return model_str;
209
+ })
210
+ .define_method(
211
+ "export_model_as_mps_format",
212
+ [](MPSolver& self, bool fixed_format, bool obfuscate) {
213
+ std::string model_str;
214
+ if (!self.ExportModelAsMpsFormat(fixed_format, obfuscate, &model_str)) {
215
+ throw std::runtime_error("Export failed");
216
+ }
217
+ return model_str;
200
218
  });
201
219
  }
@@ -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) {
@@ -3,29 +3,32 @@ require "fileutils"
3
3
  require "net/http"
4
4
  require "tmpdir"
5
5
 
6
- version = "9.0.9048"
6
+ version = "9.2.9972"
7
7
 
8
8
  if RbConfig::CONFIG["host_os"] =~ /darwin/i
9
- filename = "or-tools_MacOsX-11.2.3_v#{version}.tar.gz"
10
- checksum = "adf73a00d4ec49558b67be5ce3cfc8f30268da2253b35feb11d0d40700550bf6"
9
+ filename = "or-tools_MacOsX-12.0.1_v#{version}.tar.gz"
10
+ checksum = "796791a8ef84507d62e193e647cccb1c7725dae4f1474476e1777fe4a44ee3e0"
11
11
  else
12
12
  os = %x[lsb_release -is].chomp rescue nil
13
13
  os_version = %x[lsb_release -rs].chomp rescue nil
14
14
  if os == "Ubuntu" && os_version == "20.04"
15
- filename = "or-tools_ubuntu-20.04_v#{version}.tar.gz"
16
- checksum = "5565343c1c310d2885a40ce850ae7e3468299b3fee97ae8eed8425ce06bd4960"
15
+ filename = "or-tools_amd64_ubuntu-20.04_v#{version}.tar.gz"
16
+ checksum = "985e3036eaecacfc8a0258ec2ebef429240491577d4e0896d68fc076e65451ec"
17
17
  elsif os == "Ubuntu" && os_version == "18.04"
18
- filename = "or-tools_ubuntu-18.04_v#{version}.tar.gz"
19
- checksum = "08cf548d0179f7fa814bb7458be94cd1b8a3de14985e6a9faf6118a1d8571539"
18
+ filename = "or-tools_amd64_ubuntu-18.04_v#{version}.tar.gz"
19
+ checksum = "e36406c4fe8c111e1ace0ede9d0787ff0e98f11afd7db9cc074adfd0f55628a6"
20
+ elsif os == "Debian" && os_version == "11"
21
+ filename = "or-tools_amd64_debian-11_v#{version}.tar.gz"
22
+ checksum = "bd49ee916213b2140ab255414d35a28f19dff7caf87632309753d3fc553f85dd"
20
23
  elsif os == "Debian" && os_version == "10"
21
- filename = "or-tools_debian-10_v#{version}.tar.gz"
22
- checksum = "063fb1d8765ae23b0bb25b9c561e904532713416fe0458f7db45a0f72190eb50"
24
+ filename = "or-tools_amd64_debian-10_v#{version}.tar.gz"
25
+ checksum = "b152fee584f0c8228fe2ff21b74c789870ff9b7064e42ca26305c6b5653f0064"
23
26
  elsif os == "CentOS" && os_version == "8"
24
- filename = "or-tools_centos-8_v#{version}.tar.gz"
25
- checksum = "c98212ed4fc699d8ae70c1f53cd1d8dacd28e52970336fab5b86dedf7406f215"
27
+ filename = "or-tools_amd64_centos-8_v#{version}.tar.gz"
28
+ checksum = "66ed4bb800acf92c672f7e68acdf4ea27bbfdb17bbddc02f8326cd55a97305f6"
26
29
  elsif os == "CentOS" && os_version == "7"
27
- filename = "or-tools_centos-7_v#{version}.tar.gz"
28
- checksum = "b992bda4614bbc703583b0e9edcd2ade54bacfb9909399b20c8aa95ff7197d68"
30
+ filename = "or-tools_amd64_centos-7_v#{version}.tar.gz"
31
+ checksum = "4a5c1b1639a2828cd7e1ba82a574ef37876557b59e8aab8b81811bb750d53035"
29
32
  else
30
33
  platform =
31
34
  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.1"
2
+ VERSION = "0.6.0"
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.1
4
+ version: 0.6.0
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-05-23 00:00:00.000000000 Z
11
+ date: 2021-12-17 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.2.32
91
91
  signing_key:
92
92
  specification_version: 4
93
93
  summary: Operations research tools for Ruby