21#include "absl/base/attributes.h"
43 LOG(DFATAL) <<
"Invalid bop::BopSolveStatus";
58 void Reset()
override;
66 double new_value,
double old_value)
override;
69 double coefficient)
override;
75 int64_t
nodes()
const override;
81 bool IsLP()
const override;
82 bool IsMIP()
const 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) {}
126 if (interrupt_solver_) {
139 linear_program_.SetMaximizationProblem(
maximize_);
140 linear_program_.CleanUp();
144 VLOG(1) <<
"Setting time limit = " <<
solver_->time_limit() <<
" ms.";
145 parameters_.set_max_time_in_seconds(
146 static_cast<double>(
solver_->time_limit()) / 1000.0);
148 parameters_.set_log_search_progress(!
quiet());
151 if (!
solver_->solution_hint_.empty()) {
152 const int num_vars =
solver_->variables_.size();
153 if (
solver_->solution_hint_.size() != num_vars) {
154 LOG(WARNING) <<
"Bop currently doesn't handle partial solution hints. "
155 <<
"Filling the missing positions with zeros...";
158 for (
const std::pair<const MPVariable*, double>& p :
160 initial_solution[glop::ColIndex(p.first->index())] =
165 solver_->SetSolverSpecificParametersAsString(
166 solver_->solver_specific_parameter_string_);
167 bop_solver_.SetParameters(parameters_);
168 std::unique_ptr<TimeLimit> time_limit =
170 time_limit->RegisterExternalBooleanAsLimit(&interrupt_solver_);
172 initial_solution.empty()
173 ? bop_solver_.SolveWithTimeLimit(linear_program_, time_limit.get())
174 : bop_solver_.SolveWithTimeLimit(linear_program_, initial_solution,
187 const size_t num_vars =
solver_->variables_.size();
189 for (
int var_id = 0; var_id < num_vars; ++var_id) {
191 const glop::ColIndex lp_solver_var_id(var->
index());
193 bop_solver_.variable_values()[lp_solver_var_id];
198 const size_t num_constraints =
solver_->constraints_.size();
207 linear_program_.Clear();
208 interrupt_solver_ =
false;
212 NonIncrementalChange();
216 NonIncrementalChange();
220 NonIncrementalChange();
224 NonIncrementalChange();
228 NonIncrementalChange();
232 NonIncrementalChange();
237 double new_value,
double old_value) {
238 NonIncrementalChange();
242 NonIncrementalChange();
246 double coefficient) {
247 NonIncrementalChange();
255 LOG(DFATAL) <<
"Number of iterations not available";
260 LOG(DFATAL) <<
"Number of nodes not available";
265 return row_status_[constraint_index];
269 return column_status_[variable_index];
282 interrupt_solver_ =
true;
293 const glop::ColIndex num_cols(
solver_->variables_.size());
296 const glop::ColIndex new_col = linear_program_.CreateNewVariable();
297 DCHECK_EQ(new_col, col);
299 linear_program_.SetVariableBounds(col, var->
lb(), var->
ub());
301 linear_program_.SetVariableType(
311 const glop::RowIndex num_rows(
solver_->constraints_.size());
312 for (glop::RowIndex row(0); row < num_rows; ++row) {
316 const double lb = ct->
lb();
317 const double ub = ct->
ub();
318 const glop::RowIndex new_row = linear_program_.CreateNewConstraint();
319 DCHECK_EQ(new_row, row);
320 linear_program_.SetConstraintBounds(row, lb, ub);
322 for (
const auto& entry : ct->coefficients_) {
323 const int var_index = entry.first->index();
325 const glop::ColIndex col(var_index);
326 const double coeff = entry.second;
327 linear_program_.SetCoefficient(row, col, coeff);
334 linear_program_.SetObjectiveOffset(
solver_->Objective().offset());
335 for (
const auto& entry :
solver_->objective_->coefficients_) {
336 const int var_index = entry.first->index();
337 const glop::ColIndex col(var_index);
338 const double coeff = entry.second;
339 linear_program_.SetObjectiveCoefficient(col, coeff);
371 const std::string& parameters) {
373 google::protobuf::TextFormat::MergeFromString(parameters, ¶meters_);
374 bop_solver_.SetParameters(parameters_);
378void BopInterface::NonIncrementalChange() {
386const void*
const kRegisterBop ABSL_ATTRIBUTE_UNUSED = [] {
388 [](MPSolver*
const solver) {
return new BopInterface(solver); },
bool IsMIP() const override
void SetParameters(const MPSolverParameters ¶m) override
bool InterruptSolve() override
void SetRelativeMipGap(double value) override
void SetScalingMode(int value) override
bool IsLP() const override
MPSolver::BasisStatus row_status(int constraint_index) const override
void AddVariable(MPVariable *var) override
void * underlying_solver() override
int64_t nodes() const override
void SetVariableInteger(int index, bool integer) override
void SetObjectiveCoefficient(const MPVariable *variable, double coefficient) override
void ExtractNewVariables() override
std::string SolverVersion() const override
void ClearObjective() override
int64_t iterations() const override
void ExtractObjective() override
BopInterface(MPSolver *solver)
void SetLpAlgorithm(int value) override
void SetCoefficient(MPConstraint *constraint, const MPVariable *variable, double new_value, double old_value) override
void SetVariableBounds(int index, double lb, double ub) override
bool SetSolverSpecificParametersAsString(const std::string ¶meters) override
void SetOptimizationDirection(bool maximize) override
void SetConstraintBounds(int index, double lb, double ub) override
void SetDualTolerance(double value) override
bool IsContinuous() const override
void SetPresolveMode(int value) override
void ClearConstraint(MPConstraint *constraint) override
MPSolver::BasisStatus column_status(int variable_index) const override
void ExtractNewConstraints() override
void SetObjectiveOffset(double value) override
void AddRowConstraint(MPConstraint *ct) override
void SetPrimalTolerance(double value) override
MPSolver::ResultStatus Solve(const MPSolverParameters ¶m) override
double lb() const
Returns the lower bound.
double ub() const
Returns the upper bound.
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)
static constexpr int64_t kUnknownNumberOfIterations
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
double best_objective_bound_
MPSolverInterface(MPSolver *solver)
void SetCommonParameters(const MPSolverParameters ¶m)
MPSolver::ResultStatus result_status_
SynchronizationStatus sync_status_
@ PRESOLVE_OFF
Presolve is off.
@ PRESOLVE_ON
Presolve is on.
static const int kDefaultIntegerParamValue
@ PRESOLVE
Advanced usage: presolve mode.
@ FEASIBLE
feasible, or stopped by limit.
@ NOT_SOLVED
not been solved yet.
@ INFEASIBLE
proven infeasible.
@ ABNORMAL
abnormal, i.e., error of some kind.
@ BOP_INTEGER_PROGRAMMING
The class for variables of a Mathematical Programming (MP) model.
bool integer() const
Returns the integrality requirement of the variable.
double lb() const
Returns the lower bound.
double ub() const
Returns the upper bound.
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)
void assign(IntType size, const T &v)
@ FEASIBLE_SOLUTION_FOUND
StrictITIVector< ColIndex, Fractional > DenseRow