20#include "absl/status/status.h"
21#include "absl/strings/str_cat.h"
22#include "absl/strings/string_view.h"
28using ::absl::InvalidArgumentError;
29using ::absl::OkStatus;
35 const absl::string_view name) {
36 if (std::isnan(value)) {
37 return InvalidArgumentError(absl::StrCat(name,
" is NAN"));
40 return InvalidArgumentError(absl::StrCat(name,
" must be non-negative"));
42 return absl::OkStatus();
49 return InvalidArgumentError(
"invalid value for optimality_norm");
54 return InvalidArgumentError(
55 "eps_optimal_absolute should not be set if "
56 "detailed_optimality_criteria or simple_optimality_criteria is used");
59 return InvalidArgumentError(
60 "eps_optimal_relative should not be set if "
61 "detailed_optimality_criteria or simple_optimality_criteria is used");
68 "detailed_optimality_criteria.eps_optimal_primal_residual_absolute"));
72 "detailed_optimality_criteria.eps_optimal_primal_residual_relative"));
76 "detailed_optimality_criteria.eps_optimal_dual_residual_absolute"));
80 "detailed_optimality_criteria.eps_optimal_dual_residual_relative"));
84 "detailed_optimality_criteria.eps_optimal_objective_gap_absolute"));
88 "detailed_optimality_criteria.eps_optimal_objective_gap_relative"));
92 "simple_optimality_criteria.eps_optimal_absolute"));
95 "simple_optimality_criteria.eps_optimal_relative"));
98 "eps_optimal_absolute"));
100 "eps_optimal_relative"));
103 "eps_primal_infeasible"));
112 return InvalidArgumentError(
"iteration_limit must be non-negative");
115 "kkt_matrix_pass_limit"));
123 return InvalidArgumentError(
"step_size_reduction_exponent is NAN");
127 return InvalidArgumentError(
128 "step_size_reduction_exponent must be between 0.1 and 1.0 inclusive");
131 return InvalidArgumentError(
"step_size_growth_exponent is NAN");
135 return InvalidArgumentError(
136 "step_size_growth_exponent must be between 0.1 and 1.0 inclusive");
143 return InvalidArgumentError(
"step_size_downscaling_factor is NAN");
147 return InvalidArgumentError(
148 absl::StrCat(
"step_size_downscaling_factor must be between ",
152 return InvalidArgumentError(
"linesearch_contraction_factor is NAN");
156 return InvalidArgumentError(
157 "linesearch_contraction_factor must be between 0 and 1 exclusive");
160 return InvalidArgumentError(
"step_size_interpolation is NAN");
164 return InvalidArgumentError(absl::StrCat(
165 "step_size_interpolation must be non-negative and less than ",
174 <<
"termination_criteria invalid";
176 return InvalidArgumentError(
"num_threads must be positive");
179 return InvalidArgumentError(
"verbosity_level must be non-negative");
182 return InvalidArgumentError(
"log_interval_seconds must be non-negative");
185 return InvalidArgumentError(
"log_interval_seconds is NAN");
188 return InvalidArgumentError(
"major_iteration_frequency must be positive");
191 return InvalidArgumentError(
"termination_check_frequency must be positive");
201 return InvalidArgumentError(
"invalid restart_strategy");
204 return InvalidArgumentError(
"primal_weight_update_smoothing is NAN");
208 return InvalidArgumentError(
209 "primal_weight_update_smoothing must be between 0 and 1 inclusive");
212 return InvalidArgumentError(
"initial_primal_weight is NAN");
217 return InvalidArgumentError(
218 absl::StrCat(
"initial_primal_weight must be between ",
kTinyDouble,
222 return InvalidArgumentError(
"l_inf_ruiz_iterations must be non-negative");
225 return InvalidArgumentError(
"l_inf_ruiz_iterations must be at most 100");
228 return InvalidArgumentError(
"sufficient_reduction_for_restart is NAN");
232 return InvalidArgumentError(
233 "sufficient_reduction_for_restart must be between 0 and 1 exclusive");
236 return InvalidArgumentError(
"necessary_reduction_for_restart is NAN");
241 return InvalidArgumentError(
242 "necessary_reduction_for_restart must be in the interval "
243 "[sufficient_reduction_for_restart, 1)");
251 return InvalidArgumentError(
"invalid linesearch_rule");
255 <<
"adaptive_linesearch_parameters invalid";
257 <<
"malitsky_pock_parameters invalid";
259 return InvalidArgumentError(
"initial_step_size_scaling is NAN");
263 return InvalidArgumentError(
264 absl::StrCat(
"initial_step_size_scaling must be between ",
kTinyDouble,
269 return InvalidArgumentError(
"infinite_constraint_bound_threshold is NAN");
272 return InvalidArgumentError(
273 "infinite_constraint_bound_threshold must be positive");
276 return InvalidArgumentError(
277 "diagonal_qp_trust_region_solver_tolerance is NAN");
280 10 * std::numeric_limits<double>::epsilon()) {
281 return InvalidArgumentError(absl::StrCat(
282 "diagonal_qp_trust_region_solver_tolerance must be at least ",
283 10 * std::numeric_limits<double>::epsilon()));
287 return InvalidArgumentError(
288 "use_feasibility_polishing requires "
289 "!handle_some_primal_gradients_on_finite_bounds_as_residuals");
293 return InvalidArgumentError(
294 "use_feasibility_polishing and glop presolve can not be used "
#define RETURN_IF_ERROR(expr)
double step_size_reduction_exponent() const
double step_size_growth_exponent() const
double linesearch_contraction_factor() const
double step_size_interpolation() const
double step_size_downscaling_factor() const
static constexpr LinesearchRule ADAPTIVE_LINESEARCH_RULE
bool use_feasibility_polishing() const
static constexpr LinesearchRule MALITSKY_POCK_LINESEARCH_RULE
double log_interval_seconds() const
bool has_initial_primal_weight() const
optional double initial_primal_weight = 8;
::int32_t l_inf_ruiz_iterations() const
static constexpr RestartStrategy EVERY_MAJOR_ITERATION
::int32_t num_threads() const
const ::operations_research::pdlp::MalitskyPockParams & malitsky_pock_parameters() const
bool handle_some_primal_gradients_on_finite_bounds_as_residuals() const
double primal_weight_update_smoothing() const
const ::operations_research::pdlp::AdaptiveLinesearchParams & adaptive_linesearch_parameters() const
::int32_t verbosity_level() const
double initial_step_size_scaling() const
const ::operations_research::pdlp::TerminationCriteria & termination_criteria() const
double sufficient_reduction_for_restart() const
static constexpr RestartStrategy ADAPTIVE_DISTANCE_BASED
static constexpr RestartStrategy NO_RESTARTS
double necessary_reduction_for_restart() const
double initial_primal_weight() const
::int32_t major_iteration_frequency() const
::int32_t termination_check_frequency() const
static constexpr RestartStrategy ADAPTIVE_HEURISTIC
::operations_research::pdlp::PrimalDualHybridGradientParams_RestartStrategy restart_strategy() const
static constexpr LinesearchRule CONSTANT_STEP_SIZE_RULE
const ::operations_research::pdlp::PrimalDualHybridGradientParams_PresolveOptions & presolve_options() const
double infinite_constraint_bound_threshold() const
double diagonal_qp_trust_region_solver_tolerance() const
::operations_research::pdlp::PrimalDualHybridGradientParams_LinesearchRule linesearch_rule() const
double eps_optimal_primal_residual_relative() const
double eps_optimal_objective_gap_relative() const
double eps_optimal_objective_gap_absolute() const
double eps_optimal_primal_residual_absolute() const
double eps_optimal_dual_residual_absolute() const
double eps_optimal_dual_residual_relative() const
double eps_optimal_absolute() const
double eps_optimal_relative() const
double eps_primal_infeasible() const
double eps_optimal_relative() const
const ::operations_research::pdlp::TerminationCriteria_DetailedOptimalityCriteria & detailed_optimality_criteria() const
bool has_eps_optimal_absolute() const
optional double eps_optimal_absolute = 2 [default = 1e-06, deprecated = true];
::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
bool has_eps_optimal_relative() const
optional double eps_optimal_relative = 3 [default = 1e-06, deprecated = true];
double kkt_matrix_pass_limit() const
double eps_dual_infeasible() const
double eps_optimal_absolute() const
Validation utilities for solvers.proto.
absl::Status ValidatePrimalDualHybridGradientParams(const PrimalDualHybridGradientParams ¶ms)
absl::Status ValidateAdaptiveLinesearchParams(const AdaptiveLinesearchParams ¶ms)
absl::Status CheckNonNegative(const double value, const absl::string_view name)
@ OPTIMALITY_NORM_L_INF_COMPONENTWISE
absl::Status ValidateMalitskyPockParams(const MalitskyPockParams ¶ms)
absl::Status ValidateTerminationCriteria(const TerminationCriteria &criteria)