or-tools 0.14.0 → 0.14.2

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: 29ccd0801b240802b1a4c5b3344aeb33feff36381aa3bc714c369ae1ea4912ea
4
- data.tar.gz: 3d64b0da4320c77545b75d4830ee23040c5bb3d4eab568db23ab425e9ec0a3dd
3
+ metadata.gz: f2974585825c8e1f3d50aabc494131861eef79c80468a889537f58b2dd3926be
4
+ data.tar.gz: 5f9b8fe4574a30ebea1fba0b53a91475683e68fe5e535ba99047a6f2b3a16173
5
5
  SHA512:
6
- metadata.gz: 660915a87810919150acf5c5e5a67ae51c775a4df66a99293f3f58b6520615fd5519b7298a8d0f1d1127488faffaba8f326c7cd1740ff6d3ea2636a5e5e16062
7
- data.tar.gz: 760fc1cf72fe774787b2ae0a28f6b1f3a7f8a954af855a86d7061945e112f88408cbf160117832568878f01bcbac86d8a6078b6c174778be8e51b025d04d6f8f
6
+ metadata.gz: 48fc84cebe3a922044a98909dd8b06d61712ea1bdf06014b99a0a92dd4406766facd99cd3f2c99425257642ef08ad5a489d9ee87f354cf7f5d16a3d7ff306d5e
7
+ data.tar.gz: 6edc981eb8b47f716f607be3e7c28a59c49076810a7fcbda7077fcc3a1abcf420fe58c17d372a40447f435e7abfd68879fc471b0c8c86afdd4d1610786b0489e
data/CHANGELOG.md CHANGED
@@ -1,3 +1,12 @@
1
+ ## 0.14.2 (2025-02-10)
2
+
3
+ - Fixed error with Rice 4.5
4
+
5
+ ## 0.14.1 (2024-12-04)
6
+
7
+ - Added support for parameters to `Solver`
8
+ - Fixed error with `inspect` for `MathOpt` variables
9
+
1
10
  ## 0.14.0 (2024-10-22)
2
11
 
3
12
  - Added experimental support for `MathOpt`
