14#ifndef ORTOOLS_MATH_OPT_STORAGE_MODEL_STORAGE_H_
15#define ORTOOLS_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"
177 static absl::StatusOr<absl_nonnull std::unique_ptr<ModelStorage> >
178 FromModelProto(
const ModelProto& model_proto);
181 inline explicit ModelStorage(absl::string_view model_name =
"",
182 absl::string_view primary_objective_name =
"");
184 ModelStorage& operator=(
const ModelStorage&) =
delete;
192 absl_nonnull std::unique_ptr<ModelStorage> Clone(
193 std::optional<absl::string_view> new_name = std::nullopt)
const;
195 inline const std::string& name()
const {
return copyable_data_.name; }
204 inline VariableId AddVariable(absl::string_view name =
"");
211 VariableId AddVariable(
double lower_bound,
double upper_bound,
212 bool is_integer, absl::string_view name =
"");
214 inline double variable_lower_bound(VariableId
id)
const;
215 inline double variable_upper_bound(VariableId
id)
const;
216 inline bool is_variable_integer(VariableId
id)
const;
217 inline const std::string& variable_name(VariableId
id)
const;
219 inline void set_variable_lower_bound(VariableId
id,
double lower_bound);
220 inline void set_variable_upper_bound(VariableId
id,
double upper_bound);
221 inline void set_variable_is_integer(VariableId
id,
bool is_integer);
222 inline void set_variable_as_integer(VariableId
id);
223 inline void set_variable_as_continuous(VariableId
id);
230 void DeleteVariable(VariableId
id);
236 inline int num_variables()
const;
244 inline void ensure_next_variable_id_at_least(VariableId
id);
247 inline bool has_variable(VariableId
id)
const;
250 std::vector<VariableId> variables()
const;
256 std::vector<VariableId> SortedVariables()
const;
274 absl::string_view name =
"");
276 inline double linear_constraint_lower_bound(LinearConstraintId
id)
const;
277 inline double linear_constraint_upper_bound(LinearConstraintId
id)
const;
278 inline const std::string& linear_constraint_name(LinearConstraintId
id)
const;
280 inline void set_linear_constraint_lower_bound(LinearConstraintId
id,
282 inline void set_linear_constraint_upper_bound(LinearConstraintId
id,
290 void DeleteLinearConstraint(LinearConstraintId
id);
296 inline int num_linear_constraints()
const;
305 inline void ensure_next_linear_constraint_id_at_least(LinearConstraintId
id);
308 inline bool has_linear_constraint(LinearConstraintId
id)
const;
311 std::vector<LinearConstraintId> LinearConstraints()
const;
317 std::vector<LinearConstraintId> SortedLinearConstraints()
const;
324 inline double linear_constraint_coefficient(LinearConstraintId constraint,
325 VariableId variable)
const;
326 inline bool is_linear_constraint_coefficient_nonzero(
327 LinearConstraintId constraint, VariableId variable)
const;
332 inline void set_linear_constraint_coefficient(LinearConstraintId constraint,
338 inline std::vector<std::tuple<LinearConstraintId, VariableId, double> >
339 linear_constraint_matrix()
const;
342 inline std::vector<VariableId> variables_in_linear_constraint(
343 LinearConstraintId constraint)
const;
346 inline std::vector<LinearConstraintId> linear_constraints_with_variable(
347 VariableId variable)
const;
356 inline bool is_maximize(ObjectiveId
id)
const;
357 inline int64_t objective_priority(ObjectiveId
id)
const;
358 inline double objective_offset(ObjectiveId
id)
const;
360 inline double linear_objective_coefficient(ObjectiveId
id,
361 VariableId variable)
const;
363 inline double quadratic_objective_coefficient(
364 ObjectiveId
id, VariableId first_variable,
365 VariableId second_variable)
const;
366 inline bool is_linear_objective_coefficient_nonzero(
367 ObjectiveId
id, VariableId variable)
const;
369 inline bool is_quadratic_objective_coefficient_nonzero(
370 ObjectiveId
id, VariableId first_variable,
371 VariableId second_variable)
const;
372 inline const std::string& objective_name(ObjectiveId
id)
const;
374 inline void set_is_maximize(ObjectiveId
id,
bool is_maximize);
375 inline void set_maximize(ObjectiveId
id);
376 inline void set_minimize(ObjectiveId
id);
377 inline void set_objective_priority(ObjectiveId
id, int64_t value);
378 inline void set_objective_offset(ObjectiveId
id,
double value);
382 inline void set_linear_objective_coefficient(ObjectiveId
id,
388 inline void set_quadratic_objective_coefficient(ObjectiveId
id,
389 VariableId first_variable,
390 VariableId second_variable,
397 inline void clear_objective(ObjectiveId
id);
400 inline const absl::flat_hash_map<VariableId, double>& linear_objective(
401 ObjectiveId
id)
const;
403 inline int64_t num_linear_objective_terms(ObjectiveId
id)
const;
405 inline int64_t num_quadratic_objective_terms(ObjectiveId
id)
const;
411 inline std::vector<std::tuple<VariableId, VariableId, double> >
412 quadratic_objective_terms(ObjectiveId
id)
const;
427 int64_t priority, absl::string_view name =
"");
434 inline void DeleteAuxiliaryObjective(AuxiliaryObjectiveId
id);
440 inline int num_auxiliary_objectives()
const;
449 inline void ensure_next_auxiliary_objective_id_at_least(
450 AuxiliaryObjectiveId
id);
453 inline bool has_auxiliary_objective(AuxiliaryObjectiveId
id)
const;
456 inline std::vector<AuxiliaryObjectiveId> AuxiliaryObjectives()
const;
463 inline std::vector<AuxiliaryObjectiveId> SortedAuxiliaryObjectives()
const;
479 template <
typename Constra
intData>
481 ConstraintData data);
487 template <
typename IdType>
488 inline void DeleteAtomicConstraint(IdType
id);
491 template <
typename IdType>
492 inline const typename AtomicConstraintTraits<IdType>::ConstraintData&
493 constraint_data(IdType
id)
const;
500 template <
typename IdType>
501 inline int64_t num_constraints()
const;
505 template <
typename IdType>
506 inline IdType next_constraint_id()
const;
511 template <
typename IdType>
512 inline void ensure_next_constraint_id_at_least(IdType
id);
515 template <
typename IdType>
516 inline bool has_constraint(IdType
id)
const;
519 template <
typename IdType>
520 std::vector<IdType> Constraints()
const;
526 template <
typename IdType>
527 std::vector<IdType> SortedConstraints()
const;
532 template <
typename IdType>
533 inline std::vector<IdType> ConstraintsWithVariable(
534 VariableId variable_id)
const;
537 template <
typename IdType>
538 inline std::vector<VariableId> VariablesInConstraint(IdType
id)
const;
547 ModelProto ExportModel(
bool remove_names =
false)
const;
592 UpdateTrackerId NewUpdateTracker();
608 void DeleteUpdateTracker(UpdateTrackerId update_tracker);
620 std::optional<ModelUpdateProto> ExportModelUpdate(
621 UpdateTrackerId update_tracker,
bool remove_names =
false)
const;
632 void AdvanceCheckpoint(UpdateTrackerId update_tracker);
642 absl::Status ApplyUpdateProto(
const ModelUpdateProto& update_proto);
645 struct UpdateTrackerData {
647 const VariableStorage& variables,
const ObjectiveStorage& objectives,
648 const LinearConstraintStorage& linear_constraints,
649 const AtomicConstraintStorage<QuadraticConstraintData>&
650 quadratic_constraints,
651 const AtomicConstraintStorage<SecondOrderConeConstraintData>
653 const AtomicConstraintStorage<Sos1ConstraintData>& sos1_constraints,
654 const AtomicConstraintStorage<Sos2ConstraintData>& sos2_constraints,
655 const AtomicConstraintStorage<IndicatorConstraintData>&
656 indicator_constraints)
657 : dirty_variables(variables),
658 dirty_objective(objectives, variables.next_id()),
659 dirty_linear_constraints(linear_constraints,
660 dirty_variables.checkpoint),
661 dirty_quadratic_constraints(quadratic_constraints),
662 dirty_soc_constraints(soc_constraints),
663 dirty_sos1_constraints(sos1_constraints),
664 dirty_sos2_constraints(sos2_constraints),
665 dirty_indicator_constraints(indicator_constraints) {}
671 std::optional<ModelUpdateProto> ExportModelUpdate(
672 const ModelStorage& storage,
bool remove_names =
false)
const;
676 void AdvanceCheckpoint(
const ModelStorage& storage);
680 template <
typename Constra
intData>
681 static constexpr typename AtomicConstraintStorage<ConstraintData>::Diff
682 UpdateTrackerData::* absl_nonnull
683 AtomicConstraintDirtyFieldPtr();
691 VariableStorage::Diff dirty_variables;
692 ObjectiveStorage::Diff dirty_objective;
693 LinearConstraintStorage::Diff dirty_linear_constraints;
694 AtomicConstraintStorage<QuadraticConstraintData>::Diff
695 dirty_quadratic_constraints;
696 AtomicConstraintStorage<SecondOrderConeConstraintData>::Diff
697 dirty_soc_constraints;
698 AtomicConstraintStorage<Sos1ConstraintData>::Diff dirty_sos1_constraints;
699 AtomicConstraintStorage<Sos2ConstraintData>::Diff dirty_sos2_constraints;
700 AtomicConstraintStorage<IndicatorConstraintData>::Diff
701 dirty_indicator_constraints;
706 struct CopyableData {
707 CopyableData(
const absl::string_view model_name,
708 const absl::string_view primary_objective_name)
709 : name(model_name), objectives(primary_objective_name) {}
712 VariableStorage variables;
713 ObjectiveStorage objectives;
714 LinearConstraintStorage linear_constraints;
716 AtomicConstraintStorage<QuadraticConstraintData> quadratic_constraints;
717 AtomicConstraintStorage<SecondOrderConeConstraintData> soc_constraints;
718 AtomicConstraintStorage<Sos1ConstraintData> sos1_constraints;
719 AtomicConstraintStorage<Sos2ConstraintData> sos2_constraints;
720 AtomicConstraintStorage<IndicatorConstraintData> indicator_constraints;
725 ModelStorage(
const ModelStorage& other)
726 : copyable_data_(other.copyable_data_) {}
728 auto UpdateAndGetVariableDiffs() {
729 return MakeUpdateDataFieldRange<&UpdateTrackerData::dirty_variables>(
730 update_trackers_.GetUpdatedTrackers());
733 auto UpdateAndGetObjectiveDiffs() {
734 return MakeUpdateDataFieldRange<&UpdateTrackerData::dirty_objective>(
735 update_trackers_.GetUpdatedTrackers());
738 auto UpdateAndGetLinearConstraintDiffs() {
740 &UpdateTrackerData::dirty_linear_constraints>(
741 update_trackers_.GetUpdatedTrackers());
745 void AddVariables(
const VariablesProto& variables);
748 void AddAuxiliaryObjectives(
749 const google::protobuf::Map<int64_t, ObjectiveProto>& objectives);
752 void AddLinearConstraints(
const LinearConstraintsProto& linear_constraints);
754 void UpdateObjective(ObjectiveId
id,
const ObjectiveUpdatesProto& update);
758 void UpdateLinearObjectiveCoefficients(
759 ObjectiveId
id,
const SparseDoubleVectorProto& coefficients);
763 void UpdateQuadraticObjectiveCoefficients(
764 ObjectiveId
id,
const SparseDoubleMatrixProto& coefficients);
768 void UpdateLinearConstraintCoefficients(
769 const SparseDoubleMatrixProto& coefficients);
773 template <
typename Constra
intData>
774 AtomicConstraintStorage<ConstraintData>& constraint_storage();
778 template <
typename Constra
intData>
779 const AtomicConstraintStorage<ConstraintData>& constraint_storage()
const;
781 CopyableData copyable_data_;
782 UpdateTrackers<UpdateTrackerData> update_trackers_;
791ModelStorage::ModelStorage(
const absl::string_view model_name,
792 const absl::string_view primary_objective_name)
793 : copyable_data_(model_name,
794 primary_objective_name) {}
800VariableId ModelStorage::AddVariable(absl::string_view name) {
801 return AddVariable(-std::numeric_limits<double>::infinity(),
802 std::numeric_limits<double>::infinity(),
false, name);
805double ModelStorage::variable_lower_bound(
const VariableId
id)
const {
806 return copyable_data_.variables.lower_bound(
id);
809double ModelStorage::variable_upper_bound(
const VariableId
id)
const {
810 return copyable_data_.variables.upper_bound(
id);
813bool ModelStorage::is_variable_integer(VariableId
id)
const {
814 return copyable_data_.variables.is_integer(
id);
817const std::string& ModelStorage::variable_name(
const VariableId
id)
const {
818 return copyable_data_.variables.name(
id);
821void ModelStorage::set_variable_lower_bound(
const VariableId
id,
822 const double lower_bound) {
823 copyable_data_.variables.set_lower_bound(
id, lower_bound,
824 UpdateAndGetVariableDiffs());
827void ModelStorage::set_variable_upper_bound(
const VariableId
id,
828 const double upper_bound) {
829 copyable_data_.variables.set_upper_bound(
id, upper_bound,
830 UpdateAndGetVariableDiffs());
833void ModelStorage::set_variable_is_integer(
const VariableId
id,
834 const bool is_integer) {
835 copyable_data_.variables.set_integer(
id, is_integer,
836 UpdateAndGetVariableDiffs());
839void ModelStorage::set_variable_as_integer(VariableId
id) {
840 set_variable_is_integer(
id,
true);
843void ModelStorage::set_variable_as_continuous(VariableId
id) {
844 set_variable_is_integer(
id,
false);
847int ModelStorage::num_variables()
const {
848 return static_cast<int>(copyable_data_.variables.size());
851VariableId ModelStorage::next_variable_id()
const {
852 return copyable_data_.variables.next_id();
855void ModelStorage::ensure_next_variable_id_at_least(
const VariableId
id) {
856 copyable_data_.variables.ensure_next_id_at_least(
id);
859bool ModelStorage::has_variable(
const VariableId
id)
const {
860 return copyable_data_.variables.contains(
id);
868 return AddLinearConstraint(-std::numeric_limits<double>::infinity(),
869 std::numeric_limits<double>::infinity(), name);
872double ModelStorage::linear_constraint_lower_bound(
873 const LinearConstraintId
id)
const {
874 return copyable_data_.linear_constraints.lower_bound(
id);
877double ModelStorage::linear_constraint_upper_bound(
878 const LinearConstraintId
id)
const {
879 return copyable_data_.linear_constraints.upper_bound(
id);
882const std::string& ModelStorage::linear_constraint_name(
883 const LinearConstraintId
id)
const {
884 return copyable_data_.linear_constraints.name(
id);
887void ModelStorage::set_linear_constraint_lower_bound(
888 const LinearConstraintId
id,
const double lower_bound) {
889 copyable_data_.linear_constraints.set_lower_bound(
890 id, lower_bound, UpdateAndGetLinearConstraintDiffs());
893void ModelStorage::set_linear_constraint_upper_bound(
894 const LinearConstraintId
id,
const double upper_bound) {
895 copyable_data_.linear_constraints.set_upper_bound(
896 id, upper_bound, UpdateAndGetLinearConstraintDiffs());
899int ModelStorage::num_linear_constraints()
const {
900 return static_cast<int>(copyable_data_.linear_constraints.size());
904 return copyable_data_.linear_constraints.next_id();
907void ModelStorage::ensure_next_linear_constraint_id_at_least(
908 LinearConstraintId
id) {
909 copyable_data_.linear_constraints.ensure_next_id_at_least(
id);
912bool ModelStorage::has_linear_constraint(
const LinearConstraintId
id)
const {
913 return copyable_data_.linear_constraints.contains(
id);
920double ModelStorage::linear_constraint_coefficient(
921 LinearConstraintId constraint, VariableId variable)
const {
922 return copyable_data_.linear_constraints.matrix().get(constraint, variable);
925bool ModelStorage::is_linear_constraint_coefficient_nonzero(
926 LinearConstraintId constraint, VariableId variable)
const {
927 return copyable_data_.linear_constraints.matrix().contains(constraint,
931void ModelStorage::set_linear_constraint_coefficient(
932 const LinearConstraintId constraint,
const VariableId variable,
933 const double value) {
934 copyable_data_.linear_constraints.set_term(
935 constraint, variable, value, UpdateAndGetLinearConstraintDiffs());
938std::vector<std::tuple<LinearConstraintId, VariableId, double> >
939ModelStorage::linear_constraint_matrix()
const {
940 return copyable_data_.linear_constraints.matrix().Terms();
943std::vector<VariableId> ModelStorage::variables_in_linear_constraint(
944 LinearConstraintId constraint)
const {
945 return copyable_data_.linear_constraints.matrix().row(constraint);
948std::vector<LinearConstraintId> ModelStorage::linear_constraints_with_variable(
949 VariableId variable)
const {
950 return copyable_data_.linear_constraints.matrix().column(variable);
957bool ModelStorage::is_maximize(
const ObjectiveId
id)
const {
958 return copyable_data_.objectives.maximize(
id);
961int64_t ModelStorage::objective_priority(
const ObjectiveId
id)
const {
962 return copyable_data_.objectives.priority(
id);
965double ModelStorage::objective_offset(
const ObjectiveId
id)
const {
966 return copyable_data_.objectives.offset(
id);
969double ModelStorage::linear_objective_coefficient(
970 const ObjectiveId
id,
const VariableId variable)
const {
971 return copyable_data_.objectives.linear_term(
id, variable);
974double ModelStorage::quadratic_objective_coefficient(
975 const ObjectiveId
id,
const VariableId first_variable,
976 const VariableId second_variable)
const {
977 return copyable_data_.objectives.quadratic_term(
id, first_variable,
981bool ModelStorage::is_linear_objective_coefficient_nonzero(
982 const ObjectiveId
id,
const VariableId variable)
const {
983 return copyable_data_.objectives.linear_terms(
id).contains(variable);
986bool ModelStorage::is_quadratic_objective_coefficient_nonzero(
987 const ObjectiveId
id,
const VariableId first_variable,
988 const VariableId second_variable)
const {
989 return copyable_data_.objectives.quadratic_terms(
id).get(
990 first_variable, second_variable) != 0.0;
993const std::string& ModelStorage::objective_name(
const ObjectiveId
id)
const {
994 return copyable_data_.objectives.name(
id);
997void ModelStorage::set_is_maximize(
const ObjectiveId
id,
998 const bool is_maximize) {
999 copyable_data_.objectives.set_maximize(
id, is_maximize,
1000 UpdateAndGetObjectiveDiffs());
1003void ModelStorage::set_maximize(
const ObjectiveId
id) {
1004 set_is_maximize(
id,
true);
1007void ModelStorage::set_minimize(
const ObjectiveId
id) {
1008 set_is_maximize(
id,
false);
1011void ModelStorage::set_objective_priority(
const ObjectiveId
id,
1012 const int64_t value) {
1013 copyable_data_.objectives.set_priority(
id, value,
1014 UpdateAndGetObjectiveDiffs());
1017void ModelStorage::set_objective_offset(
const ObjectiveId
id,
1018 const double value) {
1019 copyable_data_.objectives.set_offset(
id, value, UpdateAndGetObjectiveDiffs());
1022void ModelStorage::set_linear_objective_coefficient(
const ObjectiveId
id,
1023 const VariableId variable,
1024 const double value) {
1025 copyable_data_.objectives.set_linear_term(
id, variable, value,
1026 UpdateAndGetObjectiveDiffs());
1029void ModelStorage::set_quadratic_objective_coefficient(
1030 const ObjectiveId
id,
const VariableId first_variable,
1031 const VariableId second_variable,
const double value) {
1032 copyable_data_.objectives.set_quadratic_term(
1033 id, first_variable, second_variable, value, UpdateAndGetObjectiveDiffs());
1036void ModelStorage::clear_objective(
const ObjectiveId
id) {
1037 copyable_data_.objectives.Clear(
id, UpdateAndGetObjectiveDiffs());
1040const absl::flat_hash_map<VariableId, double>& ModelStorage::linear_objective(
1041 const ObjectiveId
id)
const {
1042 return copyable_data_.objectives.linear_terms(
id);
1045int64_t ModelStorage::num_linear_objective_terms(
const ObjectiveId
id)
const {
1046 return copyable_data_.objectives.linear_terms(
id).size();
1049int64_t ModelStorage::num_quadratic_objective_terms(
1050 const ObjectiveId
id)
const {
1051 return copyable_data_.objectives.quadratic_terms(
id).nonzeros();
1054std::vector<std::tuple<VariableId, VariableId, double> >
1055ModelStorage::quadratic_objective_terms(
const ObjectiveId
id)
const {
1056 return copyable_data_.objectives.quadratic_terms(
id).Terms();
1064 const int64_t priority,
const absl::string_view name) {
1065 return copyable_data_.objectives.AddAuxiliaryObjective(priority, name);
1068void ModelStorage::DeleteAuxiliaryObjective(
const AuxiliaryObjectiveId
id) {
1069 copyable_data_.objectives.Delete(
id, UpdateAndGetObjectiveDiffs());
1072int ModelStorage::num_auxiliary_objectives()
const {
1073 return static_cast<int>(copyable_data_.objectives.num_auxiliary_objectives());
1077 return copyable_data_.objectives.next_id();
1080void ModelStorage::ensure_next_auxiliary_objective_id_at_least(
1081 const AuxiliaryObjectiveId
id) {
1082 copyable_data_.objectives.ensure_next_id_at_least(
id);
1085bool ModelStorage::has_auxiliary_objective(
1086 const AuxiliaryObjectiveId
id)
const {
1087 return copyable_data_.objectives.contains(
id);
1090std::vector<AuxiliaryObjectiveId> ModelStorage::AuxiliaryObjectives()
const {
1091 return copyable_data_.objectives.AuxiliaryObjectives();
1094std::vector<AuxiliaryObjectiveId> ModelStorage::SortedAuxiliaryObjectives()
1096 return copyable_data_.objectives.SortedAuxiliaryObjectives();
1103template <
typename Constra
intData>
1104typename ConstraintData::IdType ModelStorage::AddAtomicConstraint(
1105 ConstraintData data) {
1106 return constraint_storage<ConstraintData>().AddConstraint(data);
1109template <
typename IdType>
1110void ModelStorage::DeleteAtomicConstraint(
const IdType
id) {
1111 using ConstraintData =
1112 typename AtomicConstraintTraits<IdType>::ConstraintData;
1113 auto& storage = constraint_storage<ConstraintData>();
1114 CHECK(storage.contains(
id));
1117 MakeUpdateDataFieldRange<
1118 UpdateTrackerData::AtomicConstraintDirtyFieldPtr<ConstraintData>()>(
1119 update_trackers_.GetUpdatedTrackers()));
1122template <
typename IdType>
1123const typename AtomicConstraintTraits<IdType>::ConstraintData&
1124ModelStorage::constraint_data(
const IdType
id)
const {
1125 using ConstraintData =
1126 typename AtomicConstraintTraits<IdType>::ConstraintData;
1127 return constraint_storage<ConstraintData>().data(
id);
1130template <
typename IdType>
1131int64_t ModelStorage::num_constraints()
const {
1132 using ConstraintData =
1133 typename AtomicConstraintTraits<IdType>::ConstraintData;
1134 return constraint_storage<ConstraintData>().size();
1137template <
typename IdType>
1138IdType ModelStorage::next_constraint_id()
const {
1139 using ConstraintData =
1140 typename AtomicConstraintTraits<IdType>::ConstraintData;
1141 return constraint_storage<ConstraintData>().next_id();
1144template <
typename IdType>
1145void ModelStorage::ensure_next_constraint_id_at_least(
const IdType
id) {
1146 using ConstraintData =
1147 typename AtomicConstraintTraits<IdType>::ConstraintData;
1148 return constraint_storage<ConstraintData>().ensure_next_id_at_least(
id);
1151template <
typename IdType>
1152bool ModelStorage::has_constraint(
const IdType
id)
const {
1153 using ConstraintData =
1154 typename AtomicConstraintTraits<IdType>::ConstraintData;
1155 return constraint_storage<ConstraintData>().contains(
id);
1158template <
typename IdType>
1159std::vector<IdType> ModelStorage::Constraints()
const {
1160 using ConstraintData =
1161 typename AtomicConstraintTraits<IdType>::ConstraintData;
1162 return constraint_storage<ConstraintData>().Constraints();
1165template <
typename IdType>
1166std::vector<IdType> ModelStorage::SortedConstraints()
const {
1167 using ConstraintData =
1168 typename AtomicConstraintTraits<IdType>::ConstraintData;
1169 return constraint_storage<ConstraintData>().SortedConstraints();
1172template <
typename IdType>
1173std::vector<IdType> ModelStorage::ConstraintsWithVariable(
1174 const VariableId variable_id)
const {
1175 using ConstraintData =
1176 typename AtomicConstraintTraits<IdType>::ConstraintData;
1177 const absl::flat_hash_set<IdType> constraints =
1178 constraint_storage<ConstraintData>().RelatedConstraints(variable_id);
1179 return {constraints.begin(), constraints.end()};
1182template <
typename IdType>
1183std::vector<VariableId> ModelStorage::VariablesInConstraint(
1184 const IdType
id)
const {
1185 return constraint_data(
id).RelatedVariables();
1195inline AtomicConstraintStorage<QuadraticConstraintData>&
1196ModelStorage::constraint_storage() {
1197 return copyable_data_.quadratic_constraints;
1201inline const AtomicConstraintStorage<QuadraticConstraintData>&
1202ModelStorage::constraint_storage()
const {
1203 return copyable_data_.quadratic_constraints;
1207constexpr typename AtomicConstraintStorage<QuadraticConstraintData>::Diff
1208 ModelStorage::UpdateTrackerData::* absl_nonnull
1209 ModelStorage::UpdateTrackerData::AtomicConstraintDirtyFieldPtr<
1210 QuadraticConstraintData>() {
1211 return &UpdateTrackerData::dirty_quadratic_constraints;
1217inline AtomicConstraintStorage<SecondOrderConeConstraintData>&
1218ModelStorage::constraint_storage() {
1219 return copyable_data_.soc_constraints;
1223inline const AtomicConstraintStorage<SecondOrderConeConstraintData>&
1224ModelStorage::constraint_storage()
const {
1225 return copyable_data_.soc_constraints;
1229constexpr typename AtomicConstraintStorage<SecondOrderConeConstraintData>::Diff
1230 ModelStorage::UpdateTrackerData::* absl_nonnull
1231 ModelStorage::UpdateTrackerData::AtomicConstraintDirtyFieldPtr<
1232 SecondOrderConeConstraintData>() {
1233 return &UpdateTrackerData::dirty_soc_constraints;
1239inline AtomicConstraintStorage<Sos1ConstraintData>&
1240ModelStorage::constraint_storage() {
1241 return copyable_data_.sos1_constraints;
1245inline const AtomicConstraintStorage<Sos1ConstraintData>&
1246ModelStorage::constraint_storage()
const {
1247 return copyable_data_.sos1_constraints;
1251constexpr typename AtomicConstraintStorage<Sos1ConstraintData>::Diff
1252 ModelStorage::UpdateTrackerData::* absl_nonnull
1253 ModelStorage::UpdateTrackerData::AtomicConstraintDirtyFieldPtr<
1255 return &UpdateTrackerData::dirty_sos1_constraints;
1261inline AtomicConstraintStorage<Sos2ConstraintData>&
1262ModelStorage::constraint_storage() {
1263 return copyable_data_.sos2_constraints;
1267inline const AtomicConstraintStorage<Sos2ConstraintData>&
1268ModelStorage::constraint_storage()
const {
1269 return copyable_data_.sos2_constraints;
1273constexpr typename AtomicConstraintStorage<Sos2ConstraintData>::Diff
1274 ModelStorage::UpdateTrackerData::* absl_nonnull
1275 ModelStorage::UpdateTrackerData::AtomicConstraintDirtyFieldPtr<
1277 return &UpdateTrackerData::dirty_sos2_constraints;
1283inline AtomicConstraintStorage<IndicatorConstraintData>&
1284ModelStorage::constraint_storage() {
1285 return copyable_data_.indicator_constraints;
1289inline const AtomicConstraintStorage<IndicatorConstraintData>&
1290ModelStorage::constraint_storage()
const {
1291 return copyable_data_.indicator_constraints;
1295constexpr typename AtomicConstraintStorage<IndicatorConstraintData>::Diff
1296 ModelStorage::UpdateTrackerData::* absl_nonnull
1297 ModelStorage::UpdateTrackerData::AtomicConstraintDirtyFieldPtr<
1298 IndicatorConstraintData>() {
1299 return &UpdateTrackerData::dirty_indicator_constraints;
ConstraintData::IdType AddAtomicConstraint(const ConstraintData &data, Elemental &elemental)
const ModelStorage *absl_nonnull ModelStorageCPtr
ModelStorage *absl_nonnull ModelStoragePtr
ModelStorage *absl_nullable NullableModelStoragePtr
ElementId< ElementType::kAuxiliaryObjective > AuxiliaryObjectiveId
internal::SosConstraintData< Sos1ConstraintId > Sos1ConstraintData
ElementId< ElementType::kVariable > VariableId
ElementId< ElementType::kLinearConstraint > LinearConstraintId
const ModelStorage *absl_nullable NullableModelStorageCPtr
auto MakeUpdateDataFieldRange(const UpdateTrackers &trackers)
internal::SosConstraintData< Sos2ConstraintId > Sos2ConstraintData