7#include <dr/detail/index.hpp>
8#include <dr/detail/matrix_entry.hpp>
13template <
typename T,
typename I,
typename TIter,
typename IIter>
16 using size_type = std::size_t;
17 using difference_type = std::ptrdiff_t;
19 using scalar_type = std::iter_value_t<TIter>;
20 using scalar_reference = std::iter_reference_t<TIter>;
28 using iterator_category = std::random_access_iterator_tag;
44 size_type idx, index_type row,
45 size_type row_dim) noexcept
46 : values_(values), rowptr_(rowptr), colind_(colind), idx_(idx), row_(row),
47 row_dim_(row_dim), idx_offset_(
key_type{0, 0}) {
52 size_type idx, index_type row,
55 : values_(values), rowptr_(rowptr), colind_(colind), idx_(idx), row_(row),
56 row_dim_(row_dim), idx_offset_(idx_offset) {
64 void fast_forward_row()
noexcept {
65 while (row_ < row_dim_ - 1 && idx_ >= rowptr_[row_ + 1]) {
74 void fast_backward_row()
noexcept {
75 while (idx_ < rowptr_[row_]) {
81 operator+=(difference_type offset)
noexcept {
92 return idx_ == other.idx_;
95 constexpr difference_type
97 return difference_type(idx_) - difference_type(other.idx_);
101 return idx_ < other.idx_;
104 constexpr reference operator*()
const noexcept {
106 key_type(row_ + idx_offset_[0], colind_[idx_] + idx_offset_[1]),
120template <
typename T,
typename I,
typename TIter,
typename IIter>
124template <
typename T,
typename I,
typename TIter = T *,
typename IIter = I *>
126 :
public rng::view_interface<csr_matrix_view<T, I, TIter, IIter>> {
128 using size_type = std::size_t;
129 using difference_type = std::ptrdiff_t;
131 using scalar_reference = std::iter_reference_t<TIter>;
134 using scalar_type = T;
135 using index_type = I;
143 size_type nnz, size_type rank)
144 : values_(values), rowptr_(rowptr), colind_(colind), shape_(shape),
145 nnz_(nnz), rank_(rank), idx_offset_(
key_type{0, 0}) {}
148 size_type nnz, size_type rank,
key_type idx_offset)
149 : values_(values), rowptr_(rowptr), colind_(colind), shape_(shape),
150 nnz_(nnz), rank_(rank), idx_offset_(idx_offset) {}
152 key_type shape()
const noexcept {
return shape_; }
154 size_type size()
const noexcept {
return nnz_; }
156 std::size_t rank()
const {
return rank_; }
159 return iterator(values_, rowptr_, colind_, 0, 0, shape()[0], idx_offset_);
163 return iterator(values_, rowptr_, colind_, nnz_, shape()[0], shape()[0],
167 auto row(I row_index)
const {
168 I first = rowptr_[row_index];
169 I last = rowptr_[row_index + 1];
171 TIter values = values_;
172 IIter colind = colind_;
174 auto row_elements = rng::views::iota(first, last);
176 return row_elements | rng::views::transform([=](
auto idx) {
182 return rng::views::iota(rows[0], rows[1]) |
183 rng::views::transform([=, *
this](
auto &&row_index) {
184 return row(row_index) | rng::views::drop_while([=](
auto &&e) {
185 auto &&[
index, v] = e;
186 return index[1] < columns[0];
188 rng::views::take_while([=](
auto &&e) {
189 auto &&[
index, v] = e;
190 return index[1] < columns[1];
192 rng::views::transform([=](
auto &&elem) {
193 auto &&[
index, v] = elem;
194 auto &&[i, j] =
index;
202 auto values_data()
const {
return values_; }
204 auto rowptr_data()
const {
return rowptr_; }
206 auto colind_data()
const {
return colind_; }
220template <
typename TIter,
typename IIter,
typename... Args>
Definition: iterator_adaptor.hpp:23
Definition: matrix_entry.hpp:20
Definition: matrix_entry.hpp:115
Definition: csr_matrix_view.hpp:14
Definition: csr_matrix_view.hpp:126