27 #include "Eigen/SparseCore"
32 #include "ortools/pdlp/solve_log.pb.h"
33 #include "ortools/pdlp/solvers.pb.h"
35 namespace pdlp = ::operations_research::pdlp;
37 constexpr
double kInfinity = std::numeric_limits<double>::infinity();
56 const std::vector<Eigen::Triplet<double, int64_t>>
57 constraint_matrix_triplets = {{0, 0, 2}, {0, 1, 1}, {0, 2, 1},
58 {0, 3, 2}, {1, 0, 1}, {1, 2, 1},
59 {2, 0, 4}, {3, 2, 1.5}, {3, 3, -1}};
61 constraint_matrix_triplets.end());
67 int main(
int argc,
char* argv[]) {
70 pdlp::PrimalDualHybridGradientParams params;
73 params.mutable_termination_criteria()
74 ->mutable_simple_optimality_criteria()
75 ->set_eps_optimal_relative(1.0e-6);
76 params.mutable_termination_criteria()
77 ->mutable_simple_optimality_criteria()
78 ->set_eps_optimal_absolute(1.0e-6);
79 params.mutable_termination_criteria()->set_time_sec_limit(
kInfinity);
80 params.set_num_threads(1);
81 params.set_verbosity_level(0);
82 params.mutable_presolve_options()->set_use_glop(
false);
86 const pdlp::SolveLog& solve_log = result.
solve_log;
88 if (solve_log.termination_reason() == pdlp::TERMINATION_REASON_OPTIMAL) {
89 std::cout <<
"Solve successful" << std::endl;
91 std::cout <<
"Solve not successful. Status: "
92 << pdlp::TerminationReason_Name(solve_log.termination_reason())
100 std::cout <<
"Primal solution:\n" << result.
primal_solution << std::endl;
101 std::cout <<
"Dual solution:\n" << result.
dual_solution << std::endl;
102 std::cout <<
"Reduced costs:\n" << result.
reduced_costs << std::endl;
104 const pdlp::PointType solution_type = solve_log.solution_type();
105 std::cout <<
"Solution type: " << pdlp::PointType_Name(solution_type)
107 const std::optional<pdlp::ConvergenceInformation> ci =
110 if (ci.has_value()) {
111 std::cout <<
"Primal objective: " << ci->primal_objective() << std::endl;
112 std::cout <<
"Dual objective: " << ci->dual_objective() << std::endl;
115 std::cout <<
"Iterations: " << solve_log.iteration_count() << std::endl;
116 std::cout <<
"Solve time (sec): " << solve_log.solve_time_sec() << std::endl;
void InitGoogle(const char *usage, int *argc, char ***argv, bool deprecated)
SolverResult PrimalDualHybridGradient(QuadraticProgram qp, const PrimalDualHybridGradientParams ¶ms, const std::atomic< bool > *interrupt_solve, IterationStatsCallback iteration_stats_callback)
std::optional< ConvergenceInformation > GetConvergenceInformation(const IterationStats &stats, PointType candidate_type)
int main(int argc, char *argv[])
constexpr double kInfinity
pdlp::QuadraticProgram SimpleLp()
Eigen::VectorXd variable_upper_bounds
Eigen::VectorXd variable_lower_bounds
Eigen::VectorXd constraint_lower_bounds
Eigen::SparseMatrix< double, Eigen::ColMajor, int64_t > constraint_matrix
Eigen::VectorXd constraint_upper_bounds
Eigen::VectorXd objective_vector
Eigen::VectorXd dual_solution
Eigen::VectorXd reduced_costs
Eigen::VectorXd primal_solution