26#include "absl/log/check.h"
27#include "absl/log/log.h"
28#include "absl/strings/match.h"
29#include "absl/strings/str_cat.h"
30#include "absl/strings/str_join.h"
60 model_ = other_helper.
model();
88 model_ = request.
model();
95 if (absl::EndsWith(filename,
"txt")) {
105 absl::StatusOr<MPModelProto> model_or =
107 if (!model_or.ok())
return false;
108 model_ = model_or.value();
113 absl::StatusOr<MPModelProto> model_or =
115 if (!model_or.ok())
return false;
116 model_ = model_or.value();
122 if (!model_or.ok())
return false;
123 model_ = model_or.value();
133 if (!model_or.ok())
return false;
134 model_ = model_or.value();
144 model_.add_variable();
149 model_.mutable_variable(var_index)->set_lower_bound(lb);
153 model_.mutable_variable(var_index)->set_upper_bound(ub);
157 model_.mutable_variable(var_index)->set_is_integer(is_integer);
162 model_.mutable_variable(var_index)->set_objective_coefficient(coeff);
166 model_.mutable_variable(var_index)->set_name(
name);
170 return model_.variable(var_index).lower_bound();
174 return model_.variable(var_index).upper_bound();
178 return model_.variable(var_index).is_integer();
182 return model_.variable(var_index).objective_coefficient();
186 return model_.variable(var_index).name();
190 const int index = model_.constraint_size();
191 model_.add_constraint();
196 model_.mutable_constraint(ct_index)->set_lower_bound(lb);
200 model_.mutable_constraint(ct_index)->set_upper_bound(ub);
211 if (coeff == 0.0)
return;
219 if (coeff == 0.0)
return;
222 if (ct_proto->
var_index(i) == var_index) {
234 const std::string&
name) {
235 model_.mutable_constraint(ct_index)->set_name(
name);
242 if (ct_proto->
var_index(i) == var_index) {
254 return model_.constraint(ct_index).lower_bound();
258 return model_.constraint(ct_index).upper_bound();
262 return model_.constraint(ct_index).name();
271 int ct_index)
const {
277 const int index = model_.general_constraint_size();
279 model_.add_general_constraint()->mutable_indicator_constraint();
309 ->mutable_indicator_constraint()
310 ->mutable_constraint();
318 if (coeff == 0.0)
return;
330 if (coeff == 0.0)
return;
335 if (ct_proto->
var_index(i) == var_index) {
347 const std::string&
name) {
348 model_.mutable_general_constraint(ct_index)->set_name(
name);
359 if (ct_proto->
var_index(i) == var_index) {
386 return model_.general_constraint(ct_index)
387 .indicator_constraint()
394 return model_.general_constraint(ct_index)
395 .indicator_constraint()
402 return model_.general_constraint(ct_index).name();
406 int ct_index)
const {
409 model_.general_constraint(ct_index).indicator_constraint().constraint();
414 int ct_index)
const {
417 model_.general_constraint(ct_index).indicator_constraint().constraint();
423 return model_.general_constraint(ct_index).indicator_constraint().var_index();
428 return model_.general_constraint(ct_index)
429 .indicator_constraint()
436 return model_.constraint_size() + model_.general_constraint_size();
442 model_.set_name(
name);
446 var.clear_objective_coefficient();
457 return model_.objective_offset();
461 model_.set_objective_offset(offset);
467 model_.mutable_solution_hint()->add_var_index(var_index);
468 model_.mutable_solution_hint()->add_var_value(var_value);
520 if (solver_name.empty())
return;
523 VLOG(1) <<
"Unsupported type " << solver_name;
530 if (!solver_type_.has_value())
return false;
553 if (solver_type_.value() ==
563 if (!solver_type_.has_value()) {
564 response_->set_status(
573 if (time_limit_in_second_.has_value()) {
576 if (!solver_specific_parameters_.empty()) {
579 switch (solver_type_.value()) {
582 GlopSolveProto(std::move(request), &interrupt_solve_, log_callback_);
586 response_ =
SatSolveProto(std::move(request), &interrupt_solve_,
587 log_callback_,
nullptr);
596 response_ = std::move(temp.value());
605 response_ = std::move(temp.value());
610 case MPModelRequest::
611 GUROBI_LINEAR_PROGRAMMING:
615 response_ = std::move(temp.value());
619#if defined(USE_HIGHS)
626 response_ = std::move(temp.value());
632 response_->set_status(
638 model_of_last_solve_ = &model.
model();
640 std::numeric_limits<double>::quiet_NaN());
647 std::function<
void(
const std::string&)> log_callback) {
648 log_callback_ = std::move(log_callback);
653 log_callback_ = [log_callback](
const std::string& message) {
661 interrupter_.Interrupt();
662 interrupt_solve_ =
true;
669 return response_.has_value() &&
670 (response_.value().
status() ==
672 response_.value().status() ==
677 return response_.value();
681 if (!response_.has_value()) {
684 return MPSolverResponseStatusToSolveStatus(response_.value().status());
689 return response_.value().objective_value();
694 return response_.value().best_objective_bound();
699 if (var_index >= response_.value().variable_value_size())
return 0.0;
700 return response_.value().variable_value(var_index);
704 std::shared_ptr<LinearExpr> expr)
const {
707 evaluator_.AddToProcess(expr, 1.0);
708 return evaluator_.Evaluate();
713 if (var_index >= response_.value().reduced_cost_size())
return 0.0;
714 return response_.value().reduced_cost(var_index);
719 if (ct_index >= response_.value().dual_value_size())
return 0.0;
720 return response_.value().dual_value(ct_index);
724 if (!
has_response() || ct_index >= activities_.size() ||
725 !model_of_last_solve_.has_value()) {
729 if (std::isnan(activities_[ct_index])) {
731 model_of_last_solve_.value()->constraint(ct_index);
734 result += response_->variable_value(ct_proto.
var_index(i)) *
737 activities_[ct_index] = result;
739 return activities_[ct_index];
744 return response_.value().status_str();
748 if (!response_.has_value())
return 0.0;
749 if (!response_.value().has_solve_info())
return 0.0;
750 return response_.value().solve_info().solve_wall_time_seconds();
754 if (!response_.has_value())
return 0.0;
755 if (!response_.value().has_solve_info())
return 0.0;
756 return response_.value().solve_info().solve_user_time_seconds();
760 time_limit_in_second_ = limit;
764 const std::string& solver_specific_parameters) {
765 solver_specific_parameters_ = solver_specific_parameters;
773 return std::make_shared<AffineExpr>(expr, coeff, 0.0);
777 double coeff,
double constant) {
778 if (coeff == 1.0 && constant == 0.0)
return expr;
779 return std::make_shared<AffineExpr>(expr, coeff, constant);
784 return std::make_shared<FixedValue>(value * coeff + constant);
788 return std::make_shared<FixedValue>(value);
792 std::vector<std::shared_ptr<LinearExpr>> exprs;
793 exprs.push_back(shared_from_this());
794 exprs.push_back(expr);
795 return std::make_shared<SumArray>(exprs, 0.0);
799 if (cst == 0.0)
return shared_from_this();
800 return std::make_shared<AffineExpr>(shared_from_this(), 1.0, cst);
804 std::vector<std::shared_ptr<LinearExpr>> exprs;
805 exprs.push_back(shared_from_this());
806 exprs.push_back(expr->MulFloat(-1.0));
807 return std::make_shared<SumArray>(exprs, 0.0);
811 if (cst == 0.0)
return shared_from_this();
812 return std::make_shared<AffineExpr>(shared_from_this(), 1.0, -cst);
816 return std::make_shared<AffineExpr>(shared_from_this(), -1.0, cst);
820 if (cst == 0.0)
return std::make_shared<FixedValue>(0.0);
821 if (cst == 1.0)
return shared_from_this();
822 return std::make_shared<AffineExpr>(shared_from_this(), cst, 0.0);
826 return std::make_shared<AffineExpr>(shared_from_this(), -1, 0);
832 to_process_.push_back(std::make_pair(expr, coeff));
843 canonical_terms_[var] += coeff;
847 std::vector<double>* coeffs) {
851 expr->Visit(*
this, coeff);
856 for (
const auto& [var, coeff] : canonical_terms_) {
857 if (coeff == 0.0)
continue;
858 vars->push_back(var);
859 coeffs->push_back(coeff);
866 offset_ += coeff * helper_->variable_value(var->index());
874 expr->Visit(*
this, coeff);
882 offset_ = lin.
Flatten(&vars_, &coeffs_);
886 std::shared_ptr<LinearExpr> neg) {
890 offset_ = lin.
Flatten(&vars_, &coeffs_);
900 std::vector<int> var_indices;
901 var_indices.reserve(vars_.size());
902 for (
const std::shared_ptr<Variable>& var : vars_) {
903 var_indices.push_back(var->index());
909 for (
int i = 0; i < vars_.size(); ++i) {
917 return absl::StrCat(offset_);
921 for (
int i = 0; i < vars_.size(); ++i) {
922 DCHECK_NE(coeffs_[i], 0.0);
924 if (num_printed > 5) {
925 absl::StrAppend(&s,
" + ...");
928 if (num_printed == 1) {
929 if (coeffs_[i] == 1.0) {
930 absl::StrAppend(&s, vars_[i]->
ToString());
931 }
else if (coeffs_[i] == -1.0) {
932 absl::StrAppend(&s,
"-", vars_[i]->
ToString());
934 absl::StrAppend(&s, coeffs_[i],
" * ", vars_[i]->
ToString());
937 if (coeffs_[i] == 1.0) {
938 absl::StrAppend(&s,
" + ", vars_[i]->
ToString());
939 }
else if (coeffs_[i] == -1.0) {
940 absl::StrAppend(&s,
" - ", vars_[i]->
ToString());
941 }
else if (coeffs_[i] > 0.0) {
942 absl::StrAppend(&s,
" + ", coeffs_[i],
" * ", vars_[i]->
ToString());
944 absl::StrAppend(&s,
" - ", -coeffs_[i],
" * ", vars_[i]->
ToString());
949 if (num_printed == 0) {
950 return absl::StrCat(offset_);
954 if (offset_ != 0.0) {
956 absl::StrAppend(&s,
" + ", offset_);
958 absl::StrAppend(&s,
" - ", -offset_);
965 std::string s = absl::StrCat(
967 absl::StrJoin(vars_,
", ",
968 [](std::string* out, std::shared_ptr<Variable> expr) {
969 absl::StrAppend(out, expr->DebugString());
971 if (offset_ != 0.0) {
972 absl::StrAppend(&s,
", offset=", offset_);
974 absl::StrAppend(&s,
")");
980 : exprs_(
std::move(exprs)), offset_(
offset) {}
983 for (
int i = 0; i < exprs_.size(); ++i) {
986 if (offset_ != 0.0) {
992 if (exprs_.empty()) {
993 if (offset_ != 0.0) {
994 return absl::StrCat(offset_);
998 for (
int i = 0; i < exprs_.size(); ++i) {
1000 absl::StrAppend(&s,
" + ");
1002 absl::StrAppend(&s, exprs_[i]->
ToString());
1004 if (offset_ != 0.0) {
1005 if (offset_ > 0.0) {
1006 absl::StrAppend(&s,
" + ", offset_);
1008 absl::StrAppend(&s,
" - ", -offset_);
1011 absl::StrAppend(&s,
")");
1016 std::string s = absl::StrCat(
1018 absl::StrJoin(exprs_,
", ",
1019 [](std::string* out, std::shared_ptr<LinearExpr> expr) {
1020 absl::StrAppend(out, expr->DebugString());
1022 if (offset_ != 0.0) {
1023 absl::StrAppend(&s,
", offset=", offset_);
1025 absl::StrAppend(&s,
")");
1030 std::shared_ptr<LinearExpr> expr) {
1031 exprs_.push_back(std::move(expr));
1032 return shared_from_this();
1037 return shared_from_this();
1051 return absl::StrCat(
"FixedValue(", value_,
")");
1055 const std::vector<std::shared_ptr<LinearExpr>>& exprs,
1056 const std::vector<double>& coeffs,
double offset)
1057 : exprs_(exprs.
begin(), exprs.
end()),
1058 coeffs_(coeffs.
begin(), coeffs.
end()),
1062 for (
int i = 0; i < exprs_.size(); ++i) {
1069 if (exprs_.empty()) {
1070 return absl::StrCat(offset_);
1072 std::string s =
"(";
1073 bool first_printed =
true;
1074 for (
int i = 0; i < exprs_.size(); ++i) {
1075 if (coeffs_[i] == 0.0)
continue;
1076 if (first_printed) {
1077 first_printed =
false;
1078 if (coeffs_[i] == 1.0) {
1079 absl::StrAppend(&s, exprs_[i]->
ToString());
1080 }
else if (coeffs_[i] == -1.0) {
1081 absl::StrAppend(&s,
"-", exprs_[i]->
ToString());
1083 absl::StrAppend(&s, coeffs_[i],
" * ", exprs_[i]->
ToString());
1086 if (coeffs_[i] == 1.0) {
1087 absl::StrAppend(&s,
" + ", exprs_[i]->
ToString());
1088 }
else if (coeffs_[i] == -1.0) {
1089 absl::StrAppend(&s,
" - ", exprs_[i]->
ToString());
1090 }
else if (coeffs_[i] > 0.0) {
1091 absl::StrAppend(&s,
" + ", coeffs_[i],
" * ", exprs_[i]->
ToString());
1093 absl::StrAppend(&s,
" - ", -coeffs_[i],
" * ", exprs_[i]->
ToString());
1098 if (first_printed) {
1099 return absl::StrCat(offset_);
1103 if (offset_ != 0.0) {
1104 if (offset_ > 0.0) {
1105 absl::StrAppend(&s,
" + ", offset_);
1107 absl::StrAppend(&s,
" - ", -offset_);
1110 absl::StrAppend(&s,
")");
1115 return absl::StrCat(
1116 "WeightedSumArray([",
1117 absl::StrJoin(exprs_,
", ",
1118 [](std::string* out, std::shared_ptr<LinearExpr> e) {
1119 absl::StrAppend(out, e->DebugString());
1121 "], [", absl::StrJoin(coeffs_,
"], "), offset_,
")");
1126 : expr_(expr), coeff_(coeff), offset_(
offset) {}
1134 if (cst == 0.0)
return shared_from_this();
1139 if (cst == 0.0)
return shared_from_this();
1148 if (cst == 0.0)
return std::make_shared<FixedValue>(0);
1149 if (cst == 1.0)
return shared_from_this();
1158 std::string s =
"(";
1159 if (coeff_ == 1.0) {
1160 absl::StrAppend(&s, expr_->ToString());
1161 }
else if (coeff_ == -1.0) {
1162 absl::StrAppend(&s,
"-", expr_->ToString());
1164 absl::StrAppend(&s, coeff_,
" * ", expr_->ToString());
1166 if (offset_ > 0.0) {
1167 absl::StrAppend(&s,
" + ", offset_);
1168 }
else if (offset_ < 0.0) {
1169 absl::StrAppend(&s,
" - ", -offset_);
1171 absl::StrAppend(&s,
")");
1176 return absl::StrCat(
"AffineExpr(expr=", expr_->DebugString(),
1177 ", coeff=", coeff_,
", offset=", offset_,
")");
1180 std::shared_ptr<LinearExpr> rhs) {
1181 return std::make_shared<BoundedLinearExpression>(shared_from_this(), rhs, 0.0,
1186 return std::make_shared<BoundedLinearExpression>(shared_from_this(), rhs,
1191 std::shared_ptr<LinearExpr> rhs) {
1192 return std::make_shared<BoundedLinearExpression>(
1193 shared_from_this(), rhs, -std::numeric_limits<double>::infinity(), 0.0);
1197 return std::make_shared<BoundedLinearExpression>(
1198 shared_from_this(), -std::numeric_limits<double>::infinity(), rhs);
1202 std::shared_ptr<LinearExpr> rhs) {
1203 return std::make_shared<BoundedLinearExpression>(
1204 shared_from_this(), rhs, 0.0, std::numeric_limits<double>::infinity());
1208 return std::make_shared<BoundedLinearExpression>(
1209 shared_from_this(), rhs, std::numeric_limits<double>::infinity());
1213 std::shared_ptr<Variable> rhs)
const {
1214 return lhs->index() < rhs->index();
1262 return absl::StrCat(
"Variable(",
index_,
")");
1267 return absl::StrCat(
"Variable(index=",
index_,
1276 if (!var_name.empty())
return var_name;
1277 return absl::StrCat(
"variable#",
index_);
1313 vars_ = flat_expr.
vars();
1314 coeffs_ = flat_expr.
coeffs();
1320 std::shared_ptr<LinearExpr> pos, std::shared_ptr<LinearExpr> neg,
1323 vars_ = flat_expr.
vars();
1324 coeffs_ = flat_expr.
coeffs();
1330 std::shared_ptr<LinearExpr> expr, int64_t
lower_bound,
1333 vars_ = flat_expr.
vars();
1334 coeffs_ = flat_expr.
coeffs();
1340 std::shared_ptr<LinearExpr> pos, std::shared_ptr<LinearExpr> neg,
1343 vars_ = flat_expr.
vars();
1344 coeffs_ = flat_expr.
coeffs();
1360 if (vars_.empty()) {
1361 s = absl::StrCat(0.0);
1362 }
else if (vars_.size() == 1) {
1363 const std::string var_name = vars_[0]->ToString();
1364 if (coeffs_[0] == 1) {
1366 }
else if (coeffs_[0] == -1) {
1367 s = absl::StrCat(
"-", var_name);
1369 s = absl::StrCat(coeffs_[0],
" * ", var_name);
1373 for (
int i = 0; i < vars_.size(); ++i) {
1374 const std::string var_name = vars_[i]->ToString();
1376 if (coeffs_[i] == 1) {
1377 absl::StrAppend(&s, var_name);
1378 }
else if (coeffs_[i] == -1) {
1379 absl::StrAppend(&s,
"-", var_name);
1381 absl::StrAppend(&s, coeffs_[i],
" * ", var_name);
1384 if (coeffs_[i] == 1) {
1385 absl::StrAppend(&s,
" + ", var_name);
1386 }
else if (coeffs_[i] == -1) {
1387 absl::StrAppend(&s,
" - ", var_name);
1388 }
else if (coeffs_[i] > 1) {
1389 absl::StrAppend(&s,
" + ", coeffs_[i],
" * ", var_name);
1391 absl::StrAppend(&s,
" - ", -coeffs_[i],
" * ", var_name);
1395 absl::StrAppend(&s,
")");
1397 if (lower_bound_ == upper_bound_) {
1398 return absl::StrCat(s,
" == ", lower_bound_);
1399 }
else if (lower_bound_ == -std::numeric_limits<double>::infinity()) {
1400 if (upper_bound_ == std::numeric_limits<double>::infinity()) {
1401 return absl::StrCat(
"-inf <= ", s,
" <= inf");
1403 return absl::StrCat(s,
" <= ", upper_bound_);
1405 }
else if (upper_bound_ == std::numeric_limits<double>::infinity()) {
1406 return absl::StrCat(s,
" >= ", lower_bound_);
1408 return absl::StrCat(lower_bound_,
" <= ", s,
" <= ", upper_bound_);
1413 return absl::StrCat(
1414 "BoundedLinearExpression(vars=[",
1415 absl::StrJoin(vars_,
", ",
1416 [](std::string* out, std::shared_ptr<Variable> var) {
1417 absl::StrAppend(out, var->DebugString());
1419 "], coeffs=[", absl::StrJoin(coeffs_,
", "),
1420 "], lower_bound=", lower_bound_,
", upper_bound=", upper_bound_,
")");
1424 const bool is_zero = lower_bound_ == 0.0 && upper_bound_ == 0.0;
1426 if (vars_.empty()) {
1429 }
else if (vars_.size() == 2 && coeffs_[0] + coeffs_[1] == 0 &&
1430 std::abs(coeffs_[0]) == 1) {
int var_index_size() const
void set_lower_bound(double value)
void add_coefficient(double value)
void set_upper_bound(double value)
double coefficient(int index) const
void set_coefficient(int index, double value)
void add_var_index(::int32_t value)
::int32_t var_index(int index) const
GeneralConstraintCase general_constraint_case() const
::operations_research::MPIndicatorConstraint *PROTOBUF_NONNULL mutable_indicator_constraint()
void set_var_index(::int32_t value)
void set_var_value(::int32_t value)
::operations_research::MPConstraintProto *PROTOBUF_NONNULL mutable_constraint()
int variable_size() const
void set_enable_internal_solver_output(bool value)
MPModelRequest_SolverType SolverType
void set_solver_specific_parameters(Arg_ &&arg, Args_... args)
static constexpr SolverType HIGHS_LINEAR_PROGRAMMING
static constexpr SolverType SAT_INTEGER_PROGRAMMING
static constexpr SolverType HIGHS_MIXED_INTEGER_PROGRAMMING
static constexpr SolverType GUROBI_MIXED_INTEGER_PROGRAMMING
::operations_research::MPModelProto *PROTOBUF_NONNULL mutable_model()
static constexpr SolverType PDLP_LINEAR_PROGRAMMING
void set_solver_type(::operations_research::MPModelRequest_SolverType value)
::operations_research::MPModelRequest_SolverType solver_type() const
static constexpr SolverType GUROBI_LINEAR_PROGRAMMING
void set_solver_time_limit_seconds(double value)
const ::operations_research::MPModelProto & model() const
static constexpr SolverType GLOP_LINEAR_PROGRAMMING
static constexpr SolverType SCIP_MIXED_INTEGER_PROGRAMMING
static bool SupportsProblemType(OptimizationProblemType problem_type)
static bool ParseSolverType(absl::string_view solver_id, OptimizationProblemType *type)
std::string ToString() const override
AffineExpr(std::shared_ptr< LinearExpr > expr, double coeff, double offset)
std::string DebugString() const override
std::shared_ptr< LinearExpr > Neg() override
std::shared_ptr< LinearExpr > SubFloat(double cst) override
std::shared_ptr< LinearExpr > RSubFloat(double cst) override
std::shared_ptr< LinearExpr > AddFloat(double cst) override
void Visit(ExprVisitor &lin, double c) override
std::shared_ptr< LinearExpr > MulFloat(double cst) override
std::string ToString() const
const std::vector< double > & coeffs() const
BoundedLinearExpression(std::shared_ptr< LinearExpr > expr, double lower_bound, double upper_bound)
bool CastToBool(bool *result) const
double lower_bound() const
double upper_bound() const
const std::vector< std::shared_ptr< Variable > > & vars() const
std::string DebugString() const
void AddVarCoeff(std::shared_ptr< Variable > var, double coeff) override
double Flatten(std::vector< std::shared_ptr< Variable > > *vars, std::vector< double > *coeffs)
void AddVarCoeff(std::shared_ptr< Variable > var, double coeff) override
std::vector< std::pair< std::shared_ptr< LinearExpr >, double > > to_process_
void AddToProcess(std::shared_ptr< LinearExpr > expr, double coeff)
virtual void AddVarCoeff(std::shared_ptr< Variable > var, double coeff)=0
void AddConstant(double constant)
std::string ToString() const override
void Visit(ExprVisitor &lin, double c) override
std::string DebugString() const override
std::string ToString() const override
void Visit(ExprVisitor &lin, double c) override
const std::vector< std::shared_ptr< Variable > > & vars() const
FlatExpr(std::shared_ptr< LinearExpr > expr)
const std::vector< double > & coeffs() const
std::vector< int > VarIndices() const
std::string DebugString() const override
std::shared_ptr< LinearExpr > Add(std::shared_ptr< LinearExpr > expr)
std::shared_ptr< BoundedLinearExpression > Le(std::shared_ptr< LinearExpr > rhs)
std::shared_ptr< LinearExpr > Sub(std::shared_ptr< LinearExpr > expr)
std::shared_ptr< BoundedLinearExpression > EqCst(double rhs)
std::shared_ptr< BoundedLinearExpression > LeCst(double rhs)
static std::shared_ptr< LinearExpr > Affine(std::shared_ptr< LinearExpr > expr, double coeff, double constant)
static std::shared_ptr< LinearExpr > Constant(double value)
static std::shared_ptr< LinearExpr > AffineCst(double value, double coeff, double constant)
std::shared_ptr< BoundedLinearExpression > Ge(std::shared_ptr< LinearExpr > rhs)
virtual std::shared_ptr< LinearExpr > Neg()
virtual std::shared_ptr< LinearExpr > RSubFloat(double cst)
virtual std::shared_ptr< LinearExpr > AddFloat(double cst)
virtual std::shared_ptr< LinearExpr > MulFloat(double cst)
static std::shared_ptr< LinearExpr > Term(std::shared_ptr< LinearExpr > expr, double coeff)
std::shared_ptr< BoundedLinearExpression > GeCst(double rhs)
std::shared_ptr< BoundedLinearExpression > Eq(std::shared_ptr< LinearExpr > rhs)
virtual std::shared_ptr< LinearExpr > SubFloat(double cst)
virtual void NewMessage(const std::string &message)=0
void SetEnforcedConstraintLowerBound(int ct_index, double lb)
std::vector< int > ConstraintVarIndices(int ct_index) const
std::vector< double > EnforcedConstraintCoefficients(int ct_index) const
void SetVarIntegrality(int var_index, bool is_integer)
void ClearEnforcedConstraintTerms(int ct_index)
void SetEnforcedIndicatorValue(int ct_index, bool positive)
void SafeAddEnforcedConstraintTerm(int ct_index, int var_index, double coeff)
void SetEnforcedConstraintName(int ct_index, const std::string &name)
void SetVarName(int var_index, const std::string &name)
std::string VarName(int var_index) const
double EnforcedConstraintUpperBound(int ct_index) const
void AddConstraintTerm(int ct_index, int var_index, double coeff)
bool WriteToMpsFile(const std::string &filename, const operations_research::MPModelExportOptions &options=MPModelExportOptions())
int num_constraints() const
double ConstraintLowerBound(int ct_index) const
int AddEnforcedLinearConstraint()
int num_variables() const
bool ReadModelFromProtoFile(const std::string &filename)
std::string ExportToMpsString(const operations_research::MPModelExportOptions &options=MPModelExportOptions())
std::string ConstraintName(int ct_index) const
void SetVarUpperBound(int var_index, double ub)
bool EnforcedIndicatorValue(int ct_index) const
void SetObjectiveOffset(double offset)
void SetEnforcedConstraintCoefficient(int ct_index, int var_index, double coeff)
double VarObjectiveCoefficient(int var_index) const
std::string EnforcedConstraintName(int ct_index) const
void AddEnforcedConstraintTerm(int ct_index, int var_index, double coeff)
double ObjectiveOffset() const
double VarUpperBound(int var_index) const
double ConstraintUpperBound(int ct_index) const
MPModelProto * mutable_model()
void OverwriteModel(const ModelBuilderHelper &other_helper)
bool WriteModelToProtoFile(const std::string &filename)
void SetEnforcedIndicatorVariableIndex(int ct_index, int var_index)
void SetConstraintLowerBound(int ct_index, double lb)
bool ImportFromMpsFile(const std::string &mps_file)
void SetEnforcedConstraintUpperBound(int ct_index, double ub)
int AddLinearConstraint()
int EnforcedIndicatorVariableIndex(int ct_index) const
void AddHint(int var_index, double var_value)
void SetMaximize(bool maximize)
void SetVarObjectiveCoefficient(int var_index, double coeff)
void SetVarLowerBound(int var_index, double lb)
void SetConstraintName(int ct_index, const std::string &name)
bool ImportFromMpsString(const std::string &mps_string)
bool VarIsIntegral(int var_index) const
bool IsEnforcedConstraint(int ct_index) const
bool ImportFromLpString(const std::string &lp_string)
bool ImportFromLpFile(const std::string &lp_file)
void SetConstraintUpperBound(int ct_index, double ub)
std::vector< double > ConstraintCoefficients(int ct_index) const
const MPModelProto & model() const
double VarLowerBound(int var_index) const
void SafeAddConstraintTerm(int ct_index, int var_index, double coeff)
void ClearConstraintTerms(int ct_index)
void SetConstraintCoefficient(int ct_index, int var_index, double coeff)
void SetName(const std::string &name)
std::string ExportToLpString(const operations_research::MPModelExportOptions &options=MPModelExportOptions())
double EnforcedConstraintLowerBound(int ct_index) const
std::vector< int > EnforcedConstraintVarIndices(int ct_index) const
void Solve(const ModelBuilderHelper &model)
void SetSolverSpecificParameters(const std::string &solver_specific_parameters)
double variable_value(int var_index) const
ModelSolverHelper(const std::string &solver_name)
std::string status_string() const
bool has_response() const
std::optional< MPSolutionResponse > SolveRequest(const MPModelRequest &request)
double objective_value() const
bool SolverIsSupported() const
double activity(int ct_index)
const MPSolutionResponse & response() const
void SetLogCallbackFromDirectorClass(MbLogCallback *log_callback)
bool has_solution() const
double expression_value(std::shared_ptr< LinearExpr > expr) const
double best_objective_bound() const
void EnableOutput(bool enabled)
void SetTimeLimitInSeconds(double limit)
double reduced_cost(int var_index) const
void SetLogCallback(std::function< void(const std::string &)> log_callback)
SolveStatus status() const
double dual_value(int ct_index) const
void Visit(ExprVisitor &lin, double c) override
std::shared_ptr< LinearExpr > AddInPlace(std::shared_ptr< LinearExpr > expr)
std::string ToString() const override
std::shared_ptr< LinearExpr > AddFloatInPlace(double cst)
std::string DebugString() const override
SumArray(std::vector< std::shared_ptr< LinearExpr > > exprs, double offset)
Variable(ModelBuilderHelper *helper, int index)
void SetLowerBound(double lb)
double upper_bound() const
double lower_bounds() const
ModelBuilderHelper * helper_
void SetName(const std::string &name)
ModelBuilderHelper * helper() const
std::string DebugString() const override
void SetObjectiveCoefficient(double coeff)
std::string ToString() const override
double objective_coefficient() const
void SetUpperBound(double ub)
void SetIsIntegral(bool is_integral)
std::string ToString() const override
WeightedSumArray(const std::vector< std::shared_ptr< LinearExpr > > &exprs, const std::vector< double > &coeffs, double offset)
void Visit(ExprVisitor &lin, double c) override
std::string DebugString() const override
absl::StatusOr< std::string > GetContents(absl::string_view path, Options options)
absl::Status SetBinaryProto(absl::string_view file_name, const google::protobuf::Message &proto, Options options)
absl::Status SetTextProto(absl::string_view file_name, const google::protobuf::Message &proto, Options options)
absl::Status GetTextProto(absl::string_view file_name, google::protobuf::Message *proto, Options options)
absl::Status GetBinaryProto(const absl::string_view file_name, google::protobuf::Message *proto, Options options)
absl::StatusOr< MPModelProto > MpsFileToMPModelProto(absl::string_view mps_file)
absl::StatusOr< MPModelProto > MpsDataToMPModelProto(absl::string_view mps_data)
@ SOLVER_TYPE_UNAVAILABLE
@ INVALID_SOLVER_PARAMETERS
absl::Status WriteModelToMpsFile(absl::string_view filename, const MPModelProto &model, const MPModelExportOptions &options)
MPSolutionResponse SatSolveProto(LazyMutableCopy< MPModelRequest > request, std::atomic< bool > *interrupt_solve, std::function< void(const std::string &)> logging_callback, std::function< void(const MPSolution &)> solution_callback, std::function< void(const double)> best_bound_callback)
absl::StatusOr< MPSolutionResponse > PdlpSolveProto(LazyMutableCopy< MPModelRequest > request, const bool relax_integer_variables, const std::atomic< bool > *interrupt_solve)
absl::StatusOr< std::string > ExportModelAsLpFormat(const MPModelProto &model, const MPModelExportOptions &options)
bool GurobiIsCorrectlyInstalled()
absl::StatusOr< MPSolutionResponse > HighsSolveProto(LazyMutableCopy< MPModelRequest > request, HighsSolveInfo *solve_info)
absl::StatusOr< MPSolutionResponse > ScipSolveProto(LazyMutableCopy< MPModelRequest > request)
MPSolutionResponse SolveMPModel(LazyMutableCopy< MPModelRequest > request, const SolveInterrupter *absl_nullable interrupter)
ClosedInterval::Iterator end(ClosedInterval interval)
MPSolutionResponse GlopSolveProto(LazyMutableCopy< MPModelRequest > request, std::atomic< bool > *interrupt_solve, std::function< void(const std::string &)> logging_callback)
@ MPSOLVER_CANCELLED_BY_USER
@ MPSOLVER_MODEL_INVALID_SOLUTION_HINT
@ MPSOLVER_UNKNOWN_STATUS
@ MPSOLVER_MODEL_IS_VALID
@ MPSOLVER_MODEL_INVALID_SOLVER_PARAMETERS
@ MPSOLVER_INCOMPATIBLE_OPTIONS
@ MPSOLVER_SOLVER_TYPE_UNAVAILABLE
absl::StatusOr< MPSolutionResponse > GurobiSolveProto(LazyMutableCopy< MPModelRequest > request, GRBenv *gurobi_env)
absl::StatusOr< std::string > ExportModelAsMpsFormat(const MPModelProto &model, const MPModelExportOptions &options)
ClosedInterval::Iterator begin(ClosedInterval interval)
absl::StatusOr< MPModelProto > ModelProtoFromLpFormat(absl::string_view model)
bool operator()(std::shared_ptr< Variable > lhs, std::shared_ptr< Variable > rhs) const