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 +4 -4
- data/CHANGELOG.md +21 -0
- data/README.md +8 -8
- data/ext/or-tools/constraint.cpp +30 -30
- data/ext/or-tools/linear.cpp +18 -0
- data/ext/or-tools/routing.cpp +56 -3
- data/ext/or-tools/vendor.rb +16 -13
- data/lib/or_tools/cp_solver.rb +12 -6
- data/lib/or_tools/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1775ae46a18be137ae64fce870d29c17c3ae385c61f295f79d7ded40ed0be0bd
|
4
|
+
data.tar.gz: 28262f8b77a8dd0dc085e16a261005a47e1352d8f9f5c148ed524c348daec8db
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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.
|
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
|
data/ext/or-tools/constraint.cpp
CHANGED
@@ -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(
|
135
|
-
|
136
|
-
self
|
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
|
-
"
|
290
|
+
"add_multiplication_equality",
|
280
291
|
[](CpModelBuilder& self, IntVar target, std::vector<IntVar> vars) {
|
281
|
-
return self.
|
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
|
-
"
|
381
|
-
[](Object self, CpModelBuilder& model, SatParameters& parameters, Object callback
|
386
|
+
"_solve",
|
387
|
+
[](Object self, CpModelBuilder& model, SatParameters& parameters, Object callback) {
|
382
388
|
Model m;
|
383
389
|
|
384
|
-
if (
|
385
|
-
//
|
386
|
-
parameters.
|
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
|
})
|
data/ext/or-tools/linear.cpp
CHANGED
@@ -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
|
}
|
data/ext/or-tools/routing.cpp
CHANGED
@@ -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) {
|
data/ext/or-tools/vendor.rb
CHANGED
@@ -3,29 +3,32 @@ require "fileutils"
|
|
3
3
|
require "net/http"
|
4
4
|
require "tmpdir"
|
5
5
|
|
6
|
-
version = "9.
|
6
|
+
version = "9.2.9972"
|
7
7
|
|
8
8
|
if RbConfig::CONFIG["host_os"] =~ /darwin/i
|
9
|
-
filename = "or-tools_MacOsX-
|
10
|
-
checksum = "
|
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-
|
16
|
-
checksum = "
|
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-
|
19
|
-
checksum = "
|
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-
|
22
|
-
checksum = "
|
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-
|
25
|
-
checksum = "
|
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-
|
28
|
-
checksum = "
|
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?
|
data/lib/or_tools/cp_solver.rb
CHANGED
@@ -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
|
-
|
24
|
-
|
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
|
-
|
29
|
-
|
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
|
data/lib/or_tools/version.rb
CHANGED
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
|
+
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-
|
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.
|
90
|
+
rubygems_version: 3.2.32
|
91
91
|
signing_key:
|
92
92
|
specification_version: 4
|
93
93
|
summary: Operations research tools for Ruby
|