19 #include "absl/base/attributes.h" 20 #include "google/protobuf/text_format.h" 46 LOG(DFATAL) <<
"Invalid bop::BopSolveStatus";
61 void Reset()
override;
69 const MPVariable*
const variable,
double new_value,
70 double old_value)
override;
79 int64_t
nodes()
const override;
85 bool IsLP()
const override;
86 bool IsMIP()
const override;
107 void NonIncrementalChange();
111 std::vector<MPSolver::BasisStatus> column_status_;
112 std::vector<MPSolver::BasisStatus> row_status_;
114 std::atomic<bool> interrupt_solver_;
124 interrupt_solver_(false) {}
130 if (interrupt_solver_) {
155 if (!
solver_->solution_hint_.empty()) {
156 const int num_vars =
solver_->variables_.size();
157 if (
solver_->solution_hint_.size() != num_vars) {
158 LOG(
WARNING) <<
"Bop currently doesn't handle partial solution hints. " 159 <<
"Filling the missing positions with zeros...";
162 for (
const std::pair<const MPVariable*, double>& p :
164 initial_solution[glop::ColIndex(p.first->index())] =
170 solver_->solver_specific_parameter_string_);
174 time_limit->RegisterExternalBooleanAsLimit(&interrupt_solver_);
176 initial_solution.
empty()
191 const size_t num_vars =
solver_->variables_.size();
193 for (
int var_id = 0; var_id < num_vars; ++var_id) {
195 const glop::ColIndex lp_solver_var_id(
var->index());
198 var->set_solution_value(static_cast<double>(solution_value));
202 const size_t num_constraints =
solver_->constraints_.size();
211 linear_program_.
Clear();
212 interrupt_solver_ =
false;
216 NonIncrementalChange();
220 NonIncrementalChange();
224 NonIncrementalChange();
228 NonIncrementalChange();
232 NonIncrementalChange();
236 NonIncrementalChange();
241 double new_value,
double old_value) {
242 NonIncrementalChange();
246 NonIncrementalChange();
251 NonIncrementalChange();
259 LOG(DFATAL) <<
"Number of iterations not available";
264 LOG(DFATAL) <<
"Number of nodes not available";
269 return row_status_[constraint_index];
273 return column_status_[variable_index];
286 interrupt_solver_ =
true;
297 const glop::ColIndex num_cols(
solver_->variables_.size());
304 if (
var->integer()) {
315 const glop::RowIndex num_rows(
solver_->constraints_.size());
316 for (glop::RowIndex
row(0);
row < num_rows; ++
row) {
320 const double lb =
ct->lb();
321 const double ub =
ct->ub();
326 for (
const auto& entry :
ct->coefficients_) {
327 const int var_index = entry.first->index();
329 const glop::ColIndex
col(var_index);
330 const double coeff = entry.second;
339 for (
const auto& entry :
solver_->objective_->coefficients_) {
340 const int var_index = entry.first->index();
341 const glop::ColIndex
col(var_index);
342 const double coeff = entry.second;
377 google::protobuf::TextFormat::MergeFromString(
parameters, ¶meters_);
382 void BopInterface::NonIncrementalChange() {
void ExtractNewConstraints() override
void AddVariable(MPVariable *const var) override
ResultStatus
The status of solving the problem.
void SetDualTolerance(double value) override
void set_variable_as_extracted(int var_index, bool extracted)
ABSL_MUST_USE_RESULT BopSolveStatus SolveWithTimeLimit(const glop::LinearProgram &linear_problem, TimeLimit *time_limit)
void ClearObjective() override
void SetObjectiveCoefficient(ColIndex col, Fractional value)
double best_objective_bound_
void SetRelativeMipGap(double value) override
ModelSharedTimeLimit * time_limit
void set_constraint_as_extracted(int ct_index, bool extracted)
std::string SolverVersion() const override
SynchronizationStatus sync_status_
MPSolver::BasisStatus row_status(int constraint_index) const override
#define VLOG(verboselevel)
const MPObjective & Objective() const
Returns the objective object.
A C++ wrapper that provides a simple and unified interface to several linear programming and mixed in...
void ExtractNewVariables() override
PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final
void SetVariableType(ColIndex col, VariableType type)
void SetObjectiveCoefficient(const MPVariable *const variable, double coefficient) override
void set_max_time_in_seconds(double value)
void SetConstraintBounds(int index, double lb, double ub) override
void SetParameters(const MPSolverParameters ¶m) override
void SetConstraintBounds(RowIndex row, Fractional lower_bound, Fractional upper_bound)
Advanced usage: presolve mode.
void SetObjectiveOffset(Fractional objective_offset)
BasisStatus
Advanced usage: possible basis status values for a variable and the slack variable of a linear constr...
MPSolver::ResultStatus result_status_
void assign(IntType size, const T &v)
int64_t nodes() const override
bool IsMIP() const override
void SetLpAlgorithm(int value) override
void ExtractObjective() override
The class for variables of a Mathematical Programming (MP) model.
MPSolverInterface * BuildBopInterface(MPSolver *const solver)
void SetOptimizationDirection(bool maximize) override
void ClearConstraint(MPConstraint *const constraint) override
bool SetSolverSpecificParametersAsString(const std::string ¶meters)
Advanced usage: pass solver specific parameters in text format.
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...
virtual void SetIntegerParamToUnsupportedValue(MPSolverParameters::IntegerParam param, int value)
int64_t iterations() const override
static const int kDefaultIntegerParamValue
ColIndex CreateNewVariable()
void SetObjectiveOffset(double value) override
bool IsLP() const override
void SetCommonParameters(const MPSolverParameters ¶m)
int64_t time_limit() const
static constexpr int64_t kUnknownNumberOfIterations
bool IsContinuous() const override
glop::Fractional objective_value() const
RowIndex CreateNewConstraint()
void SetPresolveMode(int value) override
The class for constraints of a Mathematical Programming (MP) model.
feasible, or stopped by limit.
void * underlying_solver() override
void SetCoefficient(MPConstraint *const constraint, const MPVariable *const variable, double new_value, double old_value) override
#define DCHECK(condition)
int last_constraint_index_
MPSolver::ResultStatus Solve(const MPSolverParameters ¶m) override
static constexpr int64_t kUnknownNumberOfNodes
#define DCHECK_EQ(val1, val2)
void SetVariableBounds(ColIndex col, Fractional lower_bound, Fractional upper_bound)
void AddRowConstraint(MPConstraint *const ct) override
void SetVariableBounds(int index, double lb, double ub) override
bool InterruptSolve() override
glop::Fractional best_bound() const
void SetMaximizationProblem(bool maximize)
void set_log_search_progress(bool value)
This mathematical programming (MP) solver class is the main class though which users build and solve ...
Collection of objects used to extend the Constraint Solver library.
void SetParameters(const BopParameters ¶meters)
BopInterface(MPSolver *const solver)
abnormal, i.e., error of some kind.
This class stores parameter settings for LP and MIP solvers.
void SetPrimalTolerance(double value) override
bool SetSolverSpecificParametersAsString(const std::string ¶meters) override
void SetVariableInteger(int index, bool integer) override
const glop::DenseRow & variable_values() const
void SetScalingMode(int value) override
void ResetExtractionInformation()
void SetCoefficient(RowIndex row, ColIndex col, Fractional value)
double offset() const
Gets the constant term in the objective.
MPSolver::BasisStatus column_status(int variable_index) const override
bool variable_is_extracted(int var_index) const