21 #include "absl/base/attributes.h"
22 #include "google/protobuf/text_format.h"
29 #include "ortools/bop/bop_parameters.pb.h"
49 LOG(DFATAL) <<
"Invalid bop::BopSolveStatus";
64 void Reset()
override;
72 const MPVariable*
const variable,
double new_value,
73 double old_value)
override;
82 int64_t
nodes()
const override;
88 bool IsLP()
const override;
89 bool IsMIP()
const override;
110 void NonIncrementalChange();
114 std::vector<MPSolver::BasisStatus> column_status_;
115 std::vector<MPSolver::BasisStatus> row_status_;
116 bop::BopParameters parameters_;
117 std::atomic<bool> interrupt_solver_;
127 interrupt_solver_(false) {}
133 if (interrupt_solver_) {
152 parameters_.set_max_time_in_seconds(
155 parameters_.set_log_search_progress(!
quiet());
158 if (!
solver_->solution_hint_.empty()) {
159 const int num_vars =
solver_->variables_.size();
160 if (
solver_->solution_hint_.size() != num_vars) {
161 LOG(WARNING) <<
"Bop currently doesn't handle partial solution hints. "
162 <<
"Filling the missing positions with zeros...";
165 for (
const std::pair<const MPVariable*, double>& p :
167 initial_solution[glop::ColIndex(p.first->index())] =
173 solver_->solver_specific_parameter_string_);
177 time_limit->RegisterExternalBooleanAsLimit(&interrupt_solver_);
179 initial_solution.
empty()
194 const size_t num_vars =
solver_->variables_.size();
196 for (
int var_id = 0; var_id < num_vars; ++var_id) {
198 const glop::ColIndex lp_solver_var_id(
var->index());
201 var->set_solution_value(
static_cast<double>(solution_value));
205 const size_t num_constraints =
solver_->constraints_.size();
214 linear_program_.
Clear();
215 interrupt_solver_ =
false;
219 NonIncrementalChange();
223 NonIncrementalChange();
227 NonIncrementalChange();
231 NonIncrementalChange();
235 NonIncrementalChange();
239 NonIncrementalChange();
244 double new_value,
double old_value) {
245 NonIncrementalChange();
249 NonIncrementalChange();
254 NonIncrementalChange();
262 LOG(DFATAL) <<
"Number of iterations not available";
267 LOG(DFATAL) <<
"Number of nodes not available";
272 return row_status_[constraint_index];
276 return column_status_[variable_index];
289 interrupt_solver_ =
true;
300 const glop::ColIndex num_cols(
solver_->variables_.size());
304 DCHECK_EQ(new_col,
col);
307 if (
var->integer()) {
318 const glop::RowIndex num_rows(
solver_->constraints_.size());
319 for (glop::RowIndex
row(0);
row < num_rows; ++
row) {
323 const double lb =
ct->lb();
324 const double ub =
ct->ub();
326 DCHECK_EQ(new_row,
row);
329 for (
const auto& entry :
ct->coefficients_) {
330 const int var_index = entry.first->index();
332 const glop::ColIndex
col(var_index);
333 const double coeff = entry.second;
342 for (
const auto& entry :
solver_->objective_->coefficients_) {
343 const int var_index = entry.first->index();
344 const glop::ColIndex
col(var_index);
345 const double coeff = entry.second;
380 google::protobuf::TextFormat::MergeFromString(
parameters, ¶meters_);
385 void BopInterface::NonIncrementalChange() {
void SetScalingMode(int value) override
void SetDualTolerance(double value) override
void AddRowConstraint(MPConstraint *const ct) override
void SetLpAlgorithm(int value) override
void ExtractObjective() override
void * underlying_solver() override
bool IsContinuous() const override
bool InterruptSolve() override
MPSolver::ResultStatus Solve(const MPSolverParameters ¶m) override
void SetPrimalTolerance(double value) override
void ClearConstraint(MPConstraint *const constraint) override
bool SetSolverSpecificParametersAsString(const std::string ¶meters) override
void SetObjectiveCoefficient(const MPVariable *const variable, double coefficient) override
void SetCoefficient(MPConstraint *const constraint, const MPVariable *const variable, double new_value, double old_value) override
MPSolver::BasisStatus row_status(int constraint_index) const override
void SetObjectiveOffset(double value) override
void SetVariableInteger(int index, bool integer) override
void SetParameters(const MPSolverParameters ¶m) override
void ExtractNewConstraints() override
BopInterface(MPSolver *const solver)
std::string SolverVersion() const override
void SetRelativeMipGap(double value) override
void SetConstraintBounds(int index, double lb, double ub) override
void SetPresolveMode(int value) override
void SetVariableBounds(int index, double lb, double ub) override
void AddVariable(MPVariable *const var) override
void ExtractNewVariables() override
int64_t nodes() const override
bool IsLP() const override
bool IsMIP() const override
int64_t iterations() const override
void SetOptimizationDirection(bool maximize) override
MPSolver::BasisStatus column_status(int variable_index) const override
void ClearObjective() override
The class for constraints of a Mathematical Programming (MP) model.
double offset() const
Gets the constant term in the objective.
This mathematical programming (MP) solver class is the main class though which users build and solve ...
const MPObjective & Objective() const
Returns the objective object.
ResultStatus
The status of solving the problem.
@ FEASIBLE
feasible, or stopped by limit.
@ NOT_SOLVED
not been solved yet.
@ INFEASIBLE
proven infeasible.
@ ABNORMAL
abnormal, i.e., error of some kind.
bool SetSolverSpecificParametersAsString(const std::string ¶meters)
Advanced usage: pass solver specific parameters in text format.
int64_t time_limit() const
BasisStatus
Advanced usage: possible basis status values for a variable and the slack variable of a linear constr...
virtual void SetIntegerParamToUnsupportedValue(MPSolverParameters::IntegerParam param, int value)
void set_constraint_as_extracted(int ct_index, bool extracted)
MPSolver::ResultStatus result_status_
int last_constraint_index_
static constexpr int64_t kUnknownNumberOfNodes
double best_objective_bound_
void ResetExtractionInformation()
bool variable_is_extracted(int var_index) const
static constexpr int64_t kUnknownNumberOfIterations
void set_variable_as_extracted(int var_index, bool extracted)
void SetCommonParameters(const MPSolverParameters ¶m)
SynchronizationStatus sync_status_
This class stores parameter settings for LP and MIP solvers.
@ PRESOLVE
Advanced usage: presolve mode.
@ PRESOLVE_ON
Presolve is on.
@ PRESOLVE_OFF
Presolve is off.
static const int kDefaultIntegerParamValue
The class for variables of a Mathematical Programming (MP) model.
static std::unique_ptr< TimeLimit > FromParameters(const Parameters ¶meters)
Creates a time limit object initialized from an object that provides methods max_time_in_seconds() an...
ABSL_MUST_USE_RESULT BopSolveStatus SolveWithTimeLimit(const glop::LinearProgram &linear_problem, TimeLimit *time_limit)
glop::Fractional best_bound() const
const glop::DenseRow & variable_values() const
glop::Fractional objective_value() const
void SetParameters(const BopParameters ¶meters)
void SetVariableBounds(ColIndex col, Fractional lower_bound, Fractional upper_bound)
void SetObjectiveOffset(Fractional objective_offset)
void SetCoefficient(RowIndex row, ColIndex col, Fractional value)
void SetConstraintBounds(RowIndex row, Fractional lower_bound, Fractional upper_bound)
ColIndex CreateNewVariable()
void SetVariableType(ColIndex col, VariableType type)
void SetObjectiveCoefficient(ColIndex col, Fractional value)
RowIndex CreateNewConstraint()
void SetMaximizationProblem(bool maximize)
void assign(IntType size, const T &v)
ModelSharedTimeLimit * time_limit
A C++ wrapper that provides a simple and unified interface to several linear programming and mixed in...
@ FEASIBLE_SOLUTION_FOUND
Collection of objects used to extend the Constraint Solver library.
MPSolverInterface * BuildBopInterface(MPSolver *const solver)
#define VLOG(verboselevel)