128 getValidParameters ()
const
131 const bool echo =
false;
133 const bool debug =
false;
137 params->set (
"Echo to stdout",
echo,
"Whether to echo the sparse "
138 "matrix to stdout after reading it");
140 "syntax errors when parsing the Matrix Market file");
141 params->set (
"Debug mode",
debug,
"Whether to print debugging output "
142 "to stderr, on all participating MPI processes");
173 <<
"\" on Rank 0...";
192 "Failed to open input file \"" +
filename +
"\".");
215 std::pair<bool, std::string>
result;
220 result.second =
"Input stream is null on Rank 0";
224 cerr <<
"About to read from input stream on Rank 0" <<
endl;
229 cerr <<
"Successfully read sparse matrix from "
230 "input stream on Rank 0" <<
endl;
233 cerr <<
"Failed to read sparse matrix from input "
234 "stream on Rank 0" <<
endl;
265 "Unknown error when reading Matrix Market sparse matrix file; "
266 "the error is \"unknown\" because the error message has length 0.");
272 cerr <<
"The following error occurred when reading the "
321 "Failed to get Matrix Market banner line from input, after reading "
334 "Failed to get Matrix Market banner line from input. This "
335 "probably means that the file is empty (contains zero lines).");
339 cerr <<
"Raw::Checker::readBanner: Here is the presumed banner line:"
340 << endl << line << endl;
346 banner =
rcp (
new Banner (line, tolerant_));
347 }
catch (std::exception& e) {
349 "Matrix Market file's banner line contains syntax error(s): "
352 return rcp_const_cast<const Banner> (banner);
364 std::pair<bool, std::string>
365 readOnRank0 (std::istream& in)
370 typedef ScalarTraits<Scalar> STS;
375 typedef Adder<Scalar, Ordinal> raw_adder_type;
380 typedef SymmetrizingAdder<raw_adder_type> adder_type;
383 size_t lineNumber = 1;
387 std::ostringstream err;
388 RCP<const Banner> pBanner;
390 pBanner = readBanner (in, lineNumber);
392 catch (std::exception& e) {
393 err <<
"Failed to read Matrix Market file's Banner: " << e.what();
394 return std::make_pair (
false, err.str());
399 if (pBanner->matrixType () !=
"coordinate") {
400 err <<
"Matrix Market input file must contain a \"coordinate\"-"
401 "format sparse matrix in order to create a sparse matrix object "
403 return std::make_pair (
false, err.str ());
405 else if (! STS::isComplex && pBanner->dataType () ==
"complex") {
406 err <<
"The Matrix Market sparse matrix file contains complex-"
407 "valued data, but you are try to read the data into a sparse "
408 "matrix containing real values (your matrix's Scalar type is "
410 return std::make_pair (
false, err.str ());
412 else if (pBanner->dataType () !=
"real" &&
413 pBanner->dataType () !=
"complex") {
414 err <<
"Only real or complex data types (no pattern or integer "
415 "matrices) are currently supported.";
416 return std::make_pair (
false, err.str ());
419 cerr <<
"Banner line:" << endl << *pBanner << endl;
424 typedef CoordDataReader<adder_type, Ordinal, Scalar,
425 STS::isComplex> reader_type;
433 std::pair<Tuple<Ordinal, 3>,
bool> dims =
434 reader.readDimensions (in, lineNumber, tolerant_);
436 err <<
"Error reading Matrix Market sparse matrix "
437 "file: failed to read coordinate dimensions.";
438 return std::make_pair (
false, err.str ());
445 const Ordinal numRows = dims.first[0];
446 const Ordinal numCols = dims.first[1];
447 const Ordinal numEntries = dims.first[2];
449 cerr <<
"Reported dimensions: " << numRows <<
" x " << numCols
450 <<
", with " << numEntries <<
" entries (counting possible "
451 <<
"duplicates)." << endl;
456 RCP<raw_adder_type> rawAdder =
457 rcp (
new raw_adder_type (numRows, numCols, numEntries,
460 RCP<adder_type> adder =
461 rcp (
new adder_type (rawAdder, pBanner->symmType ()));
464 reader.setAdder (adder);
469 std::pair<bool, std::vector<size_t> > results =
470 reader.read (in, lineNumber, tolerant_, debug_);
473 cerr <<
"Matrix Market file successfully read" << endl;
476 cerr <<
"Failed to read Matrix Market file" << endl;
481 if (! results.first) {
483 err <<
"The Matrix Market input stream had syntax error(s)."
484 " Here is the error report." << endl;
485 reportBadness (err, results);
487 return std::make_pair (
false, err.str ());
491 reportBadness (cerr, results);
499 const bool doMerge =
false;
500 const bool replace =
false;
501 rawAdder->print (cout, doMerge, replace);
504 return std::make_pair (
true, err.str());
509 reportBadness (std::ostream& out,
510 const std::pair<
bool, std::vector<size_t> >& results)
513 const size_t numErrors = results.second.size();
514 const size_t maxNumErrorsToReport = 20;
515 out << numErrors <<
" errors when reading Matrix Market sparse "
516 "matrix file." << endl;
517 if (numErrors > maxNumErrorsToReport) {
518 out <<
"-- We do not report individual errors when there "
519 "are more than " << maxNumErrorsToReport <<
".";
521 else if (numErrors == 1) {
522 out <<
"Error on line " << results.second[0] << endl;
524 else if (numErrors > 1) {
525 out <<
"Errors on lines {";
526 for (
size_t k = 0; k < numErrors-1; ++k) {
527 out << results.second[k] <<
", ";
529 out << results.second[numErrors-1] <<
"}" << endl;