or-tools 0.5.1 → 0.6.0
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 +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
|
-
[](https://github.com/ankane/or-tools/actions)
|
5
|
+
[](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
|