45 #ifndef OR_TOOLS_MATH_OPT_CORE_SPARSE_VECTOR_VIEW_H_
46 #define OR_TOOLS_MATH_OPT_CORE_SPARSE_VECTOR_VIEW_H_
54 #include "absl/container/flat_hash_map.h"
55 #include "absl/types/span.h"
56 #include "google/protobuf/message.h"
62 #include "ortools/math_opt/sparse_containers.pb.h"
69 template <
typename SparseVector>
111 bool at_end =
false);
118 : ids_(std::move(
ids)), values_(std::move(
values)) {}
121 inline const_iterator
begin()
const;
122 inline const_iterator
end()
const;
124 absl::Span<const int64_t>
ids()
const {
return ids_; }
127 absl::Span<const T>
values()
const {
return values_; }
132 template <
typename IndexType>
133 absl::flat_hash_map<IndexType, T>
as_map();
136 absl::Span<const int64_t> ids_;
137 absl::Span<const T> values_;
143 template <
typename Collection,
typename T =
typename Collection::value_type>
145 const Collection& values) {
152 template <
typename T>
154 const google::protobuf::RepeatedField<int64_t>& ids,
155 const google::protobuf::RepeatedPtrField<T>& values) {
162 template <
typename SparseVectorProto,
163 typename T = sparse_value_type<SparseVectorProto>>
170 template <
typename T>
179 template <
typename T>
180 SparseVectorView<T>::const_iterator::const_iterator(
181 const SparseVectorView<T>* view,
bool at_end)
184 index_ = view_->ids_size();
188 template <
typename T>
189 typename SparseVectorView<T>::const_iterator::reference
191 return {view_->ids(index_), view_->values(index_)};
194 template <
typename T>
201 template <
typename T>
204 DCHECK_LT(index_, view_->ids_size());
209 template <
typename T>
212 DCHECK_EQ(view_, other.view_);
213 return index_ == other.index_;
216 template <
typename T>
219 return !(*
this == other);
222 template <
typename T>
225 DCHECK_EQ(ids_size(), values_size());
229 template <
typename T>
231 DCHECK_EQ(ids_size(), values_size());
235 template <
typename T>
236 template <
typename IndexType>
238 absl::flat_hash_map<IndexType, T> result;
239 CHECK_EQ(ids_size(), values_size());
240 result.reserve(ids_size());
241 for (
const auto& [
id,
value] : *
this) {
bool operator!=(const const_iterator &other) const
reference operator*() const
internal::ArrowOperatorProxy< reference > operator->() const
std::forward_iterator_tag iterator_category
SparseVectorView::value_type value_type
const_iterator & operator++()
bool operator==(const const_iterator &other) const
const_iterator begin() const
SparseVectorView(absl::Span< const int64_t > ids, absl::Span< const T > values)
std::pair< int64_t, T > value_type
absl::Span< const T > values() const
const T & values(int index) const
const_iterator end() const
absl::Span< const int64_t > ids() const
absl::flat_hash_map< IndexType, T > as_map()
int64_t ids(int index) const
void InsertOrDie(Collection *const collection, const typename Collection::value_type &value)
typename std::remove_reference< decltype(SparseVector().values())>::type::value_type sparse_value_type
bool operator!=(const IndicatorConstraint &lhs, const IndicatorConstraint &rhs)
SparseVectorView< T > MakeView(absl::Span< const int64_t > ids, const Collection &values)
Collection of objects used to extend the Constraint Solver library.
LinearExpr operator*(LinearExpr lhs, double rhs)
LinearRange operator==(const LinearExpr &lhs, const LinearExpr &rhs)
std::optional< int64_t > end
std::vector< int64_t > ids