21#include "absl/strings/string_view.h"
22#include "absl/types/span.h"
30std::string MaybeExtendName(absl::string_view base_name,
31 absl::string_view extension) {
32 if (base_name.empty()) {
35 return absl::StrCat(base_name,
"/", extension);
47 for (
const auto& term : right.
terms) {
48 left.
terms[term.first] -= term.second;
55 for (
auto& term : expr.
terms) {
56 term.second = -term.second;
67 result.
lower_bound = -std::numeric_limits<double>::infinity();
69 for (
const auto& term : diff.
terms) {
77 absl::string_view name) {
84 absl::Span<const GScipLinearExpr> terms,
85 absl::string_view name) {
94 std::vector<SCIP_VAR*> indicators;
95 for (
int i = 0; i < terms.size(); ++i) {
97 MaybeExtendName(name, absl::StrCat(
"z_", i)));
99 indicators.push_back(*z);
102 for (
int i = 0; i < terms.size(); ++i) {
106 ->AddLinearConstraint(
107 GScipLe(terms.at(i), resultant),
108 MaybeExtendName(name, absl::StrCat(
"x_", i,
"_le_y")))
113 CHECK_EQ(y_less_x.
lower_bound, -std::numeric_limits<double>::infinity());
121 ->AddIndicatorConstraint(
122 ind, MaybeExtendName(
123 name, absl::StrCat(
"y_le__x_", i,
"_if_z_", i)))
133 z_use.
coefficients = std::vector<double>(indicators.size(), 1.0);
140 absl::Span<const GScipLinearExpr> terms,
141 absl::string_view name) {
142 std::vector<GScipLinearExpr> negated_terms;
143 negated_terms.reserve(terms.size());
151 GScip* gscip, std::vector<SCIP_Var*> quadratic_variables1,
152 std::vector<SCIP_Var*> quadratic_variables2,
153 std::vector<double> quadratic_coefficients, absl::string_view name) {
154 constexpr double kInf = std::numeric_limits<double>::infinity();
157 MaybeExtendName(name,
"obj"));
191 ->AddIndicatorConstraint(
192 ub_constraint, MaybeExtendName(name,
"ub"), options)
207 ->AddIndicatorConstraint(
208 lb_constraint, MaybeExtendName(name,
"lb"), options)
211 return absl::OkStatus();
#define RETURN_IF_ERROR(expr)
bool ObjectiveIsMaximize()
absl::StatusOr< SCIP_CONS * > AddQuadraticConstraint(const GScipQuadraticRange &range, const std::string &name="", const GScipConstraintOptions &options=DefaultGScipConstraintOptions())
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 * > AddLinearConstraint(const GScipLinearRange &range, const std::string &name="", const GScipConstraintOptions &options=DefaultGScipConstraintOptions())
GScipLinearExpr GScipDifference(GScipLinearExpr left, const GScipLinearExpr &right)
absl::Status GScipCreateMaximum(GScip *gscip, const GScipLinearExpr &resultant, absl::Span< const GScipLinearExpr > terms, absl::string_view name)
GScipLinearExpr GScipNegate(GScipLinearExpr expr)
GScipLinearRange GScipLe(const GScipLinearExpr left, const GScipLinearExpr &right)
absl::Status GScipCreateAbs(GScip *gscip, SCIP_Var *x, SCIP_Var *abs_x, absl::string_view name)
absl::Status GScipCreateMinimum(GScip *gscip, const GScipLinearExpr &resultant, absl::Span< const GScipLinearExpr > terms, absl::string_view name)
absl::Status GScipCreateIndicatorRange(GScip *gscip, const GScipIndicatorRangeConstraint &indicator_range, absl::string_view name, const GScipConstraintOptions &options)
absl::Status GScipAddQuadraticObjectiveTerm(GScip *gscip, std::vector< SCIP_Var * > quadratic_variables1, std::vector< SCIP_Var * > quadratic_variables2, std::vector< double > quadratic_coefficients, absl::string_view name)
SCIP_VAR * indicator_variable
std::vector< SCIP_Var * > variables
std::vector< double > coefficients
SCIP_VAR * indicator_variable
absl::flat_hash_map< SCIP_VAR *, double > terms
GScipLinearExpr()=default
std::vector< SCIP_VAR * > variables
std::vector< double > coefficients
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