16#include "absl/status/status.h"
17#include "gmock/gmock.h"
18#include "gtest/gtest.h"
19#include "ortools/pdlp/solvers.pb.h"
24using ::testing::HasSubstr;
27 TerminationCriteria criteria;
33 TerminationCriteria criteria;
34 criteria.set_optimality_norm(OPTIMALITY_NORM_UNSPECIFIED);
36 EXPECT_EQ(
status.code(), absl::StatusCode::kInvalidArgument);
37 EXPECT_THAT(
status.message(), HasSubstr(
"optimality_norm"));
41 TerminationCriteria criteria;
42 criteria.set_eps_optimal_absolute(-1.0);
44 EXPECT_EQ(
status.code(), absl::StatusCode::kInvalidArgument);
45 EXPECT_THAT(
status.message(), HasSubstr(
"eps_optimal_absolute"));
49 TerminationCriteria criteria;
50 criteria.set_eps_optimal_relative(-1.0);
52 EXPECT_EQ(
status.code(), absl::StatusCode::kInvalidArgument);
53 EXPECT_THAT(
status.message(), HasSubstr(
"eps_optimal_relative"));
57 TerminationCriteria criteria;
58 criteria.set_eps_primal_infeasible(-1.0);
60 EXPECT_EQ(
status.code(), absl::StatusCode::kInvalidArgument);
61 EXPECT_THAT(
status.message(), HasSubstr(
"eps_primal_infeasible"));
65 TerminationCriteria criteria;
66 criteria.set_eps_dual_infeasible(-1.0);
68 EXPECT_EQ(
status.code(), absl::StatusCode::kInvalidArgument);
69 EXPECT_THAT(
status.message(), HasSubstr(
"eps_dual_infeasible"));
73 TerminationCriteria criteria;
74 criteria.set_time_sec_limit(-1.0);
76 EXPECT_EQ(
status.code(), absl::StatusCode::kInvalidArgument);
77 EXPECT_THAT(
status.message(), HasSubstr(
"time_sec_limit"));
81 TerminationCriteria criteria;
82 criteria.set_iteration_limit(-1);
84 EXPECT_EQ(
status.code(), absl::StatusCode::kInvalidArgument);
85 EXPECT_THAT(
status.message(), HasSubstr(
"iteration_limit"));
89 TerminationCriteria criteria;
90 criteria.set_kkt_matrix_pass_limit(-1.0);
92 EXPECT_EQ(
status.code(), absl::StatusCode::kInvalidArgument);
93 EXPECT_THAT(
status.message(), HasSubstr(
"kkt_matrix_pass_limit"));
97 AdaptiveLinesearchParams params;
103 AdaptiveLinesearchParams params;
104 params.set_step_size_reduction_exponent(0.0);
106 EXPECT_EQ(
status.code(), absl::StatusCode::kInvalidArgument);
107 EXPECT_THAT(
status.message(), HasSubstr(
"step_size_reduction_exponent"));
111 AdaptiveLinesearchParams params;
112 params.set_step_size_growth_exponent(0.0);
114 EXPECT_EQ(
status.code(), absl::StatusCode::kInvalidArgument);
115 EXPECT_THAT(
status.message(), HasSubstr(
"step_size_growth_exponent"));
119 MalitskyPockParams params;
125 MalitskyPockParams params0;
126 params0.set_step_size_downscaling_factor(0.0);
128 EXPECT_EQ(status0.code(), absl::StatusCode::kInvalidArgument);
129 EXPECT_THAT(status0.message(), HasSubstr(
"step_size_downscaling_factor"));
131 MalitskyPockParams params1;
132 params1.set_step_size_downscaling_factor(1.0);
134 EXPECT_EQ(status1.code(), absl::StatusCode::kInvalidArgument);
135 EXPECT_THAT(status1.message(), HasSubstr(
"step_size_downscaling_factor"));
139 MalitskyPockParams params0;
140 params0.set_linesearch_contraction_factor(0.0);
142 EXPECT_EQ(status0.code(), absl::StatusCode::kInvalidArgument);
143 EXPECT_THAT(status0.message(), HasSubstr(
"linesearch_contraction_factor"));
145 MalitskyPockParams params1;
146 params1.set_linesearch_contraction_factor(1.0);
148 EXPECT_EQ(status1.code(), absl::StatusCode::kInvalidArgument);
149 EXPECT_THAT(status1.message(), HasSubstr(
"linesearch_contraction_factor"));
153 MalitskyPockParams params;
154 params.set_step_size_interpolation(-1.0);
156 EXPECT_EQ(
status.code(), absl::StatusCode::kInvalidArgument);
157 EXPECT_THAT(
status.message(), HasSubstr(
"step_size_interpolation"));
161 PrimalDualHybridGradientParams params;
167 PrimalDualHybridGradientParams params;
168 params.mutable_termination_criteria()->set_eps_dual_infeasible(-1);
170 EXPECT_EQ(
status.code(), absl::StatusCode::kInvalidArgument);
171 EXPECT_THAT(
status.message(), HasSubstr(
"eps_dual_infeasible"));
175 PrimalDualHybridGradientParams params;
176 params.set_num_threads(0);
178 EXPECT_EQ(
status.code(), absl::StatusCode::kInvalidArgument);
179 EXPECT_THAT(
status.message(), HasSubstr(
"num_threads"));
183 PrimalDualHybridGradientParams params;
184 params.set_verbosity_level(-1);
186 EXPECT_EQ(
status.code(), absl::StatusCode::kInvalidArgument);
187 EXPECT_THAT(
status.message(), HasSubstr(
"verbosity_level"));
191 PrimalDualHybridGradientParams params;
192 params.set_major_iteration_frequency(0);
194 EXPECT_EQ(
status.code(), absl::StatusCode::kInvalidArgument);
195 EXPECT_THAT(
status.message(), HasSubstr(
"major_iteration_frequency"));
199 PrimalDualHybridGradientParams params;
200 params.set_termination_check_frequency(0);
202 EXPECT_EQ(
status.code(), absl::StatusCode::kInvalidArgument);
203 EXPECT_THAT(
status.message(), HasSubstr(
"termination_check_frequency"));
207 PrimalDualHybridGradientParams params;
208 params.set_restart_strategy(
209 PrimalDualHybridGradientParams::RESTART_STRATEGY_UNSPECIFIED);
211 EXPECT_EQ(
status.code(), absl::StatusCode::kInvalidArgument);
212 EXPECT_THAT(
status.message(), HasSubstr(
"restart_strategy"));
216 PrimalDualHybridGradientParams params_high;
217 params_high.set_primal_weight_update_smoothing(1.1);
218 const absl::Status status_high =
220 EXPECT_EQ(status_high.code(), absl::StatusCode::kInvalidArgument);
221 EXPECT_THAT(status_high.message(),
222 HasSubstr(
"primal_weight_update_smoothing"));
224 PrimalDualHybridGradientParams params_low;
225 params_low.set_primal_weight_update_smoothing(-0.1);
226 const absl::Status status_low =
228 EXPECT_EQ(status_low.code(), absl::StatusCode::kInvalidArgument);
229 EXPECT_THAT(status_low.message(),
230 HasSubstr(
"primal_weight_update_smoothing"));
234 PrimalDualHybridGradientParams params;
235 params.set_initial_primal_weight(-1);
237 EXPECT_EQ(
status.code(), absl::StatusCode::kInvalidArgument);
238 EXPECT_THAT(
status.message(), HasSubstr(
"initial_primal_weight"));
242 PrimalDualHybridGradientParams params;
243 params.set_l_inf_ruiz_iterations(-1);
245 EXPECT_EQ(
status.code(), absl::StatusCode::kInvalidArgument);
246 EXPECT_THAT(
status.message(), HasSubstr(
"l_inf_ruiz_iterations"));
250 PrimalDualHybridGradientParams params_high;
251 params_high.set_sufficient_reduction_for_restart(1.0);
252 const absl::Status status_high =
254 EXPECT_EQ(status_high.code(), absl::StatusCode::kInvalidArgument);
255 EXPECT_THAT(status_high.message(),
256 HasSubstr(
"sufficient_reduction_for_restart"));
258 PrimalDualHybridGradientParams params_low;
259 params_low.set_sufficient_reduction_for_restart(0.0);
260 const absl::Status status_low =
262 EXPECT_EQ(status_low.code(), absl::StatusCode::kInvalidArgument);
263 EXPECT_THAT(status_low.message(),
264 HasSubstr(
"sufficient_reduction_for_restart"));
268 PrimalDualHybridGradientParams params_high;
269 params_high.set_necessary_reduction_for_restart(1.0);
270 const absl::Status status_high =
272 EXPECT_EQ(status_high.code(), absl::StatusCode::kInvalidArgument);
273 EXPECT_THAT(status_high.message(),
274 HasSubstr(
"necessary_reduction_for_restart"));
276 PrimalDualHybridGradientParams params_low;
277 params_low.set_sufficient_reduction_for_restart(0.5);
278 params_low.set_necessary_reduction_for_restart(0.4);
279 const absl::Status status_low =
281 EXPECT_EQ(status_low.code(), absl::StatusCode::kInvalidArgument);
282 EXPECT_THAT(status_low.message(),
283 HasSubstr(
"necessary_reduction_for_restart"));
287 PrimalDualHybridGradientParams params;
288 params.set_linesearch_rule(
289 PrimalDualHybridGradientParams::LINESEARCH_RULE_UNSPECIFIED);
291 EXPECT_EQ(
status.code(), absl::StatusCode::kInvalidArgument);
292 EXPECT_THAT(
status.message(), HasSubstr(
"linesearch_rule"));
296 PrimalDualHybridGradientParams params;
297 params.mutable_adaptive_linesearch_parameters()
298 ->set_step_size_reduction_exponent(-1);
300 EXPECT_EQ(
status.code(), absl::StatusCode::kInvalidArgument);
301 EXPECT_THAT(
status.message(), HasSubstr(
"step_size_reduction_exponent"));
305 PrimalDualHybridGradientParams params;
306 params.mutable_malitsky_pock_parameters()->set_linesearch_contraction_factor(
309 EXPECT_EQ(
status.code(), absl::StatusCode::kInvalidArgument);
310 EXPECT_THAT(
status.message(), HasSubstr(
"linesearch_contraction_factor"));
314 PrimalDualHybridGradientParams params;
315 params.set_initial_step_size_scaling(-1.0);
317 EXPECT_EQ(
status.code(), absl::StatusCode::kInvalidArgument);
318 EXPECT_THAT(
status.message(), HasSubstr(
"initial_step_size_scaling"));
322 BadInfiniteConstraintBoundThreshold) {
323 PrimalDualHybridGradientParams params;
324 params.set_infinite_constraint_bound_threshold(-1.0);
326 EXPECT_EQ(
status.code(), absl::StatusCode::kInvalidArgument);
327 EXPECT_THAT(
status.message(),
328 HasSubstr(
"infinite_constraint_bound_threshold"));
332 BadDiagonalTrustRegionSolverTolerance) {
333 PrimalDualHybridGradientParams params;
334 params.set_diagonal_qp_trust_region_solver_tolerance(-1.0);
336 EXPECT_EQ(
status.code(), absl::StatusCode::kInvalidArgument);
337 EXPECT_THAT(
status.message(),
338 HasSubstr(
"diagonal_qp_trust_region_solver_tolerance"));
absl::Status ValidateTerminationCriteria(const TerminationCriteria &criteria)
absl::Status ValidateMalitskyPockParams(const MalitskyPockParams ¶ms)
absl::Status ValidateAdaptiveLinesearchParams(const AdaptiveLinesearchParams ¶ms)
absl::Status ValidatePrimalDualHybridGradientParams(const PrimalDualHybridGradientParams ¶ms)
TEST(LinearAssignmentTest, NullMatrix)