data/README.md CHANGED
@@ -93,15 +93,15 @@ Specify people and their availabililty
93
93
  people = [
94
94
  {
95
95
  availability: [
96
- {starts_at: Time.parse("2020-01-01 08:00:00"), ends_at: Time.parse("2020-01-01 16:00:00")},
97
- {starts_at: Time.parse("2020-01-02 08:00:00"), ends_at: Time.parse("2020-01-02 16:00:00")}
96
+ {starts_at: Time.parse("2025-01-01 08:00:00"), ends_at: Time.parse("2025-01-01 16:00:00")},
97
+ {starts_at: Time.parse("2025-01-02 08:00:00"), ends_at: Time.parse("2025-01-02 16:00:00")}
98
98
  ],
99
99
  max_hours: 40 # optional, applies to entire scheduling period
100
100
  },
101
101
  {
102
102
  availability: [
103
- {starts_at: Time.parse("2020-01-01 08:00:00"), ends_at: Time.parse("2020-01-01 16:00:00")},
104
- {starts_at: Time.parse("2020-01-03 08:00:00"), ends_at: Time.parse("2020-01-03 16:00:00")}
103
+ {starts_at: Time.parse("2025-01-01 08:00:00"), ends_at: Time.parse("2025-01-01 16:00:00")},
104
+ {starts_at: Time.parse("2025-01-03 08:00:00"), ends_at: Time.parse("2025-01-03 16:00:00")}
105
105
  ],
106
106
  max_hours: 20
107
107
  }
@@ -112,9 +112,9 @@ Specify shifts
112
112
 
113
113
  ```ruby
114
114
  shifts = [
115
- {starts_at: Time.parse("2020-01-01 08:00:00"), ends_at: Time.parse("2020-01-01 16:00:00")},
116
- {starts_at: Time.parse("2020-01-02 08:00:00"), ends_at: Time.parse("2020-01-02 16:00:00")},
117
- {starts_at: Time.parse("2020-01-03 08:00:00"), ends_at: Time.parse("2020-01-03 16:00:00")}
115
+ {starts_at: Time.parse("2025-01-01 08:00:00"), ends_at: Time.parse("2025-01-01 16:00:00")},
116
+ {starts_at: Time.parse("2025-01-02 08:00:00"), ends_at: Time.parse("2025-01-02 16:00:00")},
117
+ {starts_at: Time.parse("2025-01-03 08:00:00"), ends_at: Time.parse("2025-01-03 16:00:00")}
118
118
  ]
119
119
  ```
120
120
 
@@ -13,16 +13,15 @@ namespace Rice::detail
13
13
  template<>
14
14
  struct Type<KnapsackSolver::SolverType>
15
15
  {
16
- static bool verify()
17
- {
18
- return true;
19
- }
16
+ static bool verify() { return true; }
20
17
  };
21
18
 
22
19
  template<>
23
20
  class From_Ruby<KnapsackSolver::SolverType>
24
21
  {
25
22
  public:
23
+ Convertible is_convertible(VALUE value) { return Convertible::Cast; }
24
+
26
25
  KnapsackSolver::SolverType convert(VALUE x)
27
26
  {
28
27
  auto s = Symbol(x).str();
@@ -32,16 +32,15 @@ namespace Rice::detail
32
32
  template<>
33
33
  struct Type<LinearExpr>
34
34
  {
35
- static bool verify()
36
- {
37
- return true;
38
- }
35
+ static bool verify() { return true; }
39
36
  };
40
37
 
41
38
  template<>
42
39
  class From_Ruby<LinearExpr>
43
40
  {
44
41
  public:
42
+ Convertible is_convertible(VALUE value) { return Convertible::Cast; }
43
+
45
44
  LinearExpr convert(VALUE v)
46
45
  {
47
46
  LinearExpr expr;
@@ -70,6 +69,7 @@ namespace Rice::detail
70
69
  void init_constraint(Rice::Module& m) {
71
70
  Rice::define_class_under<Domain>(m, "Domain")
72
71
  .define_constructor(Rice::Constructor<Domain, int64_t, int64_t>())
72
+ .define_singleton_function("from_values", &Domain::FromValues)
73
73
  .define_method("min", &Domain::Min)
74
74
  .define_method("max", &Domain::Max);
75
75
 
@@ -9,7 +9,7 @@ $CXXFLAGS << " -Wall -Wextra"
9
9
  $CXXFLAGS << " -Wno-sign-compare -Wno-ignored-qualifiers -Wno-unused-parameter -Wno-missing-field-initializers"
10
10
 
11
11
  # hide Rice warnings
12
- $CXXFLAGS << " -Wno-implicit-fallthrough"
12
+ $CXXFLAGS << " -Wno-unused-private-field -Wno-implicit-fallthrough"
13
13
 
14
14
  inc, lib = dir_config("or-tools")
15
15
  if inc || lib
@@ -4,6 +4,7 @@
4
4
 
5
5
  using operations_research::MPConstraint;
6
6
  using operations_research::MPObjective;
7
+ using operations_research::MPSolverParameters;
7
8
  using operations_research::MPSolver;
8
9
  using operations_research::MPVariable;
9
10
 
@@ -19,15 +20,14 @@ namespace Rice::detail
19
20
  template<>
20
21
  struct Type<MPSolver::OptimizationProblemType>
21
22
  {
22
- static bool verify()
23
- {
24
- return true;
25
- }
23
+ static bool verify() { return true; }
26
24
  };
27
25
 
28
26
  template<>
29
27
  struct From_Ruby<MPSolver::OptimizationProblemType>
30
28
  {
29
+ Convertible is_convertible(VALUE value) { return Convertible::Cast; }
30
+
31
31
  static MPSolver::OptimizationProblemType convert(VALUE x)
32
32
  {
33
33
  auto s = Symbol(x).str();
@@ -56,8 +56,112 @@ void init_linear(Rice::Module& m) {
56
56
  .define_method("set_coefficient", &MPObjective::SetCoefficient)
57
57
  .define_method("set_offset", &MPObjective::SetOffset)
58
58
  .define_method("set_maximization", &MPObjective::SetMaximization)
59
+ .define_method("best_bound", &MPObjective::BestBound)
59
60
  .define_method("set_minimization", &MPObjective::SetMinimization);
60
61
 
62
+ Rice::define_class_under<MPSolverParameters>(m, "MPSolverParameters")
63
+ .define_constructor(Rice::Constructor<MPSolverParameters>())
64
+ .define_method("reset", &MPSolverParameters::Reset)
65
+ .define_method(
66
+ "relative_mip_gap=",
67
+ [](MPSolverParameters& self, double relative_mip_gap) {
68
+ self.SetDoubleParam(MPSolverParameters::DoubleParam::RELATIVE_MIP_GAP, relative_mip_gap);
69
+ })
70
+ .define_method(
71
+ "relative_mip_gap",
72
+ [](MPSolverParameters& self) {
73
+ return self.GetDoubleParam(MPSolverParameters::DoubleParam::RELATIVE_MIP_GAP);
74
+ })
75
+ .define_method(
76
+ "primal_tolerance=",
77
+ [](MPSolverParameters& self, double primal_tolerance) {
78
+ self.SetDoubleParam(MPSolverParameters::DoubleParam::PRIMAL_TOLERANCE, primal_tolerance);
79
+ })
80
+ .define_method(
81
+ "primal_tolerance",
82
+ [](MPSolverParameters& self) {
83
+ return self.GetDoubleParam(MPSolverParameters::DoubleParam::PRIMAL_TOLERANCE);
84
+ })
85
+ .define_method(
86
+ "dual_tolerance=",
87
+ [](MPSolverParameters& self, double dual_tolerance) {
88
+ self.SetDoubleParam(MPSolverParameters::DoubleParam::DUAL_TOLERANCE, dual_tolerance);
89
+ })
90
+ .define_method(
91
+ "dual_tolerance",
92
+ [](MPSolverParameters& self) {
93
+ return self.GetDoubleParam(MPSolverParameters::DoubleParam::DUAL_TOLERANCE);
94
+ })
95
+ .define_method(
96
+ "presolve=",
97
+ [](MPSolverParameters& self, bool value) {
98
+ int presolve;
99
+ if (value) {
100
+ presolve = MPSolverParameters::PresolveValues::PRESOLVE_ON;
101
+ } else {
102
+ presolve = MPSolverParameters::PresolveValues::PRESOLVE_OFF;
103
+ }
104
+ self.SetIntegerParam(MPSolverParameters::IntegerParam::PRESOLVE, presolve);
105
+ })
106
+ .define_method(
107
+ "presolve",
108
+ [](MPSolverParameters& self) {
109
+ int presolve = self.GetIntegerParam(MPSolverParameters::IntegerParam::PRESOLVE);
110
+ if (presolve == MPSolverParameters::PresolveValues::PRESOLVE_ON) {
111
+ return Rice::True;
112
+ } else if (presolve == MPSolverParameters::PresolveValues::PRESOLVE_OFF) {
113
+ return Rice::False;
114
+ } else {
115
+ return Rice::Nil;
116
+ }
117
+ })
118
+ .define_method(
119
+ "incrementality=",
120
+ [](MPSolverParameters& self, bool value) {
121
+ int incrementality;
122
+ if (value) {
123
+ incrementality = MPSolverParameters::IncrementalityValues::INCREMENTALITY_ON;
124
+ } else {
125
+ incrementality = MPSolverParameters::IncrementalityValues::INCREMENTALITY_OFF;
126
+ }
127
+ self.SetIntegerParam(MPSolverParameters::IntegerParam::INCREMENTALITY, incrementality);
128
+ })
129
+ .define_method(
130
+ "incrementality",
131
+ [](MPSolverParameters& self) {
132
+ int incrementality = self.GetIntegerParam(MPSolverParameters::IntegerParam::INCREMENTALITY);
133
+ if (incrementality == MPSolverParameters::IncrementalityValues::INCREMENTALITY_ON) {
134
+ return Rice::True;
135
+ } else if (incrementality == MPSolverParameters::IncrementalityValues::INCREMENTALITY_OFF) {
136
+ return Rice::False;
137
+ } else {
138
+ return Rice::Nil;
139
+ }
140
+ })
141
+ .define_method(
142
+ "scaling=",
143
+ [](MPSolverParameters& self, bool value) {
144
+ int scaling;
145
+ if (value) {
146
+ scaling = MPSolverParameters::ScalingValues::SCALING_ON;
147
+ } else {
148
+ scaling = MPSolverParameters::ScalingValues::SCALING_OFF;
149
+ }
150
+ self.SetIntegerParam(MPSolverParameters::IntegerParam::SCALING, scaling);
151
+ })
152
+ .define_method(
153
+ "scaling",
154
+ [](MPSolverParameters& self) {
155
+ int scaling = self.GetIntegerParam(MPSolverParameters::IntegerParam::SCALING);
156
+ if (scaling == MPSolverParameters::ScalingValues::SCALING_ON) {
157
+ return Rice::True;
158
+ } else if (scaling == MPSolverParameters::ScalingValues::SCALING_OFF) {
159
+ return Rice::False;
160
+ } else {
161
+ return Rice::Nil;
162
+ }
163
+ });
164
+
61
165
  Rice::define_class_under<MPSolver>(m, "Solver")
62
166
  .define_singleton_function(
63
167
  "_new",
@@ -109,9 +213,9 @@ void init_linear(Rice::Module& m) {
109
213
  return self.MakeRowConstraint(lb, ub);
110
214
  })
111
215
  .define_method(
112
- "solve",
113
- [](MPSolver& self) {
114
- auto status = self.Solve();
216
+ "_solve",
217
+ [](MPSolver& self, MPSolverParameters& params) {
218
+ auto status = self.Solve(params);
115
219
 
116
220
  if (status == MPSolver::ResultStatus::OPTIMAL) {
117
221
  return Symbol("optimal");
@@ -20,15 +20,14 @@ namespace Rice::detail
20
20
  template<>
21
21
  struct Type<SolverType>
22
22
  {
23
- static bool verify()
24
- {
25
- return true;
26
- }
23
+ static bool verify() { return true; }
27
24
  };
28
25
 
29
26
  template<>
30
27
  struct From_Ruby<SolverType>
31
28
  {
29
+ Convertible is_convertible(VALUE value) { return Convertible::Cast; }
30
+
32
31
  static SolverType convert(VALUE x)
33
32
  {
34
33
  auto s = Symbol(x).str();
@@ -64,6 +63,7 @@ void init_math_opt(Rice::Module& m) {
64
63
 
65
64
  Rice::define_class_under<Variable>(mathopt, "Variable")
66
65
  .define_method("id", &Variable::id)
66
+ .define_method("name", &Variable::name)
67
67
  .define_method(
68
68
  "_eql?",
69
69
  [](Variable& self, Variable &other) {
@@ -28,16 +28,15 @@ namespace Rice::detail
28
28
  template<>
29
29
  struct Type<RoutingNodeIndex>
30
30
  {
31
- static bool verify()
32
- {
33
- return true;
34
- }
31
+ static bool verify() { return true; }
35
32
  };
36
33
 
37
34
  template<>
38
35
  class From_Ruby<RoutingNodeIndex>
39
36
  {
40
37
  public:
38
+ Convertible is_convertible(VALUE value) { return Convertible::Cast; }
39
+
41
40
  RoutingNodeIndex convert(VALUE x)
42
41
  {
43
42
  const RoutingNodeIndex index{From_Ruby<int>().convert(x)};
@@ -285,7 +284,7 @@ void init_routing(Rice::Module& m) {
285
284
  Rice::define_class_under<RoutingModel::ResourceGroup>(m, "ResourceGroup");
286
285
 
287
286
  Rice::define_class_under<RoutingModel>(m, "RoutingModel")
288
- .define_constructor(Rice::Constructor<RoutingModel, RoutingIndexManager, RoutingModelParameters>(), Rice::Arg("index_manager"), Rice::Arg("parameters") = operations_research::DefaultRoutingModelParameters())
287
+ .define_constructor(Rice::Constructor<RoutingModel, RoutingIndexManager, RoutingModelParameters>(), Rice::Arg("_index_manager"), Rice::Arg("_parameters") = operations_research::DefaultRoutingModelParameters())
289
288
  .define_method("register_unary_transit_vector", &RoutingModel::RegisterUnaryTransitVector)
290
289
  .define_method(
291
290
  "register_unary_transit_callback",
@@ -300,7 +299,7 @@ void init_routing(Rice::Module& m) {
300
299
  return Rice::detail::From_Ruby<int64_t>().convert(callback.call("call", from_index));
301
300
  }
302
301
  );
303
- }, Rice::Arg("callback").keepAlive())
302
+ }, Rice::Arg("_callback").keepAlive())
304
303
  .define_method("register_transit_matrix", &RoutingModel::RegisterTransitMatrix)
305
304
  .define_method(
306
305
  "register_transit_callback",
@@ -315,7 +314,7 @@ void init_routing(Rice::Module& m) {
315
314
  return Rice::detail::From_Ruby<int64_t>().convert(callback.call("call", from_index, to_index));
316
315
  }
317
316
  );
318
- }, Rice::Arg("callback").keepAlive())
317
+ }, Rice::Arg("_callback").keepAlive())
319
318
  .define_method("add_dimension", &RoutingModel::AddDimension)
320
319
  .define_method("add_dimension_with_vehicle_transits", &RoutingModel::AddDimensionWithVehicleTransits)
321
320
  .define_method("add_dimension_with_vehicle_capacity", &RoutingModel::AddDimensionWithVehicleCapacity)
@@ -332,7 +331,7 @@ void init_routing(Rice::Module& m) {
332
331
  .define_method("add_resource_group", &RoutingModel::AddResourceGroup)
333
332
  .define_method("dimension_resource_group_indices", &RoutingModel::GetDimensionResourceGroupIndices)
334
333
  .define_method("dimension_resource_group_index", &RoutingModel::GetDimensionResourceGroupIndex)
335
- .define_method("add_disjunction", &RoutingModel::AddDisjunction, Rice::Arg("indices"), Rice::Arg("penalty"), Rice::Arg("max_cardinality") = (int64_t)1)
334
+ .define_method("add_disjunction", &RoutingModel::AddDisjunction, Rice::Arg("_indices"), Rice::Arg("_penalty"), Rice::Arg("_max_cardinality") = (int64_t)1)
336
335
  .define_method("disjunction_indices", &RoutingModel::GetDisjunctionIndices)
337
336
  .define_method("disjunction_penalty", &RoutingModel::GetDisjunctionPenalty)
338
337
  .define_method("disjunction_max_cardinality", &RoutingModel::GetDisjunctionMaxCardinality)
@@ -34,6 +34,11 @@ module ORTools
34
34
  objective.set_minimization
35
35
  end
36
36
 
37
+ def solve(parameters = nil)
38
+ parameters ||= MPSolverParameters.new
39
+ _solve(parameters)
40
+ end
41
+
37
42
  private
38
43
 
39
44
  def set_objective(expr)
@@ -1,3 +1,3 @@
1
1
  module ORTools
2
- VERSION = "0.14.0"
2
+ VERSION = "0.14.2"
3
3
  end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: or-tools
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.14.0
4
+ version: 0.14.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2024-10-22 00:00:00.000000000 Z
10
+ date: 2025-02-10 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: rice
@@ -16,15 +15,14 @@ dependencies:
16
15
  requirements:
17
16
  - - ">="
18
17
  - !ruby/object:Gem::Version
19
- version: 4.3.3
18
+ version: '4.5'
20
19
  type: :runtime
21
20
  prerelease: false
22
21
  version_requirements: !ruby/object:Gem::Requirement
23
22
  requirements:
24
23
  - - ">="
25
24
  - !ruby/object:Gem::Version
26
- version: 4.3.3
27
- description:
25
+ version: '4.5'
28
26
  email: andrew@ankane.org
29
27
  executables: []
30
28
  extensions:
@@ -74,7 +72,6 @@ homepage: https://github.com/ankane/or-tools-ruby
74
72
  licenses:
75
73
  - Apache-2.0
76
74
  metadata: {}
77
- post_install_message:
78
75
  rdoc_options: []
79
76
  require_paths:
80
77
  - lib
@@ -89,8 +86,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
89
86
  - !ruby/object:Gem::Version
90
87
  version: '0'
91
88
  requirements: []
92
- rubygems_version: 3.5.16
93
- signing_key:
89
+ rubygems_version: 3.6.2
94
90
  specification_version: 4
95
91
  summary: Operations research tools for Ruby
96
92
  test_files: []