49 static absl::StatusOr<std::unique_ptr<XpressSolver>>
New(
50 const ModelProto& input_model,
54 absl::StatusOr<SolveResultProto>
Solve(
55 const SolveParametersProto& parameters,
56 const ModelSolveParametersProto& model_parameters,
58 const CallbackRegistrationProto& callback_registration,
Callback cb,
62 absl::StatusOr<bool>
Update(
const ModelUpdateProto& model_update)
override;
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(
108 absl::Time start,
const ModelSolveParametersProto& model_parameters,
109 const SolveParametersProto& solve_parameters);
110 absl::StatusOr<SolutionProto> GetSolution(
111 const ModelSolveParametersProto& model_parameters,
112 const SolveParametersProto& solve_parameters);
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(
122 const ModelSolveParametersProto& model_parameters,
123 const SolveParametersProto& solve_parameters);
124 bool isPrimalFeasible()
const;
125 bool isDualFeasible()
const;
127 absl::StatusOr<std::optional<BasisProto>> GetBasisIfAvailable(
128 const SolveParametersProto& parameters);
130 absl::Status AddNewLinearConstraints(
const LinearConstraintsProto& cts);
131 absl::Status AddNewVariables(
const VariablesProto& new_variables);
132 absl::Status AddSingleObjective(
const ObjectiveProto& objective);
133 absl::Status ChangeCoefficients(
const SparseDoubleMatrixProto& matrix);
135 absl::Status LoadModel(
const ModelProto& input_model);
137 std::string GetLpOptimizationFlags(
const SolveParametersProto& parameters);
138 absl::Status CallXpressSolve(
const SolveParametersProto& parameters);
144 template <
typename T>
145 void XpressVectorToSparseDoubleVector(
146 absl::Span<const double> xpress_values,
const T& map,
147 SparseDoubleVectorProto& result,
148 const SparseVectorFilterProto& filter)
const;
150 const std::unique_ptr<Xpress> xpress_;
158 linear_constraints_map_;
160 int get_model_index(XpressVariableIndex index)
const {
return index; }
161 int get_model_index(
const LinearConstraintData& index)
const {
162 return index.constraint_index;
164 SolutionStatusProto getLpSolutionStatus()
const;
165 SolutionStatusProto getDualSolutionStatus()
const;
166 absl::StatusOr<InvertedBounds> ListInvertedBounds()
const;
167 absl::Status SetXpressStartingBasis(
const BasisProto& basis);
168 absl::Status SetLpIterLimits(
const SolveParametersProto& parameters);
170 bool is_mip_ =
false;
171 bool is_maximize_ =
false;
174 int primal_status = 0;
177 LpStatus xpress_lp_status_;
178 LPAlgorithmProto lp_algorithm_ = LP_ALGORITHM_UNSPECIFIED;
180 int xpress_mip_status_ = 0;