21#include "absl/status/statusor.h"
24#include "ortools/linear_solver/linear_solver.pb.h"
29#include "ortools/pdlp/solve_log.pb.h"
30#include "ortools/pdlp/solvers.pb.h"
37 const MPModelRequest& request,
const bool relax_integer_variables,
38 const std::atomic<bool>* interrupt_solve) {
39 pdlp::PrimalDualHybridGradientParams params;
40 if (request.enable_internal_solver_output()) {
41 params.set_verbosity_level(3);
43 params.set_verbosity_level(0);
46 MPSolutionResponse error_response;
49 error_response.set_status(
50 MPSolverResponseStatus::MPSOLVER_MODEL_INVALID_SOLVER_PARAMETERS);
51 return error_response;
53 if (interrupt_solve !=
nullptr && interrupt_solve->load() ==
true) {
54 error_response.set_status(MPSolverResponseStatus::MPSOLVER_NOT_SOLVED);
55 return error_response;
57 if (request.has_solver_time_limit_seconds()) {
58 params.mutable_termination_criteria()->set_time_sec_limit(
59 request.solver_time_limit_seconds());
62 const absl::optional<LazyMutableCopy<MPModelProto>> optional_model =
64 if (!optional_model) {
66 <<
"Failed to extract a valid model from protocol buffer. Status: "
67 << ProtoEnumToString<MPSolverResponseStatus>(error_response.status())
68 <<
" (" << error_response.status()
69 <<
"): " << error_response.status_str();
70 return error_response;
84 switch (pdhg_result.
solve_log.termination_reason()) {
85 case pdlp::TERMINATION_REASON_OPTIMAL:
86 response.set_status(MPSOLVER_OPTIMAL);
88 case pdlp::TERMINATION_REASON_NUMERICAL_ERROR:
89 response.set_status(MPSOLVER_ABNORMAL);
91 case pdlp::TERMINATION_REASON_PRIMAL_INFEASIBLE:
92 response.set_status(MPSOLVER_INFEASIBLE);
94 case pdlp::TERMINATION_REASON_INTERRUPTED_BY_USER:
95 response.set_status(MPSOLVER_CANCELLED_BY_USER);
98 response.set_status(MPSOLVER_NOT_SOLVED);
100 if (pdhg_result.
solve_log.has_termination_string()) {
104 const std::optional<pdlp::ConvergenceInformation> convergence_information =
108 if (convergence_information.has_value()) {
109 response.set_objective_value(convergence_information->primal_objective());
123 response.add_dual_value(objective_scaling_factor * v);
127 response.add_reduced_cost(objective_scaling_factor * v);
#define LOG_IF(severity, condition)
#define ASSIGN_OR_RETURN(lhs, rexpr)
SharedResponseManager * response
absl::StatusOr< QuadraticProgram > QpFromMpModelProto(const MPModelProto &proto, bool relax_integer_variables, bool include_names)
absl::optional< ConvergenceInformation > GetConvergenceInformation(const IterationStats &stats, PointType candidate_type)
SolverResult PrimalDualHybridGradient(QuadraticProgram qp, const PrimalDualHybridGradientParams ¶ms, const std::atomic< bool > *interrupt_solve, IterationStatsCallback iteration_stats_callback)
Collection of objects used to extend the Constraint Solver library.
bool ProtobufTextFormatMergeFromString(const std::string &proto_text_string, ProtoType *proto)
absl::optional< LazyMutableCopy< MPModelProto > > ExtractValidMPModelOrPopulateResponseStatus(const MPModelRequest &request, MPSolutionResponse *response)
If the model is valid and non-empty, returns it (possibly after extracting the model_delta).
absl::StatusOr< MPSolutionResponse > PdlpSolveProto(const MPModelRequest &request, const bool relax_integer_variables, const std::atomic< bool > *interrupt_solve)
double objective_scaling_factor
Eigen::VectorXd dual_solution
Eigen::VectorXd reduced_costs
Eigen::VectorXd primal_solution