Eigen::MatrixMarketIterator< Scalar > Class Template Reference

Iterator to browse matrices from a specified folder. More...

#include <MatrixMarketIterator.h>

Public Types

typedef Matrix< Scalar, Dynamic, 1 > VectorType
 
typedef SparseMatrix< Scalar, ColMajorMatrixType
 

Public Member Functions

 MatrixMarketIterator (const std::string &folder)
 
 ~MatrixMarketIterator ()
 
MatrixMarketIteratoroperator++ ()
 
 operator bool () const
 
MatrixTypematrix ()
 
VectorTyperhs ()
 
VectorTyperefX ()
 
std::string & matname ()
 
int sym ()
 
bool hasRhs ()
 
bool hasrefX ()
 
bool isFolderValid ()
 

Protected Member Functions

bool Fileexists (std::string file)
 
void Getnextvalidmatrix ()
 

Protected Attributes

int m_sym
 
MatrixType m_mat
 
VectorType m_rhs
 
VectorType m_refX
 
std::string m_matname
 
bool m_isvalid
 
bool m_matIsLoaded
 
bool m_hasRhs
 
bool m_hasrefX
 
std::string m_folder
 
DIR * m_folder_id
 
struct dirent * m_curs_id
 

Private Types

typedef NumTraits< Scalar >::Real RealScalar
 

Detailed Description

template<typename Scalar>
class Eigen::MatrixMarketIterator< Scalar >

Iterator to browse matrices from a specified folder.

This is used to load all the matrices from a folder. The matrices should be in Matrix Market format It is assumed that the matrices are named as matname.mtx and matname_SPD.mtx if the matrix is Symmetric and positive definite (or Hermitian) The right hand side vectors are loaded as well, if they exist. They should be named as matname_b.mtx. Note that the right hand side for a SPD matrix is named as matname_SPD_b.mtx

Sometimes a reference solution is available. In this case, it should be named as matname_x.mtx

Sample code

Template Parameters
ScalarThe scalar type

Member Typedef Documentation

◆ MatrixType

template<typename Scalar >
typedef SparseMatrix<Scalar, ColMajor> Eigen::MatrixMarketIterator< Scalar >::MatrixType

◆ RealScalar

template<typename Scalar >
typedef NumTraits<Scalar>::Real Eigen::MatrixMarketIterator< Scalar >::RealScalar
private

◆ VectorType

template<typename Scalar >
typedef Matrix<Scalar, Dynamic, 1> Eigen::MatrixMarketIterator< Scalar >::VectorType

Constructor & Destructor Documentation

◆ MatrixMarketIterator()

template<typename Scalar >
Eigen::MatrixMarketIterator< Scalar >::MatrixMarketIterator ( const std::string &  folder)
inline
51  : m_sym(0), m_isvalid(false), m_matIsLoaded(false), m_hasRhs(false), m_hasrefX(false), m_folder(folder) {
52  m_folder_id = opendir(folder.c_str());
54  }
bool m_hasRhs
Definition: MatrixMarketIterator.h:211
bool m_isvalid
Definition: MatrixMarketIterator.h:209
void Getnextvalidmatrix()
Definition: MatrixMarketIterator.h:166
bool m_matIsLoaded
Definition: MatrixMarketIterator.h:210
DIR * m_folder_id
Definition: MatrixMarketIterator.h:214
bool m_hasrefX
Definition: MatrixMarketIterator.h:212
int m_sym
Definition: MatrixMarketIterator.h:204
std::string m_folder
Definition: MatrixMarketIterator.h:213

References Eigen::MatrixMarketIterator< Scalar >::Getnextvalidmatrix(), and Eigen::MatrixMarketIterator< Scalar >::m_folder_id.

◆ ~MatrixMarketIterator()

template<typename Scalar >
Eigen::MatrixMarketIterator< Scalar >::~MatrixMarketIterator ( )
inline
56  {
57  if (m_folder_id) closedir(m_folder_id);
58  }

References Eigen::MatrixMarketIterator< Scalar >::m_folder_id.

Member Function Documentation

◆ Fileexists()

