Program Listing for File CsrMatrix.h

↰ Return to documentation for file (ADS/numeric/CsrMatrix.h)

/*--------------------------------------------------------------------------*/
/*---------------------------- File CsrMatrix.h ----------------------------*/
/*--------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------*/
/*----------------------------- DEFINITIONS --------------------------------*/
/*--------------------------------------------------------------------------*/

#ifndef __ADS_CsrMatrix
 #define __ADS_CsrMatrix
                      /* self-identification: #endif constant */

/*--------------------------------------------------------------------------*/
/*------------------------------ INCLUDES ----------------------------------*/
/*--------------------------------------------------------------------------*/

#include "ADS/Contract.h"
#include "ADS/numeric/DenseMatrix.h"
#include "ADS/numeric/SparseMatrix.h"

#include <algorithm>
#include <cstddef>
#include <cstdint>
#include <numeric>
#include <tuple>
#include <vector>

/*--------------------------------------------------------------------------*/
/*--------------------------- NAMESPACE ------------------------------------*/
/*--------------------------------------------------------------------------*/

namespace ADS {

/*--------------------------------------------------------------------------*/
/*---------------------------- CLASS CsrMatrix -----------------------------*/
/*--------------------------------------------------------------------------*/

class CsrMatrix {
 public:
 using Triplet = std::tuple< std::size_t , std::size_t , double >;

 CsrMatrix( std::size_t m = 0 , std::size_t n = 0 );

 CsrMatrix( std::size_t m , std::size_t n , std::vector< Triplet > T );

 explicit CsrMatrix( const SparseMatrix & S );

 [[nodiscard]] std::size_t rows( void ) const { return( f_m ); }
 [[nodiscard]] std::size_t cols( void ) const { return( f_n ); }
 [[nodiscard]] std::size_t nonzeros( void ) const { return( f_val.size() ); }

 [[nodiscard]] double get( std::size_t i , std::size_t j ) const;

 [[nodiscard]] std::vector< double > multiply(
                                     const std::vector< double > & x ) const;

 void multiply( const double * x , double * y ) const;

 [[nodiscard]] CsrMatrix transpose( void ) const;

 [[nodiscard]] const std::size_t * rowStart( void ) const {
  return( f_row.data() );
  }
 [[nodiscard]] const std::uint32_t * columns( void ) const {
  return( f_col.data() );
  }
 [[nodiscard]] const double * values( void ) const { return( f_val.data() ); }

 bool operator==( const CsrMatrix & ) const = default;

 private:
 [[nodiscard]] bool sorted( void ) const;

 template< class U >                  // not zeroed when they grow
 using Vector = std::vector< U , detail::DefaultInitAllocator< U > >;

 std::size_t f_m , f_n;
 Vector< std::size_t > f_row;
 Vector< std::uint32_t > f_col;
 Vector< double > f_val;
 };  // end( class CsrMatrix )

/*--------------------------------------------------------------------------*/

}  // end( namespace ADS )

/*--------------------------------------------------------------------------*/
/*-------------------------- IMPLEMENTATION --------------------------------*/
/*--------------------------------------------------------------------------*/

#include "ADS/numeric/impl/CsrMatrix.tpp"

/*--------------------------------------------------------------------------*/

#endif  /* CsrMatrix.h included */

/*--------------------------------------------------------------------------*/
/*-------------------------- End File CsrMatrix.h --------------------------*/
/*--------------------------------------------------------------------------*/