57#ifndef ORTOOLS_MATH_OPT_SOLVERS_GSCIP_GSCIP_H_
58#define ORTOOLS_MATH_OPT_SOLVERS_GSCIP_GSCIP_H_
68#include "absl/base/thread_annotations.h"
69#include "absl/container/flat_hash_map.h"
70#include "absl/container/flat_hash_set.h"
71#include "absl/status/status.h"
72#include "absl/status/statusor.h"
73#include "absl/strings/string_view.h"
74#include "absl/synchronization/mutex.h"
75#include "absl/types/span.h"
82#include "scip/scip_prob.h"
83#include "scip/type_cons.h"
84#include "scip/type_scip.h"
85#include "scip/type_var.h"
122struct GScipIndicatorConstraint;
123struct GScipLogicalConstraintData;
125struct GScipQuadraticRange;
127struct GScipVariableOptions;
130struct GScipConstraintOptions;
170 std::atomic<bool> interrupted_{
false};
175 static absl::StatusOr<std::unique_ptr<GScip>>
Create(
176 const std::string& problem_name);
192 absl::StatusOr<GScipResult>
Solve(
193 const GScipParameters& params = GScipParameters(),
195 const Interrupter* interrupter =
nullptr);
213 double lb,
double ub,
double obj_coef,
GScipVarType var_type,
214 const std::string& var_name =
"",
225 const GScipLinearRange& range,
const std::string& name =
"",
235 double Lb(SCIP_VAR* var);
236 double Ub(SCIP_VAR* var);
240 absl::string_view
Name(SCIP_VAR* var);
241 const absl::flat_hash_set<SCIP_VAR*>&
variables() {
return variables_; }
244 absl::string_view
Name(SCIP_CONS* constraint);
246 const absl::flat_hash_set<SCIP_CONS*>&
constraints() {
return constraints_; }
260 absl::Status
SetLb(SCIP_VAR* var,
double lb);
264 absl::Status
SetUb(SCIP_VAR* var,
double ub);
265 absl::Status
SetObjCoef(SCIP_VAR* var,
double obj_coef);
286 absl::Status
SafeBulkDelete(
const absl::flat_hash_set<SCIP_VAR*>& vars);
314 const std::string& name =
"",
330 const std::string& name =
"",
339 const std::string& name =
"",
349 const GScipSOSData& sos_data,
const std::string& name =
"",
359 const GScipSOSData& sos_data,
const std::string& name =
"",
398 const std::string& parameter_name);
400 const std::string& parameter_name);
403 const std::string& parameter_name);
420 template <
typename ConsHandler,
typename ConsData>
422 ConsHandler* handler, ConsData* data,
const std::string& name =
"",
458 InterruptEventHandler();
460 SCIP_RETCODE Init(GScip* gscip)
override;
465 SCIP_RETCODE TryCallInterruptIfNeeded(GScip* gscip);
468 void set_interrupter(
const Interrupter* interrupter);
479 absl::Status CleanUp();
482 absl::Status FreeTransform();
485 absl::Status CheckScipFinite(
double d);
487 absl::Status MaybeKeepConstraintAlive(SCIP_CONS* constraint,
491 InterruptEventHandler interrupt_event_handler_;
492 absl::flat_hash_set<SCIP_VAR*> variables_;
493 absl::flat_hash_set<SCIP_CONS*> constraints_;
494 absl::Mutex callback_status_mutex_;
495 absl::Status callback_status_ ABSL_GUARDED_BY(callback_status_mutex_);
502struct GScipQuadraticRange {
504 double lower_bound = -std::numeric_limits<double>::infinity();
526 double upper_bound = std::numeric_limits<double>::infinity();
565 double upper_bound = std::numeric_limits<double>::infinity();
673template <
typename ConsHandler,
typename ConsData>
675 ConsHandler* handler, ConsData* data,
const std::string& name,
677 SCIP_CONS* constraint =
nullptr;
679 scip_, &constraint, name.data(), handler, data, options.
initial,
683 if (constraint ==
nullptr) {
684 return absl::InternalError(
"SCIP failed to create constraint");
#define RETURN_IF_ERROR(expr)
Interrupter(const Interrupter &)=delete
bool is_interrupted() const
Interrupter & operator=(const Interrupter &)=delete
absl::Status DeleteConstraint(SCIP_CONS *constraint)
static constexpr double kDefaultScipInf
absl::StatusOr< SCIP_CONS * > AddConstraintForHandler(ConsHandler *handler, ConsData *data, const std::string &name="", const GScipConstraintOptions &options=DefaultGScipConstraintOptions())
double LinearConstraintLb(SCIP_CONS *constraint)
double LinearConstraintUb(SCIP_CONS *constraint)
absl::Span< SCIP_VAR *const > LinearConstraintVariables(SCIP_CONS *constraint)
absl::Status SafeBulkDelete(const absl::flat_hash_set< SCIP_VAR * > &vars)
bool ObjectiveIsMaximize()
const absl::flat_hash_set< SCIP_CONS * > & constraints()
absl::Status SetVarType(SCIP_VAR *var, GScipVarType var_type)
absl::StatusOr< char > DefaultCharParamValue(const std::string ¶meter_name)
absl::Status DeleteVariable(SCIP_VAR *var)
absl::StatusOr< SCIP_CONS * > AddQuadraticConstraint(const GScipQuadraticRange &range, const std::string &name="", const GScipConstraintOptions &options=DefaultGScipConstraintOptions())
absl::Status SetObjCoef(SCIP_VAR *var, double obj_coef)
absl::StatusOr< GScipResult > Solve(const GScipParameters ¶ms=GScipParameters(), GScipMessageHandler message_handler=nullptr, const Interrupter *interrupter=nullptr)
bool IsConstraintLinear(SCIP_CONS *constraint)
void InterruptSolveFromCallbackOnCallbackError(absl::Status error_status)
double ScipInfUnclamp(double d)
absl::StatusOr< double > DefaultRealParamValue(const std::string ¶meter_name)
absl::Status AddLinearConstraintCoef(SCIP_CONS *constraint, SCIP_VAR *var, double value)
absl::StatusOr< SCIP_CONS * > AddAndConstraint(const GScipLogicalConstraintData &logical_data, const std::string &name="", const GScipConstraintOptions &options=DefaultGScipConstraintOptions())
absl::StatusOr< double > ScipInfClamp(double d)
absl::Status CanSafeBulkDelete(const absl::flat_hash_set< SCIP_VAR * > &vars)
absl::StatusOr< int > DefaultIntParamValue(const std::string ¶meter_name)
double ObjCoef(SCIP_VAR *var)
absl::StatusOr< SCIP_VAR * > AddVariable(double lb, double ub, double obj_coef, GScipVarType var_type, const std::string &var_name="", const GScipVariableOptions &options=DefaultGScipVariableOptions())
absl::StatusOr< SCIP_CONS * > AddSOS2Constraint(const GScipSOSData &sos_data, const std::string &name="", const GScipConstraintOptions &options=DefaultGScipConstraintOptions())
absl::StatusOr< SCIP_CONS * > AddSOS1Constraint(const GScipSOSData &sos_data, const std::string &name="", const GScipConstraintOptions &options=DefaultGScipConstraintOptions())
const absl::flat_hash_set< SCIP_VAR * > & variables()
absl::string_view ConstraintType(SCIP_CONS *constraint)
absl::Status SetObjectiveOffset(double offset)
absl::StatusOr< SCIP_CONS * > AddLinearConstraint(const GScipLinearRange &range, const std::string &name="", const GScipConstraintOptions &options=DefaultGScipConstraintOptions())
absl::Span< const double > LinearConstraintCoefficients(SCIP_CONS *constraint)
absl::Status SetLb(SCIP_VAR *var, double lb)
absl::StatusOr< SCIP_CONS * > AddOrConstraint(const GScipLogicalConstraintData &logical_data, const std::string &name="", const GScipConstraintOptions &options=DefaultGScipConstraintOptions())
absl::Status SetBranchingPriority(SCIP_VAR *var, int priority)
absl::string_view Name(SCIP_VAR *var)
absl::StatusOr< SCIP_CONS * > AddIndicatorConstraint(const GScipIndicatorConstraint &indicator_constraint, const std::string &name="", const GScipConstraintOptions &options=DefaultGScipConstraintOptions())
absl::StatusOr< bool > DefaultBoolParamValue(const std::string ¶meter_name)
absl::Status SetLinearConstraintUb(SCIP_CONS *constraint, double ub)
absl::StatusOr< GScipHintResult > SuggestHint(const GScipSolution &partial_solution)
absl::Status SetMaximize(bool is_maximize)
absl::Status SetUb(SCIP_VAR *var, double ub)
absl::Status SetLinearConstraintLb(SCIP_CONS *constraint, double lb)
GScipVarType VarType(SCIP_VAR *var)
absl::StatusOr< std::string > DefaultStringParamValue(const std::string ¶meter_name)
absl::StatusOr< int64_t > DefaultLongParamValue(const std::string ¶meter_name)
static absl::StatusOr< std::unique_ptr< GScip > > Create(const std::string &problem_name)
absl::Status SetLinearConstraintCoef(SCIP_CONS *constraint, SCIP_VAR *var, double value)
static std::string ScipVersion()
const GScipConstraintOptions & DefaultGScipConstraintOptions()
absl::flat_hash_map< SCIP_VAR *, int > GScipBranchingPriority
absl::flat_hash_map< SCIP_VAR *, double > GScipSolution
std::function< void(GScipMessageType type, absl::string_view message)> GScipMessageHandler
const GScipVariableOptions & DefaultGScipVariableOptions()
#define RETURN_IF_SCIP_ERROR(x)
SCIP_VAR * indicator_variable
std::vector< double > coefficients
std::vector< SCIP_VAR * > variables
std::vector< double > coefficients
std::vector< SCIP_VAR * > operators
std::vector< double > linear_coefficients
std::vector< SCIP_Var * > quadratic_variables2
*quadratic_variables2[i] std::vector< SCIP_Var * > quadratic_variables1
std::vector< SCIP_Var * > linear_variables
std::vector< double > quadratic_coefficients
std::vector< GScipSolution > solutions
absl::flat_hash_map< SCIP_VAR *, double > primal_ray
std::vector< double > objective_values
std::vector< double > weights
std::vector< SCIP_VAR * > variables