21#include "absl/log/check.h"
22#include "absl/status/statusor.h"
23#include "gtest/gtest.h"
25#include "ortools/math_opt/solution.pb.h"
30constexpr double kInf = std::numeric_limits<double>::infinity();
39 const bool is_maximize,
const bool starting_basis_max_opt) {
40 model_.set_is_maximize(is_maximize);
44 .model_parameters = {.initial_basis = starting_basis_max_opt
48 CHECK_OK(result.termination.EnsureIsOptimal());
49 return result.solve_stats;
54 const std::unique_ptr<IncrementalSolver> solver =
56 const SolveResult max_result = solver->Solve({.parameters =
params_}).value();
57 CHECK_OK(max_result.termination.EnsureIsOptimal());
59 max_model_parameters.
initial_basis = max_result.solutions[0].basis;
60 const SolveResult min_result = solver->Solve({.parameters =
params_}).value();
61 CHECK_OK(min_result.termination.EnsureIsOptimal());
64 const SolveResult max_result_second =
67 {.parameters =
params_, .model_parameters = max_model_parameters})
69 CHECK_OK(max_result_second.termination.EnsureIsOptimal());
70 return max_result_second.solve_stats;
181 LinearConstraint c1 =
183 LinearConstraint c2 =
185 LinearConstraint c3 =
187 LinearConstraint c4 =
248 LinearConstraint c1 =
250 LinearConstraint c2 =
300 Variable x1 =
model_.AddContinuousVariable(0, 1,
"x1_basic_ranged");
301 Variable x2 =
model_.AddContinuousVariable(0, 1,
"x2_basic_ranged");
302 LinearConstraint c1 =
303 model_.AddLinearConstraint(-1 <= x1 + x2 <= 3,
"c1_basic_ranged");
341 Variable x1 =
model_.AddContinuousVariable(-
kInf,
kInf,
"x1_unbounded");
342 Variable x2 =
model_.AddContinuousVariable(-
kInf,
kInf,
"x2_unbounded");
343 Variable x3 =
model_.AddContinuousVariable(-
kInf,
kInf,
"x3_unbounded");
344 LinearConstraint c1 =
345 model_.AddLinearConstraint(-
kInf <= x1 + x2 <=
kInf,
"c1_unbounded");
346 LinearConstraint c2 =
347 model_.AddLinearConstraint(-
kInf <= x2 + x3 <=
kInf,
"c2_unbounded");
385 Variable x1 =
model_.AddContinuousVariable(0, 0,
"x1_fixed_variable");
386 Variable x2 =
model_.AddContinuousVariable(0, 0,
"x2_fixed_variable");
387 Variable x3 =
model_.AddContinuousVariable(0, 0,
"x3_fixed_variable");
427 Variable x1 =
model_.AddContinuousVariable(-1, 1,
"x1_equality");
428 Variable x2 =
model_.AddContinuousVariable(-1, 1,
"x2_equality");
429 Variable x3 =
model_.AddContinuousVariable(-1, 1,
"x3_equality");
430 LinearConstraint c1 =
model_.AddLinearConstraint(x1 + x2 == 0,
"c1_equality");
431 LinearConstraint c2 =
model_.AddLinearConstraint(x2 + x3 == 0,
"c2_equality");
432 LinearConstraint c3 =
model_.AddLinearConstraint(x3 + x1 == 0,
"c3_equality");
433 LinearConstraint c4 =
434 model_.AddLinearConstraint(x1 + x2 + x3 == 0,
"c4_equality");
457 model_.Maximize(objective_expression_);
460 EXPECT_EQ(stats.simplex_iterations, 0);
468 EXPECT_EQ(stats.simplex_iterations, 0);
480 const int basis_distance = SetUpVariableBoundBoxModel();
483 EXPECT_EQ(stats.simplex_iterations, basis_distance);
487 const int basis_distance = SetUpConstraintBoxModel();
490 EXPECT_EQ(stats.simplex_iterations, basis_distance);
494 const int basis_distance = SetUpRangedConstraintBoxModel();
497 EXPECT_EQ(stats.simplex_iterations, basis_distance);
501 const int basis_distance = SetUpBasicRangedConstraintModel();
504 EXPECT_EQ(stats.simplex_iterations, basis_distance);
510 int basis_distance = SetUpVariableBoundBoxModel();
511 basis_distance += SetUpUnboundedVariablesAndConstraintsModel();
514 EXPECT_EQ(stats.simplex_iterations, basis_distance);
520 int basis_distance = SetUpVariableBoundBoxModel();
521 basis_distance += SetUpFixedVariablesModel();
524 EXPECT_EQ(stats.simplex_iterations, basis_distance);
530 int basis_distance = SetUpVariableBoundBoxModel();
531 basis_distance += SetUpEqualitiesModel();
534 EXPECT_EQ(stats.simplex_iterations, basis_distance);
540 int basis_distance = SetUpVariableBoundBoxModel();
541 basis_distance += SetUpConstraintBoxModel();
542 basis_distance += SetUpRangedConstraintBoxModel();
543 basis_distance += SetUpBasicRangedConstraintModel();
544 basis_distance += SetUpUnboundedVariablesAndConstraintsModel();
545 basis_distance += SetUpFixedVariablesModel();
546 basis_distance += SetUpEqualitiesModel();
549 EXPECT_EQ(stats.simplex_iterations, basis_distance);
571 SetUpVariableBoundBoxModel();
573 EXPECT_EQ(stats.simplex_iterations, 0);
577 SetUpConstraintBoxModel();
579 EXPECT_EQ(stats.simplex_iterations, 0);
583 SetUpRangedConstraintBoxModel();
585 EXPECT_EQ(stats.simplex_iterations, 0);
589 SetUpBasicRangedConstraintModel();
591 EXPECT_EQ(stats.simplex_iterations, 0);
595 UnboundedVariablesAndConstraintsModelOptimalRoundtrip) {
598 SetUpVariableBoundBoxModel();
599 SetUpUnboundedVariablesAndConstraintsModel();
601 EXPECT_EQ(stats.simplex_iterations, 0);
607 SetUpVariableBoundBoxModel();
608 SetUpFixedVariablesModel();
610 EXPECT_EQ(stats.simplex_iterations, 0);
616 SetUpVariableBoundBoxModel();
617 SetUpEqualitiesModel();
619 EXPECT_EQ(stats.simplex_iterations, 0);
625 SetUpVariableBoundBoxModel();
626 SetUpConstraintBoxModel();
627 SetUpRangedConstraintBoxModel();
628 SetUpBasicRangedConstraintModel();
629 SetUpUnboundedVariablesAndConstraintsModel();
630 SetUpFixedVariablesModel();
631 SetUpEqualitiesModel();
633 EXPECT_EQ(stats.simplex_iterations, 0);
SolverType TestedSolver() const
SolveStats SolveWithWarmStart(bool is_maximize, bool starting_basis_max_opt)
int SetUpConstraintBoxModel()
SolveStats RoundTripSolve()
int SetUpFixedVariablesModel()
LinearExpression objective_expression_
int SetUpEqualitiesModel()
int SetUpVariableBoundBoxModel()
const SolveParameters params_
int SetUpBasicRangedConstraintModel()
int SetUpRangedConstraintBoxModel()
int SetUpUnboundedVariablesAndConstraintsModel()
Variable AddContinuousVariable(double lower_bound, double upper_bound, absl::string_view name="")
Adds a variable to the model with domain [lower_bound, upper_bound].
LinearConstraint AddLinearConstraint(absl::string_view name="")
Adds a linear constraint to the model with bounds [-inf, +inf].
An object oriented wrapper for quadratic constraints in ModelStorage.
TEST_P(InfeasibleSubsystemTest, CanComputeInfeasibleSubsystem)
absl::StatusOr< SolveResult > Solve(const Model &model, const SolverType solver_type, const SolveArguments &solve_args, const SolverInitArguments &init_args)
absl::StatusOr< std::unique_ptr< IncrementalSolver > > NewIncrementalSolver(Model *model, SolverType solver_type, SolverInitArguments arguments)
@ kFixedValue
The variable/constraint has identical finite lower and upper bounds.
@ kBasic
The variable/constraint is basic.
@ kFree
The variable/constraint is free (it has no finite bounds).
@ kAtLowerBound
The variable/constraint is at its lower bound (which must be finite).
@ kAtUpperBound
The variable/constraint is at its upper bound (which must be finite).
In SWIG mode, we don't want anything besides these top-level includes.
LinearConstraintMap< BasisStatus > constraint_status
VariableMap< BasisStatus > variable_status
std::optional< Basis > initial_basis