template<typename Scalar >
bool Eigen::MatrixMarketIterator< Scalar >::Fileexists ( std::string  file)
inlineprotected
156  {
157  std::ifstream file_id(file.c_str());
158  if (!file_id.good()) {
159  return false;
160  } else {
161  file_id.close();
162  return true;
163  }
164  }

Referenced by Eigen::MatrixMarketIterator< Scalar >::refX(), and Eigen::MatrixMarketIterator< Scalar >::rhs().

◆ Getnextvalidmatrix()

template<typename Scalar >
void Eigen::MatrixMarketIterator< Scalar >::Getnextvalidmatrix ( )
inlineprotected
166  {
167  m_isvalid = false;
168  // Here, we return with the next valid matrix in the folder
169  while ((m_curs_id = readdir(m_folder_id)) != NULL) {
170  m_isvalid = false;
171  std::string curfile;
172  curfile = m_folder + "/" + m_curs_id->d_name;
173  // Discard if it is a folder
174  if (m_curs_id->d_type == DT_DIR) continue; // FIXME This may not be available on non BSD systems
175  // struct stat st_buf;
176  // stat (curfile.c_str(), &st_buf);
177  // if (S_ISDIR(st_buf.st_mode)) continue;
178 
179  // Determine from the header if it is a matrix or a right hand side
180  bool isvector, iscomplex = false;
181  if (!getMarketHeader(curfile, m_sym, iscomplex, isvector)) continue;
182  if (isvector) continue;
183  if (!iscomplex) {
184  if (internal::is_same<Scalar, std::complex<float> >::value ||
185  internal::is_same<Scalar, std::complex<double> >::value)
186  continue;
187  }
188  if (iscomplex) {
190  }
191 
192  // Get the matrix name
193  std::string filename = m_curs_id->d_name;
194  m_matname = filename.substr(0, filename.length() - 4);
195 
196  // Find if the matrix is SPD
197  size_t found = m_matname.find("SPD");
198  if ((found != std::string::npos) && (m_sym != NonSymmetric)) m_sym = SPD;
199 
200  m_isvalid = true;
201  break;
202  }
203  }
SCALAR Scalar
Definition: bench_gemm.cpp:45
std::string m_matname
Definition: MatrixMarketIterator.h:208
struct dirent * m_curs_id
Definition: MatrixMarketIterator.h:215
squared absolute value
Definition: GlobalFunctions.h:87
@ NonSymmetric
Definition: MatrixMarketIterator.h:19
@ SPD
Definition: MatrixMarketIterator.h:19
bool getMarketHeader(const std::string &filename, int &sym, bool &iscomplex, bool &isdense)
Reads the header of a matrixmarket file and determines the properties of a matrix.
Definition: MarketIO.h:122
string filename
Definition: MergeRestartFiles.py:39
bool found
Definition: MergeRestartFiles.py:24
std::string string(const unsigned &i)
Definition: oomph_definitions.cc:286
@ value
Definition: Meta.h:206

References MergeRestartFiles::filename, MergeRestartFiles::found, Eigen::getMarketHeader(), Eigen::MatrixMarketIterator< Scalar >::m_curs_id, Eigen::MatrixMarketIterator< Scalar >::m_folder, Eigen::MatrixMarketIterator< Scalar >::m_folder_id, Eigen::MatrixMarketIterator< Scalar >::m_isvalid, Eigen::MatrixMarketIterator< Scalar >::m_matname, Eigen::MatrixMarketIterator< Scalar >::m_sym, Eigen::NonSymmetric, Eigen::SPD, oomph::Global_string_for_annotation::string(), and Eigen::value.

Referenced by Eigen::MatrixMarketIterator< Scalar >::MatrixMarketIterator(), and Eigen::MatrixMarketIterator< Scalar >::operator++().

◆ hasrefX()

template<typename Scalar >
bool Eigen::MatrixMarketIterator< Scalar >::hasrefX ( )
inline

◆ hasRhs()

template<typename Scalar >
bool Eigen::MatrixMarketIterator< Scalar >::hasRhs ( )
inline

◆ isFolderValid()

template<typename Scalar >
bool Eigen::MatrixMarketIterator< Scalar >::isFolderValid ( )
inline

◆ matname()

