or-tools 0.14.0 → 0.14.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: 29ccd0801b240802b1a4c5b3344aeb33feff36381aa3bc714c369ae1ea4912ea
4
- data.tar.gz: 3d64b0da4320c77545b75d4830ee23040c5bb3d4eab568db23ab425e9ec0a3dd
3
+ metadata.gz: 5803be6e2ff6de980c6f1a89ab9ccda1e2ee264139229bca865103c8379dc4a2
4
+ data.tar.gz: 323fda85d36cc8dadb6720a23ac3e9eaa881e3618e74044c8b04773bb979c16e
5
5
  SHA512:
6
- metadata.gz: 660915a87810919150acf5c5e5a67ae51c775a4df66a99293f3f58b6520615fd5519b7298a8d0f1d1127488faffaba8f326c7cd1740ff6d3ea2636a5e5e16062
7
- data.tar.gz: 760fc1cf72fe774787b2ae0a28f6b1f3a7f8a954af855a86d7061945e112f88408cbf160117832568878f01bcbac86d8a6078b6c174778be8e51b025d04d6f8f
6
+ metadata.gz: 48c9eba03b16bb2ce63edf62d52f33fc88595e691543f68dd1a2090adb7212958331534a97b801c7f54acce6626461bc0e268ac312ea34c1c50045dedcfbb3b4
7
+ data.tar.gz: 8d91150d41201f8e47129ef3b48cfb4b63b5cb91c09c87d7ef01f87de4b82ff6d287fb2ca5e3b5a4984152bdb2e5a33f4c5b8fe9495d6a9e89ab81b31c1674ac
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ ## 0.14.1 (2024-12-04)
2
+
3
+ - Added support for parameters to `Solver`
4
+ - Fixed error with `inspect` for `MathOpt` variables
5
+
1
6
  ## 0.14.0 (2024-10-22)
2
7
 
3
8
  - 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
 
