14 #ifndef OR_TOOLS_MATH_OPT_SOLVERS_GSCIP_SOLVER_H_
15 #define OR_TOOLS_MATH_OPT_SOLVERS_GSCIP_SOLVER_H_
23 #include "absl/container/flat_hash_map.h"
24 #include "absl/container/flat_hash_set.h"
25 #include "absl/status/status.h"
26 #include "absl/status/statusor.h"
27 #include "absl/types/span.h"
28 #include "google/protobuf/map.h"
31 #include "ortools/gscip/gscip.pb.h"
33 #include "ortools/math_opt/callback.pb.h"
38 #include "ortools/math_opt/model.pb.h"
39 #include "ortools/math_opt/model_parameters.pb.h"
40 #include "ortools/math_opt/model_update.pb.h"
41 #include "ortools/math_opt/parameters.pb.h"
42 #include "ortools/math_opt/result.pb.h"
43 #include "ortools/math_opt/sparse_containers.pb.h"
44 #include "scip/type_cons.h"
45 #include "scip/type_var.h"
52 static absl::StatusOr<std::unique_ptr<SolverInterface>>
New(
55 absl::StatusOr<SolveResultProto>
Solve(
57 const ModelSolveParametersProto& model_parameters,
59 const CallbackRegistrationProto& callback_registration,
Callback cb,
61 absl::StatusOr<bool>
Update(
const ModelUpdateProto& model_update)
override;
66 const SolveParametersProto& solve_parameters);
75 struct AuxiliaryStructureHandler {
79 absl::Status DeleteStructure(
GScip& gscip);
81 std::vector<SCIP_VAR*> variables;
82 std::vector<SCIP_CONS*> constraints;
107 InterruptEventHandler();
109 SCIP_RETCODE Init(
GScip* gscip)
override;
114 SCIP_RETCODE TryCallInterruptIfNeeded(
GScip* gscip);
122 explicit GScipSolver(std::unique_ptr<GScip> gscip);
125 absl::Status AddVariables(
const VariablesProto& variables,
126 const absl::flat_hash_map<int64_t, double>&
127 linear_objective_coefficients);
131 absl::StatusOr<bool> UpdateVariables(
132 const VariableUpdatesProto& variable_updates);
134 absl::Status AddQuadraticObjectiveTerms(
135 const SparseDoubleMatrixProto& new_qp_terms,
bool maximize);
138 absl::Status AddLinearConstraints(
139 const LinearConstraintsProto& linear_constraints,
140 const SparseDoubleMatrixProto& linear_constraint_matrix);
144 absl::Status UpdateLinearConstraints(
145 const LinearConstraintUpdatesProto linear_constraint_updates,
146 const SparseDoubleMatrixProto& linear_constraint_matrix,
147 std::optional<int64_t> first_new_var_id,
148 std::optional<int64_t> first_new_cstr_id);
150 absl::Status AddQuadraticConstraints(
151 const google::protobuf::Map<int64_t, QuadraticConstraintProto>&
152 quadratic_constraints);
154 absl::Status AddIndicatorConstraints(
155 const google::protobuf::Map<int64_t, IndicatorConstraintProto>&
156 indicator_constraints);
161 absl::StatusOr<std::pair<SCIP_VAR*, SCIP_CONS*>>
162 AddSlackVariableEqualToExpression(
const LinearExpressionProto& expression);
168 absl::StatusOr<std::pair<GScipSOSData, AuxiliaryStructureHandler>>
169 ProcessSosProto(
const SosConstraintProto& sos_constraint);
171 absl::Status AddSos1Constraints(
172 const google::protobuf::Map<int64_t, SosConstraintProto>&
174 absl::Status AddSos2Constraints(
175 const google::protobuf::Map<int64_t, SosConstraintProto>&
178 absl::flat_hash_set<SCIP_VAR*> LookupAllVariables(
180 absl::StatusOr<SolveResultProto> CreateSolveResultProto(
182 const ModelSolveParametersProto& model_parameters,
183 std::optional<double> cutoff);
191 const std::unique_ptr<GScip> gscip_;
192 InterruptEventHandler interrupt_event_handler_;
193 absl::flat_hash_map<int64_t, SCIP_VAR*> variables_;
194 bool has_quadratic_objective_ =
false;
195 absl::flat_hash_map<int64_t, SCIP_CONS*> linear_constraints_;
196 absl::flat_hash_map<int64_t, SCIP_CONS*> quadratic_constraints_;
200 absl::flat_hash_map<int64_t, std::optional<std::pair<SCIP_CONS*, int64_t>>>
201 indicator_constraints_;
202 absl::flat_hash_map<int64_t, std::pair<SCIP_CONS*, AuxiliaryStructureHandler>>
204 absl::flat_hash_map<int64_t, std::pair<SCIP_CONS*, AuxiliaryStructureHandler>>
absl::StatusOr< bool > Update(const ModelUpdateProto &model_update) override
static absl::StatusOr< std::unique_ptr< SolverInterface > > New(const ModelProto &model, const InitArgs &init_args)
absl::StatusOr< SolveResultProto > Solve(const SolveParametersProto ¶meters, const ModelSolveParametersProto &model_parameters, MessageCallback message_cb, const CallbackRegistrationProto &callback_registration, Callback cb, SolveInterrupter *interrupter) override
static absl::StatusOr< GScipParameters > MergeParameters(const SolveParametersProto &solve_parameters)
std::function< void(const std::vector< std::string > &)> MessageCallback
std::function< absl::StatusOr< CallbackResultProto >(const CallbackDataProto &)> Callback
absl::Span< const int64_t > variable_ids
Collection of objects used to extend the Constraint Solver library.