template<typename Scalar >
std::string& Eigen::MatrixMarketIterator< Scalar >::matname ( )
inline

◆ matrix()

template<typename Scalar >
MatrixType& Eigen::MatrixMarketIterator< Scalar >::matrix ( )
inline

Return the sparse matrix corresponding to the current file

70  {
71  // Read the matrix
72  if (m_matIsLoaded) return m_mat;
73 
74  std::string matrix_file = m_folder + "/" + m_matname + ".mtx";
75  if (!loadMarket(m_mat, matrix_file)) {
76  std::cerr << "Warning loadMarket failed when loading \"" << matrix_file << "\"" << std::endl;
77  m_matIsLoaded = false;
78  return m_mat;
79  }
80  m_matIsLoaded = true;
81 
82  if (m_sym != NonSymmetric) {
83  // Check whether we need to restore a full matrix:
84  RealScalar diag_norm = m_mat.diagonal().norm();
85  RealScalar lower_norm = m_mat.template triangularView<Lower>().norm();
86  RealScalar upper_norm = m_mat.template triangularView<Upper>().norm();
87  if (lower_norm > diag_norm && upper_norm == diag_norm) {
88  // only the lower part is stored
90  m_mat = tmp.template selfadjointView<Lower>();
91  } else if (upper_norm > diag_norm && lower_norm == diag_norm) {
92  // only the upper part is stored
94  m_mat = tmp.template selfadjointView<Upper>();
95  }
96  }
97  return m_mat;
98  }
NumTraits< Scalar >::Real RealScalar
Definition: bench_gemm.cpp:46
MatrixXf MatrixType
Definition: benchmark-blocking-sizes.cpp:52
MatrixType m_mat
Definition: MatrixMarketIterator.h:205
RealScalar norm() const
Definition: SparseDot.h:88
const ConstDiagonalReturnType diagonal() const
Definition: SparseMatrix.h:757
Eigen::Matrix< Scalar, Dynamic, Dynamic, ColMajor > tmp
Definition: level3_impl.h:365
bool loadMarket(SparseMatrixType &mat, const std::string &filename)
Loads a sparse matrix from a matrixmarket format file.
Definition: MarketIO.h:156

References Eigen::SparseMatrix< Scalar_, Options_, StorageIndex_ >::diagonal(), Eigen::loadMarket(), Eigen::MatrixMarketIterator< Scalar >::m_folder, Eigen::MatrixMarketIterator< Scalar >::m_mat, Eigen::MatrixMarketIterator< Scalar >::m_matIsLoaded, Eigen::MatrixMarketIterator< Scalar >::m_matname, Eigen::MatrixMarketIterator< Scalar >::m_sym, Eigen::NonSymmetric, Eigen::SparseMatrixBase< Derived >::norm(), oomph::Global_string_for_annotation::string(), and tmp.

Referenced by Browse_Matrices(), check_sparse_spd_solving(), check_sparse_square_solving(), and Eigen::MatrixMarketIterator< Scalar >::rhs().

◆ operator bool()

template<typename Scalar >
Eigen::MatrixMarketIterator< Scalar >::operator bool ( ) const
inline

◆ operator++()

◆ refX()

template<typename Scalar >
VectorType& Eigen::MatrixMarketIterator< Scalar >::refX ( )
inline

Return a reference solution If it is not provided and if the right hand side is not available then refX is randomly generated such that A*refX = b where A and b are the matrix and the rhs. Note that when a rhs is provided, refX is not available

132  {
133  // Check if a reference solution is provided
134  if (m_hasrefX) return m_refX;
135 
136  std::string lhs_file;
137  lhs_file = m_folder + "/" + m_matname + "_x.mtx";
138  m_hasrefX = Fileexists(lhs_file);
139  if (m_hasrefX) {
140  m_refX.resize(m_mat.cols());
141  m_hasrefX = loadMarketVector(m_refX, lhs_file);
142  } else
143  m_refX.resize(0);
144  return m_refX;
145  }
VectorType m_refX
Definition: MatrixMarketIterator.h:207
bool Fileexists(std::string file)
Definition: MatrixMarketIterator.h:156
EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE void resize(Index rows, Index cols)
Definition: PlainObjectBase.h:294
Index cols() const
Definition: SparseMatrix.h:161
bool loadMarketVector(VectorType &vec, const std::string &filename)
Same functionality as loadMarketDense, deprecated.
Definition: MarketIO.h:284

