17#ifndef ORTOOLS_MATH_OPT_CPP_MODEL_H_
18#define ORTOOLS_MATH_OPT_CPP_MODEL_H_
26#include "absl/base/nullability.h"
27#include "absl/log/check.h"
28#include "absl/status/status.h"
29#include "absl/status/statusor.h"
30#include "absl/strings/string_view.h"
31#include "absl/types/span.h"
133 explicit Model(absl::string_view
name =
"");
140 explicit Model(absl_nonnull std::unique_ptr<ModelStorage>
storage);
162 absl_nonnull std::unique_ptr<Model>
Clone(
163 std::optional<absl::string_view> new_name = std::nullopt)
const;
165 inline absl::string_view
name()
const;
183 absl::string_view
name =
"");
188 absl::string_view
name =
"");
271 absl::string_view
name =
"");
378 absl::string_view
name =
"");
430 absl::Span<const LinearExpression> arguments_to_norm,
454 SecondOrderConeConstraintId
id)
const;
462 SecondOrderConeConstraintId
id)
const;
471 inline std::vector<SecondOrderConeConstraint>
497 const std::vector<LinearExpression>& expressions,
498 std::vector<double> weights = {}, absl::string_view
name =
"");
558 const std::vector<LinearExpression>& expressions,
559 std::vector<double> weights = {}, absl::string_view
name =
"");
619 const BoundedLinearExpression& implied_constraint,
620 bool activate_on_zero =
false, absl::string_view
name = {});
663 inline void Maximize(
double objective);
667 inline void Maximize(LinearTerm objective);
669 inline void Maximize(
const LinearExpression& objective);
671 inline void Maximize(
const QuadraticExpression& objective);
674 inline void Minimize(
double objective);
678 inline void Minimize(LinearTerm objective);
680 inline void Minimize(
const LinearExpression& objective);
682 inline void Minimize(
const QuadraticExpression& objective);
732 Variable second_variable,
double value);
773 absl::string_view
name = {});
777 absl::string_view
name = {});
781 absl::string_view
name = {});
785 absl::string_view
name = {});
834 inline void Maximize(Objective objective,
const LinearExpression& expression);
836 inline void Minimize(Objective objective,
const LinearExpression& expression);
838 void SetObjective(Objective objective,
const LinearExpression& expression,
842 void AddToObjective(Objective objective,
const LinearExpression& expression);
864 Objective objective)
const;
869 ModelProto
ExportModel(
bool remove_names =
false)
const;
912 friend std::ostream&
operator<<(std::ostream& ostr,
const Model& model);
932 const absl_nonnull std::shared_ptr<ModelStorage> storage_;
947 const bool is_integer,
948 const absl::string_view name) {
958 const double upper_bound,
959 const absl::string_view name) {
965 const absl::string_view
name) {
977 return storage()->next_variable_id().value();
993 CHECK(
has_variable(
id)) <<
"No variable with id: " <<
id.value();
1045 if (storage_.get() !=
variable.storage()) {
1047 <<
"variable with id " <<
variable.id()
1048 <<
" is from a different model";
1053 <<
" is not found in this model (it was probably deleted)";
1055 return absl::OkStatus();
1062 const double upper_bound,
1063 const absl::string_view name) {
1069 CheckModel(constraint.
storage());
1074 return storage()->num_linear_constraints();
1078 return storage()->next_linear_constraint_id().value();
1086 return storage()->has_linear_constraint(
id);
1090 CHECK_GE(
id, 0) <<
"negative linear constraint id: " << id;
1096 <<
"No linear constraint with id: " <<
id.value();
1101 CheckModel(constraint.
storage());
1106 double lower_bound) {
1113 CheckModel(constraint.
storage());
1114 return storage()->linear_constraint_lower_bound(constraint.
typed_id());
1119 CheckModel(constraint.
storage());
1125 CheckModel(constraint.
storage());
1126 return storage()->linear_constraint_upper_bound(constraint.
typed_id());
1135 <<
" is from a different model";
1140 <<
" is not found in this model (it was probably deleted)";
1142 return absl::OkStatus();
1147 CheckModel(constraint.storage());
1149 storage()->set_linear_constraint_coefficient(constraint.typed_id(),
1155 CheckModel(constraint.
storage());
1157 return storage()->linear_constraint_coefficient(constraint.
typed_id(),
1163 CheckModel(constraint.storage());
1165 return storage()->is_linear_constraint_coefficient_nonzero(
1172 CheckModel(constraint.
storage());
1189 return storage()->has_constraint(
id);
1193 CHECK_GE(
id, 0) <<
"negative quadratic constraint id: " << id;
1200 <<
"No quadratic constraint with id: " <<
id.value();
1216 CheckModel(constraint.
storage());
1221 return storage()->num_constraints<SecondOrderConeConstraintId>();
1225 return storage()->next_constraint_id<SecondOrderConeConstraintId>().value();
1229 return id < 0 ?
false
1231 SecondOrderConeConstraintId(
id));
1235 const SecondOrderConeConstraintId
id)
const {
1240 const int64_t
id)
const {
1245 const SecondOrderConeConstraintId
id)
const {
1247 <<
"No second-order cone constraint with id: " <<
id.value();
1264 CheckModel(constraint.
storage());
1269 return storage()->num_constraints<Sos1ConstraintId>();
1273 return storage()->next_constraint_id<Sos1ConstraintId>().value();
1281 return storage()->has_constraint(
id);
1290 <<
"No SOS1 constraint with id: " <<
id.value();
1305 CheckModel(constraint.
storage());
1310 return storage()->num_constraints<Sos2ConstraintId>();
1314 return storage()->next_constraint_id<Sos2ConstraintId>().value();
1322 return storage()->has_constraint(
id);
1331 <<
"No SOS2 constraint with id: " <<
id.value();
1346 CheckModel(constraint.
storage());
1363 return storage()->has_constraint(
id);
1373 <<
"No indicator constraint with id: " <<
id.value();
1450 const Variable second_variable)
const {
1452 CheckModel(second_variable.
storage());
1459 const double value) {
1467 const double value) {
1468 CheckModel(first_variable.
storage());
1469 CheckModel(second_variable.
storage());
1470 storage()->set_quadratic_objective_coefficient(
1472 second_variable.
typed_id(), value);
1481 return storage()->is_linear_objective_coefficient_nonzero(
1488 CheckModel(second_variable.
storage());
1489 return storage()->is_quadratic_objective_coefficient_nonzero(
1521 const absl::string_view
name) {
1527 const bool is_maximize,
1528 const int64_t priority,
1529 const absl::string_view
name) {
1536 const int64_t priority,
1537 const absl::string_view
name) {
1543 const int64_t priority,
1544 const absl::string_view
name) {
1550 CheckModel(objective.
storage());
1551 CHECK(!objective.
is_primary()) <<
"cannot delete primary objective";
1554 <<
"cannot delete unrecognized auxiliary objective id: " << id;
1555 storage()->DeleteAuxiliaryObjective(
id);
1559 return storage()->num_auxiliary_objectives();
1563 return storage()->next_auxiliary_objective_id().
value();
1575 CHECK_GE(
id, 0) <<
"negative auxiliary objective id: " << id;
1581 <<
"unrecognized auxiliary objective id: " << id;
1598 const int64_t priority) {
1599 CheckModel(objective.
storage());
1605 const double value) {
1606 CheckModel(objective.
storage());
1613 const double value) {
1627 CheckModel(objective.
storage());
1631void Model::CheckOptionalModel(
1633 if (other_storage !=
nullptr) {
ModelStorageCPtr storage() const
Sos1Constraint AddSos1Constraint(const std::vector< LinearExpression > &expressions, std::vector< double > weights={}, absl::string_view name="")
void set_lower_bound(Variable variable, double lower_bound)
std::vector< IndicatorConstraint > SortedIndicatorConstraints() const
Objective auxiliary_objective(int64_t id) const
bool has_auxiliary_objective(int64_t id) const
int64_t num_sos2_constraints() const
QuadraticConstraint AddQuadraticConstraint(const BoundedQuadraticExpression &bounded_expr, absl::string_view name="")
Sos2Constraint AddSos2Constraint(const std::vector< LinearExpression > &expressions, std::vector< double > weights={}, absl::string_view name="")
ModelProto ExportModel(bool remove_names=false) const
bool has_variable(int64_t id) const
std::vector< SecondOrderConeConstraint > SecondOrderConeConstraints() const
int64_t next_quadratic_constraint_id() const
friend std::ostream & operator<<(std::ostream &ostr, const Model &model)
int64_t next_auxiliary_objective_id() const
int64_t next_linear_constraint_id() const
void DeleteSecondOrderConeConstraint(SecondOrderConeConstraint constraint)
static absl::StatusOr< std::unique_ptr< Model > > FromModelProto(const ModelProto &model_proto)
std::vector< Sos2Constraint > SortedSos2Constraints() const
bool is_integer(Variable variable) const
void set_continuous(Variable variable)
bool has_sos1_constraint(int64_t id) const
std::vector< Sos1Constraint > SortedSos1Constraints() const
absl::string_view name() const
int num_linear_constraints() const
void DeleteQuadraticConstraint(QuadraticConstraint constraint)
std::vector< QuadraticConstraint > SortedQuadraticConstraints() const
void set_coefficient(LinearConstraint constraint, Variable variable, double value)
double lower_bound(Variable variable) const
SecondOrderConeConstraint AddSecondOrderConeConstraint(absl::Span< const LinearExpression > arguments_to_norm, const LinearExpression &upper_bound, absl::string_view name="")
std::vector< Variable > NonzeroVariablesInLinearObjective() const
std::vector< SecondOrderConeConstraint > SortedSecondOrderConeConstraints() const
SecondOrderConeConstraint second_order_cone_constraint(int64_t id) const
int64_t next_indicator_constraint_id() const
std::vector< Objective > AuxiliaryObjectives() const
int64_t next_second_order_cone_constraint_id() const
int64_t num_second_order_cone_constraints() const
std::unique_ptr< UpdateTracker > NewUpdateTracker()
std::vector< LinearConstraint > SortedLinearConstraints() const
int64_t next_variable_id() const
Objective AddMinimizationObjective(const LinearExpression &expression, int64_t priority, absl::string_view name={})
bool has_sos2_constraint(int64_t id) const
void Maximize(double objective)
std::vector< Sos1Constraint > Sos1Constraints() const
int num_variables() const
absl::Status ValidateExistingLinearConstraintOfThisModel(LinearConstraint linear_constraint) const
void set_is_maximize(bool is_maximize)
int64_t num_sos1_constraints() const
bool has_indicator_constraint(int64_t id) const
bool has_quadratic_constraint(int64_t id) const
Variable variable(int64_t id) const
QuadraticExpression ObjectiveAsQuadraticExpression() const
Model & operator=(const Model &)=delete
void AddToObjective(double objective)
Variable AddVariable(double lower_bound, double upper_bound, bool is_integer, absl::string_view name="")
Objective AddAuxiliaryObjective(int64_t priority, absl::string_view name={})
bool has_linear_constraint(int64_t id) const
void DeleteAuxiliaryObjective(Objective objective)
ModelStorageCPtr storage() const
void set_objective_priority(Objective objective, int64_t priority)
void set_objective_offset(double value)
absl::Status ApplyUpdateProto(const ModelUpdateProto &update_proto)
int64_t next_sos2_constraint_id() const
std::vector< LinearConstraint > ColumnNonzeros(Variable variable) const
void DeleteLinearConstraint(LinearConstraint constraint)
int64_t num_indicator_constraints() const
std::vector< QuadraticConstraint > QuadraticConstraints() const
Model(const Model &)=delete
void DeleteSos1Constraint(Sos1Constraint constraint)
bool has_second_order_cone_constraint(int64_t id) const
void Minimize(double objective)
std::vector< LinearConstraint > LinearConstraints() const
std::vector< Objective > SortedAuxiliaryObjectives() const
absl_nonnull std::unique_ptr< Model > Clone(std::optional< absl::string_view > new_name=std::nullopt) const
int64_t num_auxiliary_objectives() const
void DeleteIndicatorConstraint(IndicatorConstraint constraint)
Variable AddIntegerVariable(double lower_bound, double upper_bound, absl::string_view name="")
LinearConstraint linear_constraint(int64_t id) const
void set_objective_coefficient(Variable variable, double value)
Variable AddBinaryVariable(absl::string_view name="")
double upper_bound(Variable variable) const
std::vector< Variable > Variables() const
void DeleteSos2Constraint(Sos2Constraint constraint)
std::vector< Variable > NonzeroVariablesInQuadraticObjective() const
bool is_objective_coefficient_nonzero(Variable variable) const
double coefficient(LinearConstraint constraint, Variable variable) const
void set_upper_bound(Variable variable, double upper_bound)
std::vector< Sos2Constraint > Sos2Constraints() const
int64_t next_sos1_constraint_id() const
std::vector< Variable > SortedVariables() const
void set_integer(Variable variable)
Model(absl::string_view name="")
Variable AddContinuousVariable(double lower_bound, double upper_bound, absl::string_view name="")
std::vector< IndicatorConstraint > IndicatorConstraints() const
double objective_coefficient(Variable variable) const
void DeleteVariable(Variable variable)
absl::Status ValidateExistingVariableOfThisModel(Variable variable) const
Objective AddMaximizationObjective(const LinearExpression &expression, int64_t priority, absl::string_view name={})
Objective primary_objective() const
IndicatorConstraint indicator_constraint(int64_t id) const
LinearExpression ObjectiveAsLinearExpression() const
Sos2Constraint sos2_constraint(int64_t id) const
int64_t num_quadratic_constraints() const
bool is_coefficient_nonzero(LinearConstraint constraint, Variable variable) const
QuadraticConstraint quadratic_constraint(int64_t id) const
double objective_offset() const
void SetObjective(double objective, bool is_maximize)
IndicatorConstraint AddIndicatorConstraint(Variable indicator_variable, const BoundedLinearExpression &implied_constraint, bool activate_on_zero=false, absl::string_view name={})
void set_is_integer(Variable variable, bool is_integer)
LinearConstraint AddLinearConstraint(absl::string_view name="")
std::vector< Variable > RowNonzeros(LinearConstraint constraint) const
Sos1Constraint sos1_constraint(int64_t id) const
ObjectiveId typed_id() const
static Objective Primary(ModelStorageCPtr storage)
static Objective Auxiliary(ModelStorageCPtr storage, AuxiliaryObjectiveId id)
SecondOrderConeConstraintId typed_id() const
Sos1ConstraintId typed_id() const
Sos2ConstraintId typed_id() const
constexpr absl::string_view kObjectsFromOtherModelStorage
const ModelStorage *absl_nonnull ModelStorageCPtr
std::vector< ConstraintType > AtomicConstraints(const ModelStorage &storage)
For infeasible and unbounded see Not checked if options check_solutions_if_inf_or_unbounded and the If options first_solution_only is false
ModelStorage *absl_nonnull ModelStoragePtr
ElementId< ElementType::kAuxiliaryObjective > AuxiliaryObjectiveId
std::vector< ConstraintType > SortedAtomicConstraints(const ModelStorage &storage)
ElementId< ElementType::kVariable > VariableId
constexpr ObjectiveId kPrimaryObjectiveId
ElementId< ElementType::kQuadraticConstraint > QuadraticConstraintId
ElementId< ElementType::kLinearConstraint > LinearConstraintId
const ModelStorage *absl_nullable NullableModelStorageCPtr
ElementId< ElementType::kIndicatorConstraint > IndicatorConstraintId
StatusBuilder InvalidArgumentErrorBuilder()