27#include "absl/container/flat_hash_map.h"
28#include "absl/container/flat_hash_set.h"
29#include "absl/memory/memory.h"
30#include "absl/status/status.h"
31#include "absl/status/statusor.h"
32#include "absl/strings/str_cat.h"
33#include "absl/strings/str_format.h"
34#include "absl/strings/string_view.h"
35#include "absl/types/span.h"
43#include "scip/cons_linear.h"
44#include "scip/cons_quadratic.h"
46#include "scip/scip_general.h"
47#include "scip/scip_param.h"
48#include "scip/scip_prob.h"
49#include "scip/scip_solvingstats.h"
50#include "scip/scipdefplugins.h"
51#include "scip/type_cons.h"
52#include "scip/type_scip.h"
53#include "scip/type_var.h"
57#define RETURN_ERROR_UNLESS(x) \
59 return util::StatusBuilder(absl::InvalidArgumentError(absl::StrFormat( \
60 "Condition violated at %s:%d: %s", __FILE__, __LINE__, #x)))
64constexpr absl::string_view kLinearConstraintHandlerName =
"linear";
66SCIP_VARTYPE ConvertVarType(
const GScipVarType var_type) {
69 return SCIP_VARTYPE_CONTINUOUS;
71 return SCIP_VARTYPE_IMPLINT;
73 return SCIP_VARTYPE_INTEGER;
77GScipVarType ConvertVarType(
const SCIP_VARTYPE var_type) {
79 case SCIP_VARTYPE_CONTINUOUS:
81 case SCIP_VARTYPE_IMPLINT:
83 case SCIP_VARTYPE_INTEGER:
84 case SCIP_VARTYPE_BINARY:
90 switch (scip_status) {
91 case SCIP_STATUS_UNKNOWN:
93 case SCIP_STATUS_USERINTERRUPT:
95 case SCIP_STATUS_BESTSOLLIMIT:
97 case SCIP_STATUS_MEMLIMIT:
99 case SCIP_STATUS_NODELIMIT:
101 case SCIP_STATUS_RESTARTLIMIT:
103 case SCIP_STATUS_SOLLIMIT:
105 case SCIP_STATUS_STALLNODELIMIT:
107 case SCIP_STATUS_TIMELIMIT:
109 case SCIP_STATUS_TOTALNODELIMIT:
111 case SCIP_STATUS_OPTIMAL:
113 case SCIP_STATUS_GAPLIMIT:
115 case SCIP_STATUS_INFEASIBLE:
117 case SCIP_STATUS_UNBOUNDED:
119 case SCIP_STATUS_INFORUNBD:
121 case SCIP_STATUS_TERMINATE:
124 LOG(
FATAL) <<
"Unrecognized scip status: " << scip_status;
128SCIP_PARAMEMPHASIS ConvertEmphasis(
130 switch (gscip_emphasis) {
132 return SCIP_PARAMEMPHASIS_DEFAULT;
134 return SCIP_PARAMEMPHASIS_CPSOLVER;
136 return SCIP_PARAMEMPHASIS_EASYCIP;
138 return SCIP_PARAMEMPHASIS_FEASIBILITY;
140 return SCIP_PARAMEMPHASIS_HARDLP;
142 return SCIP_PARAMEMPHASIS_OPTIMALITY;
144 return SCIP_PARAMEMPHASIS_COUNTER;
146 return SCIP_PARAMEMPHASIS_PHASEFEAS;
148 return SCIP_PARAMEMPHASIS_PHASEIMPROVE;
150 return SCIP_PARAMEMPHASIS_PHASEPROOF;
152 LOG(
FATAL) <<
"Unrecognized gscip_emphasis: "
157SCIP_PARAMSETTING ConvertMetaParamValue(
159 switch (gscip_meta_param_value) {
161 return SCIP_PARAMSETTING_DEFAULT;
163 return SCIP_PARAMSETTING_AGGRESSIVE;
165 return SCIP_PARAMSETTING_FAST;
167 return SCIP_PARAMSETTING_OFF;
169 LOG(
FATAL) <<
"Unrecognized gscip_meta_param_value: "
174absl::Status CheckSolutionsInOrder(
const GScipResult& result,
175 const bool is_maximize) {
176 auto objective_as_good_as = [is_maximize](
double left,
double right) {
178 return left >= right;
180 return left <= right;
182 for (
int i = 1; i < result.objective_values.size(); ++i) {
183 const double previous = result.objective_values[i - 1];
184 const double current = result.objective_values[i];
185 if (!objective_as_good_as(previous, current)) {
187 <<
"Expected SCIP solutions to be in best objective order "
189 << (is_maximize ?
"maximization" :
"minimization")
190 <<
" problem, the " << i - 1 <<
" objective is " << previous
191 <<
" and the " << i <<
" objective is " << current;
194 return absl::OkStatus();
206 return constraint_options;
209absl::Status GScip::SetParams(
const GScipParameters& params,
210 const std::string& legacy_params) {
211 if (params.has_silence_output()) {
212 SCIPsetMessagehdlrQuiet(scip_, params.silence_output());
214 if (!params.search_logs_filename().empty()) {
215 SCIPsetMessagehdlrLogfile(scip_, params.search_logs_filename().c_str());
218 const SCIP_Bool set_param_quiet =
219 static_cast<SCIP_Bool
>(!params.silence_output());
222 scip_, ConvertEmphasis(params.emphasis()), set_param_quiet));
223 if (params.has_heuristics()) {
225 scip_, ConvertMetaParamValue(params.heuristics()), set_param_quiet));
227 if (params.has_presolve()) {
229 scip_, ConvertMetaParamValue(params.presolve()), set_param_quiet));
231 if (params.has_separating()) {
233 scip_, ConvertMetaParamValue(params.separating()), set_param_quiet));
235 for (
const auto& bool_param : params.bool_params()) {
237 (SCIPsetBoolParam(scip_, bool_param.first.c_str(), bool_param.second)));
239 for (
const auto& int_param : params.int_params()) {
241 (SCIPsetIntParam(scip_, int_param.first.c_str(), int_param.second)));
243 for (
const auto& long_param : params.long_params()) {
245 long_param.second)));
247 for (
const auto& char_param : params.char_params()) {
248 if (char_param.second.size() != 1) {
249 return absl::InvalidArgumentError(
250 absl::StrCat(
"Character parameters must be single character strings, "
252 char_param.first,
" was: ", char_param.second));
255 char_param.second[0])));
257 for (
const auto& string_param : params.string_params()) {
259 string_param.second.c_str())));
261 for (
const auto& real_param : params.real_params()) {
263 (SCIPsetRealParam(scip_, real_param.first.c_str(), real_param.second)));
265 if (!legacy_params.empty()) {
269 return absl::OkStatus();
273 const std::string& problem_name) {
274 SCIP*
scip =
nullptr;
279 return absl::WrapUnique(
new GScip(
scip));
282GScip::GScip(SCIP* scip) : scip_(scip) {}
286absl::Status GScip::FreeTransform() {
291 return absl::StrFormat(
"SCIP %d.%d.%d [LP solver: %s]", SCIPmajorVersion(),
292 SCIPminorVersion(), SCIPtechVersion(),
297 if (scip_ ==
nullptr) {
300 return SCIPinterruptSolve(scip_) == SCIP_OKAY;
303absl::Status GScip::CleanUp() {
304 if (scip_ !=
nullptr) {
305 for (SCIP_VAR* variable : variables_) {
306 if (variable !=
nullptr) {
310 for (SCIP_CONS* constraint : constraints_) {
311 if (constraint !=
nullptr) {
317 return absl::OkStatus();
321 const absl::Status clean_up_status = CleanUp();
322 LOG_IF(DFATAL, !clean_up_status.ok()) << clean_up_status;
326 double lb,
double ub,
double obj_coef,
GScipVarType var_type,
328 SCIP_VAR*
var =
nullptr;
329 lb = ScipInfClamp(lb);
330 ub = ScipInfClamp(ub);
335 ConvertVarType(var_type)));
340 variables_.insert(
var);
347absl::Status GScip::MaybeKeepConstraintAlive(
350 constraints_.insert(constraint);
354 return absl::OkStatus();
360 SCIP_CONS* constraint =
nullptr;
362 <<
"Error adding constraint: " <<
name <<
".";
365 const_cast<SCIP_VAR**
>(range.
variables.data()),
386 SCIP_CONS* constraint =
nullptr;
389 <<
"Error adding quadratic constraint: " <<
name <<
" in linear term.";
392 <<
"Error adding quadratic constraint: " <<
name <<
" in quadratic term.";
394 <<
"Error adding quadratic constraint: " <<
name <<
" in quadratic term.";
396 scip_, &constraint,
name.c_str(), num_lin_vars,
422 <<
"Error adding indicator constraint: " <<
name <<
".";
427 SCIP_CONS* constraint =
nullptr;
430 <<
"Error adding indicator constraint: " <<
name <<
".";
432 scip_, &constraint,
name.c_str(), indicator,
434 const_cast<SCIP_Var**
>(indicator_constraint.
variables.data()),
435 const_cast<double*
>(indicator_constraint.
coefficients.data()),
455 <<
"Error adding and constraint: " <<
name <<
".";
456 SCIP_CONS* constraint =
nullptr;
458 SCIPcreateConsAnd(scip_, &constraint,
name.c_str(),
460 const_cast<SCIP_VAR**
>(logical_data.
operators.data()),
480 <<
"Error adding or constraint: " <<
name <<
".";
481 SCIP_CONS* constraint =
nullptr;
483 SCIPcreateConsOr(scip_, &constraint,
name.c_str(), logical_data.
resultant,
485 const_cast<SCIP_Var**
>(logical_data.
operators.data()),
503absl::Status ValidateSOSData(
const GScipSOSData& sos_data,
504 const std::string&
name) {
506 <<
"Error adding SOS constraint: " <<
name <<
".";
507 if (!sos_data.
weights.empty()) {
509 <<
" Error adding SOS constraint: " <<
name <<
".";
511 absl::flat_hash_set<double> distinct_weights;
512 for (
const double w : sos_data.
weights) {
514 <<
"Error adding SOS constraint: " <<
name
515 <<
", weights must be distinct, but found value " << w <<
" twice.";
516 distinct_weights.insert(w);
518 return absl::OkStatus();
527 SCIP_CONS* constraint =
nullptr;
528 double* weights =
nullptr;
529 if (!sos_data.
weights.empty()) {
530 weights =
const_cast<double*
>(sos_data.
weights.data());
535 const_cast<SCIP_Var**
>(sos_data.
variables.data()), weights,
554 SCIP_CONS* constraint =
nullptr;
555 double* weights =
nullptr;
556 if (!sos_data.
weights.empty()) {
557 weights =
const_cast<double*
>(sos_data.
weights.data());
561 const_cast<SCIP_Var**
>(sos_data.
variables.data()), weights,
578 scip_, is_maximize ? SCIP_OBJSENSE_MAXIMIZE : SCIP_OBJSENSE_MINIMIZE));
579 return absl::OkStatus();
583 double old_offset = SCIPgetOrigObjoffset(scip_);
584 double delta_offset = offset - old_offset;
586 return absl::OkStatus();
590 return SCIPgetObjsense(scip_) == SCIP_OBJSENSE_MAXIMIZE;
597 return absl::OkStatus();
601 lb = ScipInfClamp(lb);
603 return absl::OkStatus();
607 ub = ScipInfClamp(ub);
609 return absl::OkStatus();
614 return absl::OkStatus();
618 SCIP_Bool infeasible;
620 SCIPchgVarType(scip_,
var, ConvertVarType(var_type), &infeasible));
621 return absl::OkStatus();
625 SCIP_Bool did_delete;
628 <<
"Failed to delete variable named: " <<
Name(
var);
629 variables_.erase(
var);
631 return absl::OkStatus();
635 const absl::flat_hash_set<SCIP_VAR*>& vars) {
636 for (SCIP_CONS* constraint : constraints_) {
638 return absl::InvalidArgumentError(absl::StrCat(
639 "Model contains nonlinear constraint: ",
Name(constraint)));
642 return absl::OkStatus();
648 for (SCIP_CONS* constraint : constraints_) {
649 const absl::Span<SCIP_VAR* const> nonzeros =
651 const std::vector<SCIP_VAR*> nonzeros_copy(nonzeros.begin(),
653 for (SCIP_VAR*
var : nonzeros_copy) {
654 if (vars.contains(
var)) {
659 for (SCIP_VAR*
const var : vars) {
662 return absl::OkStatus();
666 return ScipInfUnclamp(SCIPvarGetLbOriginal(
var));
670 return ScipInfUnclamp(SCIPvarGetUbOriginal(
var));
676 return ConvertVarType(SCIPvarGetType(
var));
682 return absl::string_view(SCIPconshdlrGetName(SCIPconsGetHdlr(constraint)));
686 return ConstraintType(constraint) == kLinearConstraintHandlerName;
690 SCIP_CONS* constraint) {
691 int num_vars = SCIPgetNVarsLinear(scip_, constraint);
692 return absl::MakeConstSpan(SCIPgetValsLinear(scip_, constraint), num_vars);
696 SCIP_CONS* constraint) {
697 int num_vars = SCIPgetNVarsLinear(scip_, constraint);
698 return absl::MakeConstSpan(SCIPgetVarsLinear(scip_, constraint), num_vars);
702 return ScipInfUnclamp(SCIPgetLhsLinear(scip_, constraint));
706 return ScipInfUnclamp(SCIPgetRhsLinear(scip_, constraint));
710 return SCIPconsGetName(constraint);
714 lb = ScipInfClamp(lb);
716 return absl::OkStatus();
720 ub = ScipInfClamp(ub);
722 return absl::OkStatus();
727 constraints_.erase(constraint);
729 return absl::OkStatus();
738 return absl::OkStatus();
744 const int scip_num_vars = SCIPgetNOrigVars(scip_);
745 const bool is_solution_partial = partial_solution.size() < scip_num_vars;
746 if (is_solution_partial) {
751 <<
"Error suggesting hint.";
754 for (
const auto& var_value_pair : partial_solution) {
756 var_value_pair.second));
758 if (!is_solution_partial) {
759 SCIP_Bool is_feasible;
761 scip_, solution,
false,
true,
764 if (!
static_cast<bool>(is_feasible)) {
771 if (
static_cast<bool>(is_stored)) {
790 const absl::Status param_status = SetParams(params, legacy_params);
791 if (!param_status.ok()) {
795 std::string(param_status.message()));
818 if (message_handler !=
nullptr) {
822 SCIPsetMessagehdlr(scip_, new_handler.get());
837 const SCIP_STAGE stage = SCIPgetStage(scip_);
838 if (stage != SCIP_STAGE_PRESOLVING && stage != SCIP_STAGE_SOLVING &&
839 stage != SCIP_STAGE_SOLVED) {
842 absl::StrCat(
"Unpexpected SCIP final stage= ", stage,
843 " was expected to be either SCIP_STAGE_PRESOLVING, "
844 "SCIP_STAGE_SOLVING, or SCIP_STAGE_SOLVED"));
852 if (
file ==
nullptr) {
853 return absl::InvalidArgumentError(absl::StrCat(
855 " to write SCIP solve stats."));
858 int close_result = fclose(
file);
859 if (close_result != 0) {
860 return absl::InvalidArgumentError(absl::StrCat(
861 "Error: ", close_result,
863 " when writing solve stats."));
870 const int num_scip_solutions = SCIPgetNSols(scip_);
871 const int num_returned_solutions =
873 SCIP_SOL** all_solutions = SCIPgetSols(scip_);
875 for (
int i = 0; i < num_returned_solutions; ++i) {
876 SCIP_SOL* scip_sol = all_solutions[i];
877 const double obj_value = ScipInfUnclamp(SCIPgetSolOrigObj(scip_, scip_sol));
879 for (SCIP_VAR* v : variables_) {
880 solution[v] = SCIPgetSolVal(scip_, scip_sol, v);
887 if (stage != SCIP_STAGE_PRESOLVING && SCIPhasPrimalRay(scip_)) {
888 for (SCIP_VAR* v : variables_) {
889 result.
primal_ray[v] = SCIPgetPrimalRayVal(scip_, v);
897 if (stage != SCIP_STAGE_PRESOLVING) {
911 if (message_handler !=
nullptr) {
928 SCIPsetMessagehdlrQuiet(scip_,
false);
929 SCIPsetMessagehdlrLogfile(scip_,
nullptr);
935 const std::string& parameter_name) {
936 SCIP_Bool default_value;
938 SCIPgetBoolParam(scip_, parameter_name.c_str(), &default_value));
939 return static_cast<bool>(default_value);
943 const std::string& parameter_name) {
946 SCIPgetIntParam(scip_, parameter_name.c_str(), &default_value));
947 return default_value;
951 const std::string& parameter_name) {
954 SCIPgetLongintParam(scip_, parameter_name.c_str(), &result));
955 return static_cast<int64_t
>(result);
959 const std::string& parameter_name) {
962 SCIPgetRealParam(scip_, parameter_name.c_str(), &result));
967 const std::string& parameter_name) {
970 SCIPgetCharParam(scip_, parameter_name.c_str(), &result));
975 const std::string& parameter_name) {
978 SCIPgetStringParam(scip_, parameter_name.c_str(), &result));
979 return std::string(result);
982double GScip::ScipInfClamp(
double d) {
983 const double kScipInf =
ScipInf();
984 if (d > kScipInf)
return kScipInf;
985 if (d < -kScipInf)
return -kScipInf;
989double GScip::ScipInfUnclamp(
double d) {
990 const double kScipInf =
ScipInf();
991 if (d >= kScipInf)
return std::numeric_limits<double>::infinity();
992 if (d <= -kScipInf)
return -std::numeric_limits<double>::infinity();
996#undef RETURN_ERROR_UNLESS
#define LOG_IF(severity, condition)
double LinearConstraintUb(SCIP_CONS *constraint)
absl::Status SetObjectiveOffset(double offset)
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::Status DeleteVariable(SCIP_VAR *var)
absl::StatusOr< SCIP_CONS * > AddOrConstraint(const GScipLogicalConstraintData &logical_data, const std::string &name="", const GScipConstraintOptions &options=DefaultGScipConstraintOptions())
absl::StatusOr< double > DefaultRealParamValue(const std::string ¶meter_name)
absl::Status CanSafeBulkDelete(const absl::flat_hash_set< SCIP_VAR * > &vars)
absl::StatusOr< SCIP_CONS * > AddAndConstraint(const GScipLogicalConstraintData &logical_data, const std::string &name="", const GScipConstraintOptions &options=DefaultGScipConstraintOptions())
absl::StatusOr< SCIP_CONS * > AddLinearConstraint(const GScipLinearRange &range, const std::string &name="", const GScipConstraintOptions &options=DefaultGScipConstraintOptions())
bool IsConstraintLinear(SCIP_CONS *constraint)
absl::string_view ConstraintType(SCIP_CONS *constraint)
absl::StatusOr< int64_t > DefaultLongParamValue(const std::string ¶meter_name)
absl::StatusOr< int > DefaultIntParamValue(const std::string ¶meter_name)
absl::Status DeleteConstraint(SCIP_CONS *constraint)
absl::Status SetLinearConstraintUb(SCIP_CONS *constraint, double ub)
absl::Status SafeBulkDelete(const absl::flat_hash_set< SCIP_VAR * > &vars)
static absl::StatusOr< std::unique_ptr< GScip > > Create(const std::string &problem_name)
double ObjCoef(SCIP_VAR *var)
absl::Status SetMaximize(bool is_maximize)
absl::StatusOr< std::string > DefaultStringParamValue(const std::string ¶meter_name)
absl::StatusOr< bool > DefaultBoolParamValue(const std::string ¶meter_name)
absl::StatusOr< SCIP_CONS * > AddIndicatorConstraint(const GScipIndicatorConstraint &indicator_constraint, const std::string &name="", const GScipConstraintOptions &options=DefaultGScipConstraintOptions())
absl::Status SetLb(SCIP_VAR *var, double lb)
absl::Span< SCIP_VAR *const > LinearConstraintVariables(SCIP_CONS *constraint)
double LinearConstraintLb(SCIP_CONS *constraint)
absl::Status SetLinearConstraintCoef(SCIP_CONS *constraint, SCIP_VAR *var, double value)
absl::Status SetLinearConstraintLb(SCIP_CONS *constraint, double lb)
absl::StatusOr< GScipHintResult > SuggestHint(const GScipSolution &partial_solution)
absl::StatusOr< GScipResult > Solve(const GScipParameters ¶ms=GScipParameters(), const std::string &legacy_params="", GScipMessageHandler message_handler=nullptr)
GScipVarType VarType(SCIP_VAR *var)
absl::Status SetVarType(SCIP_VAR *var, GScipVarType var_type)
absl::Status SetBranchingPriority(SCIP_VAR *var, int priority)
absl::StatusOr< char > DefaultCharParamValue(const std::string ¶meter_name)
absl::Span< const double > LinearConstraintCoefficients(SCIP_CONS *constraint)
absl::Status SetUb(SCIP_VAR *var, double ub)
absl::Status SetObjCoef(SCIP_VAR *var, double obj_coef)
absl::StatusOr< SCIP_CONS * > AddSOS2Constraint(const GScipSOSData &sos_data, const std::string &name="", const GScipConstraintOptions &options=DefaultGScipConstraintOptions())
static std::string ScipVersion()
absl::StatusOr< SCIP_CONS * > AddQuadraticConstraint(const GScipQuadraticRange &range, const std::string &name="", const GScipConstraintOptions &options=DefaultGScipConstraintOptions())
absl::string_view Name(SCIP_VAR *var)
absl::StatusOr< SCIP_CONS * > AddSOS1Constraint(const GScipSOSData &sos_data, const std::string &name="", const GScipConstraintOptions &options=DefaultGScipConstraintOptions())
bool ObjectiveIsMaximize()
static constexpr Status TOTAL_NODE_LIMIT
static constexpr Status BEST_SOL_LIMIT
static constexpr Status UNBOUNDED
static constexpr Status INF_OR_UNBD
static constexpr Status SOL_LIMIT
static constexpr Status STALL_NODE_LIMIT
static constexpr Status TERMINATE
void set_status(::operations_research::GScipOutput_Status value)
static constexpr Status GAP_LIMIT
static constexpr Status RESTART_LIMIT
static constexpr Status USER_INTERRUPT
static constexpr Status TIME_LIMIT
static constexpr Status INVALID_SOLVER_PARAMETERS
static constexpr Status NODE_LIMIT
static constexpr Status INFEASIBLE
static constexpr Status MEM_LIMIT
GScipOutput_Status Status
void set_status_detail(ArgT0 &&arg0, ArgT... args)
static constexpr Status OPTIMAL
::operations_research::GScipSolvingStats * mutable_stats()
static constexpr Status UNKNOWN
static constexpr Emphasis PHASE_IMPROVE
bool print_detailed_solving_stats() const
static constexpr Emphasis FEASIBILITY
static constexpr MetaParamValue FAST
static constexpr Emphasis HARD_LP
static constexpr Emphasis CP_SOLVER
double objective_limit() const
const std::string & scip_model_filename() const
static constexpr MetaParamValue AGGRESSIVE
int32_t num_solutions() const
static constexpr Emphasis PHASE_FEAS
bool has_objective_limit() const
static constexpr Emphasis PHASE_PROOF
static constexpr MetaParamValue DEFAULT_META_PARAM_VALUE
static constexpr Emphasis COUNTER
static constexpr Emphasis OPTIMALITY
static constexpr Emphasis EASY_CIP
bool print_scip_model() const
GScipParameters_MetaParamValue MetaParamValue
static constexpr Emphasis DEFAULT_EMPHASIS
const std::string & detailed_solving_stats_filename() const
static constexpr MetaParamValue OFF
GScipParameters_Emphasis Emphasis
void set_best_bound(double value)
void set_root_node_bound(double value)
void set_total_lp_iterations(int64_t value)
void set_primal_simplex_iterations(int64_t value)
void set_best_objective(double value)
void set_node_count(int64_t value)
void set_first_lp_relaxation_bound(double value)
void set_deterministic_time(double value)
void set_dual_simplex_iterations(int64_t value)
#define RETURN_ERROR_UNLESS(x)
const char * SCIPlpiGetSolverName(void)
gets name and version of LP solver
absl::StatusOr< MessageHandlerPtr > MakeSCIPMessageHandler(const GScipMessageHandler gscip_message_handler)
std::unique_ptr< SCIP_MESSAGEHDLR, ReleaseSCIPMessageHandler > MessageHandlerPtr
MessageHandlerPtr CaptureMessageHandlerPtr(SCIP_MESSAGEHDLR *const handler)
Collection of objects used to extend the Constraint Solver library.
const GScipConstraintOptions & DefaultGScipConstraintOptions()
std::function< void(GScipMessageType type, absl::string_view message)> GScipMessageHandler
int GScipMaxNumThreads(const GScipParameters ¶meters)
absl::Status LegacyScipSetSolverSpecificParameters(const std::string ¶meters, SCIP *scip)
std::string ProtoEnumToString(ProtoEnumType enum_value)
const GScipVariableOptions & DefaultGScipVariableOptions()
absl::flat_hash_map< SCIP_VAR *, double > GScipSolution
StatusBuilder InternalErrorBuilder()
#define SCIP_TO_STATUS(x)
#define RETURN_IF_SCIP_ERROR(x)
#define ASSIGN_OR_RETURN(lhs, rexpr)
#define RETURN_IF_ERROR(expr)
std::vector< double > coefficients
std::vector< SCIP_Var * > variables
SCIP_VAR * indicator_variable
std::vector< SCIP_VAR * > variables
std::vector< double > coefficients
std::vector< SCIP_VAR * > operators
std::vector< SCIP_Var * > quadratic_variables1
std::vector< SCIP_Var * > quadratic_variables2
std::vector< SCIP_Var * > linear_variables
std::vector< double > linear_coefficients
std::vector< double > quadratic_coefficients
absl::flat_hash_map< SCIP_VAR *, double > primal_ray
std::vector< double > objective_values
std::vector< GScipSolution > solutions
std::vector< SCIP_VAR * > variables
std::vector< double > weights