1 #ifndef VIENNACL_IO_MATRIX_MARKET_HPP
2 #define VIENNACL_IO_MATRIX_MARKET_HPP
45 inline void trim(
char * buffer,
long max_size)
49 for (
long i=0; i<max_size; ++i)
59 for (
long i=stop; i<max_size; ++i)
68 for (
long i=0; i<=stop -
start; ++i)
70 buffer[i] = buffer[start + i];
74 buffer[stop - start + 1] = 0;
79 inline std::string
tolower(std::string & s)
81 std::transform(s.begin(), s.end(), s.begin(), static_cast < int(*)(int) > (
std::tolower));
99 template<
typename MatrixT>
108 std::ifstream reader(file);
111 bool symmetric =
false;
112 bool dense_format =
false;
113 bool is_header =
true;
116 long valid_entries = 0;
121 std::cerr <<
"ViennaCL: Matrix Market Reader: Cannot open file " << file << std::endl;
125 while (reader.good())
130 reader.getline(buffer, 1024);
134 while (reader.good() && buffer[0] == 0);
136 if (buffer[0] ==
'%')
138 if (buffer[1] ==
'%')
141 std::stringstream line(std::string(buffer + 2));
145 std::cerr <<
"Error in file " << file <<
" at line " << linenum <<
" in file " << file <<
": Expected 'MatrixMarket', got '" << token <<
"'" << std::endl;
152 std::cerr <<
"Error in file " << file <<
" at line " << linenum <<
" in file " << file <<
": Expected 'matrix', got '" << token <<
"'" << std::endl;
162 std::cerr <<
"Error in file " << file <<
" at line " << linenum <<
" in file " << file <<
": 'array' type is not supported yet!" << std::endl;
167 std::cerr <<
"Error in file " << file <<
" at line " << linenum <<
" in file " << file <<
": Expected 'array' or 'coordinate', got '" << token <<
"'" << std::endl;
175 std::cerr <<
"Error in file " << file <<
": The MatrixMarket reader provided with ViennaCL supports only real valued floating point arithmetic." << std::endl;
184 std::cerr <<
"Error in file " << file <<
": The MatrixMarket reader provided with ViennaCL supports only general or symmetric matrices." << std::endl;
192 std::stringstream line(std::stringstream::in | std::stringstream::out);
193 line << std::string(buffer);
205 std::cerr <<
"Error in file " << file <<
": Could not get matrix dimensions (rows) in line " << linenum << std::endl;
213 std::cerr <<
"Error in file " << file <<
": Could not get matrix dimensions (columns) in line " << linenum << std::endl;
222 std::cerr <<
"Error in file " << file <<
": Could not get matrix dimensions (columns) in line " << linenum << std::endl;
227 if (rows > 0 && cols > 0)
259 std::cerr <<
"Error in file " << file <<
": Parse error for matrix entry in line " << linenum << std::endl;
267 std::cerr <<
"Error in file " << file <<
": Parse error for matrix entry in line " << linenum << std::endl;
279 std::cerr <<
"Error in file " << file <<
": Parse error for matrix entry in line " << linenum << std::endl;
299 if (++valid_entries == nnz)
321 template<
typename MatrixT>
329 template<
typename MatrixT>
331 const std::string & file,
337 template<
typename ScalarT>
346 template<
typename ScalarT>
348 const std::string & file,
357 template<
typename MatrixT>
360 std::ofstream writer(file);
362 long num_entries = 0;
363 for (
typename MatrixT::const_iterator1 row_it = mat.begin1();
364 row_it != mat.end1();
366 for (
typename MatrixT::const_iterator2 col_it = row_it.begin();
367 col_it != row_it.end();
371 writer <<
"%%MatrixMarket matrix coordinate real general" << std::endl;
372 writer << mat.size1() <<
" " << mat.size2() <<
" " << num_entries << std::endl;
374 for (
typename MatrixT::const_iterator1 row_it = mat.begin1();
375 row_it != mat.end1();
377 for (
typename MatrixT::const_iterator2 col_it = row_it.begin();
378 col_it != row_it.end();
380 writer << col_it.index1() + index_base <<
" " << col_it.index2() + index_base <<
" " << *col_it << std::endl;
385 template<
typename ScalarT>
394 template<
typename ScalarT>
396 const std::string & file,
411 template<
typename MatrixT>
413 const std::string & file,
void fill(MatrixType &matrix, vcl_size_t row_index, vcl_size_t col_index, NumericT value)
Generic filler routine for setting an entry of a matrix to a particular value.
void trim(char *buffer, long max_size)
Adapter classes for sparse matrices made of the STL type std::vector >
Generic size and resize functionality for different vector and matrix types.
vcl_size_t size1(MatrixType const &mat)
Generic routine for obtaining the number of rows of a matrix (ViennaCL, uBLAS, etc.)
void write_matrix_market_file_impl(MatrixT const &mat, const char *file, long index_base)
result_of::size_type< MatrixType >::type size2(MatrixType const &mat)
Generic routine for obtaining the number of columns of a matrix (ViennaCL, uBLAS, etc...
void write_matrix_market_file(std::vector< std::map< unsigned int, ScalarT > > const &mat, const char *file, long index_base=1)
std::string tolower(std::string &s)
void resize(MatrixType &matrix, vcl_size_t rows, vcl_size_t cols)
Generic resize routine for resizing a matrix (ViennaCL, uBLAS, etc.) to a new size/dimension.
result_of::size_type< T >::type start(T const &obj)
Generic fill functionality for different matrix types.
long read_matrix_market_file_impl(MatrixT &mat, const char *file, long index_base)
Reads a sparse or dense matrix from a file (MatrixMarket format)
vector_expression< const matrix_base< NumericT, F >, const unsigned int, op_row > row(const matrix_base< NumericT, F > &A, unsigned int i)
Helper meta function for retrieving the main RAM-based value type. Particularly important to obtain T...
long read_matrix_market_file(MatrixT &mat, const char *file, long index_base=1)
Reads a sparse matrix from a file (MatrixMarket format)