23 std::string MaybeExtendName(
const std::string& base_name,
24 const std::string& extension) {
25 if (base_name.empty()) {
28 return absl::StrCat(base_name,
"/", extension);
39 for (
const auto& term : right.
terms) {
40 left.
terms[term.first] -= term.second;
47 for (
auto& term : expr.
terms) {
48 term.second = -term.second;
58 result.
lower_bound = -std::numeric_limits<double>::infinity();
60 for (
const auto& term : diff.
terms) {
68 const std::string&
name) {
74 const std::vector<GScipLinearExpr>& terms,
75 const std::string&
name) {
84 std::vector<SCIP_VAR*> indicators;
85 for (
int i = 0; i < terms.size(); ++i) {
86 auto z = gscip->
AddVariable(0.0, 1.0, 0.0, GScipVarType::kInteger,
87 MaybeExtendName(
name, absl::StrCat(
"z_", i)));
89 indicators.push_back(*z);
92 for (
int i = 0; i < terms.size(); ++i) {
96 ->AddLinearConstraint(
97 Le(terms.at(i), resultant),
98 MaybeExtendName(
name, absl::StrCat(
"x_", i,
"_le_y")))
111 ->AddIndicatorConstraint(
112 ind, MaybeExtendName(
113 name, absl::StrCat(
"y_le__x_", i,
"_if_z_", i)))
123 z_use.
coefficients = std::vector<double>(indicators.size(), 1.0);
130 const std::vector<GScipLinearExpr>& terms,
131 const std::string&
name) {
132 std::vector<GScipLinearExpr> negated_terms;
133 negated_terms.reserve(terms.size());
135 negated_terms.push_back(
Negate(e));
141 GScip* gscip, std::vector<SCIP_Var*> quadratic_variables1,
142 std::vector<SCIP_Var*> quadratic_variables2,
143 std::vector<double> quadratic_coefficients,
const std::string&
name) {
144 constexpr
double kInf = std::numeric_limits<double>::infinity();
146 gscip->
AddVariable(-kInf, kInf, 1.0, GScipVarType::kContinuous,
147 MaybeExtendName(
name,
"obj"));
181 ->AddIndicatorConstraint(
182 ub_constraint, MaybeExtendName(
name,
"ub"), options)
197 ->AddIndicatorConstraint(
198 lb_constraint, MaybeExtendName(
name,
"lb"), options)
201 return absl::OkStatus();