49 static absl::StatusOr<std::unique_ptr<XpressSolver>>
New(
54 absl::StatusOr<SolveResultProto>
Solve(
65 absl::StatusOr<ComputeInfeasibleSubsystemResultProto>
71 explicit XpressSolver(std::unique_ptr<Xpress> g_xpress);
74 using VarId = int64_t;
75 using AuxiliaryObjectiveId = int64_t;
76 using LinearConstraintId = int64_t;
77 using QuadraticConstraintId = int64_t;
78 using SecondOrderConeConstraintId = int64_t;
79 using Sos1ConstraintId = int64_t;
80 using Sos2ConstraintId = int64_t;
81 using IndicatorConstraintId = int64_t;
82 using AnyConstraintId = int64_t;
83 using XpressVariableIndex = int;
84 using XpressMultiObjectiveIndex = int;
85 using XpressLinearConstraintIndex = int;
86 using XpressQuadraticConstraintIndex = int;
87 using XpressSosConstraintIndex = int;
88 using XpressGeneralConstraintIndex = int;
89 using XpressAnyConstraintIndex = int;
91 static constexpr XpressVariableIndex kUnspecifiedIndex = -1;
92 static constexpr XpressAnyConstraintIndex kUnspecifiedConstraint = -2;
96 static bool isFinite(
double value) {
97 return value < kPlusInf && value > kMinusInf;
101 struct LinearConstraintData {
102 XpressLinearConstraintIndex constraint_index = kUnspecifiedConstraint;
103 double lower_bound = kMinusInf;
104 double upper_bound = kPlusInf;
107 absl::StatusOr<SolveResultProto> ExtractSolveResultProto(
110 absl::StatusOr<SolutionProto> GetSolution(
113 absl::StatusOr<SolveStatsProto> GetSolveStats(absl::Time start)
const;
115 absl::StatusOr<double> GetBestPrimalBound()
const;
116 absl::StatusOr<double> GetBestDualBound()
const;
118 absl::StatusOr<TerminationProto> ConvertTerminationReason(
119 double best_primal_bound,
double best_dual_bound)
const;
121 absl::StatusOr<SolutionProto> GetLpSolution(
124 bool isPrimalFeasible()
const;
125 bool isDualFeasible()
const;
127 absl::StatusOr<std::optional<BasisProto>> GetBasisIfAvailable(
130 absl::Status AddNewLinearConstraints(
132 absl::Status AddNewVariables(
const VariablesProto& new_variables);
136 absl::Status LoadModel(
const ModelProto& input_model);
145 template <
typename T>
146 void XpressVectorToSparseDoubleVector(
147 absl::Span<const double> xpress_values,
const T& map,
151 const std::unique_ptr<Xpress> xpress_;
159 linear_constraints_map_;
161 int get_model_index(XpressVariableIndex index)
const {
return index; }
162 int get_model_index(
const LinearConstraintData& index)
const {
163 return index.constraint_index;
167 absl::StatusOr<InvertedBounds> ListInvertedBounds()
const;
168 absl::Status SetXpressStartingBasis(
const BasisProto& basis);
171 bool is_mip_ =
false;
172 bool is_maximize_ =
false;
175 int primal_status = 0;
178 LpStatus xpress_lp_status_;
181 int xpress_mip_status_ = 0;
absl::StatusOr< SolveResultProto > Solve(const SolveParametersProto ¶meters, const ModelSolveParametersProto &model_parameters, MessageCallback message_cb, const CallbackRegistrationProto &callback_registration, Callback cb, const SolveInterrupter *interrupter) override
Solves the optimization problem.
absl::StatusOr< ComputeInfeasibleSubsystemResultProto > ComputeInfeasibleSubsystem(const SolveParametersProto ¶meters, MessageCallback message_cb, const SolveInterrupter *interrupter) override
Computes the infeasible subsystem (not implemented yet)