23std::string MaybeExtendName(
const std::string& base_name,
24 const std::string& extension) {
25 if (base_name.empty()) {
28 return absl::StrCat(base_name,
"/", extension);
40 for (
const auto& term : right.
terms) {
41 left.
terms[term.first] -= term.second;
48 for (
auto& term : expr.
terms) {
49 term.second = -term.second;
60 result.
lower_bound = -std::numeric_limits<double>::infinity();
62 for (
const auto& term : diff.
terms) {
70 const std::string&
name) {
77 const std::vector<GScipLinearExpr>& terms,
78 const std::string&
name) {
87 std::vector<SCIP_VAR*> indicators;
88 for (
int i = 0; i < terms.size(); ++i) {
90 MaybeExtendName(
name, absl::StrCat(
"z_", i)));
92 indicators.push_back(*z);
95 for (
int i = 0; i < terms.size(); ++i) {
99 ->AddLinearConstraint(
100 GScipLe(terms.at(i), resultant),
101 MaybeExtendName(
name, absl::StrCat(
"x_", i,
"_le_y")))
114 ->AddIndicatorConstraint(
115 ind, MaybeExtendName(
116 name, absl::StrCat(
"y_le__x_", i,
"_if_z_", i)))
126 z_use.
coefficients = std::vector<double>(indicators.size(), 1.0);
133 const std::vector<GScipLinearExpr>& terms,
134 const std::string&
name) {
135 std::vector<GScipLinearExpr> negated_terms;
136 negated_terms.reserve(terms.size());
144 GScip* gscip, std::vector<SCIP_Var*> quadratic_variables1,
145 std::vector<SCIP_Var*> quadratic_variables2,
146 std::vector<double> quadratic_coefficients,
const std::string&
name) {
147 constexpr double kInf = std::numeric_limits<double>::infinity();
150 MaybeExtendName(
name,
"obj"));
184 ->AddIndicatorConstraint(
185 ub_constraint, MaybeExtendName(
name,
"ub"), options)
200 ->AddIndicatorConstraint(
201 lb_constraint, MaybeExtendName(
name,
"lb"), options)
204 return absl::OkStatus();
#define CHECK_EQ(val1, val2)
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())
absl::StatusOr< SCIP_CONS * > AddQuadraticConstraint(const GScipQuadraticRange &range, const std::string &name="", const GScipConstraintOptions &options=DefaultGScipConstraintOptions())
bool ObjectiveIsMaximize()
The vehicle routing library lets one model and solve generic vehicle routing problems ranging from th...
GScipLinearRange GScipLe(const GScipLinearExpr left, const GScipLinearExpr &right)
GScipLinearExpr GScipDifference(GScipLinearExpr left, const GScipLinearExpr &right)
absl::Status GScipCreateMaximum(GScip *gscip, const GScipLinearExpr &resultant, const std::vector< GScipLinearExpr > &terms, const std::string &name)
absl::Status GScipCreateAbs(GScip *gscip, SCIP_Var *x, SCIP_Var *abs_x, const std::string &name)
absl::Status GScipAddQuadraticObjectiveTerm(GScip *gscip, std::vector< SCIP_Var * > quadratic_variables1, std::vector< SCIP_Var * > quadratic_variables2, std::vector< double > quadratic_coefficients, const std::string &name)
absl::Status GScipCreateMinimum(GScip *gscip, const GScipLinearExpr &resultant, const std::vector< GScipLinearExpr > &terms, const std::string &name)
absl::Status GScipCreateIndicatorRange(GScip *gscip, const GScipIndicatorRangeConstraint &indicator_range, const std::string &name, const GScipConstraintOptions &options)
GScipLinearExpr GScipNegate(GScipLinearExpr expr)
#define RETURN_IF_ERROR(expr)
std::vector< double > coefficients
std::vector< SCIP_Var * > variables
SCIP_VAR * indicator_variable
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< 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