42 #ifndef __Teuchos_MatrixMarket_Raw_Reader_hpp
43 #define __Teuchos_MatrixMarket_Raw_Reader_hpp
71 namespace MatrixMarket {
100 template<
class Scalar,
class Ordinal>
109 Reader (
const bool tolerant,
const bool debug) :
143 bool tolerant =
false;
147 tolerant = params->
get (
"Parse tolerantly", tolerant);
148 debug = params->
get (
"Debug mode", debug);
161 const bool tolerant =
false;
162 const bool debug =
false;
166 params->set (
"Parse tolerantly", tolerant,
"Whether to tolerate "
167 "syntax errors when parsing the Matrix Market file");
168 params->set (
"Debug mode", debug,
"Whether to print debugging output "
169 "to stderr, on all participating MPI processes");
207 std::ifstream in (filename.c_str ());
209 "Failed to open file \"" << filename <<
"\" for reading.");
210 return read (rowptr, colind, values, numRows, numCols, in);
263 size_t lineNumber = 1;
268 std::ostringstream err;
272 catch (std::exception& e) {
273 err <<
"Failed to read Matrix Market input's Banner: " << e.what();
276 cerr << err.str() << endl;
289 if (banner->matrixType () !=
"coordinate") {
290 err <<
"Matrix Market input file must contain a \"coordinate\"-"
291 "format sparse matrix in order to create a sparse matrix object "
295 else if (! STS::isComplex && banner->dataType () ==
"complex") {
296 err <<
"The Matrix Market sparse matrix file contains complex-"
297 "valued data, but you are try to read the data into a sparse "
298 "matrix containing real values (your matrix's Scalar type is "
302 else if (banner->dataType () !=
"real" &&
303 banner->dataType () !=
"complex") {
304 err <<
"Only real or complex data types (no pattern or integer "
305 "matrices) are currently supported.";
311 cerr <<
"Matrix Market banner is invalid: " << err.str () << endl;
317 "Matrix Market banner is invalid: " << err.str ());
321 cerr <<
"Matrix Market Banner line:" << endl << *banner << endl;
334 std::pair<Tuple<Ordinal, 3>,
bool> dims =
337 err <<
"Error reading Matrix Market sparse matrix file: failed to "
338 "read coordinate dimensions.";
341 cerr << err.str () << endl;
355 numRows = dims.first[0];
356 numCols = dims.first[1];
357 const Ordinal numEntries = dims.first[2];
359 cerr <<
"Reported dimensions: " << numRows <<
" x " << numCols
360 <<
", with " << numEntries <<
" entries (counting possible "
361 <<
"duplicates)." << endl;
367 rcp (
new raw_adder_type (numRows, numCols, numEntries,
373 rcp (
new adder_type (rawAdder, banner->symmType ()));
376 reader.setAdder (adder);
381 std::pair<bool, std::vector<size_t> > results =
385 if (! results.first) {
386 err <<
"The Matrix Market input stream had syntax error(s)."
387 " Here is the error report." << endl;
391 cerr << err.str() << endl;
400 size_t numUnique, numRemoved;
405 rawAdder->mergeAndConvertToCSR (numUnique, numRemoved, ptr, ind, val);
407 catch (std::exception& e) {
408 err <<
"Failed to convert sparse matrix data to CSR (compressed "
409 "sparse row) format. Reported error: " << e.what ();
412 cerr << err.str () << endl;
443 cerr <<
"MatrixMarket::Raw::Reader:" << endl
444 <<
"- Tolerant mode: " <<
tolerant_ << endl
445 <<
"- Debug mode: " <<
debug_ << endl;
474 const bool maybeBannerLine =
true;
475 size_t numLinesRead = 0;
476 bool commentLine =
false;
479 const bool readFailed = ! getline (in, line);
481 "Failed to get Matrix Market banner line from input, after reading "
482 << numLinesRead <<
"line" << (numLinesRead != 1 ?
"s." :
"."));
489 }
while (commentLine);
492 const bool readFailed = ! getline (in, line);
494 "Failed to get Matrix Market banner line from input. This "
495 "probably means that the file is empty (contains zero lines).");
499 cerr <<
"Raw::Reader::readBanner: Here is the presumed banner line:"
500 << endl << line << endl;
507 }
catch (std::exception& e) {
509 "Matrix Market file's banner line contains syntax error(s): "
512 return rcp_const_cast<
const Banner> (banner);
521 const std::pair<
bool, std::vector<size_t> >& results)
524 const size_t numErrors = results.second.size();
525 const size_t maxNumErrorsToReport = 20;
526 out << numErrors <<
" errors when reading Matrix Market sparse "
527 "matrix file." << endl;
528 if (numErrors > maxNumErrorsToReport) {
529 out <<
"-- We do not report individual errors when there "
530 "are more than " << maxNumErrorsToReport <<
".";
532 else if (numErrors == 1) {
533 out <<
"Error on line " << results.second[0] << endl;
535 else if (numErrors > 1) {
536 out <<
"Errors on lines {";
537 for (
size_t k = 0; k < numErrors-1; ++k) {
538 out << results.second[k] <<
", ";
540 out << results.second[numErrors-1] <<
"}" << endl;
548 #endif // __Teuchos_MatrixMarket_Raw_Reader_hpp
Read a sparse matrix from a Matrix Market file into raw CSR (compressed sparse row) storage...
bool checkCommentLine(const std::string &line, size_t &start, size_t &size, const size_t lineNumber, const bool tolerant, const bool maybeBannerLine)
True if the line is a comment line, false otherwise.
void setParameters(const RCP< ParameterList > ¶ms)
Set parameters from the given ParameterList.
RCP< const ParameterList > getValidParameters() const
Get a list of valid default parameters, with documentation.
void init()
"Initialize" the Reader.
Adds entries with optional symmetry to a sparse matrix.
bool debug_
Whether to print debugging output to stderr.
std::pair< Teuchos::Tuple< Ordinal, 3 >, bool > readDimensions(std::istream &in, size_t &lineNumber, const bool tolerant=false)
Read (numRows, numCols, numNonzeros).
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Macro for throwing an exception with breakpointing to ease debugging.
T * get() const
Get the raw C++ pointer to the underlying object.
Reader(const RCP< ParameterList > ¶ms)
Constructor that takes a ParameterList of parameters.
Coordinate-format sparse matrix data reader.
This structure defines some basic traits for a scalar field type.
bool read(ArrayRCP< Ordinal > &rowptr, ArrayRCP< Ordinal > &colind, ArrayRCP< Scalar > &values, Ordinal &numRows, Ordinal &numCols, std::istream &in)
Read the sparse matrix from the given input stream into CSR storage.
bool tolerant_
Whether to parse the Matrix Market file tolerantly.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Deprecated.
bool readFile(ArrayRCP< Ordinal > &rowptr, ArrayRCP< Ordinal > &colind, ArrayRCP< Scalar > &values, Ordinal &numRows, Ordinal &numCols, const std::string &filename)
Read the sparse matrix from the given file into CSR storage.
RCP< const Banner > readBanner(std::istream &in, size_t &lineNumber)
Read in the Banner line from the given input stream.
A list of parameters of arbitrary type.
Reader()
Constructor that sets default Boolean parameters.
Smart reference counting pointer class for automatic garbage collection.
Reader(const bool tolerant, const bool debug)
Constructor that takes Boolean parameters.
void reportBadness(std::ostream &out, const std::pair< bool, std::vector< size_t > > &results)
Parse a Matrix Market banner line.
Reference-counted smart pointer for managing arrays.
To be used with Checker for "raw" sparse matrix input.