9template <
typename DSM>
class csr_eq_segment_iterator;
15 using value_type =
typename DSM::value_type;
16 using index_type =
typename DSM::index_type;
17 using elem_type =
typename DSM::elem_type;
21 operator value_type()
const {
return iterator_.get(); }
22 operator std::pair<std::pair<index_type, index_type>, elem_type>()
const {
23 return iterator_.get();
26 template <std::
size_t Index>
auto get()
const noexcept {
27 if constexpr (Index == 0) {
28 return iterator_.get_index();
30 if constexpr (Index == 1) {
31 return iterator_.get_value();
35 auto operator=(
const value_type &value)
const {
40 *
this = value_type(other);
43 auto operator&()
const {
return iterator_; }
51 using value_type =
typename DSM::value_type;
52 using index_type =
typename DSM::index_type;
53 using elem_type =
typename DSM::elem_type;
54 using difference_type =
typename DSM::difference_type;
60 segment_index_ = segment_index;
68 assert(dsm_ == other.dsm_);
69 return segment_index_ == other.segment_index_
70 ? index_ <=> other.index_
71 : segment_index_ <=> other.segment_index_;
76 return (*this <=> other) == 0;
80 auto &operator+=(difference_type n) {
81 assert(dsm_ !=
nullptr);
82 assert(n >= 0 ||
static_cast<difference_type
>(index_) >= -n);
87 auto &operator-=(difference_type n) {
return *
this += (-n); }
91 assert(dsm_ !=
nullptr && dsm_ == other.dsm_);
92 assert(index_ >= other.index_);
93 return index_ - other.index_;
107 auto operator++(
int) {
112 auto operator--(
int) {
118 auto operator+(difference_type n)
const {
123 auto operator-(difference_type n)
const {
130 friend auto operator+(difference_type n,
136 auto operator*()
const {
137 assert(dsm_ !=
nullptr);
140 auto operator[](difference_type n)
const {
141 assert(dsm_ !=
nullptr);
145 void get(value_type *dst, std::size_t size)
const {
146 auto elems =
new elem_type[size];
148 get_value(elems, size);
149 get_index(indexes, size);
150 for (std::size_t i = 0; i < size; i++) {
151 *(dst + i) = {indexes[i], elems[i]};
155 value_type get()
const {
161 void get_value(elem_type *dst, std::size_t size)
const {
162 assert(dsm_ !=
nullptr);
163 assert(segment_index_ * dsm_->segment_size_ + index_ < dsm_->nnz_);
164 (dsm_->vals_data_->segments()[segment_index_].begin() + index_)
168 elem_type get_value()
const {
175 assert(dsm_ !=
nullptr);
176 assert(segment_index_ * dsm_->segment_size_ + index_ < dsm_->nnz_);
177 auto col_data =
new index_type[size];
178 (dsm_->cols_data_->segments()[segment_index_].begin() + index_)
179 .get(col_data, size);
181 std::size_t rows_length = dsm_->get_row_size(segment_index_);
183 if (rank() == dsm_->rows_backend_.getrank()) {
184 rows = dsm_->rows_data_;
186 rows =
new index_type[rows_length];
187 dsm_->rows_backend_.getmem(rows, 0, rows_length *
sizeof(index_type),
191 dsm_->cols_data_->get_segment_offset(segment_index_) + index_;
192 auto rows_iter = rows + 1;
193 auto cols_iter = col_data;
195 std::size_t current_row = dsm_->row_offsets_[segment_index_];
196 std::size_t last_row = current_row + rows_length - 1;
197 for (
int i = 0; i < size; i++) {
198 while (current_row < last_row && *rows_iter <= position + i) {
202 iter->first = current_row;
203 iter->second = *cols_iter;
207 if (rank() != dsm_->rows_backend_.getrank()) {
219 void put(
const value_type *dst, std::size_t size)
const {
220 assert(dsm_ !=
nullptr);
221 assert(segment_index_ * dsm_->segment_size_ + index_ < dsm_->nnz_);
222 (dsm_->vals_data_->segments()[segment_index_].begin() + index_)
226 void put(
const value_type &value)
const { put(&value, 1); }
229 assert(dsm_ !=
nullptr);
230 return segment_index_;
233 auto segments()
const {
234 assert(dsm_ !=
nullptr);
235 return dr::__detail::drop_segments(dsm_->segments(), segment_index_,
240 const auto my_process_segment_index = dsm_->rows_backend_.getrank();
241 assert(my_process_segment_index == segment_index_);
242 if (dsm_->local_view ==
nullptr) {
243 throw std::runtime_error(
"Requesting not existing local segment");
245 return dsm_->local_view->begin();
252 std::size_t segment_index_ = 0;
253 std::size_t index_ = 0;
261 using difference_type = std::ptrdiff_t;
263 csr_eq_segment(DSM *dsm, std::size_t segment_index, std::size_t size,
264 std::size_t reserved) {
266 segment_index_ = segment_index;
268 reserved_ = reserved;
269 assert(dsm_ !=
nullptr);
273 assert(dsm_ !=
nullptr);
277 auto begin()
const {
return iterator(dsm_, segment_index_, 0); }
278 auto end()
const {
return begin() + size(); }
279 auto reserved()
const {
return reserved_; }
281 auto operator[](difference_type n)
const {
return *(begin() + n); }
283 bool is_local()
const {
return segment_index_ == default_comm().rank(); }
287 std::size_t segment_index_;
289 std::size_t reserved_;
295template <
typename DSM>
296struct tuple_size<dr::mp::csr_eq_segment_reference<DSM>>
297 : std::integral_constant<std::size_t, 2> {};
299template <std::
size_t Index,
typename DSM>
300struct tuple_element<Index, dr::mp::csr_eq_segment_reference<DSM>>
301 : tuple_element<Index, std::tuple<dr::index<typename DSM::index_type>,
302 typename DSM::elem_type>> {};
Definition: csr_eq_segment.hpp:49
Definition: csr_eq_segment.hpp:11
Definition: csr_eq_segment.hpp:256