References Eigen::SparseMatrix< Scalar_, Options_, StorageIndex_ >::cols(), Eigen::MatrixMarketIterator< Scalar >::Fileexists(), Eigen::loadMarketVector(), Eigen::MatrixMarketIterator< Scalar >::m_folder, Eigen::MatrixMarketIterator< Scalar >::m_hasrefX, Eigen::MatrixMarketIterator< Scalar >::m_mat, Eigen::MatrixMarketIterator< Scalar >::m_matname, Eigen::MatrixMarketIterator< Scalar >::m_refX, Eigen::PlainObjectBase< Derived >::resize(), and oomph::Global_string_for_annotation::string().

Referenced by Browse_Matrices(), check_sparse_spd_solving(), and check_sparse_square_solving().

◆ rhs()

template<typename Scalar >
VectorType& Eigen::MatrixMarketIterator< Scalar >::rhs ( )
inline

Return the right hand side corresponding to the current matrix. If the rhs file is not provided, a random rhs is generated

103  {
104  // Get the right hand side
105  if (m_hasRhs) return m_rhs;
106 
107  std::string rhs_file;
108  rhs_file = m_folder + "/" + m_matname + "_b.mtx"; // The pattern is matname_b.mtx
109  m_hasRhs = Fileexists(rhs_file);
110  if (m_hasRhs) {
111  m_rhs.resize(m_mat.cols());
112  m_hasRhs = loadMarketVector(m_rhs, rhs_file);
113  }
114  if (!m_hasRhs) {
115  // Generate a random right hand side
116  if (!m_matIsLoaded) this->matrix();
117  m_refX.resize(m_mat.cols());
118  m_refX.setRandom();
119  m_rhs = m_mat * m_refX;
120  m_hasrefX = true;
121  m_hasRhs = true;
122  }
123  return m_rhs;
124  }
MatrixType & matrix()
Definition: MatrixMarketIterator.h:70
VectorType m_rhs
Definition: MatrixMarketIterator.h:206
Derived & setRandom(Index size)
Definition: Random.h:147

References Eigen::SparseMatrix< Scalar_, Options_, StorageIndex_ >::cols(), Eigen::MatrixMarketIterator< Scalar >::Fileexists(), Eigen::loadMarketVector(), Eigen::MatrixMarketIterator< Scalar >::m_folder, Eigen::MatrixMarketIterator< Scalar >::m_hasrefX, Eigen::MatrixMarketIterator< Scalar >::m_hasRhs, Eigen::MatrixMarketIterator< Scalar >::m_mat, Eigen::MatrixMarketIterator< Scalar >::m_matIsLoaded, Eigen::MatrixMarketIterator< Scalar >::m_matname, Eigen::MatrixMarketIterator< Scalar >::m_refX, Eigen::MatrixMarketIterator< Scalar >::m_rhs, Eigen::MatrixMarketIterator< Scalar >::matrix(), Eigen::PlainObjectBase< Derived >::resize(), Eigen::PlainObjectBase< Derived >::setRandom(), and oomph::Global_string_for_annotation::string().

Referenced by Browse_Matrices(), check_sparse_spd_solving(), and check_sparse_square_solving().

◆ sym()

template<typename Scalar >
int Eigen::MatrixMarketIterator< Scalar >::sym ( )
inline

Member Data Documentation

◆ m_curs_id

template<typename Scalar >
struct dirent* Eigen::MatrixMarketIterator< Scalar >::m_curs_id
protected

◆ m_folder

◆ m_folder_id

◆ m_hasrefX

◆ m_hasRhs

◆ m_isvalid

◆ m_mat

◆ m_matIsLoaded

◆ m_matname

◆ m_refX

◆ m_rhs

template<typename Scalar >
VectorType Eigen::MatrixMarketIterator< Scalar >::m_rhs
protected

◆ m_sym


The documentation for this class was generated from the following file: