DASH  0.3.0
MatrixRef.h
1 #ifndef DASH__MATRIX__MATRIX_REF_H__
2 #define DASH__MATRIX__MATRIX_REF_H__
3 
4 #include <dash/Matrix.h>
5 
6 #include <dash/dart/if/dart.h>
7 
8 #include <dash/Team.h>
9 #include <dash/Pattern.h>
10 #include <dash/GlobRef.h>
11 #include <dash/HView.h>
12 
13 #include <dash/view/Sub.h>
14 
15 #include <dash/iterator/GlobIter.h>
16 #include <dash/iterator/GlobViewIter.h>
17 
18 
19 namespace dash {
20 
22 template <
23  typename T,
24  dim_t NumDimensions,
25  typename IndexT,
26  class PatternT,
27  typename LocalMemT>
28 class Matrix;
30 template <
31  typename T,
32  dim_t NumDimensions,
33  dim_t NumViewDim,
34  class PatternT,
35  typename LocalMemT>
36 class MatrixRef;
38 template <
39  typename T,
40  dim_t NumDimensions,
41  dim_t NumViewDim,
42  class PatternT,
43  typename LocalMemT>
44 class LocalMatrixRef;
45 
58 template <
59  typename ElementT,
60  dim_t NumDimensions,
61  dim_t NumViewDim,
62  class PatternT,
63  class LocalMemT >
64 class MatrixRef
65 {
66  private:
67  typedef MatrixRef<ElementT, NumDimensions, NumViewDim, PatternT, LocalMemT>
68  self_t;
69  typedef PatternT
70  Pattern_t;
71  typedef typename PatternT::index_type
72  Index_t;
73  typedef typename PatternT::size_type
74  Size_t;
75  typedef MatrixRefView<ElementT, NumDimensions, PatternT, LocalMemT>
76  MatrixRefView_t;
77  typedef CartesianIndexSpace<
78  NumViewDim,
79  PatternT::memory_order(),
80  typename PatternT::index_type >
81  IndexSpace_t;
82  typedef std::array<typename PatternT::size_type, NumDimensions>
83  Extents_t;
84  typedef std::array<typename PatternT::index_type, NumDimensions>
85  Offsets_t;
86 
87  typedef Matrix<ElementT, NumDimensions, Index_t, PatternT, LocalMemT> matrix_t;
88  typedef typename matrix_t::GlobMem_t GlobMem_t;
89 
90  public:
91  typedef PatternT pattern_type;
92  typedef typename PatternT::index_type index_type;
93  typedef ElementT value_type;
94  typedef IndexSpace_t index_space_type;
95 
96  typedef typename PatternT::size_type size_type;
97  typedef typename PatternT::index_type difference_type;
98 
99  typedef GlobViewIter<value_type, PatternT, GlobMem_t> iterator;
100  typedef GlobViewIter<const value_type, PatternT, GlobMem_t> const_iterator;
101 
102  typedef std::reverse_iterator<iterator> reverse_iterator;
103  typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
104 
105  typedef GlobRef< value_type> reference;
106  typedef GlobRef<const value_type> const_reference;
107 
108  typedef iterator pointer;
109  typedef const_iterator const_pointer;
110 
111  typedef LocalMatrixRef<
112  ElementT, NumDimensions, NumDimensions, PatternT, LocalMemT>
113  local_type;
114  typedef LocalMatrixRef<
115  const ElementT, NumDimensions, NumDimensions, PatternT, LocalMemT>
116  const_local_type;
117 
118  typedef LocalMatrixRef<
119  ElementT, NumDimensions, NumDimensions, PatternT, LocalMemT>
120  local_reference_type;
121  typedef LocalMatrixRef<
122  const ElementT, NumDimensions, NumDimensions, PatternT, LocalMemT>
123  const_local_reference_type;
124 
125  public:
126  template<
127  typename T_,
128  dim_t NumDimensions_,
129  typename IndexT_,
130  class PatternT_,
131  typename LocalMemT_>
132  friend class Matrix;
133  template<
134  typename T_,
135  dim_t NumDimensions1,
136  dim_t NumDimensions2,
137  class PatternT_,
138  typename LocalMemT_ >
139  friend class MatrixRef;
140  template<
141  typename T_,
142  dim_t NumDimensions1,
143  dim_t NumDimensions2,
144  class PatternT_,
145  typename LocalMemT_ >
146  friend class LocalMatrixRef;
147 
148  inline operator
149  MatrixRef<ElementT, NumDimensions, NumViewDim-1, PatternT, LocalMemT>();
150 
151 public:
152  typedef std::integral_constant<dim_t, NumViewDim>
153  rank;
154 
155  static constexpr dim_t ndim() {
156  return NumViewDim;
157  }
158 
159 private:
160  MatrixRefView<ElementT, NumDimensions, PatternT, LocalMemT> _refview;
161 
162 public:
163  MatrixRef<ElementT, NumDimensions, NumViewDim, PatternT, LocalMemT>() =
164  default;
165 
166  template <class T_>
167  MatrixRef<ElementT, NumDimensions, NumViewDim, PatternT, LocalMemT>(
168  const MatrixRef<T_, NumDimensions, NumViewDim + 1, PatternT, LocalMemT>&
169  prev,
170  index_type coord);
171 
172  template <class T_>
173  MatrixRef<ElementT, NumDimensions, NumViewDim, PatternT, LocalMemT>(
174  const MatrixRef<T_, NumDimensions, NumViewDim, PatternT, LocalMemT> & other);
175 
176  constexpr Team & team() const noexcept;
177 
178  constexpr size_type size() const noexcept;
179  constexpr size_type local_size() const noexcept;
180  constexpr size_type local_capacity() const noexcept;
181  constexpr size_type extent(dim_t dim) const noexcept;
182  constexpr Extents_t extents() const noexcept;
183  constexpr index_type offset(dim_t dim) const noexcept;
184  constexpr Offsets_t offsets() const noexcept;
185  constexpr bool empty() const noexcept;
186 
187  inline void barrier() const;
188 
193  constexpr const PatternT & pattern() const noexcept;
194 
195  constexpr const_pointer data() const noexcept;
196  pointer data() noexcept;
197 
198  iterator begin() noexcept;
199  constexpr const_iterator begin() const noexcept;
200 
201  iterator end() noexcept;
202  constexpr const_iterator end() const noexcept;
203 
205  inline local_type sub_local() noexcept;
206 
208  inline ElementT * lbegin() noexcept;
210  constexpr const ElementT * lbegin() const noexcept;
212  inline ElementT * lend() noexcept;
214  constexpr const ElementT * lend() const noexcept;
215 
220  template <dim_t __NumViewDim = NumViewDim - 1>
221  typename std::enable_if<
222  (__NumViewDim != 0),
223  MatrixRef<ElementT, NumDimensions, __NumViewDim, PatternT, LocalMemT>>::
224  type
225  operator[](size_type n);
226 
231  template <dim_t __NumViewDim = NumViewDim - 1>
232  typename std::enable_if<
233  (__NumViewDim != 0),
234  MatrixRef<const ElementT, NumDimensions, __NumViewDim, PatternT, LocalMemT>>::
235  type
236  constexpr operator[](size_type n) const;
237 
242  template<dim_t __NumViewDim = NumViewDim-1>
243  typename std::enable_if<(__NumViewDim == 0), reference>::type
244  operator[](size_type n);
245 
250  template<dim_t __NumViewDim = NumViewDim-1>
251  typename std::enable_if<(__NumViewDim == 0), const_reference>::type
252  operator[](size_type n) const;
253 
254  template <dim_t NumSubDimensions>
255  MatrixRef<
256  const ElementT,
257  NumDimensions,
258  NumDimensions - 1,
259  PatternT,
260  LocalMemT>
261  sub(size_type n) const;
262 
263  template<dim_t NumSubDimensions>
264  MatrixRef<ElementT, NumDimensions, NumDimensions-1, PatternT, LocalMemT>
265  sub(size_type n);
266 
267  MatrixRef<ElementT, NumDimensions, NumDimensions-1, PatternT, LocalMemT>
268  col(size_type n);
269 
270  MatrixRef<ElementT, NumDimensions, NumDimensions-1, PatternT, LocalMemT>
271  row(size_type n);
272 
273  template <dim_t SubDimension>
274  MatrixRef<const ElementT, NumDimensions, NumDimensions, PatternT, LocalMemT>
275  sub(size_type n, size_type range) const;
276 
277  template <dim_t SubDimension>
278  MatrixRef<ElementT, NumDimensions, NumDimensions, PatternT, LocalMemT>
279  sub(size_type n, size_type range);
280 
290  MatrixRef<ElementT, NumDimensions, NumDimensions, PatternT, LocalMemT>
291  rows(
293  size_type n,
295  size_type range);
296 
306  MatrixRef<ElementT, NumDimensions, NumDimensions, PatternT, LocalMemT>
307  cols(
309  size_type offset,
311  size_type range);
312 
321  template<typename ... Args>
322  reference at(
324  Args... args);
325 
334  template<typename ... Args>
335  const_reference at(
337  Args... args) const;
338 
347  const_reference at(
349  const ::std::array<index_type, NumDimensions> & coords) const;
350 
359  reference at(
361  const ::std::array<index_type, NumDimensions> & coords);
362 
372  template<typename... Args>
373  reference operator()(
375  Args... args);
376 
377  constexpr bool is_local(index_type n) const;
378 
379  template<dim_t Dimension>
380  constexpr bool is_local(index_type n) const;
381 
382  constexpr const ViewSpec<NumDimensions, index_type> & viewspec() const {
383  return _refview._viewspec;
384  }
385 
386  template <int level>
388  inline hview();
389 };
390 
391 } // namespace dash
392 
393 #include <dash/matrix/internal/MatrixRef-inl.h>
394 
395 #endif // DASH__MATRIX__MATRIX_REF_H__
constexpr dim_t rank(const DimensionalType &d)
Definition: Dimensional.h:64
local_type sub_local() noexcept
View representing elements in the active unit&#39;s local memory.
Defines how a list of global indices is mapped to single units within a Team.
Definition: BlockPattern.h:42
size_t size()
Return the number of units in the global team.
constexpr auto end(RangeType &&range) -> decltype(std::forward< RangeType >(range).end())
Definition: Range.h:98
This class is a simple memory pool which holds allocates elements of size ValueType.
Definition: AllOf.h:8
constexpr auto begin(RangeType &&range) -> decltype(std::forward< RangeType >(range).begin())
Definition: Range.h:89
int dim_t
Scalar type for a dimension value, with 0 indicating the first dimension.
Definition: Types.h:39
reference at(Args... args)
Fortran-style subscript operator.
MatrixRef< ElementT, NumDimensions, NumDimensions, PatternT, LocalMemT > cols(size_type offset, size_type range)
Create a view representing the matrix slice within a column range.
constexpr const PatternT & pattern() const noexcept
The pattern used to distribute matrix elements to units in its associated team.
constexpr dim_t ndim(const DimensionalType &d)
Definition: Dimensional.h:56
ElementT * lbegin() noexcept
Pointer to first element in local range.
MatrixRef< ElementT, NumDimensions, NumDimensions, PatternT, LocalMemT > rows(size_type n, size_type range)
Create a view representing the matrix slice within a row range.
constexpr DimensionalType::extent_type extent(const DimensionalType &d)
Definition: Dimensional.h:73
void barrier()
A global barrier involving all units.
see https://en.cppreference.com/w/cpp/feature_test for recommended feature tests
Definition: cstddef.h:8
constexpr ViewSubMod< ViewOrigin< NViewDim >, SubDim > sub(OffsetFirstT begin, OffsetFinalT end)
Sub-section, view dimensions maintain domain dimensions.
Definition: Sub.h:27
Forward-declaration.
ElementT * lend() noexcept
Pointer past final element in local range.