20#include "absl/log/log.h"
33 const double abs_obj =
37 return std::isfinite(abs_obj) &&
48 double primal_err_baseline;
50 double dual_err_baseline;
51 double primal_absolute_epsilon =
53 double dual_absolute_epsilon =
56 switch (optimality_norm) {
71 primal_err_baseline = 1.0;
72 primal_absolute_epsilon = 0.0;
74 dual_err_baseline = 1.0;
75 dual_absolute_epsilon = 0.0;
78 LOG(FATAL) <<
"Invalid optimality_norm value "
82 const bool primal_err_ok =
86 primal_absolute_epsilon +
89 const bool dual_err_ok =
92 dual_err <= dual_absolute_epsilon +
95 return primal_err_ok && dual_err_ok &&
104bool PrimalInfeasibilityCriteriaMet(
double eps_primal_infeasible,
105 const InfeasibilityInformation& stats) {
106 if (stats.dual_ray_objective() <= 0.0)
return false;
107 return stats.max_dual_ray_infeasibility() / stats.dual_ray_objective() <=
108 eps_primal_infeasible;
113bool DualInfeasibilityCriteriaMet(
double eps_dual_infeasible,
114 const InfeasibilityInformation& stats) {
115 if (stats.primal_ray_linear_objective() >= 0.0)
return false;
116 return (stats.max_primal_ray_infeasibility() /
117 -stats.primal_ray_linear_objective() <=
118 eps_dual_infeasible) &&
119 (stats.primal_ray_quadratic_norm() /
120 -stats.primal_ray_linear_objective() <=
121 eps_dual_infeasible);
163 const std::atomic<bool>* interrupt_solve) {
178 if (interrupt_solve !=
nullptr && interrupt_solve->load() ==
true) {
189 const bool force_numerical_termination) {
197 .type = convergence_stats.candidate_type()};
202 infeasibility_stats)) {
205 .type = infeasibility_stats.candidate_type()};
208 infeasibility_stats)) {
211 .type = infeasibility_stats.candidate_type()};
214 if (force_numerical_termination) {
231 const double epsilon_relative) {
234 return (epsilon_absolute == epsilon_relative)
236 : epsilon_absolute / epsilon_relative;
243 const double eps_ratio_primal =
246 const double eps_ratio_dual =
249 const double eps_ratio_gap =
265 const double abs_obj =
double cumulative_time_sec() const
::int32_t iteration_number() const
double cumulative_kkt_matrix_passes() const
const ::operations_research::pdlp::ConvergenceInformation & convergence_information(int index) const
const ::operations_research::pdlp::InfeasibilityInformation & infeasibility_information(int index) const
double objective_vector_l2_norm() const
double combined_bounds_max() const
double combined_bounds_l2_norm() const
double objective_vector_abs_max() const
void set_eps_optimal_primal_residual_relative(double value)
double eps_optimal_primal_residual_relative() const
void set_eps_optimal_dual_residual_relative(double value)
double eps_optimal_objective_gap_relative() const
double eps_optimal_objective_gap_absolute() const
void set_eps_optimal_dual_residual_absolute(double value)
double eps_optimal_primal_residual_absolute() const
void set_eps_optimal_objective_gap_absolute(double value)
double eps_optimal_dual_residual_absolute() const
double eps_optimal_dual_residual_relative() const
void set_eps_optimal_objective_gap_relative(double value)
void set_eps_optimal_primal_residual_absolute(double value)
void set_eps_optimal_absolute(double value)
double eps_optimal_absolute() const
double eps_optimal_relative() const
void set_eps_optimal_relative(double value)
double eps_primal_infeasible() const
double eps_optimal_relative() const
const ::operations_research::pdlp::TerminationCriteria_DetailedOptimalityCriteria & detailed_optimality_criteria() const
::operations_research::pdlp::OptimalityNorm optimality_norm() const
bool has_detailed_optimality_criteria() const
.operations_research.pdlp.TerminationCriteria.DetailedOptimalityCriteria detailed_optimality_criteria...
const ::operations_research::pdlp::TerminationCriteria_SimpleOptimalityCriteria & simple_optimality_criteria() const
double time_sec_limit() const
bool has_simple_optimality_criteria() const
.operations_research.pdlp.TerminationCriteria.SimpleOptimalityCriteria simple_optimality_criteria = 9...
::int32_t iteration_limit() const
TerminationCriteria_DetailedOptimalityCriteria DetailedOptimalityCriteria
double kkt_matrix_pass_limit() const
double eps_dual_infeasible() const
TerminationCriteria_SimpleOptimalityCriteria SimpleOptimalityCriteria
nested types -------------------------------------------------—
double eps_optimal_absolute() const
Validation utilities for solvers.proto.
std::optional< TerminationReasonAndPointType > CheckSimpleTerminationCriteria(const TerminationCriteria &criteria, const IterationStats &stats, const std::atomic< bool > *interrupt_solve)
TerminationCriteria::DetailedOptimalityCriteria EffectiveOptimalityCriteria(const TerminationCriteria &termination_criteria)
Computes the effective optimality criteria for a TerminationCriteria.
QuadraticProgramBoundNorms BoundNormsFromProblemStats(const QuadraticProgramStats &stats)
double EpsilonRatio(const double epsilon_absolute, const double epsilon_relative)
const ::std::string & OptimalityNorm_Name(T value)
@ OPTIMALITY_NORM_L_INF_COMPONENTWISE
std::optional< TerminationReasonAndPointType > CheckIterateTerminationCriteria(const TerminationCriteria &criteria, const IterationStats &stats, const QuadraticProgramBoundNorms &bound_norms, const bool force_numerical_termination)
bool OptimalityCriteriaMet(const TerminationCriteria::DetailedOptimalityCriteria &optimality_criteria, const ConvergenceInformation &stats, const OptimalityNorm optimality_norm, const QuadraticProgramBoundNorms &bound_norms)
Determines if the optimality criteria are met.
bool ObjectiveGapMet(const TerminationCriteria::DetailedOptimalityCriteria &optimality_criteria, const ConvergenceInformation &stats)
@ TERMINATION_REASON_DUAL_INFEASIBLE
@ TERMINATION_REASON_TIME_LIMIT
@ TERMINATION_REASON_KKT_MATRIX_PASS_LIMIT
@ TERMINATION_REASON_PRIMAL_INFEASIBLE
@ TERMINATION_REASON_OPTIMAL
@ TERMINATION_REASON_ITERATION_LIMIT
@ TERMINATION_REASON_NUMERICAL_ERROR
@ TERMINATION_REASON_INTERRUPTED_BY_USER
RelativeConvergenceInformation ComputeRelativeResiduals(const TerminationCriteria::DetailedOptimalityCriteria &optimality_criteria, const ConvergenceInformation &stats, const QuadraticProgramBoundNorms &bound_norms)
double l_inf_norm_constraint_bounds
double l_inf_norm_primal_linear_objective
double l2_norm_constraint_bounds
double l2_norm_primal_linear_objective