55 static absl::StatusOr<std::unique_ptr<GurobiSolver>>
New(
59 absl::StatusOr<SolveResultProto>
Solve(
66 absl::StatusOr<ComputeInfeasibleSubsystemResultProto>
72 struct GurobiCallbackData {
73 explicit GurobiCallbackData(
76 : callback_input(std::move(callback_input)),
77 local_interrupter(local_interrupter) {}
92 absl::Status status = absl::OkStatus();
95 explicit GurobiSolver(std::unique_ptr<Gurobi> g_gurobi);
98 using VariableId = int64_t;
99 using AuxiliaryObjectiveId = int64_t;
100 using LinearConstraintId = int64_t;
101 using QuadraticConstraintId = int64_t;
102 using SecondOrderConeConstraintId = int64_t;
103 using Sos1ConstraintId = int64_t;
104 using Sos2ConstraintId = int64_t;
105 using IndicatorConstraintId = int64_t;
106 using AnyConstraintId = int64_t;
107 using GurobiVariableIndex = int;
108 using GurobiMultiObjectiveIndex = int;
109 using GurobiLinearConstraintIndex = int;
110 using GurobiQuadraticConstraintIndex = int;
111 using GurobiSosConstraintIndex = int;
115 using GurobiGeneralConstraintIndex = int;
116 using GurobiAnyConstraintIndex = int;
118 static constexpr GurobiVariableIndex kUnspecifiedIndex = -1;
119 static constexpr GurobiAnyConstraintIndex kUnspecifiedConstraint = -2;
120 static constexpr double kInf = std::numeric_limits<double>::infinity();
122 struct GurobiModelElements {
123 std::vector<GurobiVariableIndex> variables;
124 std::vector<GurobiLinearConstraintIndex> linear_constraints;
125 std::vector<GurobiQuadraticConstraintIndex> quadratic_constraints;
126 std::vector<GurobiSosConstraintIndex> sos_constraints;
127 std::vector<GurobiGeneralConstraintIndex> general_constraints;
136 struct LinearConstraintData {
139 GurobiModelElements DependentElements()
const;
141 GurobiLinearConstraintIndex constraint_index = kUnspecifiedConstraint;
143 GurobiVariableIndex slack_index = kUnspecifiedIndex;
144 double lower_bound = -kInf;
145 double upper_bound = kInf;
148 struct SecondOrderConeConstraintData {
151 GurobiModelElements DependentElements()
const;
153 GurobiQuadraticConstraintIndex constraint_index = kUnspecifiedConstraint;
154 std::vector<GurobiVariableIndex> slack_variables;
155 std::vector<GurobiLinearConstraintIndex> slack_constraints;
158 struct SosConstraintData {
161 GurobiModelElements DependentElements()
const;
163 GurobiSosConstraintIndex constraint_index = kUnspecifiedConstraint;
164 std::vector<GurobiVariableIndex> slack_variables;
165 std::vector<GurobiLinearConstraintIndex> slack_constraints;
168 struct IndicatorConstraintData {
171 GurobiGeneralConstraintIndex constraint_index;
174 int64_t indicator_variable_id;
177 struct SolutionClaims {
178 bool primal_feasible_solution_exists;
179 bool dual_feasible_solution_exists;
182 struct SolutionsAndClaims {
183 std::vector<SolutionProto> solutions;
184 SolutionClaims solution_claims;
187 template <
typename SolutionType>
188 struct SolutionAndClaim {
189 std::optional<SolutionType>
solution;
190 bool feasible_solution_exists =
false;
195 absl::StatusOr<SolveResultProto> ExtractSolveResultProto(
198 SolutionClaims solution_claims,
200 absl::StatusOr<GurobiSolver::SolutionsAndClaims> GetSolutions(
202 absl::StatusOr<SolveStatsProto> GetSolveStats(absl::Time start)
const;
204 absl::StatusOr<double> GetGurobiBestDualBound()
const;
205 absl::StatusOr<double> GetBestDualBound(
206 absl::Span<const SolutionProto> solutions)
const;
207 absl::StatusOr<double> GetBestPrimalBound(
208 absl::Span<const SolutionProto> solutions)
const;
210 bool PrimalSolutionQualityAvailable()
const;
211 absl::StatusOr<double> GetPrimalSolutionQuality()
const;
214 absl::StatusOr<bool> AnyElementInIIS(
const GurobiModelElements& grb_elements);
216 absl::StatusOr<std::optional<ModelSubsetProto::Bounds>> VariableBoundsInIIS(
217 GurobiVariableIndex grb_index);
219 absl::StatusOr<bool> VariableInIIS(GurobiVariableIndex grb_index);
220 absl::StatusOr<std::optional<ModelSubsetProto::Bounds>> LinearConstraintInIIS(
221 const LinearConstraintData& grb_data);
222 absl::StatusOr<std::optional<ModelSubsetProto::Bounds>>
223 QuadraticConstraintInIIS(GurobiQuadraticConstraintIndex grb_index);
228 absl::StatusOr<ComputeInfeasibleSubsystemResultProto>
229 ExtractComputeInfeasibleSubsystemResultProto(
bool proven_infeasible);
232 absl::StatusOr<bool> IsMaximize()
const;
234 absl::StatusOr<TerminationProto> ConvertTerminationReason(
235 int gurobi_status, SolutionClaims solution_claims,
236 double best_primal_bound,
double best_dual_bound);
240 absl::StatusOr<SolutionsAndClaims> GetLpSolution(
244 absl::StatusOr<SolutionsAndClaims> GetQpSolution(
248 absl::StatusOr<SolutionsAndClaims> GetQcpSolution(
253 absl::StatusOr<SolutionsAndClaims> GetMipSolutions(
257 absl::StatusOr<SolutionAndClaim<PrimalSolutionProto>>
258 GetConvexPrimalSolutionIfAvailable(
260 absl::StatusOr<SolutionAndClaim<DualSolutionProto>>
261 GetConvexDualSolutionIfAvailable(
263 absl::StatusOr<std::optional<BasisProto>> GetBasisIfAvailable();
265 absl::Status SetParameters(
268 absl::Status AddNewLinearConstraints(
270 absl::Status AddNewQuadraticConstraints(
271 const google::protobuf::Map<QuadraticConstraintId,
273 absl::Status AddNewSecondOrderConeConstraints(
274 const google::protobuf::Map<SecondOrderConeConstraintId,
276 absl::Status AddNewSosConstraints(
277 const google::protobuf::Map<AnyConstraintId, SosConstraintProto>&
280 absl::flat_hash_map<int64_t, SosConstraintData>& constraints_map);
281 absl::Status AddNewIndicatorConstraints(
282 const google::protobuf::Map<IndicatorConstraintId,
284 absl::Status AddNewVariables(
const VariablesProto& new_variables);
286 absl::Status AddMultiObjectives(
288 const google::protobuf::Map<int64_t, ObjectiveProto>&
289 auxiliary_objectives);
295 absl::Status AddNewMultiObjective(
297 std::optional<AuxiliaryObjectiveId> objective_id,
bool is_maximize);
298 absl::Status AddNewSlacks(
299 const std::vector<LinearConstraintData*>& new_slacks);
302 absl::Status ResetQuadraticObjectiveTerms(
306 absl::Status UpdateQuadraticObjectiveTerms(
308 absl::Status LoadModel(
const ModelProto& input_model);
310 absl::Status UpdateDoubleListAttribute(
312 const char* absl_nonnull attribute_name,
const IdHashMap& id_hash_map);
314 const char* absl_nonnull attribute_name,
315 const IdHashMap& id_hash_map);
317 struct DeletedIndices {
318 std::vector<GurobiVariableIndex> variables;
319 std::vector<GurobiLinearConstraintIndex> linear_constraints;
320 std::vector<GurobiQuadraticConstraintIndex> quadratic_constraints;
321 std::vector<GurobiSosConstraintIndex> sos_constraints;
322 std::vector<GurobiGeneralConstraintIndex> general_constraints;
325 void UpdateGurobiIndices(
const DeletedIndices& deleted_indices);
326 absl::Status UpdateLinearConstraints(
328 std::vector<GurobiVariableIndex>& deleted_variables_index);
330 int get_model_index(GurobiVariableIndex index)
const {
return index; }
331 int get_model_index(
const LinearConstraintData& index)
const {
332 return index.constraint_index;
339 template <
typename T>
340 void GurobiVectorToSparseDoubleVector(
341 absl::Span<const double> gurobi_values,
const T& map,
344 absl::StatusOr<BasisProto> GetGurobiBasis();
345 absl::Status SetGurobiBasis(
const BasisProto& basis);
346 absl::StatusOr<DualRayProto> GetGurobiDualRay(
350 absl::StatusOr<bool> IsMIP()
const;
352 absl::StatusOr<bool> IsQP()
const;
354 absl::StatusOr<bool> IsQCP()
const;
356 absl::StatusOr<std::unique_ptr<GurobiCallbackData>> RegisterCallback(
362 absl::StatusOr<InvertedBounds> ListInvertedBounds()
const;
366 bool is_multi_objective_mode()
const;
370 absl::StatusOr<InvalidIndicators> ListInvalidIndicators()
const;
372 struct VariableEqualToExpression {
373 GurobiVariableIndex variable_index;
374 GurobiLinearConstraintIndex constraint_index;
379 std::optional<VariableId> TryExtractVariable(
388 absl::StatusOr<VariableEqualToExpression>
392 absl::Status SetMultiObjectiveParameters(
395 absl::Status ResetModelParameters(
398 const std::unique_ptr<Gurobi> gurobi_;
411 absl::flat_hash_map<std::optional<AuxiliaryObjectiveId>,
412 GurobiMultiObjectiveIndex>
413 multi_objectives_map_;
417 linear_constraints_map_;
420 absl::flat_hash_map<QuadraticConstraintId, GurobiQuadraticConstraintIndex>
421 quadratic_constraints_map_;
424 absl::flat_hash_map<SecondOrderConeConstraintId,
425 SecondOrderConeConstraintData>
426 soc_constraints_map_;
429 absl::flat_hash_map<Sos1ConstraintId, SosConstraintData>
430 sos1_constraints_map_;
433 absl::flat_hash_map<Sos2ConstraintId, SosConstraintData>
434 sos2_constraints_map_;
439 absl::flat_hash_map<IndicatorConstraintId,
440 std::optional<IndicatorConstraintData>>
441 indicator_constraints_map_;
448 int num_gurobi_variables_ = 0;
450 int num_gurobi_lin_cons_ = 0;
452 int num_gurobi_quad_cons_ = 0;
454 int num_gurobi_sos_cons_ = 0;
456 int num_gurobi_gen_cons_ = 0;
463 absl::flat_hash_map<std::pair<VariableId, VariableId>,
double>
464 quadratic_objective_coefficients_;
470 absl::flat_hash_set<VariableId> undeletable_variables_;
472 static constexpr int kGrbBasicConstraint = 0;
473 static constexpr int kGrbNonBasicConstraint = -1;