|
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,43 @@ 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 | + |
61 | 97 | Rice::define_class_under<MPSolver>(m, "Solver") |
62 | 98 | .define_singleton_function( |
63 | 99 | "_new", |
@@ -109,9 +145,9 @@ void init_linear(Rice::Module& m) { |
109 | 145 | return self.MakeRowConstraint(lb, ub); |
110 | 146 | }) |
111 | 147 | .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); |
115 | 151 |
|
116 | 152 | if (status == MPSolver::ResultStatus::OPTIMAL) { |
117 | 153 | return Symbol("optimal"); |
|
0 commit comments