LvArray
SparsityPatternView.hpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2021, Lawrence Livermore National Security, LLC and LvArray contributors.
3  * All rights reserved.
4  * See the LICENSE file for details.
5  * SPDX-License-Identifier: (BSD-3-Clause)
6  */
7 
13 #pragma once
14 
15 // Source includes
16 #include "ArrayOfSetsView.hpp"
17 
18 // System includes
19 #include <limits>
20 
21 #ifdef LVARRAY_BOUNDS_CHECK
22 
28 #define SPARSITYPATTERN_COLUMN_CHECK( col ) \
29  LVARRAY_ERROR_IF( !arrayManipulation::isPositive( col ) || col >= this->numColumns(), \
30  "Column Check Failed: col=" << col << " numColumns=" << this->numColumns() )
31 
32 #else // LVARRAY_BOUNDS_CHECK
33 
39 #define SPARSITYPATTERN_COLUMN_CHECK( col )
40 
41 #endif
42 
43 namespace LvArray
44 {
45 
58 template< typename COL_TYPE,
59  typename INDEX_TYPE,
60  template< typename > class BUFFER_TYPE >
61 class SparsityPatternView : protected ArrayOfSetsView< COL_TYPE, INDEX_TYPE, BUFFER_TYPE >
62 {
63 protected:
64  using COL_TYPE_NC = std::remove_const_t< COL_TYPE >;
67 
69  using typename ParentClass::INDEX_TYPE_NC;
70 
71  using typename ParentClass::SIZE_TYPE;
72 
73 public:
74  static_assert( std::is_integral< COL_TYPE >::value, "COL_TYPE must be integral." );
75  static_assert( std::is_integral< INDEX_TYPE >::value, "INDEX_TYPE must be integral." );
76 
78 
79  using ColType = COL_TYPE;
80  using ColTypeNC = COL_TYPE_NC;
81  using typename ParentClass::IndexType;
82 
86 
92  SparsityPatternView() = default;
93 
98  inline
99  SparsityPatternView( SparsityPatternView const & ) = default;
100 
105  inline
107  ParentClass( std::move( src ) ),
108  m_numCols( src.m_numCols )
109  { src.m_numCols = 0; }
110 
119  LVARRAY_HOST_DEVICE constexpr inline
120  SparsityPatternView( INDEX_TYPE const nRows,
121  COL_TYPE const nCols,
122  BUFFER_TYPE< INDEX_TYPE > const & offsets,
123  BUFFER_TYPE< SIZE_TYPE > const & nnz,
124  BUFFER_TYPE< COL_TYPE > const & columns ):
125  ParentClass( nRows, offsets, nnz, columns ),
126  m_numCols( nCols )
127  {}
128 
133  inline
134  SparsityPatternView & operator=( SparsityPatternView const & ) = default;
135 
141  inline
143  {
144  ParentClass::operator=( std::move( src ) );
145  m_numCols = src.m_numCols;
146  src.m_numCols = 0;
147  return *this;
148  }
149 
151 
155 
157 
161  LVARRAY_HOST_DEVICE constexpr inline
163  toView() const
164  {
166  numColumns(),
167  this->m_offsets,
168  this->m_sizes,
169  this->m_values );
170  }
171 
175  LVARRAY_HOST_DEVICE constexpr inline
177  toViewConst() const
178  {
180  numColumns(),
181  this->m_offsets,
182  this->m_sizes,
183  this->m_values );
184  }
185 
187 
191 
196  LVARRAY_HOST_DEVICE constexpr inline
197  INDEX_TYPE_NC const numRows() const
198  { return ParentClass::size(); }
199 
203  LVARRAY_HOST_DEVICE constexpr inline
204  COL_TYPE const numColumns() const
205  { return m_numCols; }
206 
210  LVARRAY_HOST_DEVICE inline
212  {
213  INDEX_TYPE_NC nnz = 0;
214  for( INDEX_TYPE_NC row = 0; row < numRows(); ++row )
215  {
216  nnz += numNonZeros( row );
217  }
218 
219  return nnz;
220  }
221 
226  LVARRAY_HOST_DEVICE constexpr inline
227  INDEX_TYPE_NC const numNonZeros( INDEX_TYPE const row ) const
228  { return ParentClass::sizeOfSet( row ); }
229 
233  LVARRAY_HOST_DEVICE constexpr inline
235  { return ParentClass::valueCapacity(); }
236 
242  LVARRAY_HOST_DEVICE constexpr inline
243  INDEX_TYPE_NC const nonZeroCapacity( INDEX_TYPE const row ) const
244  { return ParentClass::capacityOfSet( row ); }
245 
249  LVARRAY_HOST_DEVICE inline
250  bool empty() const
251  { return numNonZeros() == 0; }
252 
257  LVARRAY_HOST_DEVICE constexpr inline
258  bool empty( INDEX_TYPE const row ) const
259  { return numNonZeros( row ) == 0; }
260 
266  LVARRAY_HOST_DEVICE inline
267  bool empty( INDEX_TYPE const row, COL_TYPE const col ) const
268  { return !ParentClass::contains( row, col ); }
269 
271 
275 
281  LVARRAY_HOST_DEVICE constexpr inline
283  { return (*this)[row]; }
284 
288  LVARRAY_HOST_DEVICE constexpr inline
289  INDEX_TYPE const * getOffsets() const
290  { return this->m_offsets.data(); }
291 
295  LVARRAY_HOST_DEVICE constexpr inline
296  COL_TYPE const * getColumns() const
297  {
298  return this->getValues();
299  }
300 
301  using ParentClass::getSizes;
302 
303 
305 
309 
319  LVARRAY_HOST_DEVICE inline
320  bool insertNonZero( INDEX_TYPE const row, COL_TYPE const col ) const
321  {
324  return ParentClass::insertIntoSet( row, col );
325  }
326 
338  template< typename ITER >
339  LVARRAY_HOST_DEVICE inline
340  INDEX_TYPE_NC insertNonZeros( INDEX_TYPE const row, ITER const first, ITER const last ) const
341  {
343 
344  #ifdef LVARRAY_BOUNDS_CHECK
345  for( ITER iter = first; iter != last; ++iter )
346  { SPARSITYPATTERN_COLUMN_CHECK( *iter ); }
347  #endif
348 
349  return ParentClass::insertIntoSet( row, first, last );
350  }
351 
358  LVARRAY_HOST_DEVICE inline
359  bool removeNonZero( INDEX_TYPE const row, COL_TYPE const col ) const
360  {
363  return ParentClass::removeFromSet( row, col );
364  }
365 
376  template< typename ITER >
377  LVARRAY_HOST_DEVICE inline
378  INDEX_TYPE_NC removeNonZeros( INDEX_TYPE const row, ITER const first, ITER const last ) const
379  {
381 
382  #ifdef LVARRAY_BOUNDS_CHECK
383  for( ITER iter = first; iter != last; ++iter )
384  { SPARSITYPATTERN_COLUMN_CHECK( *iter ); }
385  #endif
386 
387  return ParentClass::removeFromSet( row, first, last );
388  }
389 
391 
395 
403  void move( MemorySpace const space, bool const touch=true ) const
404  { return ParentClass::move( space, touch ); }
405 
407 
408 protected:
409 
415  ParentClass( true )
416  {};
417 
423  {
425  *this = std::move( src );
426  }
427 
436  template< class ... BUFFERS >
437  void resize( INDEX_TYPE const nrows,
438  COL_TYPE const ncols,
439  INDEX_TYPE_NC initialRowCapacity,
440  BUFFERS & ... buffers )
441  {
442  LVARRAY_ERROR_IF( !arrayManipulation::isPositive( nrows ), "nrows must be positive." );
443  LVARRAY_ERROR_IF( !arrayManipulation::isPositive( ncols ), "ncols must be positive." );
445  "COL_TYPE must be able to hold the range of columns: [0, " << ncols - 1 << "]." );
446 
447  m_numCols = ncols;
448  ParentClass::resizeImpl( nrows, initialRowCapacity, buffers ... );
449  }
450 
452  COL_TYPE_NC m_numCols;
453 };
454 
455 } // namespace LvArray
#define SPARSITYPATTERN_COLUMN_CHECK(col)
Check that col is a valid column in the matrix.
Definition: SparsityPatternView.hpp:39
LVARRAY_HOST_DEVICE bool empty(INDEX_TYPE const row, COL_TYPE const col) const
Definition: SparsityPatternView.hpp:267
LVARRAY_HOST_DEVICE bool removeNonZero(INDEX_TYPE const row, COL_TYPE const col) const
Remove a non-zero entry at the given position.
Definition: SparsityPatternView.hpp:359
This class provides a view into a compressed row storage sparsity pattern.
Definition: SparsityPatternView.hpp:61
LVARRAY_HOST_DEVICE constexpr COL_TYPE const * getColumns() const
Definition: SparsityPatternView.hpp:296
LVARRAY_HOST_DEVICE constexpr INDEX_TYPE_NC const numNonZeros(INDEX_TYPE const row) const
Definition: SparsityPatternView.hpp:227
#define ARRAYOFARRAYS_CHECK_BOUNDS(i)
Check that i is a valid array index.
Definition: ArrayOfArraysView.hpp:106
SparsityPatternView(SparsityPatternView &&src)
Move constructor.
Definition: SparsityPatternView.hpp:106
#define LVARRAY_ERROR_IF(EXP, MSG)
Abort execution if EXP is true.
Definition: Macros.hpp:155
This class serves to provide a sliced multidimensional interface to the family of LvArray classes...
Definition: ArraySlice.hpp:89
BUFFER_TYPE< INDEX_TYPE > m_offsets
Definition: ArrayOfArraysView.hpp:965
void assimilate(SparsityPatternView &&src)
Steal the resources of src, clearing it in the process.
Definition: SparsityPatternView.hpp:422
LVARRAY_HOST_DEVICE constexpr INDEX_TYPE_NC capacityOfSet(INDEX_TYPE const i) const
Definition: ArrayOfSetsView.hpp:181
BUFFER_TYPE< SIZE_TYPE > m_sizes
Holds the size of each array.
Definition: ArrayOfArraysView.hpp:968
LVARRAY_HOST_DEVICE bool insertIntoSet(INDEX_TYPE const i, COL_TYPE const &value) const
Insert a value into the given set.
Definition: ArrayOfSetsView.hpp:261
LVARRAY_HOST_DEVICE constexpr COL_TYPE const * getValues() const
Definition: ArrayOfArraysView.hpp:362
void resize(INDEX_TYPE const nrows, COL_TYPE const ncols, INDEX_TYPE_NC initialRowCapacity, BUFFERS &... buffers)
Resize the SparsityPattern to the given size.
Definition: SparsityPatternView.hpp:437
COL_TYPE_NC m_numCols
The number of columns in the matrix.
Definition: SparsityPatternView.hpp:452
LVARRAY_HOST_DEVICE constexpr std::enable_if< std::is_signed< INDEX_TYPE >::value, bool >::type isPositive(INDEX_TYPE const i)
Definition: arrayManipulation.hpp:82
LVARRAY_HOST_DEVICE bool removeFromSet(INDEX_TYPE const i, COL_TYPE const &value) const
Remove a value from the given set.
Definition: ArrayOfSetsView.hpp:287
This class provides a view into an array of sets like object.
Definition: ArrayOfSetsView.hpp:40
SparsityPatternView()=default
A constructor to create an uninitialized SparsityPatternView.
LVARRAY_HOST_DEVICE constexpr INDEX_TYPE_NC const numRows() const
Definition: SparsityPatternView.hpp:197
LVARRAY_HOST_DEVICE INDEX_TYPE_NC numNonZeros() const
Definition: SparsityPatternView.hpp:211
LVARRAY_HOST_DEVICE constexpr INDEX_TYPE_NC valueCapacity() const
Definition: ArrayOfArraysView.hpp:394
INDEX_TYPE IndexType
The integer type used for indexing.
Definition: ArrayOfArraysView.hpp:188
void resizeImpl(INDEX_TYPE const newSize, INDEX_TYPE const defaultArrayCapacity, BUFFERS &... buffers)
Set the number of arrays.
Definition: ArrayOfArraysView.hpp:759
void move(MemorySpace const space, bool const touch=true) const
Move this ArrayOfSets to the given memory space.
Definition: ArrayOfSetsView.hpp:320
LVARRAY_HOST_DEVICE bool empty() const
Definition: SparsityPatternView.hpp:250
LVARRAY_HOST_DEVICE constexpr bool empty(INDEX_TYPE const row) const
Definition: SparsityPatternView.hpp:258
camp::resources::Platform MemorySpace
an alias for camp::resources::Platform.
Definition: bufferManipulation.hpp:31
LVARRAY_HOST_DEVICE bool contains(INDEX_TYPE const i, COL_TYPE const &value) const
Definition: ArrayOfSetsView.hpp:192
LVARRAY_HOST_DEVICE constexpr INDEX_TYPE_NC const nonZeroCapacity() const
Definition: SparsityPatternView.hpp:234
The top level namespace.
Definition: Array.hpp:24
SparsityPatternView & operator=(SparsityPatternView const &)=default
Default copy assignment operator, this does a shallow copy.
LVARRAY_HOST_DEVICE constexpr INDEX_TYPE_NC sizeOfSet(INDEX_TYPE const i) const
Definition: ArrayOfSetsView.hpp:171
LVARRAY_HOST_DEVICE bool insertNonZero(INDEX_TYPE const row, COL_TYPE const col) const
Insert a non-zero entry at the given position.
Definition: SparsityPatternView.hpp:320
COL_TYPE ColType
The integer type used to enumerate the columns.
Definition: SparsityPatternView.hpp:79
LVARRAY_HOST_DEVICE constexpr SparsityPatternView< COL_TYPE, INDEX_TYPE const, BUFFER_TYPE > toView() const
Definition: SparsityPatternView.hpp:163
LVARRAY_HOST_DEVICE constexpr INDEX_TYPE const * getOffsets() const
Definition: SparsityPatternView.hpp:289
typename ParentClass::INDEX_TYPE_NC INDEX_TYPE_NC
Since INDEX_TYPE should always be const we need an alias for the non const version.
Definition: ArrayOfSetsView.hpp:47
void free(BUFFERS &... buffers)
Destroy all the objects held by this array and free all associated memory.
Definition: ArrayOfArraysView.hpp:806
LVARRAY_HOST_DEVICE constexpr INDEX_TYPE_NC const nonZeroCapacity(INDEX_TYPE const row) const
Definition: SparsityPatternView.hpp:243
std::conditional_t< CONST_SIZES, INDEX_TYPE const, INDEX_TYPE_NC > SIZE_TYPE
The type contained by the m_sizes buffer.
Definition: ArrayOfArraysView.hpp:177
void move(MemorySpace const space, bool const touch=true) const
Move this ArrayOfSets to the given memory space.
Definition: SparsityPatternView.hpp:403
SparsityPatternView & operator=(SparsityPatternView &&src)
Move assignment operator, this does a shallow copy.
Definition: SparsityPatternView.hpp:142
ArrayOfSetsView & operator=(ArrayOfSetsView const &)=default
Default copy assignment operator, this does a shallow copy.
LVARRAY_HOST_DEVICE INDEX_TYPE_NC insertNonZeros(INDEX_TYPE const row, ITER const first, ITER const last) const
Inserts multiple non-zero entries into the given row.
Definition: SparsityPatternView.hpp:340
Contains the implementation of LvArray::ArrayOfSetsView.
SparsityPatternView(bool)
Protected constructor to be used by parent classes.
Definition: SparsityPatternView.hpp:414
LVARRAY_HOST_DEVICE constexpr ArraySlice< COL_TYPE const, 1, 0, INDEX_TYPE_NC > getColumns(INDEX_TYPE const row) const
Definition: SparsityPatternView.hpp:282
LVARRAY_HOST_DEVICE constexpr COL_TYPE const numColumns() const
Definition: SparsityPatternView.hpp:204
#define DISABLE_HD_WARNING
Disable host device warnings.
Definition: Macros.hpp:614
LVARRAY_HOST_DEVICE constexpr INDEX_TYPE_NC size() const
Definition: ArrayOfArraysView.hpp:324
LVARRAY_HOST_DEVICE constexpr SIZE_TYPE const * getSizes() const
Definition: ArrayOfArraysView.hpp:342
LVARRAY_HOST_DEVICE constexpr SparsityPatternView(INDEX_TYPE const nRows, COL_TYPE const nCols, BUFFER_TYPE< INDEX_TYPE > const &offsets, BUFFER_TYPE< SIZE_TYPE > const &nnz, BUFFER_TYPE< COL_TYPE > const &columns)
Construct a new CRSMatrixView from the given buffers.
Definition: SparsityPatternView.hpp:120
LVARRAY_HOST_DEVICE LVARRAY_FORCE_INLINE constexpr std::enable_if_t< std::is_arithmetic< T >::value, T > max(T const a, T const b)
Definition: math.hpp:313
typename ParentClass::INDEX_TYPE_NC INDEX_TYPE_NC
Since INDEX_TYPE should always be const we need an alias for the non const version.
Definition: ArrayOfSetsView.hpp:47
LVARRAY_HOST_DEVICE constexpr SparsityPatternView< COL_TYPE const, INDEX_TYPE const, BUFFER_TYPE > toViewConst() const
Definition: SparsityPatternView.hpp:177
DISABLE_HD_WARNING LVARRAY_HOST_DEVICE INDEX_TYPE_NC removeNonZeros(INDEX_TYPE const row, ITER const first, ITER const last) const
Remove multiple non-zero entries from the given row.
Definition: SparsityPatternView.hpp:378
#define LVARRAY_HOST_DEVICE
Mark a function for both host and device usage.
Definition: Macros.hpp:600