21 #include "absl/base/attributes.h"
22 #include "absl/status/status.h"
23 #include "absl/status/statusor.h"
24 #include "absl/strings/str_cat.h"
25 #include "absl/types/optional.h"
26 #include "google/protobuf/text_format.h"
29 #include "ortools/linear_solver/linear_solver.pb.h"
31 #include "ortools/pdlp/solve_log.pb.h"
32 #include "ortools/pdlp/solvers.pb.h"
45 const MPModelRequest& request, std::atomic<bool>* interrupt)
override;
48 void Reset()
override;
56 const MPVariable*
const variable,
double new_value,
57 double old_value)
override;
66 int64_t
nodes()
const override;
72 bool IsLP()
const override;
73 bool IsMIP()
const override;
94 void NonIncrementalChange();
96 pdlp::PrimalDualHybridGradientParams parameters_;
97 pdlp::SolveLog solve_log_;
112 parameters_.set_verbosity_level(0);
114 parameters_.set_verbosity_level(3);
118 solver_->solver_specific_parameter_string_);
123 parameters_.mutable_termination_criteria()->set_time_sec_limit(
128 for (
int i = 0; i <
solver_->variables_.size(); ++i) {
131 for (
int i = 0; i <
solver_->constraints_.size(); ++i) {
137 MPModelRequest request;
139 if (!google::protobuf::TextFormat::PrintToString(
140 parameters_, request.mutable_solver_specific_parameters())) {
141 LOG(QFATAL) <<
"Error converting parameters to text format: "
142 << parameters_.DebugString();
144 absl::StatusOr<MPSolutionResponse>
response =
148 LOG(ERROR) <<
"Unexpected error solving with PDLP: " <<
response.status();
156 if (!solve_log_.ParseFromString(
response->solver_specific_info())) {
157 LOG(DFATAL) <<
"Unable to parse PDLP's SolveLog from solver_specific_info";
160 if (
response->status() == MPSOLVER_FEASIBLE ||
161 response->status() == MPSOLVER_OPTIMAL) {
164 LOG(ERROR) <<
"LoadSolutionFromProto failed: " << result;
172 const MPModelRequest& request, std::atomic<bool>* interrupt) {
173 absl::StatusOr<MPSolutionResponse>
response =
177 LOG(ERROR) <<
"Unexpected error solving with PDLP: " <<
response.status();
178 MPSolutionResponse error_response;
179 error_response.set_status(MPSolverResponseStatus::MPSOLVER_ABNORMAL);
180 error_response.set_status_str(
response.status().ToString());
181 return error_response;
190 NonIncrementalChange();
194 NonIncrementalChange();
198 NonIncrementalChange();
202 NonIncrementalChange();
206 NonIncrementalChange();
210 NonIncrementalChange();
215 double new_value,
double old_value) {
216 NonIncrementalChange();
220 NonIncrementalChange();
225 NonIncrementalChange();
233 return solve_log_.iteration_count();
237 LOG(DFATAL) <<
"Number of nodes only available for discrete problems";
244 return MPSolver::BasisStatus::FREE;
250 return MPSolver::BasisStatus::FREE;
276 if (num_threads < 1) {
277 return absl::InvalidArgumentError(
278 absl::StrCat(
"Invalid number of threads: ", num_threads));
280 parameters_.set_num_threads(num_threads);
281 return absl::OkStatus();
297 void PdlpInterface::NonIncrementalChange() {
The class for constraints of a Mathematical Programming (MP) model.
This mathematical programming (MP) solver class is the main class though which users build and solve ...
ResultStatus
The status of solving the problem.
@ ABNORMAL
abnormal, i.e., error of some kind.
bool SetSolverSpecificParametersAsString(const std::string ¶meters)
Advanced usage: pass solver specific parameters in text format.
absl::Status LoadSolutionFromProto(const MPSolutionResponse &response, double tolerance=std::numeric_limits< double >::infinity())
Load a solution encoded in a protocol buffer onto this solver for easy access via the MPSolver interf...
void ExportModelToProto(MPModelProto *output_model) const
Exports model to protocol buffer.
int64_t time_limit() const
BasisStatus
Advanced usage: possible basis status values for a variable and the slack variable of a linear constr...
void set_constraint_as_extracted(int ct_index, bool extracted)
MPSolver::ResultStatus result_status_
static constexpr int64_t kUnknownNumberOfNodes
void ResetExtractionInformation()
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.
The class for variables of a Mathematical Programming (MP) model.
void SetScalingMode(int value) override
void SetDualTolerance(double value) override
void AddRowConstraint(MPConstraint *const ct) override
void SetLpAlgorithm(int value) override
std::optional< MPSolutionResponse > DirectlySolveProto(const MPModelRequest &request, std::atomic< bool > *interrupt) override
void ExtractObjective() override
void * underlying_solver() override
bool IsContinuous() const override
MPSolver::ResultStatus Solve(const MPSolverParameters ¶m) override
void SetPrimalTolerance(double value) override
void ClearConstraint(MPConstraint *const constraint) override
~PdlpInterface() 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
std::string SolverVersion() const override
void SetRelativeMipGap(double value) override
void SetConstraintBounds(int index, double lb, double ub) override
absl::Status SetNumThreads(int num_threads) 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
PdlpInterface(MPSolver *const solver)
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
CpModelProto const * model_proto
SharedResponseManager * response
A C++ wrapper that provides a simple and unified interface to several linear programming and mixed in...
Collection of objects used to extend the Constraint Solver library.
MPSolverInterface * BuildPdlpInterface(MPSolver *const solver)
absl::StatusOr< MPSolutionResponse > PdlpSolveProto(const MPModelRequest &request, const bool relax_integer_variables, const std::atomic< bool > *interrupt_solve)
bool ProtobufTextFormatMergeFromString(absl::string_view proto_text_string, ProtoType *proto)
#define VLOG(verboselevel)