14 #ifndef OR_TOOLS_MATH_OPT_STORAGE_OBJECTIVE_STORAGE_H_
15 #define OR_TOOLS_MATH_OPT_STORAGE_OBJECTIVE_STORAGE_H_
21 #include "absl/container/flat_hash_map.h"
22 #include "absl/container/flat_hash_set.h"
24 #include "ortools/math_opt/model.pb.h"
25 #include "ortools/math_opt/model_update.pb.h"
51 absl::flat_hash_set<std::pair<VariableId, VariableId>>
56 double offset()
const {
return offset_; }
59 const absl::flat_hash_map<VariableId, double>&
linear_terms()
const {
60 return linear_terms_.
terms();
63 return quadratic_terms_.
get(v1, v2);
66 return quadratic_terms_;
69 template <
typename DiffIter>
72 template <
typename DiffIter>
75 template <
typename DiffIter>
79 template <
typename DiffIter>
83 template <
typename DiffIter>
87 template <
typename DiffIter>
91 ObjectiveProto
Proto()
const;
108 ObjectiveUpdatesProto
Update(
110 const absl::flat_hash_set<VariableId>& deleted_variables,
111 const std::vector<VariableId>& new_variables)
const;
118 bool maximize_ =
false;
119 double offset_ = 0.0;
129 return linear_terms_.
get(v);
132 template <
typename DiffIter>
140 diff.direction =
true;
144 template <
typename DiffIter>
156 template <
typename DiffIter>
160 if (linear_terms_.
set(variable,
value)) {
162 if (variable < diff.variable_checkpoint) {
163 diff.linear_coefficients.insert(variable);
169 template <
typename DiffIter>
171 const VariableId v1,
const VariableId v2,
const double val,
173 if (quadratic_terms_.
set(v1, v2, val)) {
175 if (v1 < diff.variable_checkpoint && v2 < diff.variable_checkpoint) {
176 diff.quadratic_coefficients.insert(
183 template <
typename DiffIter>
187 for (
const auto [
var, _] : linear_terms_.
terms()) {
188 if (
var < diff.variable_checkpoint) {
189 diff.linear_coefficients.insert(
var);
192 for (
const auto [v1, v2, _] : quadratic_terms_.
Terms()) {
193 if (v2 < diff.variable_checkpoint) {
194 diff.quadratic_coefficients.insert({v1, v2});
198 linear_terms_.
clear();
199 quadratic_terms_.
Clear();
202 template <
typename DiffIter>
206 if (variable >= diff.variable_checkpoint) {
209 diff.linear_coefficients.erase(variable);
211 if (v2 < diff.variable_checkpoint) {
212 diff.quadratic_coefficients.erase(
217 linear_terms_.
erase(variable);
218 quadratic_terms_.
Delete(variable);
const absl::flat_hash_map< VariableId, double > & linear_terms() const
double linear_term(VariableId v) const
bool diff_is_empty(const Diff &diff) const
void Clear(const iterator_range< DiffIter > &diffs)
void DeleteVariable(VariableId variable, const iterator_range< DiffIter > &diffs)
double quadratic_term(const VariableId v1, const VariableId v2) const
void set_maximize(bool maximize, const iterator_range< DiffIter > &diffs)
void set_offset(double offset, const iterator_range< DiffIter > &diffs)
void set_linear_term(VariableId variable, double value, const iterator_range< DiffIter > &diffs)
void AdvanceCheckpointInDiff(VariableId variable_checkpoint, Diff &diff) const
void set_quadratic_term(VariableId v1, VariableId v2, double val, const iterator_range< DiffIter > &diffs)
ObjectiveUpdatesProto Update(const Diff &diff, const absl::flat_hash_set< VariableId > &deleted_variables, const std::vector< VariableId > &new_variables) const
ObjectiveProto Proto() const
const SparseSymmetricMatrix & quadratic_terms() const
const absl::flat_hash_map< VariableId, double > & terms() const
double get(const VariableId id) const
bool set(const VariableId id, const double coeff)
void erase(VariableId id)
double get(VariableId first, VariableId second) const
void Delete(VariableId variable)
std::vector< VariableId > RelatedVariables(VariableId variable) const
bool set(VariableId first, VariableId second, double value)
std::vector< std::pair< VariableId, double > > Terms(VariableId variable) const
absl::flat_hash_set< std::pair< VariableId, VariableId > > quadratic_coefficients
VariableId variable_checkpoint
Diff(const VariableId variable_checkpoint)
absl::flat_hash_set< VariableId > linear_coefficients