21#include "absl/base/attributes.h"
22#include "absl/log/check.h"
50 std::atomic<bool>* interrupt)
override {
55 void Reset()
override;
63 double new_value,
double old_value)
override;
66 double coefficient)
override;
72 int64_t
nodes()
const override;
78 bool IsLP()
const override;
79 bool IsMIP()
const override;
89 const std::vector<MPSolver::BasisStatus>& variable_statuses,
90 const std::vector<MPSolver::BasisStatus>& constraint_statuses)
override;
100 const std::string& parameters)
override;
103 void NonIncrementalChange();
107 std::vector<MPSolver::BasisStatus> column_status_;
108 std::vector<MPSolver::BasisStatus> row_status_;
110 std::atomic<bool> interrupt_solver_;
120 interrupt_solver_(false) {}
128 linear_program_.Clear();
129 interrupt_solver_ =
false;
133 linear_program_.SetMaximizationProblem(
maximize_);
134 linear_program_.CleanUp();
138 VLOG(1) <<
"Setting time limit = " <<
solver_->time_limit() <<
" ms.";
139 parameters_.set_max_time_in_seconds(
140 static_cast<double>(
solver_->time_limit()) / 1000.0);
143 solver_->SetSolverSpecificParametersAsString(
144 solver_->solver_specific_parameter_string_);
145 lp_solver_.SetParameters(parameters_);
146 std::unique_ptr<TimeLimit> time_limit =
148 time_limit->RegisterExternalBooleanAsLimit(&interrupt_solver_);
150 lp_solver_.SolveWithTimeLimit(linear_program_, time_limit.get());
157 const int num_vars =
solver_->variables_.size();
159 for (
int var_id = 0; var_id < num_vars; ++var_id) {
161 const glop::ColIndex lp_solver_var_id(var->
index());
164 lp_solver_.variable_values()[lp_solver_var_id];
168 lp_solver_.reduced_costs()[lp_solver_var_id];
172 lp_solver_.variable_statuses()[lp_solver_var_id];
176 const int num_constraints =
solver_->constraints_.size();
178 for (
int ct_id = 0; ct_id < num_constraints; ++ct_id) {
180 const glop::RowIndex lp_solver_ct_id(ct->
index());
183 lp_solver_.dual_values()[lp_solver_ct_id];
187 lp_solver_.constraint_statuses()[lp_solver_ct_id];
195 interrupt_solver_ =
true;
206 NonIncrementalChange();
210 NonIncrementalChange();
214 LOG(WARNING) <<
"Glop doesn't deal with integer variables.";
218 NonIncrementalChange();
222 NonIncrementalChange();
226 NonIncrementalChange();
231 double new_value,
double old_value) {
232 NonIncrementalChange();
236 NonIncrementalChange();
240 double coefficient) {
241 NonIncrementalChange();
249 return lp_solver_.GetNumberOfSimplexIterations();
253 LOG(DFATAL) <<
"Number of nodes only available for discrete problems";
258 return row_status_[constraint_index];
262 return column_status_[variable_index];
281 const glop::ColIndex num_cols(
solver_->variables_.size());
284 const glop::ColIndex new_col = linear_program_.CreateNewVariable();
285 DCHECK_EQ(new_col, col);
287 linear_program_.SetVariableBounds(col, var->
lb(), var->
ub());
294 const glop::RowIndex num_rows(
solver_->constraints_.size());
295 for (glop::RowIndex row(0); row < num_rows; ++row) {
299 const double lb = ct->
lb();
300 const double ub = ct->
ub();
301 const glop::RowIndex new_row = linear_program_.CreateNewConstraint();
302 DCHECK_EQ(new_row, row);
303 linear_program_.SetConstraintBounds(row, lb, ub);
305 for (
const auto& entry : ct->coefficients_) {
306 const int var_index = entry.first->index();
308 const glop::ColIndex col(var_index);
309 const double coeff = entry.second;
310 linear_program_.SetCoefficient(row, col, coeff);
316 linear_program_.SetObjectiveOffset(
solver_->Objective().offset());
317 for (
const auto& entry :
solver_->objective_->coefficients_) {
318 const int var_index = entry.first->index();
319 const glop::ColIndex col(var_index);
320 const double coeff = entry.second;
321 linear_program_.SetObjectiveCoefficient(col, coeff);
326 const std::vector<MPSolver::BasisStatus>& variable_statuses,
327 const std::vector<MPSolver::BasisStatus>& constraint_statuses) {
336 lp_solver_.SetInitialBasis(glop_variable_statuses, glop_constraint_statuses);
341 parameters_.set_log_search_progress(!
quiet_);
375 parameters_.set_use_preprocessing(
false);
378 parameters_.set_use_preprocessing(
true);
390 parameters_.set_use_scaling(
false);
393 parameters_.set_use_scaling(
true);
405 parameters_.set_use_dual_simplex(
true);
408 parameters_.set_use_dual_simplex(
false);
419 const std::string& parameters) {
425 lp_solver_.SetParameters(parameters_);
431void GLOPInterface::NonIncrementalChange() {
439const void*
const kRegisterGlop ABSL_ATTRIBUTE_UNUSED = [] {
441 [](MPSolver*
const solver) {
return new GLOPInterface(solver); },
int64_t nodes() const override
void SetParameters(const MPSolverParameters ¶m) override
void SetRelativeMipGap(double value) override
void ExtractNewConstraints() override
void SetCoefficient(MPConstraint *constraint, const MPVariable *variable, double new_value, double old_value) override
bool IsMIP() const override
void ExtractNewVariables() override
bool InterruptSolve() override
bool IsContinuous() const override
void SetVariableInteger(int index, bool integer) override
GLOPInterface(MPSolver *solver)
bool SetSolverSpecificParametersAsString(const std::string ¶meters) override
MPSolutionResponse DirectlySolveProto(LazyMutableCopy< MPModelRequest > request, std::atomic< bool > *interrupt) override
void SetObjectiveOffset(double value) override
void ClearConstraint(MPConstraint *constraint) override
void SetPrimalTolerance(double value) override
void * underlying_solver() override
void AddRowConstraint(MPConstraint *ct) override
void ExtractObjective() override
void SetObjectiveCoefficient(const MPVariable *variable, double coefficient) override
MPSolver::ResultStatus Solve(const MPSolverParameters ¶m) override
void ClearObjective() override
~GLOPInterface() override
MPSolver::BasisStatus row_status(int constraint_index) const override
int64_t iterations() const override
MPSolver::BasisStatus column_status(int variable_index) const override
void SetConstraintBounds(int index, double lb, double ub) override
bool IsLP() const override
void SetOptimizationDirection(bool maximize) override
void SetDualTolerance(double value) override
void SetStartingLpBasis(const std::vector< MPSolver::BasisStatus > &variable_statuses, const std::vector< MPSolver::BasisStatus > &constraint_statuses) override
void SetVariableBounds(int index, double lb, double ub) override
std::string SolverVersion() const override
void SetPresolveMode(int value) override
void AddVariable(MPVariable *var) override
void SetScalingMode(int value) override
void SetLpAlgorithm(int value) override
bool SupportsDirectlySolveProto(std::atomic< bool > *interrupt) const override
void set_dual_value(double dual_value)
double lb() const
Returns the lower bound.
double ub() const
Returns the upper bound.
int index() const
Returns the index of the constraint in the MPSolver::constraints_.
static MPSolverInterfaceFactoryRepository * GetInstance()
void Register(MPSolverInterfaceFactory factory, MPSolver::OptimizationProblemType problem_type, std::function< bool()> is_runtime_ready={})
void set_variable_as_extracted(int var_index, bool extracted)
friend class MPConstraint
void set_constraint_as_extracted(int ct_index, bool extracted)
void ResetExtractionInformation()
virtual void SetIntegerParamToUnsupportedValue(MPSolverParameters::IntegerParam param, int value)
int last_constraint_index_
bool variable_is_extracted(int var_index) const
static constexpr int64_t kUnknownNumberOfNodes
void SetDoubleParamToUnsupportedValue(MPSolverParameters::DoubleParam param, double value)
MPSolverInterface(MPSolver *solver)
void SetCommonParameters(const MPSolverParameters ¶m)
MPSolver::ResultStatus result_status_
SynchronizationStatus sync_status_
@ DUAL_TOLERANCE
Advanced usage: tolerance for dual feasibility of basic solutions.
@ RELATIVE_MIP_GAP
Limit for relative MIP gap.
@ PRESOLVE_OFF
Presolve is off.
@ PRESOLVE_ON
Presolve is on.
static const int kDefaultIntegerParamValue
@ PRESOLVE
Advanced usage: presolve mode.
@ LP_ALGORITHM
Algorithm to solve linear programs.
@ SCALING
Advanced usage: enable or disable matrix scaling.
@ SCALING_ON
Scaling is on.
@ SCALING_OFF
Scaling is off.
int GetIntegerParam(MPSolverParameters::IntegerParam param) const
Returns the value of an integer parameter.
static const double kDefaultDoubleParamValue
@ GLOP_LINEAR_PROGRAMMING
The class for variables of a Mathematical Programming (MP) model.
double lb() const
Returns the lower bound.
double ub() const
Returns the upper bound.
void set_reduced_cost(double reduced_cost)
void set_solution_value(double value)
int index() const
Returns the index of the variable in the MPSolver::variables_.
static std::unique_ptr< TimeLimit > FromParameters(const Parameters ¶meters)
static std::string GlopVersion()
void push_back(const value_type &val)
StrictITIVector< RowIndex, ConstraintStatus > ConstraintStatusColumn
StrictITIVector< ColIndex, VariableStatus > VariableStatusRow
MPSolver::ResultStatus GlopToMPSolverResultStatus(glop::ProblemStatus s)
glop::VariableStatus MPSolverToGlopVariableStatus(MPSolver::BasisStatus s)
glop::ConstraintStatus MPSolverToGlopConstraintStatus(MPSolver::BasisStatus s)
MPSolutionResponse GlopSolveProto(LazyMutableCopy< MPModelRequest > request, std::atomic< bool > *interrupt_solve, std::function< void(const std::string &)> logging_callback)
bool ProtobufTextFormatMergeFromString(absl::string_view proto_text_string, ProtoType *proto)
MPSolver::BasisStatus GlopToMPSolverConstraintStatus(glop::ConstraintStatus s)
MPSolver::BasisStatus GlopToMPSolverVariableStatus(glop::VariableStatus s)