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));
101 template<
typename MatrixT>
110 std::ifstream reader(file);
113 bool symmetric =
false;
114 bool dense_format =
false;
115 bool is_header =
true;
116 bool pattern_matrix =
false;
120 long valid_entries = 0;
125 std::cerr <<
"ViennaCL: Matrix Market Reader: Cannot open file " << file << std::endl;
129 while (reader.good())
134 reader.getline(buffer, 1024);
138 while (reader.good() && buffer[0] == 0);
140 if (buffer[0] ==
'%')
142 if (buffer[1] ==
'%')
145 std::stringstream line(std::string(buffer + 2));
149 std::cerr <<
"Error in file " << file <<
" at line " << linenum <<
" in file " << file <<
": Expected 'MatrixMarket', got '" << token <<
"'" << std::endl;
156 std::cerr <<
"Error in file " << file <<
" at line " << linenum <<
" in file " << file <<
": Expected 'matrix', got '" << token <<
"'" << std::endl;
166 std::cerr <<
"Error in file " << file <<
" at line " << linenum <<
" in file " << file <<
": 'array' type is not supported yet!" << std::endl;
171 std::cerr <<
"Error in file " << file <<
" at line " << linenum <<
" in file " << file <<
": Expected 'array' or 'coordinate', got '" << token <<
"'" << std::endl;
179 pattern_matrix =
true;
187 std::cerr <<
"Error in file " << file <<
": The MatrixMarket reader provided with ViennaCL supports only real valued floating point arithmetic or pattern type matrices." << std::endl;
196 std::cerr <<
"Error in file " << file <<
": The MatrixMarket reader provided with ViennaCL supports only general or symmetric matrices." << std::endl;
204 std::stringstream line(std::stringstream::in | std::stringstream::out);
205 line << std::string(buffer);
217 std::cerr <<
"Error in file " << file <<
": Could not get matrix dimensions (rows) in line " << linenum << std::endl;
225 std::cerr <<
"Error in file " << file <<
": Could not get matrix dimensions (columns) in line " << linenum << std::endl;
234 std::cerr <<
"Error in file " << file <<
": Could not get matrix dimensions (columns) in line " << linenum << std::endl;
239 if (rows > 0 && cols > 0)
264 ScalarT value = ScalarT(1);
271 std::cerr <<
"Error in file " << file <<
": Parse error for matrix row entry in line " << linenum << std::endl;
279 std::cerr <<
"Error in file " << file <<
": Parse error for matrix col entry in line " << linenum << std::endl;
295 std::cerr <<
"Error in file " << file <<
": Parse error for matrix entry in line " << linenum << std::endl;
316 if (++valid_entries == nnz)
338 template<
typename MatrixT>
346 template<
typename MatrixT>
348 const std::string & file,
354 template<
typename ScalarT>
363 template<
typename ScalarT>
365 const std::string & file,
374 template<
typename MatrixT>
377 std::ofstream writer(file);
379 long num_entries = 0;
380 for (
typename MatrixT::const_iterator1 row_it = mat.begin1();
381 row_it != mat.end1();
383 for (
typename MatrixT::const_iterator2 col_it = row_it.begin();
384 col_it != row_it.end();
388 writer <<
"%%MatrixMarket matrix coordinate real general" << std::endl;
389 writer << mat.size1() <<
" " << mat.size2() <<
" " << num_entries << std::endl;
391 for (
typename MatrixT::const_iterator1 row_it = mat.begin1();
392 row_it != mat.end1();
394 for (
typename MatrixT::const_iterator2 col_it = row_it.begin();
395 col_it != row_it.end();
397 writer << col_it.index1() + index_base <<
" " << col_it.index2() + index_base <<
" " << *col_it << std::endl;
402 template<
typename ScalarT>
411 template<
typename ScalarT>
413 const std::string & file,
428 template<
typename MatrixT>
430 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...
Main namespace in ViennaCL. Holds all the basic types such as vector, matrix, etc. and defines operations upon them.
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)