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:
66 
68  using typename ParentClass::INDEX_TYPE_NC;
69 
70  using typename ParentClass::SIZE_TYPE;
71 
72 public:
73  static_assert( std::is_integral< COL_TYPE >::value, "COL_TYPE must be integral." );
74  static_assert( std::is_integral< INDEX_TYPE >::value, "INDEX_TYPE must be integral." );
75 
77  using ColType = COL_TYPE;
78  using typename ParentClass::IndexType;
79 
83 
89  SparsityPatternView() = default;
90 
95  inline
96  SparsityPatternView( SparsityPatternView const & ) = default;
97 
102  inline
104  ParentClass( std::move( src ) ),
105  m_numCols( src.m_numCols )
106  { src.m_numCols = 0; }
107 
116  LVARRAY_HOST_DEVICE constexpr inline
117  SparsityPatternView( INDEX_TYPE const nRows,
118  INDEX_TYPE const nCols,
119  BUFFER_TYPE< INDEX_TYPE > const & offsets,
120  BUFFER_TYPE< SIZE_TYPE > const & nnz,
121  BUFFER_TYPE< COL_TYPE > const & columns ):
122  ParentClass( nRows, offsets, nnz, columns ),
123  m_numCols( nCols )
124  {}
125 
130  inline
131  SparsityPatternView & operator=( SparsityPatternView const & ) = default;
132 
138  inline
140  {
141  ParentClass::operator=( std::move( src ) );
142  m_numCols = src.m_numCols;
143  src.m_numCols = 0;
144  return *this;
145  }
146 
148 
152 
154 
158  LVARRAY_HOST_DEVICE constexpr inline
160  toView() const
161  {
163  numColumns(),
164  this->m_offsets,
165  this->m_sizes,
166  this->m_values );
167  }
168 
172  LVARRAY_HOST_DEVICE constexpr inline
174  toViewConst() const
175  {
177  numColumns(),
178  this->m_offsets,
179  this->m_sizes,
180  this->m_values );
181  }
182 
184 
188 
193  LVARRAY_HOST_DEVICE constexpr inline
195  { return ParentClass::size(); }
196 
200  LVARRAY_HOST_DEVICE constexpr inline
202  { return m_numCols; }
203 
207  LVARRAY_HOST_DEVICE inline
209  {
210  INDEX_TYPE_NC nnz = 0;
211  for( INDEX_TYPE_NC row = 0; row < numRows(); ++row )
212  {
213  nnz += numNonZeros( row );
214  }
215 
216  return nnz;
217  }
218 
223  LVARRAY_HOST_DEVICE constexpr inline
224  INDEX_TYPE_NC numNonZeros( INDEX_TYPE const row ) const
225  { return ParentClass::sizeOfSet( row ); }
226 
230  LVARRAY_HOST_DEVICE constexpr inline
232  { return ParentClass::valueCapacity(); }
233 
239  LVARRAY_HOST_DEVICE constexpr inline
240  INDEX_TYPE_NC nonZeroCapacity( INDEX_TYPE const row ) const
241  { return ParentClass::capacityOfSet( row ); }
242 
246  LVARRAY_HOST_DEVICE inline
247  bool empty() const
248  { return numNonZeros() == 0; }
249 
254  LVARRAY_HOST_DEVICE constexpr inline
255  bool empty( INDEX_TYPE const row ) const
256  { return numNonZeros( row ) == 0; }
257 
263  LVARRAY_HOST_DEVICE inline
264  bool empty( INDEX_TYPE const row, COL_TYPE const col ) const
265  { return !ParentClass::contains( row, col ); }
266 
268 
272 
278  LVARRAY_HOST_DEVICE constexpr inline
280  { return (*this)[row]; }
281 
285  LVARRAY_HOST_DEVICE constexpr inline
286  INDEX_TYPE const * getOffsets() const
287  { return this->m_offsets.data(); }
288 
292  LVARRAY_HOST_DEVICE constexpr inline
293  COL_TYPE const * getColumns() const
294  {
295  return this->getValues();
296  }
297 
298  using ParentClass::getSizes;
299 
300 
302 
306 
316  LVARRAY_HOST_DEVICE inline
317  bool insertNonZero( INDEX_TYPE const row, COL_TYPE const col ) const
318  {
321  return ParentClass::insertIntoSet( row, col );
322  }
323 
335  template< typename ITER >
336  LVARRAY_HOST_DEVICE inline
337  INDEX_TYPE_NC insertNonZeros( INDEX_TYPE const row, ITER const first, ITER const last ) const
338  {
340 
341  #ifdef LVARRAY_BOUNDS_CHECK
342  for( ITER iter = first; iter != last; ++iter )
343  { SPARSITYPATTERN_COLUMN_CHECK( *iter ); }
344  #endif
345 
346  return ParentClass::insertIntoSet( row, first, last );
347  }
348 
355  LVARRAY_HOST_DEVICE inline
356  bool removeNonZero( INDEX_TYPE const row, COL_TYPE const col ) const
357  {
360  return ParentClass::removeFromSet( row, col );
361  }
362 
373  template< typename ITER >
374  LVARRAY_HOST_DEVICE inline
375  INDEX_TYPE_NC removeNonZeros( INDEX_TYPE const row, ITER const first, ITER const last ) const
376  {
378 
379  #ifdef LVARRAY_BOUNDS_CHECK
380  for( ITER iter = first; iter != last; ++iter )
381  { SPARSITYPATTERN_COLUMN_CHECK( *iter ); }
382  #endif
383 
384  return ParentClass::removeFromSet( row, first, last );
385  }
386 
388 
392 
400  void move( MemorySpace const space, bool const touch=true ) const
401  { return ParentClass::move( space, touch ); }
402 
404 
405 protected:
406 
412  ParentClass( true )
413  {};
414 
420  {
422  *this = std::move( src );
423  }
424 
433  template< class ... BUFFERS >
434  void resize( INDEX_TYPE const nrows,
435  INDEX_TYPE const ncols,
436  INDEX_TYPE_NC initialRowCapacity,
437  BUFFERS & ... buffers )
438  {
439  LVARRAY_ERROR_IF( !arrayManipulation::isPositive( nrows ), "nrows must be positive." );
440  LVARRAY_ERROR_IF( !arrayManipulation::isPositive( ncols ), "ncols must be positive." );
442  "COL_TYPE must be able to hold the range of columns: [0, " << ncols - 1 << "]." );
443 
444  m_numCols = ncols;
445  ParentClass::resizeImpl( nrows, initialRowCapacity, buffers ... );
446  }
447 
450 };
451 
452 } // 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:264
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:356
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:293
LVARRAY_HOST_DEVICE constexpr INDEX_TYPE_NC numNonZeros(INDEX_TYPE const row) const
Definition: SparsityPatternView.hpp:224
#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:103
LVARRAY_HOST_DEVICE constexpr SparsityPatternView(INDEX_TYPE const nRows, INDEX_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:117
#define LVARRAY_ERROR_IF(EXP, MSG)
Abort execution if EXP is true.
Definition: Macros.hpp:122
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:419
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:361
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
void resize(INDEX_TYPE const nrows, INDEX_TYPE const ncols, INDEX_TYPE_NC initialRowCapacity, BUFFERS &... buffers)
Resize the SparsityPattern to the given size.
Definition: SparsityPatternView.hpp:434
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 INDEX_TYPE_NC numNonZeros() const
Definition: SparsityPatternView.hpp:208
LVARRAY_HOST_DEVICE constexpr INDEX_TYPE_NC valueCapacity() const
Definition: ArrayOfArraysView.hpp:393
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
LVARRAY_HOST_DEVICE constexpr INDEX_TYPE_NC numRows() const
Definition: SparsityPatternView.hpp:194
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:247
LVARRAY_HOST_DEVICE constexpr bool empty(INDEX_TYPE const row) const
Definition: SparsityPatternView.hpp:255
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
The top level namespace.
Definition: Array.hpp:24
INDEX_TYPE_NC m_numCols
The number of columns in the matrix.
Definition: SparsityPatternView.hpp:449
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:317
COL_TYPE ColType
The integer type used to enumerate the columns.
Definition: SparsityPatternView.hpp:77
LVARRAY_HOST_DEVICE constexpr SparsityPatternView< COL_TYPE, INDEX_TYPE const, BUFFER_TYPE > toView() const
Definition: SparsityPatternView.hpp:160
LVARRAY_HOST_DEVICE constexpr INDEX_TYPE const * getOffsets() const
Definition: SparsityPatternView.hpp:286
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
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:400
SparsityPatternView & operator=(SparsityPatternView &&src)
Move assignment operator, this does a shallow copy.
Definition: SparsityPatternView.hpp:139
ArrayOfSetsView & operator=(ArrayOfSetsView const &)=default
Default copy assignment operator, this does a shallow copy.
LVARRAY_HOST_DEVICE constexpr std::enable_if_t< std::is_arithmetic< T >::value, T > max(T const a, T const b)
Definition: math.hpp:311
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:337
LVARRAY_HOST_DEVICE constexpr INDEX_TYPE_NC nonZeroCapacity() const
Definition: SparsityPatternView.hpp:231
Contains the implementation of LvArray::ArrayOfSetsView.
SparsityPatternView(bool)
Protected constructor to be used by parent classes.
Definition: SparsityPatternView.hpp:411
LVARRAY_HOST_DEVICE constexpr ArraySlice< COL_TYPE const, 1, 0, INDEX_TYPE_NC > getColumns(INDEX_TYPE const row) const
Definition: SparsityPatternView.hpp:279
LVARRAY_HOST_DEVICE constexpr INDEX_TYPE_NC nonZeroCapacity(INDEX_TYPE const row) const
Definition: SparsityPatternView.hpp:240
#define DISABLE_HD_WARNING
Disable host device warnings.
Definition: Macros.hpp:561
LVARRAY_HOST_DEVICE constexpr INDEX_TYPE_NC size() const
Definition: ArrayOfArraysView.hpp:323
LVARRAY_HOST_DEVICE constexpr SIZE_TYPE const * getSizes() const
Definition: ArrayOfArraysView.hpp:341
LVARRAY_HOST_DEVICE constexpr INDEX_TYPE_NC numColumns() const
Definition: SparsityPatternView.hpp:201
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:174
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:375
#define LVARRAY_HOST_DEVICE
Mark a function for both host and device usage.
Definition: Macros.hpp:549