14#ifndef OR_TOOLS_MATH_OPT_STORAGE_MODEL_STORAGE_H_
15#define OR_TOOLS_MATH_OPT_STORAGE_MODEL_STORAGE_H_
25#include "absl/container/flat_hash_map.h"
26#include "absl/container/flat_hash_set.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"
35#include "ortools/math_opt/model.pb.h"
36#include "ortools/math_opt/model_update.pb.h"
37#include "ortools/math_opt/sparse_containers.pb.h"
167 static absl::StatusOr<std::unique_ptr<ModelStorage> > FromModelProto(
168 const ModelProto& model_proto);
171 inline explicit ModelStorage(absl::string_view model_name =
"",
172 absl::string_view primary_objective_name =
"");
174 ModelStorage& operator=(
const ModelStorage&) =
delete;
182 std::unique_ptr<ModelStorage> Clone(
183 std::optional<absl::string_view> new_name = std::nullopt)
const;
185 inline const std::string& name()
const {
return copyable_data_.name; }
194 inline VariableId AddVariable(absl::string_view name =
"");
201 VariableId AddVariable(
double lower_bound,
double upper_bound,
202 bool is_integer, absl::string_view name =
"");
204 inline double variable_lower_bound(VariableId
id)
const;
205 inline double variable_upper_bound(VariableId
id)
const;
206 inline bool is_variable_integer(VariableId
id)
const;
207 inline const std::string& variable_name(VariableId
id)
const;
209 inline void set_variable_lower_bound(VariableId
id,
double lower_bound);
210 inline void set_variable_upper_bound(VariableId
id,
double upper_bound);
211 inline void set_variable_is_integer(VariableId
id,
bool is_integer);
212 inline void set_variable_as_integer(VariableId
id);
213 inline void set_variable_as_continuous(VariableId
id);
220 void DeleteVariable(VariableId
id);
226 inline int num_variables()
const;
231 inline VariableId next_variable_id()
const;
234 inline void ensure_next_variable_id_at_least(VariableId
id);
237 inline bool has_variable(VariableId
id)
const;
240 std::vector<VariableId> variables()
const;
246 std::vector<VariableId> SortedVariables()
const;
256 inline LinearConstraintId AddLinearConstraint(absl::string_view name =
"");
263 LinearConstraintId AddLinearConstraint(
double lower_bound,
double upper_bound,
264 absl::string_view name =
"");
266 inline double linear_constraint_lower_bound(LinearConstraintId
id)
const;
267 inline double linear_constraint_upper_bound(LinearConstraintId
id)
const;
268 inline const std::string& linear_constraint_name(LinearConstraintId
id)
const;
270 inline void set_linear_constraint_lower_bound(LinearConstraintId
id,
272 inline void set_linear_constraint_upper_bound(LinearConstraintId
id,
280 void DeleteLinearConstraint(LinearConstraintId
id);
286 inline int num_linear_constraints()
const;
291 inline LinearConstraintId next_linear_constraint_id()
const;
295 inline void ensure_next_linear_constraint_id_at_least(LinearConstraintId
id);
298 inline bool has_linear_constraint(LinearConstraintId
id)
const;
301 std::vector<LinearConstraintId> LinearConstraints()
const;
307 std::vector<LinearConstraintId> SortedLinearConstraints()
const;
314 inline double linear_constraint_coefficient(LinearConstraintId constraint,
315 VariableId variable)
const;
316 inline bool is_linear_constraint_coefficient_nonzero(
317 LinearConstraintId constraint, VariableId variable)
const;
322 inline void set_linear_constraint_coefficient(LinearConstraintId constraint,
328 inline std::vector<std::tuple<LinearConstraintId, VariableId, double> >
329 linear_constraint_matrix()
const;
332 inline std::vector<VariableId> variables_in_linear_constraint(
333 LinearConstraintId constraint)
const;
336 inline std::vector<LinearConstraintId> linear_constraints_with_variable(
337 VariableId variable)
const;
346 inline bool is_maximize(ObjectiveId
id)
const;
347 inline int64_t objective_priority(ObjectiveId
id)
const;
348 inline double objective_offset(ObjectiveId
id)
const;
350 inline double linear_objective_coefficient(ObjectiveId
id,
351 VariableId variable)
const;
353 inline double quadratic_objective_coefficient(
354 ObjectiveId
id, VariableId first_variable,
355 VariableId second_variable)
const;
356 inline bool is_linear_objective_coefficient_nonzero(
357 ObjectiveId
id, VariableId variable)
const;
359 inline bool is_quadratic_objective_coefficient_nonzero(
360 ObjectiveId
id, VariableId first_variable,
361 VariableId second_variable)
const;
362 inline const std::string& objective_name(ObjectiveId
id)
const;
364 inline void set_is_maximize(ObjectiveId
id,
bool is_maximize);
365 inline void set_maximize(ObjectiveId
id);
366 inline void set_minimize(ObjectiveId
id);
367 inline void set_objective_priority(ObjectiveId
id, int64_t value);
368 inline void set_objective_offset(ObjectiveId
id,
double value);
372 inline void set_linear_objective_coefficient(ObjectiveId
id,
378 inline void set_quadratic_objective_coefficient(ObjectiveId
id,
379 VariableId first_variable,
380 VariableId second_variable,
387 inline void clear_objective(ObjectiveId
id);
390 inline const absl::flat_hash_map<VariableId, double>& linear_objective(
391 ObjectiveId
id)
const;
393 inline int64_t num_linear_objective_terms(ObjectiveId
id)
const;
395 inline int64_t num_quadratic_objective_terms(ObjectiveId
id)
const;
401 inline std::vector<std::tuple<VariableId, VariableId, double> >
402 quadratic_objective_terms(ObjectiveId
id)
const;
416 inline AuxiliaryObjectiveId AddAuxiliaryObjective(
417 int64_t priority, absl::string_view name =
"");
424 inline void DeleteAuxiliaryObjective(AuxiliaryObjectiveId
id);
430 inline int num_auxiliary_objectives()
const;
435 inline AuxiliaryObjectiveId next_auxiliary_objective_id()
const;
439 inline void ensure_next_auxiliary_objective_id_at_least(
440 AuxiliaryObjectiveId
id);
443 inline bool has_auxiliary_objective(AuxiliaryObjectiveId
id)
const;
446 inline std::vector<AuxiliaryObjectiveId> AuxiliaryObjectives()
const;
453 inline std::vector<AuxiliaryObjectiveId> SortedAuxiliaryObjectives()
const;
469 template <
typename Constra
intData>
470 inline typename ConstraintData::IdType AddAtomicConstraint(
471 ConstraintData data);
477 template <
typename IdType>
478 inline void DeleteAtomicConstraint(IdType
id);
481 template <
typename IdType>
482 inline const typename AtomicConstraintTraits<IdType>::ConstraintData&
483 constraint_data(IdType
id)
const;
490 template <
typename IdType>
491 inline int64_t num_constraints()
const;
495 template <
typename IdType>
496 inline IdType next_constraint_id()
const;
501 template <
typename IdType>
502 inline void ensure_next_constraint_id_at_least(IdType
id);
505 template <
typename IdType>
506 inline bool has_constraint(IdType
id)
const;
509 template <
typename IdType>
510 std::vector<IdType> Constraints()
const;
516 template <
typename IdType>
517 std::vector<IdType> SortedConstraints()
const;
522 template <
typename IdType>
523 inline std::vector<IdType> ConstraintsWithVariable(
524 VariableId variable_id)
const;
527 template <
typename IdType>
528 inline std::vector<VariableId> VariablesInConstraint(IdType
id)
const;
537 ModelProto ExportModel(
bool remove_names =
false)
const;
582 UpdateTrackerId NewUpdateTracker();
598 void DeleteUpdateTracker(UpdateTrackerId update_tracker);
610 std::optional<ModelUpdateProto> ExportModelUpdate(
611 UpdateTrackerId update_tracker,
bool remove_names =
false)
const;
622 void AdvanceCheckpoint(UpdateTrackerId update_tracker);
632 absl::Status ApplyUpdateProto(
const ModelUpdateProto& update_proto);
635 struct UpdateTrackerData {
637 const VariableStorage& variables,
const ObjectiveStorage& objectives,
638 const LinearConstraintStorage& linear_constraints,
639 const AtomicConstraintStorage<QuadraticConstraintData>&
640 quadratic_constraints,
641 const AtomicConstraintStorage<SecondOrderConeConstraintData>
643 const AtomicConstraintStorage<Sos1ConstraintData>& sos1_constraints,
644 const AtomicConstraintStorage<Sos2ConstraintData>& sos2_constraints,
645 const AtomicConstraintStorage<IndicatorConstraintData>&
646 indicator_constraints)
647 : dirty_variables(variables),
648 dirty_objective(objectives, variables.next_id()),
649 dirty_linear_constraints(linear_constraints,
650 dirty_variables.checkpoint),
651 dirty_quadratic_constraints(quadratic_constraints),
652 dirty_soc_constraints(soc_constraints),
653 dirty_sos1_constraints(sos1_constraints),
654 dirty_sos2_constraints(sos2_constraints),
655 dirty_indicator_constraints(indicator_constraints) {}
661 std::optional<ModelUpdateProto> ExportModelUpdate(
662 const ModelStorage& storage,
bool remove_names =
false)
const;
666 void AdvanceCheckpoint(
const ModelStorage& storage);
670 template <
typename Constra
intData>
671 static constexpr typename AtomicConstraintStorage<ConstraintData>::Diff
673 AtomicConstraintDirtyFieldPtr();
681 VariableStorage::Diff dirty_variables;
682 ObjectiveStorage::Diff dirty_objective;
683 LinearConstraintStorage::Diff dirty_linear_constraints;
684 AtomicConstraintStorage<QuadraticConstraintData>::Diff
685 dirty_quadratic_constraints;
686 AtomicConstraintStorage<SecondOrderConeConstraintData>::Diff
687 dirty_soc_constraints;
688 AtomicConstraintStorage<Sos1ConstraintData>::Diff dirty_sos1_constraints;
689 AtomicConstraintStorage<Sos2ConstraintData>::Diff dirty_sos2_constraints;
690 AtomicConstraintStorage<IndicatorConstraintData>::Diff
691 dirty_indicator_constraints;
696 struct CopyableData {
697 CopyableData(
const absl::string_view model_name,
698 const absl::string_view primary_objective_name)
699 : name(model_name), objectives(primary_objective_name) {}
702 VariableStorage variables;
703 ObjectiveStorage objectives;
704 LinearConstraintStorage linear_constraints;
706 AtomicConstraintStorage<QuadraticConstraintData> quadratic_constraints;
707 AtomicConstraintStorage<SecondOrderConeConstraintData> soc_constraints;
708 AtomicConstraintStorage<Sos1ConstraintData> sos1_constraints;
709 AtomicConstraintStorage<Sos2ConstraintData> sos2_constraints;
710 AtomicConstraintStorage<IndicatorConstraintData> indicator_constraints;
715 ModelStorage(
const ModelStorage& other)
716 : copyable_data_(other.copyable_data_) {}
718 auto UpdateAndGetVariableDiffs() {
719 return MakeUpdateDataFieldRange<&UpdateTrackerData::dirty_variables>(
720 update_trackers_.GetUpdatedTrackers());
723 auto UpdateAndGetObjectiveDiffs() {
724 return MakeUpdateDataFieldRange<&UpdateTrackerData::dirty_objective>(
725 update_trackers_.GetUpdatedTrackers());
728 auto UpdateAndGetLinearConstraintDiffs() {
730 &UpdateTrackerData::dirty_linear_constraints>(
731 update_trackers_.GetUpdatedTrackers());
735 void AddVariables(
const VariablesProto& variables);
738 void AddAuxiliaryObjectives(
739 const google::protobuf::Map<int64_t, ObjectiveProto>& objectives);
742 void AddLinearConstraints(
const LinearConstraintsProto& linear_constraints);
744 void UpdateObjective(ObjectiveId
id,
const ObjectiveUpdatesProto& update);
748 void UpdateLinearObjectiveCoefficients(
749 ObjectiveId
id,
const SparseDoubleVectorProto& coefficients);
753 void UpdateQuadraticObjectiveCoefficients(
754 ObjectiveId
id,
const SparseDoubleMatrixProto& coefficients);
758 void UpdateLinearConstraintCoefficients(
759 const SparseDoubleMatrixProto& coefficients);
763 template <
typename Constra
intData>
764 AtomicConstraintStorage<ConstraintData>& constraint_storage();
768 template <
typename Constra
intData>
769 const AtomicConstraintStorage<ConstraintData>& constraint_storage()
const;
771 CopyableData copyable_data_;
772 UpdateTrackers<UpdateTrackerData> update_trackers_;
781ModelStorage::ModelStorage(
const absl::string_view model_name,
782 const absl::string_view primary_objective_name)
783 : copyable_data_(model_name,
784 primary_objective_name) {}
790VariableId ModelStorage::AddVariable(absl::string_view name) {
791 return AddVariable(-std::numeric_limits<double>::infinity(),
792 std::numeric_limits<double>::infinity(),
false, name);
795double ModelStorage::variable_lower_bound(
const VariableId
id)
const {
796 return copyable_data_.variables.lower_bound(
id);
799double ModelStorage::variable_upper_bound(
const VariableId
id)
const {
800 return copyable_data_.variables.upper_bound(
id);
803bool ModelStorage::is_variable_integer(VariableId
id)
const {
804 return copyable_data_.variables.is_integer(
id);
807const std::string& ModelStorage::variable_name(
const VariableId
id)
const {
808 return copyable_data_.variables.name(
id);
811void ModelStorage::set_variable_lower_bound(
const VariableId
id,
812 const double lower_bound) {
813 copyable_data_.variables.set_lower_bound(
id, lower_bound,
814 UpdateAndGetVariableDiffs());
817void ModelStorage::set_variable_upper_bound(
const VariableId
id,
818 const double upper_bound) {
819 copyable_data_.variables.set_upper_bound(
id, upper_bound,
820 UpdateAndGetVariableDiffs());
823void ModelStorage::set_variable_is_integer(
const VariableId
id,
824 const bool is_integer) {
825 copyable_data_.variables.set_integer(
id, is_integer,
826 UpdateAndGetVariableDiffs());
829void ModelStorage::set_variable_as_integer(VariableId
id) {
830 set_variable_is_integer(
id,
true);
833void ModelStorage::set_variable_as_continuous(VariableId
id) {
834 set_variable_is_integer(
id,
false);
837int ModelStorage::num_variables()
const {
838 return static_cast<int>(copyable_data_.variables.size());
841VariableId ModelStorage::next_variable_id()
const {
842 return copyable_data_.variables.next_id();
845void ModelStorage::ensure_next_variable_id_at_least(
const VariableId
id) {
846 copyable_data_.variables.ensure_next_id_at_least(
id);
849bool ModelStorage::has_variable(
const VariableId
id)
const {
850 return copyable_data_.variables.contains(
id);
857LinearConstraintId ModelStorage::AddLinearConstraint(absl::string_view name) {
858 return AddLinearConstraint(-std::numeric_limits<double>::infinity(),
859 std::numeric_limits<double>::infinity(), name);
862double ModelStorage::linear_constraint_lower_bound(
863 const LinearConstraintId
id)
const {
864 return copyable_data_.linear_constraints.lower_bound(
id);
867double ModelStorage::linear_constraint_upper_bound(
868 const LinearConstraintId
id)
const {
869 return copyable_data_.linear_constraints.upper_bound(
id);
872const std::string& ModelStorage::linear_constraint_name(
873 const LinearConstraintId
id)
const {
874 return copyable_data_.linear_constraints.name(
id);
877void ModelStorage::set_linear_constraint_lower_bound(
878 const LinearConstraintId
id,
const double lower_bound) {
879 copyable_data_.linear_constraints.set_lower_bound(
880 id, lower_bound, UpdateAndGetLinearConstraintDiffs());
883void ModelStorage::set_linear_constraint_upper_bound(
884 const LinearConstraintId
id,
const double upper_bound) {
885 copyable_data_.linear_constraints.set_upper_bound(
886 id, upper_bound, UpdateAndGetLinearConstraintDiffs());
889int ModelStorage::num_linear_constraints()
const {
890 return static_cast<int>(copyable_data_.linear_constraints.size());
893LinearConstraintId ModelStorage::next_linear_constraint_id()
const {
894 return copyable_data_.linear_constraints.next_id();
897void ModelStorage::ensure_next_linear_constraint_id_at_least(
898 LinearConstraintId
id) {
899 copyable_data_.linear_constraints.ensure_next_id_at_least(
id);
902bool ModelStorage::has_linear_constraint(
const LinearConstraintId
id)
const {
903 return copyable_data_.linear_constraints.contains(
id);
910double ModelStorage::linear_constraint_coefficient(
911 LinearConstraintId constraint, VariableId variable)
const {
912 return copyable_data_.linear_constraints.matrix().get(constraint, variable);
915bool ModelStorage::is_linear_constraint_coefficient_nonzero(
916 LinearConstraintId constraint, VariableId variable)
const {
917 return copyable_data_.linear_constraints.matrix().contains(constraint,
921void ModelStorage::set_linear_constraint_coefficient(
922 const LinearConstraintId constraint,
const VariableId variable,
923 const double value) {
924 copyable_data_.linear_constraints.set_term(
925 constraint, variable, value, UpdateAndGetLinearConstraintDiffs());
928std::vector<std::tuple<LinearConstraintId, VariableId, double> >
929ModelStorage::linear_constraint_matrix()
const {
930 return copyable_data_.linear_constraints.matrix().Terms();
933std::vector<VariableId> ModelStorage::variables_in_linear_constraint(
934 LinearConstraintId constraint)
const {
935 return copyable_data_.linear_constraints.matrix().row(constraint);
938std::vector<LinearConstraintId> ModelStorage::linear_constraints_with_variable(
939 VariableId variable)
const {
940 return copyable_data_.linear_constraints.matrix().column(variable);
947bool ModelStorage::is_maximize(
const ObjectiveId
id)
const {
948 return copyable_data_.objectives.maximize(
id);
951int64_t ModelStorage::objective_priority(
const ObjectiveId
id)
const {
952 return copyable_data_.objectives.priority(
id);
955double ModelStorage::objective_offset(
const ObjectiveId
id)
const {
956 return copyable_data_.objectives.offset(
id);
959double ModelStorage::linear_objective_coefficient(
960 const ObjectiveId
id,
const VariableId variable)
const {
961 return copyable_data_.objectives.linear_term(
id, variable);
964double ModelStorage::quadratic_objective_coefficient(
965 const ObjectiveId
id,
const VariableId first_variable,
966 const VariableId second_variable)
const {
967 return copyable_data_.objectives.quadratic_term(
id, first_variable,
971bool ModelStorage::is_linear_objective_coefficient_nonzero(
972 const ObjectiveId
id,
const VariableId variable)
const {
973 return copyable_data_.objectives.linear_terms(
id).contains(variable);
976bool ModelStorage::is_quadratic_objective_coefficient_nonzero(
977 const ObjectiveId
id,
const VariableId first_variable,
978 const VariableId second_variable)
const {
979 return copyable_data_.objectives.quadratic_terms(
id).get(
980 first_variable, second_variable) != 0.0;
983const std::string& ModelStorage::objective_name(
const ObjectiveId
id)
const {
984 return copyable_data_.objectives.name(
id);
987void ModelStorage::set_is_maximize(
const ObjectiveId
id,
988 const bool is_maximize) {
989 copyable_data_.objectives.set_maximize(
id, is_maximize,
990 UpdateAndGetObjectiveDiffs());
993void ModelStorage::set_maximize(
const ObjectiveId
id) {
994 set_is_maximize(
id,
true);
997void ModelStorage::set_minimize(
const ObjectiveId
id) {
998 set_is_maximize(
id,
false);
1001void ModelStorage::set_objective_priority(
const ObjectiveId
id,
1002 const int64_t value) {
1003 copyable_data_.objectives.set_priority(
id, value,
1004 UpdateAndGetObjectiveDiffs());
1007void ModelStorage::set_objective_offset(
const ObjectiveId
id,
1008 const double value) {
1009 copyable_data_.objectives.set_offset(
id, value, UpdateAndGetObjectiveDiffs());
1012void ModelStorage::set_linear_objective_coefficient(
const ObjectiveId
id,
1013 const VariableId variable,
1014 const double value) {
1015 copyable_data_.objectives.set_linear_term(
id, variable, value,
1016 UpdateAndGetObjectiveDiffs());
1019void ModelStorage::set_quadratic_objective_coefficient(
1020 const ObjectiveId
id,
const VariableId first_variable,
1021 const VariableId second_variable,
const double value) {
1022 copyable_data_.objectives.set_quadratic_term(
1023 id, first_variable, second_variable, value, UpdateAndGetObjectiveDiffs());
1026void ModelStorage::clear_objective(
const ObjectiveId
id) {
1027 copyable_data_.objectives.Clear(
id, UpdateAndGetObjectiveDiffs());
1030const absl::flat_hash_map<VariableId, double>& ModelStorage::linear_objective(
1031 const ObjectiveId
id)
const {
1032 return copyable_data_.objectives.linear_terms(
id);
1035int64_t ModelStorage::num_linear_objective_terms(
const ObjectiveId
id)
const {
1036 return copyable_data_.objectives.linear_terms(
id).size();
1039int64_t ModelStorage::num_quadratic_objective_terms(
1040 const ObjectiveId
id)
const {
1041 return copyable_data_.objectives.quadratic_terms(
id).nonzeros();
1044std::vector<std::tuple<VariableId, VariableId, double> >
1045ModelStorage::quadratic_objective_terms(
const ObjectiveId
id)
const {
1046 return copyable_data_.objectives.quadratic_terms(
id).Terms();
1053AuxiliaryObjectiveId ModelStorage::AddAuxiliaryObjective(
1054 const int64_t priority,
const absl::string_view name) {
1055 return copyable_data_.objectives.AddAuxiliaryObjective(priority, name);
1058void ModelStorage::DeleteAuxiliaryObjective(
const AuxiliaryObjectiveId
id) {
1059 copyable_data_.objectives.Delete(
id, UpdateAndGetObjectiveDiffs());
1062int ModelStorage::num_auxiliary_objectives()
const {
1063 return static_cast<int>(copyable_data_.objectives.num_auxiliary_objectives());
1066AuxiliaryObjectiveId ModelStorage::next_auxiliary_objective_id()
const {
1067 return copyable_data_.objectives.next_id();
1070void ModelStorage::ensure_next_auxiliary_objective_id_at_least(
1071 const AuxiliaryObjectiveId
id) {
1072 copyable_data_.objectives.ensure_next_id_at_least(
id);
1075bool ModelStorage::has_auxiliary_objective(
1076 const AuxiliaryObjectiveId
id)
const {
1077 return copyable_data_.objectives.contains(
id);
1080std::vector<AuxiliaryObjectiveId> ModelStorage::AuxiliaryObjectives()
const {
1081 return copyable_data_.objectives.AuxiliaryObjectives();
1084std::vector<AuxiliaryObjectiveId> ModelStorage::SortedAuxiliaryObjectives()
1086 return copyable_data_.objectives.SortedAuxiliaryObjectives();
1093template <
typename Constra
intData>
1094typename ConstraintData::IdType ModelStorage::AddAtomicConstraint(
1095 ConstraintData data) {
1096 return constraint_storage<ConstraintData>().AddConstraint(data);
1099template <
typename IdType>
1100void ModelStorage::DeleteAtomicConstraint(
const IdType
id) {
1101 using ConstraintData =
1102 typename AtomicConstraintTraits<IdType>::ConstraintData;
1103 auto& storage = constraint_storage<ConstraintData>();
1104 CHECK(storage.contains(
id));
1107 MakeUpdateDataFieldRange<
1108 UpdateTrackerData::AtomicConstraintDirtyFieldPtr<ConstraintData>()>(
1109 update_trackers_.GetUpdatedTrackers()));
1112template <
typename IdType>
1113const typename AtomicConstraintTraits<IdType>::ConstraintData&
1114ModelStorage::constraint_data(
const IdType
id)
const {
1115 using ConstraintData =
1116 typename AtomicConstraintTraits<IdType>::ConstraintData;
1117 return constraint_storage<ConstraintData>().data(
id);
1120template <
typename IdType>
1121int64_t ModelStorage::num_constraints()
const {
1122 using ConstraintData =
1123 typename AtomicConstraintTraits<IdType>::ConstraintData;
1124 return constraint_storage<ConstraintData>().size();
1127template <
typename IdType>
1128IdType ModelStorage::next_constraint_id()
const {
1129 using ConstraintData =
1130 typename AtomicConstraintTraits<IdType>::ConstraintData;
1131 return constraint_storage<ConstraintData>().next_id();
1134template <
typename IdType>
1135void ModelStorage::ensure_next_constraint_id_at_least(
const IdType
id) {
1136 using ConstraintData =
1137 typename AtomicConstraintTraits<IdType>::ConstraintData;
1138 return constraint_storage<ConstraintData>().ensure_next_id_at_least(
id);
1141template <
typename IdType>
1142bool ModelStorage::has_constraint(
const IdType
id)
const {
1143 using ConstraintData =
1144 typename AtomicConstraintTraits<IdType>::ConstraintData;
1145 return constraint_storage<ConstraintData>().contains(
id);
1148template <
typename IdType>
1149std::vector<IdType> ModelStorage::Constraints()
const {
1150 using ConstraintData =
1151 typename AtomicConstraintTraits<IdType>::ConstraintData;
1152 return constraint_storage<ConstraintData>().Constraints();
1155template <
typename IdType>
1156std::vector<IdType> ModelStorage::SortedConstraints()
const {
1157 using ConstraintData =
1158 typename AtomicConstraintTraits<IdType>::ConstraintData;
1159 return constraint_storage<ConstraintData>().SortedConstraints();
1162template <
typename IdType>
1163std::vector<IdType> ModelStorage::ConstraintsWithVariable(
1164 const VariableId variable_id)
const {
1165 using ConstraintData =
1166 typename AtomicConstraintTraits<IdType>::ConstraintData;
1167 const absl::flat_hash_set<IdType> constraints =
1168 constraint_storage<ConstraintData>().RelatedConstraints(variable_id);
1169 return {constraints.begin(), constraints.end()};
1172template <
typename IdType>
1173std::vector<VariableId> ModelStorage::VariablesInConstraint(
1174 const IdType
id)
const {
1175 return constraint_data(
id).RelatedVariables();
1185inline AtomicConstraintStorage<QuadraticConstraintData>&
1186ModelStorage::constraint_storage() {
1187 return copyable_data_.quadratic_constraints;
1191inline const AtomicConstraintStorage<QuadraticConstraintData>&
1192ModelStorage::constraint_storage()
const {
1193 return copyable_data_.quadratic_constraints;
1197constexpr typename AtomicConstraintStorage<QuadraticConstraintData>::Diff
1198 ModelStorage::UpdateTrackerData::*
1199 ModelStorage::UpdateTrackerData::AtomicConstraintDirtyFieldPtr<
1200 QuadraticConstraintData>() {
1201 return &UpdateTrackerData::dirty_quadratic_constraints;
1207inline AtomicConstraintStorage<SecondOrderConeConstraintData>&
1208ModelStorage::constraint_storage() {
1209 return copyable_data_.soc_constraints;
1213inline const AtomicConstraintStorage<SecondOrderConeConstraintData>&
1214ModelStorage::constraint_storage()
const {
1215 return copyable_data_.soc_constraints;
1219constexpr typename AtomicConstraintStorage<SecondOrderConeConstraintData>::Diff
1220 ModelStorage::UpdateTrackerData::*
1221 ModelStorage::UpdateTrackerData::AtomicConstraintDirtyFieldPtr<
1222 SecondOrderConeConstraintData>() {
1223 return &UpdateTrackerData::dirty_soc_constraints;
1229inline AtomicConstraintStorage<Sos1ConstraintData>&
1230ModelStorage::constraint_storage() {
1231 return copyable_data_.sos1_constraints;
1235inline const AtomicConstraintStorage<Sos1ConstraintData>&
1236ModelStorage::constraint_storage()
const {
1237 return copyable_data_.sos1_constraints;
1241constexpr typename AtomicConstraintStorage<Sos1ConstraintData>::Diff
1242 ModelStorage::UpdateTrackerData::*
1243 ModelStorage::UpdateTrackerData::AtomicConstraintDirtyFieldPtr<
1245 return &UpdateTrackerData::dirty_sos1_constraints;
1251inline AtomicConstraintStorage<Sos2ConstraintData>&
1252ModelStorage::constraint_storage() {
1253 return copyable_data_.sos2_constraints;
1257inline const AtomicConstraintStorage<Sos2ConstraintData>&
1258ModelStorage::constraint_storage()
const {
1259 return copyable_data_.sos2_constraints;
1263constexpr typename AtomicConstraintStorage<Sos2ConstraintData>::Diff
1264 ModelStorage::UpdateTrackerData::*
1265 ModelStorage::UpdateTrackerData::AtomicConstraintDirtyFieldPtr<
1267 return &UpdateTrackerData::dirty_sos2_constraints;
1273inline AtomicConstraintStorage<IndicatorConstraintData>&
1274ModelStorage::constraint_storage() {
1275 return copyable_data_.indicator_constraints;
1279inline const AtomicConstraintStorage<IndicatorConstraintData>&
1280ModelStorage::constraint_storage()
const {
1281 return copyable_data_.indicator_constraints;
1285constexpr typename AtomicConstraintStorage<IndicatorConstraintData>::Diff
1286 ModelStorage::UpdateTrackerData::*
1287 ModelStorage::UpdateTrackerData::AtomicConstraintDirtyFieldPtr<
1288 IndicatorConstraintData>() {
1289 return &UpdateTrackerData::dirty_indicator_constraints;
An object oriented wrapper for quadratic constraints in ModelStorage.
internal::SosConstraintData< Sos1ConstraintId > Sos1ConstraintData
auto MakeUpdateDataFieldRange(const UpdateTrackers &trackers)
internal::SosConstraintData< Sos2ConstraintId > Sos2ConstraintData
In SWIG mode, we don't want anything besides these top-level includes.