Skip to content

Commit 5626082

Browse files
authored
Linear solver parameters (#69)
* Introduce parameters for Solver. * Add all double parameters to MPSolverParameters * Add extraction of best bound from objective
1 parent 0fbcf46 commit 5626082

File tree

3 files changed

+68
-3
lines changed

3 files changed

+68
-3
lines changed

ext/or-tools/linear.cpp

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
using operations_research::MPConstraint;
66
using operations_research::MPObjective;
7+
using operations_research::MPSolverParameters;
78
using operations_research::MPSolver;
89
using operations_research::MPVariable;
910

@@ -56,8 +57,43 @@ void init_linear(Rice::Module& m) {
5657
.define_method("set_coefficient", &MPObjective::SetCoefficient)
5758
.define_method("set_offset", &MPObjective::SetOffset)
5859
.define_method("set_maximization", &MPObjective::SetMaximization)
60+
.define_method("best_bound", &MPObjective::BestBound)
5961
.define_method("set_minimization", &MPObjective::SetMinimization);
6062

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+
6197
Rice::define_class_under<MPSolver>(m, "Solver")
6298
.define_singleton_function(
6399
"_new",
@@ -109,9 +145,9 @@ void init_linear(Rice::Module& m) {
109145
return self.MakeRowConstraint(lb, ub);
110146
})
111147
.define_method(
112-
"solve",
113-
[](MPSolver& self) {
114-
auto status = self.Solve();
148+
"_solve",
149+
[](MPSolver& self, MPSolverParameters& params) {
150+
auto status = self.Solve(params);
115151

116152
if (status == MPSolver::ResultStatus::OPTIMAL) {
117153
return Symbol("optimal");

lib/or_tools/solver.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,14 @@ def minimize(expr)
3434
objective.set_minimization
3535
end
3636

37+
def solve
38+
_solve(parameters)
39+
end
40+
41+
def parameters
42+
@parameters ||= MPSolverParameters.new
43+
end
44+
3745
private
3846

3947
def set_objective(expr)

test/linear_test.rb

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,4 +96,25 @@ def test_unrecognized_solver_type
9696
end
9797
assert_equal "Unrecognized solver type", error.message
9898
end
99+
100+
def test_relative_mip_gap_parameter
101+
params = ORTools::MPSolverParameters.new
102+
103+
params.relative_mip_gap = 42
104+
assert_equal 42, params.relative_mip_gap
105+
end
106+
107+
def test_primal_tolerance_parameter
108+
params = ORTools::MPSolverParameters.new
109+
110+
params.primal_tolerance = 42
111+
assert_equal 42, params.primal_tolerance
112+
end
113+
114+
def test_dual_tolerance_parameter
115+
params = ORTools::MPSolverParameters.new
116+
117+
params.dual_tolerance = 42
118+
assert_equal 42, params.dual_tolerance
119+
end
99120
end

0 commit comments

Comments
 (0)