@@ -70,6 +70,7 @@ namespace Rice::detail
70
70
  void init_constraint(Rice::Module& m) {
71
71
  Rice::define_class_under<Domain>(m, "Domain")
72
72
  .define_constructor(Rice::Constructor<Domain, int64_t, int64_t>())
73
+ .define_singleton_function("from_values", &Domain::FromValues)
73
74
  .define_method("min", &Domain::Min)
74
75
  .define_method("max", &Domain::Max);
75
76
 
@@ -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
 
@@ -56,8 +57,94 @@ void init_linear(Rice::Module& m) {
56
57
  .define_method("set_coefficient", &MPObjective::SetCoefficient)
57
58
  .define_method("set_offset", &MPObjective::SetOffset)
58
59
  .define_method("set_maximization", &MPObjective::SetMaximization)
60
+ .define_method("best_bound", &MPObjective::BestBound)
59
61
  .define_method("set_minimization", &MPObjective::SetMinimization);
60
62
 
63
+ Rice::define_class_under<MPSolverParameters>(m, "MPSolverParameters")
64
+ .define_constructor(Rice::Constructor<MPSolverParameters>())
65
+ .define_method("reset", &MPSolverParameters::Reset)
66
+ .define_method(
67
+ "relative_mip_gap=",
68
+ [](MPSolverParameters& self, double relative_mip_gap) {
69
+ self.SetDoubleParam(MPSolverParameters::DoubleParam::RELATIVE_MIP_GAP, relative_mip_gap);
70
+ })
71
+ .define_method(
72
+ "relative_mip_gap",
73
+ [](MPSolverParameters& self) {
74
+ return self.GetDoubleParam(MPSolverParameters::DoubleParam::RELATIVE_MIP_GAP);
75
+ })
76
+ .define_method(
77
+ "primal_tolerance=",
78
+ [](MPSolverParameters& self, double primal_tolerance) {
79
+ self.SetDoubleParam(MPSolverParameters::DoubleParam::PRIMAL_TOLERANCE, primal_tolerance);
80
+ })
81
+ .define_method(
82
+ "primal_tolerance",
83
+ [](MPSolverParameters& self) {
84
+ return self.GetDoubleParam(MPSolverParameters::DoubleParam::PRIMAL_TOLERANCE);
85
+ })
86
+ .define_method(
87
+ "dual_tolerance=",
88
+ [](MPSolverParameters& self, double dual_tolerance) {
89
+ self.SetDoubleParam(MPSolverParameters::DoubleParam::DUAL_TOLERANCE, dual_tolerance);
90
+ })
91
+ .define_method(
92
+ "dual_tolerance",
93
+ [](MPSolverParameters& self) {
94
+ return self.GetDoubleParam(MPSolverParameters::DoubleParam::DUAL_TOLERANCE);
95
+ })
96
+ .define_method(
97
+ "presolve=",
98
+ [](MPSolverParameters& self, bool value) {
99
+ int presolve;
100
+ if (value) {
101
+ presolve = MPSolverParameters::PresolveValues::PRESOLVE_ON;
102
+ } else {
103
+ presolve = MPSolverParameters::PresolveValues::PRESOLVE_OFF;
104
+ }
105
+ self.SetIntegerParam(MPSolverParameters::IntegerParam::PRESOLVE, presolve);
106
+ })
107
+ .define_method(
108
+ "presolve",
109
+ [](MPSolverParameters& self) {
110
+ int presolve = self.GetIntegerParam(MPSolverParameters::IntegerParam::PRESOLVE);
111
+ return presolve != MPSolverParameters::PresolveValues::PRESOLVE_OFF;
112
+ })
113
+ .define_method(
114
+ "incrementality=",
115
+ [](MPSolverParameters& self, bool value) {
116
+ int incrementality;
117
+ if (value) {
118
+ incrementality = MPSolverParameters::IncrementalityValues::INCREMENTALITY_ON;
119
+ } else {
120
+ incrementality = MPSolverParameters::IncrementalityValues::INCREMENTALITY_OFF;
121
+ }
122
+ self.SetIntegerParam(MPSolverParameters::IntegerParam::INCREMENTALITY, incrementality);
123
+ })
124
+ .define_method(
125
+ "incrementality",
126
+ [](MPSolverParameters& self) {
127
+ int incrementality = self.GetIntegerParam(MPSolverParameters::IntegerParam::INCREMENTALITY);
128
+ return incrementality != MPSolverParameters::IncrementalityValues::INCREMENTALITY_OFF;
129
+ })
130
+ .define_method(
131
+ "scaling=",
132
+ [](MPSolverParameters& self, bool value) {
133
+ int scaling;
134
+ if (value) {
135
+ scaling = MPSolverParameters::ScalingValues::SCALING_ON;
136
+ } else {
137
+ scaling = MPSolverParameters::ScalingValues::SCALING_OFF;
138
+ }
139
+ self.SetIntegerParam(MPSolverParameters::IntegerParam::SCALING, scaling);
140
+ })
141
+ .define_method(
142
+ "scaling",
143
+ [](MPSolverParameters& self) {
144
+ int scaling = self.GetIntegerParam(MPSolverParameters::IntegerParam::SCALING);
145
+ return scaling != MPSolverParameters::ScalingValues::SCALING_OFF;
146
+ });
147
+
61
148
  Rice::define_class_under<MPSolver>(m, "Solver")
62
149
  .define_singleton_function(
63
150
  "_new",
@@ -109,9 +196,9 @@ void init_linear(Rice::Module& m) {
109
196
  return self.MakeRowConstraint(lb, ub);
110
197
  })
111
198
  .define_method(
112
- "solve",
113
- [](MPSolver& self) {
114
- auto status = self.Solve();
199
+ "_solve",
200
+ [](MPSolver& self, MPSolverParameters& params) {
201
+ auto status = self.Solve(params);
115
202
 
116
203
  if (status == MPSolver::ResultStatus::OPTIMAL) {
117
204
  return Symbol("optimal");
@@ -64,6 +64,7 @@ void init_math_opt(Rice::Module& m) {
64
64
 
65
65
  Rice::define_class_under<Variable>(mathopt, "Variable")
66
66
  .define_method("id", &Variable::id)
67
+ .define_method("name", &Variable::name)
67
68
  .define_method(
68
69
  "_eql?",
69
70
  [](Variable& self, Variable &other) {
@@ -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.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.14.0
4
+ version: 0.14.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: 2024-10-22 00:00:00.000000000 Z
11
+ date: 2024-12-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rice
@@ -89,7 +89,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
89
89
  - !ruby/object:Gem::Version
90
90
  version: '0'
91
91
  requirements: []
92
- rubygems_version: 3.5.16
92
+ rubygems_version: 3.5.22
93
93
  signing_key:
94
94
  specification_version: 4
95
95
  summary: Operations research tools for Ruby