20#include "absl/base/attributes.h"
21#include "absl/status/status.h"
22#include "absl/status/statusor.h"
23#include "absl/strings/str_cat.h"
48 std::atomic<bool>* interrupt)
override {
49 const bool log_error = request->enable_internal_solver_output();
56 void Reset()
override;
64 double new_value,
double old_value)
override;
67 double coefficient)
override;
73 int64_t
nodes()
const override;
79 bool IsLP()
const override;
80 bool IsMIP()
const override;
98 const std::string& parameters)
override;
102 void NonIncrementalChange();
106 std::atomic<bool> interrupt_solver_;
117 interrupt_solver_ =
false;
122 parameters_.set_verbosity_level(0);
124 parameters_.set_verbosity_level(3);
127 solver_->SetSolverSpecificParametersAsString(
128 solver_->solver_specific_parameter_string_);
132 VLOG(1) <<
"Setting time limit = " <<
solver_->time_limit() <<
" ms.";
133 parameters_.mutable_termination_criteria()->set_time_sec_limit(
134 static_cast<double>(
solver_->time_limit()) / 1000.0);
138 for (
int i = 0; i <
solver_->variables_.size(); ++i) {
141 for (
int i = 0; i <
solver_->constraints_.size(); ++i) {
146 solver_->ExportModelToProto(&model_proto);
149 if (!google::protobuf::TextFormat::PrintToString(
151 LOG(QFATAL) <<
"Error converting parameters to text format: "
155 std::move(request),
true, &interrupt_solver_);
157 if (!response.ok()) {
158 LOG(ERROR) <<
"Unexpected error solving with PDLP: " << response.status();
171 if (response->has_solver_specific_info()) {
172 if (!solve_log_.ParseFromString(response->solver_specific_info())) {
174 <<
"Unable to parse PDLP's SolveLog from solver_specific_info";
180 const absl::Status result =
solver_->LoadSolutionFromProto(*response);
182 LOG(ERROR) <<
"LoadSolutionFromProto failed: " << result;
192 NonIncrementalChange();
196 NonIncrementalChange();
200 NonIncrementalChange();
204 NonIncrementalChange();
208 NonIncrementalChange();
212 NonIncrementalChange();
217 double new_value,
double old_value) {
218 NonIncrementalChange();
222 NonIncrementalChange();
226 double coefficient) {
227 NonIncrementalChange();
235 return solve_log_.iteration_count();
239 LOG(DFATAL) <<
"Number of nodes only available for discrete problems";
268 interrupt_solver_ =
true;
283 if (num_threads < 1) {
284 return absl::InvalidArgumentError(
285 absl::StrCat(
"Invalid number of threads: ", num_threads));
287 parameters_.set_num_threads(num_threads);
288 return absl::OkStatus();
300 const std::string& parameters) {
304void PdlpInterface::NonIncrementalChange() {
312const void*
const kRegisterPdlp ABSL_ATTRIBUTE_UNUSED = [] {
314 [](MPSolver*
const solver) {
return new PdlpInterface(solver); },
::std::string *PROTOBUF_NONNULL mutable_solver_specific_parameters()
::operations_research::MPModelProto *PROTOBUF_NONNULL mutable_model()
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()
static constexpr int64_t kUnknownNumberOfNodes
MPSolverInterface(MPSolver *solver)
void SetCommonParameters(const MPSolverParameters ¶m)
MPSolver::ResultStatus result_status_
SynchronizationStatus sync_status_
@ NOT_SOLVED
not been solved yet.
@ ABNORMAL
abnormal, i.e., error of some kind.
@ PDLP_LINEAR_PROGRAMMING
The class for variables of a Mathematical Programming (MP) model.
MPSolutionResponse DirectlySolveProto(LazyMutableCopy< MPModelRequest > request, std::atomic< bool > *interrupt) override
int64_t nodes() const override
void SetLpAlgorithm(int value) override
bool IsMIP() const override
void * underlying_solver() override
bool SetSolverSpecificParametersAsString(const std::string ¶meters) override
void SetScalingMode(int value) override
std::string SolverVersion() const override
~PdlpInterface() override
void SetConstraintBounds(int index, double lb, double ub) override
void ClearObjective() override
PdlpInterface(MPSolver *solver)
void SetPrimalTolerance(double value) override
void SetVariableInteger(int index, bool integer) override
void SetDualTolerance(double value) override
bool InterruptSolve() override
void SetVariableBounds(int index, double lb, double ub) override
void AddVariable(MPVariable *var) override
MPSolver::ResultStatus Solve(const MPSolverParameters ¶m) override
bool IsContinuous() const override
void SetPresolveMode(int value) override
void SetOptimizationDirection(bool maximize) override
bool IsLP() const override
void ExtractObjective() override
void AddRowConstraint(MPConstraint *ct) override
void SetRelativeMipGap(double value) override
bool SupportsDirectlySolveProto(std::atomic< bool > *interrupt) const override
void ExtractNewVariables() override
void SetObjectiveOffset(double value) override
int64_t iterations() const override
void ExtractNewConstraints() override
MPSolver::BasisStatus column_status(int variable_index) const override
void SetObjectiveCoefficient(const MPVariable *variable, double coefficient) override
MPSolver::BasisStatus row_status(int constraint_index) const override
void ClearConstraint(MPConstraint *constraint) override
void SetParameters(const MPSolverParameters ¶m) override
void SetCoefficient(MPConstraint *constraint, const MPVariable *variable, double new_value, double old_value) override
absl::Status SetNumThreads(int num_threads) override
absl::StatusOr< MPSolutionResponse > PdlpSolveProto(LazyMutableCopy< MPModelRequest > request, const bool relax_integer_variables, const std::atomic< bool > *interrupt_solve)
@ MPSOLVER_CANCELLED_BY_USER
std::string ProtobufDebugString(const P &message)
MPSolutionResponse ConvertStatusOrMPSolutionResponse(bool log_error, absl::StatusOr< MPSolutionResponse > response)
bool ProtobufTextFormatMergeFromString(absl::string_view proto_text_string, ProtoType *proto)