Distributed Ranges
Loading...
Searching...
No Matches
dense_matrix_view.hpp
1// SPDX-FileCopyrightText: Intel Corporation
2//
3// SPDX-License-Identifier: BSD-3-Clause
4
5#pragma once
6
7#include <iterator>
8
9#include <dr/detail/index.hpp>
10#include <dr/detail/iterator_adaptor.hpp>
11#include <dr/detail/matrix_entry.hpp>
12#include <dr/sp/containers/sequential/dense_matrix.hpp>
13#include <dr/sp/views/dense_column_view.hpp>
14#include <dr/sp/views/dense_matrix_iterator.hpp>
15#include <dr/sp/views/dense_row_view.hpp>
16
17namespace dr::sp {
18
19template <typename T, typename Iter = T *>
21 : public rng::view_interface<dense_matrix_view<T, Iter>> {
22public:
23 using size_type = std::size_t;
24 using difference_type = std::ptrdiff_t;
25
26 using scalar_reference = std::iter_reference_t<Iter>;
28
29 using key_type = dr::index<>;
30 using map_type = T;
31
33
34 dense_matrix_view(Iter data, key_type shape, size_type ld, size_type rank)
35 : data_(data), shape_(shape), idx_offset_(key_type{0, 0}), ld_(ld),
36 rank_(rank) {}
37
38 dense_matrix_view(Iter data, key_type shape, key_type idx_offset,
39 size_type ld, size_type rank)
40 : data_(data), shape_(shape), idx_offset_(idx_offset), ld_(ld),
41 rank_(rank) {}
42
43 template <typename Allocator>
44 requires(std::is_same_v<typename std::allocator_traits<Allocator>::pointer,
45 Iter>)
47 : data_(m.data()), shape_(m.shape()), idx_offset_(key_type{0, 0}),
48 ld_(m.ld()), rank_(0) {}
49
50 key_type shape() const noexcept { return shape_; }
51
52 size_type size() const noexcept { return shape()[0] * shape()[1]; }
53
54 scalar_reference operator[](key_type idx) const {
55 return data_[idx[0] * ld_ + idx[1]];
56 }
57
58 iterator begin() const {
59 return iterator(data_, key_type{0, 0}, idx_offset_, shape_, ld_);
60 }
61
62 iterator end() const {
63 return iterator(data_, key_type{shape_[0], 0}, idx_offset_, shape_, ld_);
64 }
65
66 auto row(size_type row_index) const {
67 // return dense_matrix_row_view(data_ + row_index * ld_, row_index,
68 // shape()[1]);
69 auto row_elements = rng::views::iota(size_type(0), size_type(shape()[1]));
70 Iter data = data_ + row_index * ld_;
71
72 return row_elements | rng::views::transform([=](auto column_index) {
73 return reference(key_type(row_index, column_index),
74 data[column_index]);
75 });
76 }
77
78 auto column(size_type column_index) const {
79 // return dense_matrix_column_view(data_ + column_index, column_index,
80 // shape()[0], ld_);
81 auto column_elements =
82 rng::views::iota(size_type(0), size_type(shape()[0]));
83 Iter data = data_ + column_index;
84 size_type ld = ld_;
85
86 return column_elements | rng::views::transform([=](auto row_index) {
87 return reference(key_type(row_index, column_index),
88 data[row_index * ld]);
89 });
90 }
91
92 Iter data() const { return data_; }
93
94 std::size_t rank() const { return rank_; }
95
96 size_type ld() const { return ld_; }
97
98 auto local() const {
99 auto local_data = __detail::local(data_);
101 local_data, shape_, idx_offset_, ld(), rank());
102 }
103
104private:
105 Iter data_;
106 key_type shape_;
107 key_type idx_offset_;
108 size_type ld_;
109 size_type rank_;
110};
111
112template <std::random_access_iterator Iter>
113dense_matrix_view(Iter, dr::index<>, std::size_t)
115
116template <std::random_access_iterator Iter>
119
120template <typename T, typename Allocator>
123
124} // namespace dr::sp
Definition: index.hpp:34
Definition: iterator_adaptor.hpp:23
Definition: matrix_entry.hpp:115
Definition: dense_matrix_view.hpp:21
Definition: dense_matrix.hpp:19