From 626bdfb331e8007efecb93071dfeac5cabf1e7e3 Mon Sep 17 00:00:00 2001 From: Corentin Le Molgat Date: Wed, 2 Feb 2022 14:33:49 +0100 Subject: [PATCH] Sync math_opt code --- ortools/math_opt/cpp/solve_result.cc | 3 +++ ortools/math_opt/cpp/solve_result.h | 2 ++ ortools/math_opt/result.proto | 4 ++++ ortools/math_opt/solvers/pdlp_solver.cc | 2 ++ ortools/math_opt/validators/solve_stats_validator.cc | 4 ++-- 5 files changed, 13 insertions(+), 2 deletions(-) diff --git a/ortools/math_opt/cpp/solve_result.cc b/ortools/math_opt/cpp/solve_result.cc index 795941d480..24b93fa269 100644 --- a/ortools/math_opt/cpp/solve_result.cc +++ b/ortools/math_opt/cpp/solve_result.cc @@ -285,6 +285,7 @@ SolveStatsProto SolveStats::ToProto() const { *proto.mutable_problem_status() = problem_status.ToProto(); proto.set_simplex_iterations(simplex_iterations); proto.set_barrier_iterations(barrier_iterations); + proto.set_first_order_iterations(first_order_iterations); proto.set_node_count(node_count); return proto; } @@ -299,6 +300,7 @@ SolveStats SolveStats::FromProto(const SolveStatsProto& solve_stats_proto) { ProblemStatus::FromProto(solve_stats_proto.problem_status()); result.simplex_iterations = solve_stats_proto.simplex_iterations(); result.barrier_iterations = solve_stats_proto.barrier_iterations(); + result.first_order_iterations = solve_stats_proto.first_order_iterations(); result.node_count = solve_stats_proto.node_count(); return result; } @@ -310,6 +312,7 @@ std::ostream& operator<<(std::ostream& ostr, const SolveStats& solve_stats) { ostr << ", problem_status: " << solve_stats.problem_status; ostr << ", simplex_iterations: " << solve_stats.simplex_iterations; ostr << ", barrier_iterations: " << solve_stats.barrier_iterations; + ostr << ", first_order_iterations: " << solve_stats.first_order_iterations; ostr << ", node_count: " << solve_stats.node_count; ostr << "}"; return ostr; diff --git a/ortools/math_opt/cpp/solve_result.h b/ortools/math_opt/cpp/solve_result.h index 75754aac62..6a09e5b5d5 100644 --- a/ortools/math_opt/cpp/solve_result.h +++ b/ortools/math_opt/cpp/solve_result.h @@ -133,6 +133,8 @@ struct SolveStats { int barrier_iterations = 0; + int first_order_iterations = 0; + int node_count = 0; // Will CHECK fail on invalid input, if problem_status is invalid. diff --git a/ortools/math_opt/result.proto b/ortools/math_opt/result.proto index 36c6d021ba..b553301b8a 100644 --- a/ortools/math_opt/result.proto +++ b/ortools/math_opt/result.proto @@ -113,7 +113,11 @@ message SolveStatsProto { int64 barrier_iterations = 6; + int64 first_order_iterations = 8; + int64 node_count = 7; + + // Next id: 9 } // The reason a call to Solve() terminates. diff --git a/ortools/math_opt/solvers/pdlp_solver.cc b/ortools/math_opt/solvers/pdlp_solver.cc index 51633bc206..46144e09a7 100644 --- a/ortools/math_opt/solvers/pdlp_solver.cc +++ b/ortools/math_opt/solvers/pdlp_solver.cc @@ -214,6 +214,8 @@ absl::StatusOr PdlpSolver::MakeSolveResult( ASSIGN_OR_RETURN(*result.mutable_solve_stats()->mutable_solve_time(), util_time::EncodeGoogleApiProto( absl::Seconds(pdlp_result.solve_log.solve_time_sec()))); + result.mutable_solve_stats()->set_first_order_iterations( + pdlp_result.solve_log.iteration_count()); const std::optional convergence_information = pdlp::GetConvergenceInformation(pdlp_result.solve_log.solution_stats(), pdlp_result.solve_log.solution_type()); diff --git a/ortools/math_opt/validators/solve_stats_validator.cc b/ortools/math_opt/validators/solve_stats_validator.cc index 967afe9d5a..f833945350 100644 --- a/ortools/math_opt/validators/solve_stats_validator.cc +++ b/ortools/math_opt/validators/solve_stats_validator.cc @@ -152,7 +152,7 @@ absl::Status ValidateSolveStatsConsistency(const SolveStatsProto& solve_stats) { return absl::InvalidArgumentError( absl::StrCat("best_primal_bound is finite, but primal_status is not " "feasible (primal_status = ", - solve_stats.problem_status().primal_status())); + solve_stats.problem_status().primal_status(), ")")); } if (solve_stats.problem_status().dual_status() != FEASIBILITY_STATUS_FEASIBLE && @@ -160,7 +160,7 @@ absl::Status ValidateSolveStatsConsistency(const SolveStatsProto& solve_stats) { return absl::InvalidArgumentError( absl::StrCat("best_dual_bound is finite, but dual_status is not " "feasible (dual_status = ", - solve_stats.problem_status().dual_status())); + solve_stats.problem_status().dual_status(), ")")); } return absl::OkStatus(); }