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 --------------------------*/
/*--------------------------------------------------------------------------*/