14#ifndef OR_TOOLS_MATH_OPT_STORAGE_MODEL_STORAGE_H_
15#define OR_TOOLS_MATH_OPT_STORAGE_MODEL_STORAGE_H_
17#ifdef MATHOPT_STORAGE_V2
37#include "absl/base/nullability.h"
38#include "absl/container/flat_hash_map.h"
39#include "absl/container/flat_hash_set.h"
40#include "absl/log/check.h"
41#include "absl/status/status.h"
42#include "absl/status/statusor.h"
43#include "absl/strings/string_view.h"
180 static absl::StatusOr<absl::Nonnull<std::unique_ptr<ModelStorage> > >
181 FromModelProto(
const ModelProto& model_proto);
184 inline explicit ModelStorage(absl::string_view model_name =
"",
185 absl::string_view primary_objective_name =
"");
187 ModelStorage& operator=(
const ModelStorage&) =
delete;
195 absl::Nonnull<std::unique_ptr<ModelStorage> > Clone(
196 std::optional<absl::string_view> new_name = std::nullopt)
const;
198 inline const std::string& name()
const {
return copyable_data_.name; }
207 inline VariableId AddVariable(absl::string_view name =
"");
214 VariableId AddVariable(
double lower_bound,
double upper_bound,
215 bool is_integer, absl::string_view name =
"");
217 inline double variable_lower_bound(VariableId
id)
const;
218 inline double variable_upper_bound(VariableId
id)
const;
219 inline bool is_variable_integer(VariableId
id)
const;
220 inline const std::string& variable_name(VariableId
id)
const;
222 inline void set_variable_lower_bound(VariableId
id,
double lower_bound);
223 inline void set_variable_upper_bound(VariableId
id,
double upper_bound);
224 inline void set_variable_is_integer(VariableId
id,
bool is_integer);
225 inline void set_variable_as_integer(VariableId
id);
226 inline void set_variable_as_continuous(VariableId
id);
233 void DeleteVariable(VariableId
id);
239 inline int num_variables()
const;
247 inline void ensure_next_variable_id_at_least(VariableId
id);
250 inline bool has_variable(VariableId
id)
const;
253 std::vector<VariableId> variables()
const;
259 std::vector<VariableId> SortedVariables()
const;
277 absl::string_view name =
"");
279 inline double linear_constraint_lower_bound(LinearConstraintId
id)
const;
280 inline double linear_constraint_upper_bound(LinearConstraintId
id)
const;
281 inline const std::string& linear_constraint_name(LinearConstraintId
id)
const;
283 inline void set_linear_constraint_lower_bound(LinearConstraintId
id,
285 inline void set_linear_constraint_upper_bound(LinearConstraintId
id,
293 void DeleteLinearConstraint(LinearConstraintId
id);
299 inline int num_linear_constraints()
const;
308 inline void ensure_next_linear_constraint_id_at_least(LinearConstraintId
id);
311 inline bool has_linear_constraint(LinearConstraintId
id)
const;
314 std::vector<LinearConstraintId> LinearConstraints()
const;
320 std::vector<LinearConstraintId> SortedLinearConstraints()
const;
327 inline double linear_constraint_coefficient(LinearConstraintId constraint,
328 VariableId variable)
const;
329 inline bool is_linear_constraint_coefficient_nonzero(
330 LinearConstraintId constraint, VariableId variable)
const;
335 inline void set_linear_constraint_coefficient(LinearConstraintId constraint,
341 inline std::vector<std::tuple<LinearConstraintId, VariableId, double> >
342 linear_constraint_matrix()
const;
345 inline std::vector<VariableId> variables_in_linear_constraint(
346 LinearConstraintId constraint)
const;
349 inline std::vector<LinearConstraintId> linear_constraints_with_variable(
350 VariableId variable)
const;
359 inline bool is_maximize(ObjectiveId
id)
const;
360 inline int64_t objective_priority(ObjectiveId
id)
const;
361 inline double objective_offset(ObjectiveId
id)
const;
363 inline double linear_objective_coefficient(ObjectiveId
id,
364 VariableId variable)
const;
366 inline double quadratic_objective_coefficient(
367 ObjectiveId
id, VariableId first_variable,
368 VariableId second_variable)
const;
369 inline bool is_linear_objective_coefficient_nonzero(
370 ObjectiveId
id, VariableId variable)
const;
372 inline bool is_quadratic_objective_coefficient_nonzero(
373 ObjectiveId
id, VariableId first_variable,
374 VariableId second_variable)
const;
375 inline const std::string& objective_name(ObjectiveId
id)
const;
377 inline void set_is_maximize(ObjectiveId
id,
bool is_maximize);
378 inline void set_maximize(ObjectiveId
id);
379 inline void set_minimize(ObjectiveId
id);
380 inline void set_objective_priority(ObjectiveId
id, int64_t value);
381 inline void set_objective_offset(ObjectiveId
id,
double value);
385 inline void set_linear_objective_coefficient(ObjectiveId
id,
391 inline void set_quadratic_objective_coefficient(ObjectiveId
id,
392 VariableId first_variable,
393 VariableId second_variable,
400 inline void clear_objective(ObjectiveId
id);
403 inline const absl::flat_hash_map<VariableId, double>& linear_objective(
404 ObjectiveId
id)
const;
406 inline int64_t num_linear_objective_terms(ObjectiveId
id)
const;
408 inline int64_t num_quadratic_objective_terms(ObjectiveId
id)
const;
414 inline std::vector<std::tuple<VariableId, VariableId, double> >
415 quadratic_objective_terms(ObjectiveId
id)
const;
430 int64_t priority, absl::string_view name =
"");
437 inline void DeleteAuxiliaryObjective(AuxiliaryObjectiveId
id);
443 inline int num_auxiliary_objectives()
const;
452 inline void ensure_next_auxiliary_objective_id_at_least(
453 AuxiliaryObjectiveId
id);
456 inline bool has_auxiliary_objective(AuxiliaryObjectiveId
id)
const;
459 inline std::vector<AuxiliaryObjectiveId> AuxiliaryObjectives()
const;
466 inline std::vector<AuxiliaryObjectiveId> SortedAuxiliaryObjectives()
const;
482 template <
typename Constra
intData>
484 ConstraintData data);
490 template <
typename IdType>
491 inline void DeleteAtomicConstraint(IdType
id);
494 template <
typename IdType>
495 inline const typename AtomicConstraintTraits<IdType>::ConstraintData&
496 constraint_data(IdType
id)
const;
503 template <
typename IdType>
504 inline int64_t num_constraints()
const;
508 template <
typename IdType>
509 inline IdType next_constraint_id()
const;
514 template <
typename IdType>
515 inline void ensure_next_constraint_id_at_least(IdType
id);
518 template <
typename IdType>
519 inline bool has_constraint(IdType
id)
const;
522 template <
typename IdType>
523 std::vector<IdType> Constraints()
const;
529 template <
typename IdType>
530 std::vector<IdType> SortedConstraints()
const;
535 template <
typename IdType>
536 inline std::vector<IdType> ConstraintsWithVariable(
537 VariableId variable_id)
const;
540 template <
typename IdType>
541 inline std::vector<VariableId> VariablesInConstraint(IdType
id)
const;
550 ModelProto ExportModel(
bool remove_names =
false)
const;
595 UpdateTrackerId NewUpdateTracker();
611 void DeleteUpdateTracker(UpdateTrackerId update_tracker);
623 std::optional<ModelUpdateProto> ExportModelUpdate(
624 UpdateTrackerId update_tracker,
bool remove_names =
false)
const;
635 void AdvanceCheckpoint(UpdateTrackerId update_tracker);
645 absl::Status ApplyUpdateProto(
const ModelUpdateProto& update_proto);
648 struct UpdateTrackerData {
650 const VariableStorage& variables,
const ObjectiveStorage& objectives,
651 const LinearConstraintStorage& linear_constraints,
652 const AtomicConstraintStorage<QuadraticConstraintData>&
653 quadratic_constraints,
654 const AtomicConstraintStorage<SecondOrderConeConstraintData>
656 const AtomicConstraintStorage<Sos1ConstraintData>& sos1_constraints,
657 const AtomicConstraintStorage<Sos2ConstraintData>& sos2_constraints,
658 const AtomicConstraintStorage<IndicatorConstraintData>&
659 indicator_constraints)
660 : dirty_variables(variables),
661 dirty_objective(objectives, variables.next_id()),
662 dirty_linear_constraints(linear_constraints,
663 dirty_variables.checkpoint),
664 dirty_quadratic_constraints(quadratic_constraints),
665 dirty_soc_constraints(soc_constraints),
666 dirty_sos1_constraints(sos1_constraints),
667 dirty_sos2_constraints(sos2_constraints),
668 dirty_indicator_constraints(indicator_constraints) {}
674 std::optional<ModelUpdateProto> ExportModelUpdate(
675 const ModelStorage& storage,
bool remove_names =
false)
const;
679 void AdvanceCheckpoint(
const ModelStorage& storage);
683 template <
typename Constra
intData>
684 static constexpr typename AtomicConstraintStorage<ConstraintData>::Diff
686 AtomicConstraintDirtyFieldPtr();
694 VariableStorage::Diff dirty_variables;
695 ObjectiveStorage::Diff dirty_objective;
696 LinearConstraintStorage::Diff dirty_linear_constraints;
697 AtomicConstraintStorage<QuadraticConstraintData>::Diff
698 dirty_quadratic_constraints;
699 AtomicConstraintStorage<SecondOrderConeConstraintData>::Diff
700 dirty_soc_constraints;
701 AtomicConstraintStorage<Sos1ConstraintData>::Diff dirty_sos1_constraints;
702 AtomicConstraintStorage<Sos2ConstraintData>::Diff dirty_sos2_constraints;
703 AtomicConstraintStorage<IndicatorConstraintData>::Diff
704 dirty_indicator_constraints;
709 struct CopyableData {
710 CopyableData(
const absl::string_view model_name,
711 const absl::string_view primary_objective_name)
712 : name(model_name), objectives(primary_objective_name) {}
715 VariableStorage variables;
716 ObjectiveStorage objectives;
717 LinearConstraintStorage linear_constraints;
719 AtomicConstraintStorage<QuadraticConstraintData> quadratic_constraints;
720 AtomicConstraintStorage<SecondOrderConeConstraintData> soc_constraints;
721 AtomicConstraintStorage<Sos1ConstraintData> sos1_constraints;
722 AtomicConstraintStorage<Sos2ConstraintData> sos2_constraints;
723 AtomicConstraintStorage<IndicatorConstraintData> indicator_constraints;
728 ModelStorage(
const ModelStorage& other)
729 : copyable_data_(other.copyable_data_) {}
731 auto UpdateAndGetVariableDiffs() {
732 return MakeUpdateDataFieldRange<&UpdateTrackerData::dirty_variables>(
733 update_trackers_.GetUpdatedTrackers());
736 auto UpdateAndGetObjectiveDiffs() {
737 return MakeUpdateDataFieldRange<&UpdateTrackerData::dirty_objective>(
738 update_trackers_.GetUpdatedTrackers());
741 auto UpdateAndGetLinearConstraintDiffs() {
743 &UpdateTrackerData::dirty_linear_constraints>(
744 update_trackers_.GetUpdatedTrackers());
748 void AddVariables(
const VariablesProto& variables);
751 void AddAuxiliaryObjectives(
752 const google::protobuf::Map<int64_t, ObjectiveProto>& objectives);
755 void AddLinearConstraints(
const LinearConstraintsProto& linear_constraints);
757 void UpdateObjective(ObjectiveId
id,
const ObjectiveUpdatesProto& update);
761 void UpdateLinearObjectiveCoefficients(
762 ObjectiveId
id,
const SparseDoubleVectorProto& coefficients);
766 void UpdateQuadraticObjectiveCoefficients(
767 ObjectiveId
id,
const SparseDoubleMatrixProto& coefficients);
771 void UpdateLinearConstraintCoefficients(
772 const SparseDoubleMatrixProto& coefficients);
776 template <
typename Constra
intData>
777 AtomicConstraintStorage<ConstraintData>& constraint_storage();
781 template <
typename Constra
intData>
782 const AtomicConstraintStorage<ConstraintData>& constraint_storage()
const;
784 CopyableData copyable_data_;
785 UpdateTrackers<UpdateTrackerData> update_trackers_;
794ModelStorage::ModelStorage(
const absl::string_view model_name,
795 const absl::string_view primary_objective_name)
796 : copyable_data_(model_name,
797 primary_objective_name) {}
803VariableId ModelStorage::AddVariable(absl::string_view name) {
804 return AddVariable(-std::numeric_limits<double>::infinity(),
805 std::numeric_limits<double>::infinity(),
false, name);
808double ModelStorage::variable_lower_bound(
const VariableId
id)
const {
809 return copyable_data_.variables.lower_bound(
id);
812double ModelStorage::variable_upper_bound(
const VariableId
id)
const {
813 return copyable_data_.variables.upper_bound(
id);
816bool ModelStorage::is_variable_integer(VariableId
id)
const {
817 return copyable_data_.variables.is_integer(
id);
820const std::string& ModelStorage::variable_name(
const VariableId
id)
const {
821 return copyable_data_.variables.name(
id);
824void ModelStorage::set_variable_lower_bound(
const VariableId
id,
825 const double lower_bound) {
826 copyable_data_.variables.set_lower_bound(
id, lower_bound,
827 UpdateAndGetVariableDiffs());
830void ModelStorage::set_variable_upper_bound(
const VariableId
id,
831 const double upper_bound) {
832 copyable_data_.variables.set_upper_bound(
id, upper_bound,
833 UpdateAndGetVariableDiffs());
836void ModelStorage::set_variable_is_integer(
const VariableId
id,
837 const bool is_integer) {
838 copyable_data_.variables.set_integer(
id, is_integer,
839 UpdateAndGetVariableDiffs());
842void ModelStorage::set_variable_as_integer(VariableId
id) {
843 set_variable_is_integer(
id,
true);
846void ModelStorage::set_variable_as_continuous(VariableId
id) {
847 set_variable_is_integer(
id,
false);
850int ModelStorage::num_variables()
const {
851 return static_cast<int>(copyable_data_.variables.size());
854VariableId ModelStorage::next_variable_id()
const {
855 return copyable_data_.variables.next_id();
858void ModelStorage::ensure_next_variable_id_at_least(
const VariableId
id) {
859 copyable_data_.variables.ensure_next_id_at_least(
id);
862bool ModelStorage::has_variable(
const VariableId
id)
const {
863 return copyable_data_.variables.contains(
id);
871 return AddLinearConstraint(-std::numeric_limits<double>::infinity(),
872 std::numeric_limits<double>::infinity(), name);
875double ModelStorage::linear_constraint_lower_bound(
876 const LinearConstraintId
id)
const {
877 return copyable_data_.linear_constraints.lower_bound(
id);
880double ModelStorage::linear_constraint_upper_bound(
881 const LinearConstraintId
id)
const {
882 return copyable_data_.linear_constraints.upper_bound(
id);
885const std::string& ModelStorage::linear_constraint_name(
886 const LinearConstraintId
id)
const {
887 return copyable_data_.linear_constraints.name(
id);
890void ModelStorage::set_linear_constraint_lower_bound(
891 const LinearConstraintId
id,
const double lower_bound) {
892 copyable_data_.linear_constraints.set_lower_bound(
893 id, lower_bound, UpdateAndGetLinearConstraintDiffs());
896void ModelStorage::set_linear_constraint_upper_bound(
897 const LinearConstraintId
id,
const double upper_bound) {
898 copyable_data_.linear_constraints.set_upper_bound(
899 id, upper_bound, UpdateAndGetLinearConstraintDiffs());
902int ModelStorage::num_linear_constraints()
const {
903 return static_cast<int>(copyable_data_.linear_constraints.size());
907 return copyable_data_.linear_constraints.next_id();
910void ModelStorage::ensure_next_linear_constraint_id_at_least(
911 LinearConstraintId
id) {
912 copyable_data_.linear_constraints.ensure_next_id_at_least(
id);
915bool ModelStorage::has_linear_constraint(
const LinearConstraintId
id)
const {
916 return copyable_data_.linear_constraints.contains(
id);
923double ModelStorage::linear_constraint_coefficient(
924 LinearConstraintId constraint, VariableId variable)
const {
925 return copyable_data_.linear_constraints.matrix().get(constraint, variable);
928bool ModelStorage::is_linear_constraint_coefficient_nonzero(
929 LinearConstraintId constraint, VariableId variable)
const {
930 return copyable_data_.linear_constraints.matrix().contains(constraint,
934void ModelStorage::set_linear_constraint_coefficient(
935 const LinearConstraintId constraint,
const VariableId variable,
936 const double value) {
937 copyable_data_.linear_constraints.set_term(
938 constraint, variable, value, UpdateAndGetLinearConstraintDiffs());
941std::vector<std::tuple<LinearConstraintId, VariableId, double> >
942ModelStorage::linear_constraint_matrix()
const {
943 return copyable_data_.linear_constraints.matrix().Terms();
946std::vector<VariableId> ModelStorage::variables_in_linear_constraint(
947 LinearConstraintId constraint)
const {
948 return copyable_data_.linear_constraints.matrix().row(constraint);
951std::vector<LinearConstraintId> ModelStorage::linear_constraints_with_variable(
952 VariableId variable)
const {
953 return copyable_data_.linear_constraints.matrix().column(variable);
960bool ModelStorage::is_maximize(
const ObjectiveId
id)
const {
961 return copyable_data_.objectives.maximize(
id);
964int64_t ModelStorage::objective_priority(
const ObjectiveId
id)
const {
965 return copyable_data_.objectives.priority(
id);
968double ModelStorage::objective_offset(
const ObjectiveId
id)
const {
969 return copyable_data_.objectives.offset(
id);
972double ModelStorage::linear_objective_coefficient(
973 const ObjectiveId
id,
const VariableId variable)
const {
974 return copyable_data_.objectives.linear_term(
id, variable);
977double ModelStorage::quadratic_objective_coefficient(
978 const ObjectiveId
id,
const VariableId first_variable,
979 const VariableId second_variable)
const {
980 return copyable_data_.objectives.quadratic_term(
id, first_variable,
984bool ModelStorage::is_linear_objective_coefficient_nonzero(
985 const ObjectiveId
id,
const VariableId variable)
const {
986 return copyable_data_.objectives.linear_terms(
id).contains(variable);
989bool ModelStorage::is_quadratic_objective_coefficient_nonzero(
990 const ObjectiveId
id,
const VariableId first_variable,
991 const VariableId second_variable)
const {
992 return copyable_data_.objectives.quadratic_terms(
id).get(
993 first_variable, second_variable) != 0.0;
996const std::string& ModelStorage::objective_name(
const ObjectiveId
id)
const {
997 return copyable_data_.objectives.name(
id);
1000void ModelStorage::set_is_maximize(
const ObjectiveId
id,
1001 const bool is_maximize) {
1002 copyable_data_.objectives.set_maximize(
id, is_maximize,
1003 UpdateAndGetObjectiveDiffs());
1006void ModelStorage::set_maximize(
const ObjectiveId
id) {
1007 set_is_maximize(
id,
true);
1010void ModelStorage::set_minimize(
const ObjectiveId
id) {
1011 set_is_maximize(
id,
false);
1014void ModelStorage::set_objective_priority(
const ObjectiveId
id,
1015 const int64_t value) {
1016 copyable_data_.objectives.set_priority(
id, value,
1017 UpdateAndGetObjectiveDiffs());
1020void ModelStorage::set_objective_offset(
const ObjectiveId
id,
1021 const double value) {
1022 copyable_data_.objectives.set_offset(
id, value, UpdateAndGetObjectiveDiffs());
1025void ModelStorage::set_linear_objective_coefficient(
const ObjectiveId
id,
1026 const VariableId variable,
1027 const double value) {
1028 copyable_data_.objectives.set_linear_term(
id, variable, value,
1029 UpdateAndGetObjectiveDiffs());
1032void ModelStorage::set_quadratic_objective_coefficient(
1033 const ObjectiveId
id,
const VariableId first_variable,
1034 const VariableId second_variable,
const double value) {
1035 copyable_data_.objectives.set_quadratic_term(
1036 id, first_variable, second_variable, value, UpdateAndGetObjectiveDiffs());
1039void ModelStorage::clear_objective(
const ObjectiveId
id) {
1040 copyable_data_.objectives.Clear(
id, UpdateAndGetObjectiveDiffs());
1043const absl::flat_hash_map<VariableId, double>& ModelStorage::linear_objective(
1044 const ObjectiveId
id)
const {
1045 return copyable_data_.objectives.linear_terms(
id);
1048int64_t ModelStorage::num_linear_objective_terms(
const ObjectiveId
id)
const {
1049 return copyable_data_.objectives.linear_terms(
id).size();
1052int64_t ModelStorage::num_quadratic_objective_terms(
1053 const ObjectiveId
id)
const {
1054 return copyable_data_.objectives.quadratic_terms(
id).nonzeros();
1057std::vector<std::tuple<VariableId, VariableId, double> >
1058ModelStorage::quadratic_objective_terms(
const ObjectiveId
id)
const {
1059 return copyable_data_.objectives.quadratic_terms(
id).Terms();
1067 const int64_t priority,
const absl::string_view name) {
1068 return copyable_data_.objectives.AddAuxiliaryObjective(priority, name);
1071void ModelStorage::DeleteAuxiliaryObjective(
const AuxiliaryObjectiveId
id) {
1072 copyable_data_.objectives.Delete(
id, UpdateAndGetObjectiveDiffs());
1075int ModelStorage::num_auxiliary_objectives()
const {
1076 return static_cast<int>(copyable_data_.objectives.num_auxiliary_objectives());
1080 return copyable_data_.objectives.next_id();
1083void ModelStorage::ensure_next_auxiliary_objective_id_at_least(
1084 const AuxiliaryObjectiveId
id) {
1085 copyable_data_.objectives.ensure_next_id_at_least(
id);
1088bool ModelStorage::has_auxiliary_objective(
1089 const AuxiliaryObjectiveId
id)
const {
1090 return copyable_data_.objectives.contains(
id);
1093std::vector<AuxiliaryObjectiveId> ModelStorage::AuxiliaryObjectives()
const {
1094 return copyable_data_.objectives.AuxiliaryObjectives();
1097std::vector<AuxiliaryObjectiveId> ModelStorage::SortedAuxiliaryObjectives()
1099 return copyable_data_.objectives.SortedAuxiliaryObjectives();
1106template <
typename Constra
intData>
1107typename ConstraintData::IdType ModelStorage::AddAtomicConstraint(
1108 ConstraintData data) {
1109 return constraint_storage<ConstraintData>().AddConstraint(data);
1112template <
typename IdType>
1113void ModelStorage::DeleteAtomicConstraint(
const IdType
id) {
1114 using ConstraintData =
1115 typename AtomicConstraintTraits<IdType>::ConstraintData;
1116 auto& storage = constraint_storage<ConstraintData>();
1117 CHECK(storage.contains(
id));
1120 MakeUpdateDataFieldRange<
1121 UpdateTrackerData::AtomicConstraintDirtyFieldPtr<ConstraintData>()>(
1122 update_trackers_.GetUpdatedTrackers()));
1125template <
typename IdType>
1126const typename AtomicConstraintTraits<IdType>::ConstraintData&
1127ModelStorage::constraint_data(
const IdType
id)
const {
1128 using ConstraintData =
1129 typename AtomicConstraintTraits<IdType>::ConstraintData;
1130 return constraint_storage<ConstraintData>().data(
id);
1133template <
typename IdType>
1134int64_t ModelStorage::num_constraints()
const {
1135 using ConstraintData =
1136 typename AtomicConstraintTraits<IdType>::ConstraintData;
1137 return constraint_storage<ConstraintData>().size();
1140template <
typename IdType>
1141IdType ModelStorage::next_constraint_id()
const {
1142 using ConstraintData =
1143 typename AtomicConstraintTraits<IdType>::ConstraintData;
1144 return constraint_storage<ConstraintData>().next_id();
1147template <
typename IdType>
1148void ModelStorage::ensure_next_constraint_id_at_least(
const IdType
id) {
1149 using ConstraintData =
1150 typename AtomicConstraintTraits<IdType>::ConstraintData;
1151 return constraint_storage<ConstraintData>().ensure_next_id_at_least(
id);
1154template <
typename IdType>
1155bool ModelStorage::has_constraint(
const IdType
id)
const {
1156 using ConstraintData =
1157 typename AtomicConstraintTraits<IdType>::ConstraintData;
1158 return constraint_storage<ConstraintData>().contains(
id);
1161template <
typename IdType>
1162std::vector<IdType> ModelStorage::Constraints()
const {
1163 using ConstraintData =
1164 typename AtomicConstraintTraits<IdType>::ConstraintData;
1165 return constraint_storage<ConstraintData>().Constraints();
1168template <
typename IdType>
1169std::vector<IdType> ModelStorage::SortedConstraints()
const {
1170 using ConstraintData =
1171 typename AtomicConstraintTraits<IdType>::ConstraintData;
1172 return constraint_storage<ConstraintData>().SortedConstraints();
1175template <
typename IdType>
1176std::vector<IdType> ModelStorage::ConstraintsWithVariable(
1177 const VariableId variable_id)
const {
1178 using ConstraintData =
1179 typename AtomicConstraintTraits<IdType>::ConstraintData;
1180 const absl::flat_hash_set<IdType> constraints =
1181 constraint_storage<ConstraintData>().RelatedConstraints(variable_id);
1182 return {constraints.begin(), constraints.end()};
1185template <
typename IdType>
1186std::vector<VariableId> ModelStorage::VariablesInConstraint(
1187 const IdType
id)
const {
1188 return constraint_data(
id).RelatedVariables();
1198inline AtomicConstraintStorage<QuadraticConstraintData>&
1199ModelStorage::constraint_storage() {
1200 return copyable_data_.quadratic_constraints;
1204inline const AtomicConstraintStorage<QuadraticConstraintData>&
1205ModelStorage::constraint_storage()
const {
1206 return copyable_data_.quadratic_constraints;
1210constexpr typename AtomicConstraintStorage<QuadraticConstraintData>::Diff
1211 ModelStorage::UpdateTrackerData::*
1212 ModelStorage::UpdateTrackerData::AtomicConstraintDirtyFieldPtr<
1213 QuadraticConstraintData>() {
1214 return &UpdateTrackerData::dirty_quadratic_constraints;
1220inline AtomicConstraintStorage<SecondOrderConeConstraintData>&
1221ModelStorage::constraint_storage() {
1222 return copyable_data_.soc_constraints;
1226inline const AtomicConstraintStorage<SecondOrderConeConstraintData>&
1227ModelStorage::constraint_storage()
const {
1228 return copyable_data_.soc_constraints;
1232constexpr typename AtomicConstraintStorage<SecondOrderConeConstraintData>::Diff
1233 ModelStorage::UpdateTrackerData::*
1234 ModelStorage::UpdateTrackerData::AtomicConstraintDirtyFieldPtr<
1235 SecondOrderConeConstraintData>() {
1236 return &UpdateTrackerData::dirty_soc_constraints;
1242inline AtomicConstraintStorage<Sos1ConstraintData>&
1243ModelStorage::constraint_storage() {
1244 return copyable_data_.sos1_constraints;
1248inline const AtomicConstraintStorage<Sos1ConstraintData>&
1249ModelStorage::constraint_storage()
const {
1250 return copyable_data_.sos1_constraints;
1254constexpr typename AtomicConstraintStorage<Sos1ConstraintData>::Diff
1255 ModelStorage::UpdateTrackerData::*
1256 ModelStorage::UpdateTrackerData::AtomicConstraintDirtyFieldPtr<
1258 return &UpdateTrackerData::dirty_sos1_constraints;
1264inline AtomicConstraintStorage<Sos2ConstraintData>&
1265ModelStorage::constraint_storage() {
1266 return copyable_data_.sos2_constraints;
1270inline const AtomicConstraintStorage<Sos2ConstraintData>&
1271ModelStorage::constraint_storage()
const {
1272 return copyable_data_.sos2_constraints;
1276constexpr typename AtomicConstraintStorage<Sos2ConstraintData>::Diff
1277 ModelStorage::UpdateTrackerData::*
1278 ModelStorage::UpdateTrackerData::AtomicConstraintDirtyFieldPtr<
1280 return &UpdateTrackerData::dirty_sos2_constraints;
1286inline AtomicConstraintStorage<IndicatorConstraintData>&
1287ModelStorage::constraint_storage() {
1288 return copyable_data_.indicator_constraints;
1292inline const AtomicConstraintStorage<IndicatorConstraintData>&
1293ModelStorage::constraint_storage()
const {
1294 return copyable_data_.indicator_constraints;
1298constexpr typename AtomicConstraintStorage<IndicatorConstraintData>::Diff
1299 ModelStorage::UpdateTrackerData::*
1300 ModelStorage::UpdateTrackerData::AtomicConstraintDirtyFieldPtr<
1301 IndicatorConstraintData>() {
1302 return &UpdateTrackerData::dirty_indicator_constraints;
ConstraintData::IdType AddAtomicConstraint(const ConstraintData &data, Elemental &elemental)
An object oriented wrapper for quadratic constraints in ModelStorage.
absl::Nonnull< const ModelStorage * > ModelStorageCPtr
ElementId< ElementType::kAuxiliaryObjective > AuxiliaryObjectiveId
internal::SosConstraintData< Sos1ConstraintId > Sos1ConstraintData
ElementId< ElementType::kVariable > VariableId
absl::Nonnull< ModelStorage * > ModelStoragePtr
ElementId< ElementType::kLinearConstraint > LinearConstraintId
auto MakeUpdateDataFieldRange(const UpdateTrackers &trackers)
absl::Nullable< ModelStorage * > NullableModelStoragePtr
internal::SosConstraintData< Sos2ConstraintId > Sos2ConstraintData
absl::Nullable< const ModelStorage * > NullableModelStorageCPtr
In SWIG mode, we don't want anything besides these top-level includes.