17 #ifndef OR_TOOLS_MATH_OPT_CPP_MODEL_H_
18 #define OR_TOOLS_MATH_OPT_CPP_MODEL_H_
27 #include "absl/status/status.h"
28 #include "absl/status/statusor.h"
29 #include "absl/strings/string_view.h"
30 #include "absl/log/check.h"
42 #include "ortools/math_opt/model.pb.h"
43 #include "ortools/math_opt/model_update.pb.h"
130 explicit Model(absl::string_view
name =
"");
159 std::unique_ptr<Model>
Clone(
160 std::optional<absl::string_view> new_name = std::nullopt)
const;
162 inline const std::string&
name()
const;
180 absl::string_view
name =
"");
185 absl::string_view
name =
"");
268 absl::string_view
name =
"");
375 absl::string_view
name =
"");
403 QuadraticConstraintId
id)
const;
434 const std::vector<LinearExpression>& expressions,
435 std::vector<double> weights = {}, absl::string_view
name =
"");
493 const std::vector<LinearExpression>& expressions,
494 std::vector<double> weights = {}, absl::string_view
name =
"");
553 Variable indicator_variable,
554 const BoundedLinearExpression& implied_constraint,
555 bool activate_on_zero =
false, absl::string_view
name = {});
583 IndicatorConstraintId
id)
const;
598 inline void Maximize(
double objective);
600 inline void Maximize(Variable objective);
602 inline void Maximize(LinearTerm objective);
604 inline void Maximize(
const LinearExpression& objective);
606 inline void Maximize(
const QuadraticExpression& objective);
609 inline void Minimize(
double objective);
611 inline void Minimize(Variable objective);
613 inline void Minimize(LinearTerm objective);
615 inline void Minimize(
const LinearExpression& objective);
617 inline void Minimize(
const QuadraticExpression& objective);
651 Variable second_variable)
const;
662 Variable second_variable,
double value);
672 Variable second_variable)
const;
739 inline void CheckOptionalModel(
const ModelStorage* other_storage)
const;
744 inline void CheckModel(
const ModelStorage* other_storage)
const;
752 const std::shared_ptr<ModelStorage> storage_;
767 const bool is_integer,
768 const absl::string_view
name) {
779 const absl::string_view
name) {
785 const absl::string_view
name) {
813 CHECK(
has_variable(
id)) <<
"No variable with id: " <<
id.value();
868 <<
" is from a different model";
873 <<
" is not found in this model (it was probably deleted)";
875 return absl::OkStatus();
883 const absl::string_view
name) {
889 CheckModel(constraint.
storage());
915 <<
"No linear constraint with id: " <<
id.value();
920 CheckModel(constraint.
storage());
926 CheckModel(constraint.
storage());
932 CheckModel(constraint.
storage());
938 CheckModel(constraint.
storage());
944 CheckModel(constraint.
storage());
954 <<
" is from a different model";
959 <<
" is not found in this model (it was probably deleted)";
961 return absl::OkStatus();
966 CheckModel(constraint.
storage());
974 CheckModel(constraint.
storage());
982 CheckModel(constraint.
storage());
991 CheckModel(constraint.
storage());
1016 const QuadraticConstraintId
id)
const {
1018 <<
"No quadratic constraint with id: " <<
id.value();
1023 return AtomicConstraints<QuadraticConstraint>(*
storage());
1027 return SortedAtomicConstraints<QuadraticConstraint>(*
storage());
1033 CheckModel(constraint.
storage());
1059 <<
"No SOS1 constraint with id: " <<
id.value();
1064 return AtomicConstraints<Sos1Constraint>(*
storage());
1068 return SortedAtomicConstraints<Sos1Constraint>(*
storage());
1074 CheckModel(constraint.
storage());
1100 <<
"No SOS2 constraint with id: " <<
id.value();
1105 return AtomicConstraints<Sos2Constraint>(*
storage());
1109 return SortedAtomicConstraints<Sos2Constraint>(*
storage());
1115 CheckModel(constraint.
storage());
1140 const IndicatorConstraintId
id)
const {
1142 <<
"No indicator constraint with id: " <<
id.value();
1147 return AtomicConstraints<IndicatorConstraint>(*
storage());
1151 return SortedAtomicConstraints<IndicatorConstraint>(*
storage());
1214 const Variable second_variable)
const {
1215 CheckModel(first_variable.
storage());
1216 CheckModel(second_variable.
storage());
1222 const double value) {
1229 const double value) {
1230 CheckModel(first_variable.
storage());
1231 CheckModel(second_variable.
storage());
1246 CheckModel(first_variable.
storage());
1247 CheckModel(second_variable.
storage());
1268 void Model::CheckOptionalModel(
const ModelStorage*
const other_storage)
const {
1269 if (other_storage !=
nullptr) {
1270 CHECK_EQ(other_storage,
storage())
1275 void Model::CheckModel(
const ModelStorage*
const other_storage)
const {
IndicatorConstraintId typed_id() const
const ModelStorage * storage() const
LinearConstraintId typed_id() const
const ModelStorage * storage() const
std::vector< IndicatorConstraint > IndicatorConstraints() const
static absl::StatusOr< std::unique_ptr< Model > > FromModelProto(const ModelProto &model_proto)
void DeleteVariable(Variable variable)
int64_t num_sos2_constraints() const
void DeleteIndicatorConstraint(IndicatorConstraint constraint)
int64_t next_variable_id() const
Variable AddBinaryVariable(absl::string_view name="")
double objective_coefficient(Variable variable) const
std::unique_ptr< Model > Clone(std::optional< absl::string_view > new_name=std::nullopt) const
int64_t num_sos1_constraints() const
LinearConstraint linear_constraint(int64_t id) const
void DeleteQuadraticConstraint(QuadraticConstraint constraint)
std::vector< Sos2Constraint > SortedSos2Constraints() const
const std::string & name() const
Model & operator=(const Model &)=delete
bool has_sos1_constraint(int64_t id) const
absl::Status ValidateExistingVariableOfThisModel(Variable variable) const
int num_linear_constraints() const
double coefficient(LinearConstraint constraint, Variable variable) const
int64_t next_linear_constraint_id() const
double lower_bound(Variable variable) const
void DeleteSos2Constraint(Sos2Constraint constraint)
void SetObjective(double objective, bool is_maximize)
void Minimize(double objective)
std::unique_ptr< UpdateTracker > NewUpdateTracker()
QuadraticConstraint quadratic_constraint(int64_t id) const
LinearExpression ObjectiveAsLinearExpression() const
int64_t num_indicator_constraints() const
Model(absl::string_view name="")
std::vector< LinearConstraint > ColumnNonzeros(Variable variable) const
Variable variable(int64_t id) const
Variable AddIntegerVariable(double lower_bound, double upper_bound, absl::string_view name="")
std::vector< Sos2Constraint > Sos2Constraints() const
std::vector< IndicatorConstraint > SortedIndicatorConstraints() const
int num_variables() const
LinearConstraint AddLinearConstraint(absl::string_view name="")
absl::Status ValidateExistingLinearConstraintOfThisModel(LinearConstraint linear_constraint) const
void DeleteSos1Constraint(Sos1Constraint constraint)
double objective_offset() const
absl::Status ApplyUpdateProto(const ModelUpdateProto &update_proto)
std::vector< QuadraticConstraint > QuadraticConstraints() const
bool has_variable(int64_t id) const
void Maximize(double objective)
void set_coefficient(LinearConstraint constraint, Variable variable, double value)
QuadraticConstraint AddQuadraticConstraint(const BoundedQuadraticExpression &bounded_expr, absl::string_view name="")
bool has_linear_constraint(int64_t id) const
bool is_objective_coefficient_nonzero(Variable variable) const
std::vector< Sos1Constraint > SortedSos1Constraints() const
bool has_quadratic_constraint(int64_t id) const
std::vector< Sos1Constraint > Sos1Constraints() const
void AddToObjective(double objective)
double upper_bound(Variable variable) const
int64_t next_indicator_constraint_id() const
ModelProto ExportModel() const
bool is_coefficient_nonzero(LinearConstraint constraint, Variable variable) const
Sos1Constraint sos1_constraint(int64_t id) const
void set_is_maximize(bool is_maximize)
void set_is_integer(Variable variable, bool is_integer)
int64_t next_sos1_constraint_id() const
bool has_indicator_constraint(int64_t id) const
void set_continuous(Variable variable)
QuadraticExpression ObjectiveAsQuadraticExpression() const
const ModelStorage * storage() const
void DeleteLinearConstraint(LinearConstraint constraint)
std::vector< Variable > Variables() const
void set_upper_bound(Variable variable, double upper_bound)
IndicatorConstraint indicator_constraint(int64_t id) const
bool is_integer(Variable variable) const
Sos1Constraint AddSos1Constraint(const std::vector< LinearExpression > &expressions, std::vector< double > weights={}, absl::string_view name="")
Variable AddContinuousVariable(double lower_bound, double upper_bound, absl::string_view name="")
int64_t next_quadratic_constraint_id() const
void set_lower_bound(Variable variable, double lower_bound)
std::vector< LinearConstraint > LinearConstraints() const
std::vector< Variable > RowNonzeros(LinearConstraint constraint) const
void set_integer(Variable variable)
Sos2Constraint AddSos2Constraint(const std::vector< LinearExpression > &expressions, std::vector< double > weights={}, absl::string_view name="")
std::vector< LinearConstraint > SortedLinearConstraints() const
IndicatorConstraint AddIndicatorConstraint(Variable indicator_variable, const BoundedLinearExpression &implied_constraint, bool activate_on_zero=false, absl::string_view name={})
bool has_sos2_constraint(int64_t id) const
void set_objective_coefficient(Variable variable, double value)
friend std::ostream & operator<<(std::ostream &ostr, const Model &model)
std::vector< QuadraticConstraint > SortedQuadraticConstraints() const
Model(const Model &)=delete
int64_t next_sos2_constraint_id() const
std::vector< Variable > SortedVariables() const
int64_t num_quadratic_constraints() const
Variable AddVariable(double lower_bound, double upper_bound, bool is_integer, absl::string_view name="")
void set_objective_offset(double value)
Sos2Constraint sos2_constraint(int64_t id) const
LinearConstraintId next_linear_constraint_id() const
void set_quadratic_objective_coefficient(VariableId first_variable, VariableId second_variable, double value)
void DeleteVariable(VariableId id)
double linear_objective_coefficient(VariableId variable) const
int num_linear_constraints() const
IdType next_constraint_id() const
double linear_constraint_coefficient(LinearConstraintId constraint, VariableId variable) const
void DeleteLinearConstraint(LinearConstraintId id)
void set_linear_objective_coefficient(VariableId variable, double value)
int num_variables() const
double linear_constraint_lower_bound(LinearConstraintId id) const
bool is_quadratic_objective_coefficient_nonzero(VariableId first_variable, VariableId second_variable) const
double objective_offset() const
void set_linear_constraint_coefficient(LinearConstraintId constraint, VariableId variable, double value)
void set_variable_upper_bound(VariableId id, double upper_bound)
void set_variable_is_integer(VariableId id, bool is_integer)
bool has_linear_constraint(LinearConstraintId id) const
const std::string & variable_name(VariableId id) const
void set_linear_constraint_upper_bound(LinearConstraintId id, double upper_bound)
void set_is_maximize(bool is_maximize)
double quadratic_objective_coefficient(VariableId first_variable, VariableId second_variable) const
void set_linear_constraint_lower_bound(LinearConstraintId id, double lower_bound)
VariableId next_variable_id() const
double linear_constraint_upper_bound(LinearConstraintId id) const
bool has_constraint(IdType id) const
int64_t num_constraints() const
bool has_variable(VariableId id) const
double variable_lower_bound(VariableId id) const
const std::string & name() const
void DeleteAtomicConstraint(IdType id)
bool is_linear_constraint_coefficient_nonzero(LinearConstraintId constraint, VariableId variable) const
bool is_variable_integer(VariableId id) const
const std::string & linear_constraint_name(LinearConstraintId id) const
bool is_linear_objective_coefficient_nonzero(VariableId variable) const
double variable_upper_bound(VariableId id) const
void set_variable_lower_bound(VariableId id, double lower_bound)
void set_objective_offset(double value)
QuadraticConstraintId typed_id() const
const ModelStorage * storage() const
Sos1ConstraintId typed_id() const
const ModelStorage * storage() const
Sos2ConstraintId typed_id() const
const ModelStorage * storage() const
const ModelStorage * storage() const
VariableId typed_id() const
CpModelProto const * model_proto
constexpr absl::string_view kObjectsFromOtherModelStorage
Collection of objects used to extend the Constraint Solver library.
StatusBuilder InvalidArgumentErrorBuilder()