42 #ifndef __Teuchos_MatrixMarket_Raw_Checker_hpp 
   43 #define __Teuchos_MatrixMarket_Raw_Checker_hpp 
   51   namespace MatrixMarket {
 
   67       template<
class Scalar, 
class Ordinal>
 
   79         Checker (
const bool echo, 
const bool tolerant, 
const bool debug) :
 
  112           bool tolerant = 
false;
 
  116           echo = params->
get (
"Echo to stdout", echo);
 
  117           tolerant = params->
get (
"Parse tolerantly", tolerant);
 
  118           debug = params->
get (
"Debug mode", debug);
 
  131           const bool echo = 
false;
 
  132           const bool tolerant = 
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");
 
  139           params->set (
"Parse tolerantly", tolerant, 
"Whether to tolerate " 
  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");
 
  164           const int myRank = comm.
getRank ();
 
  172               cerr << 
"Attempting to open file \"" << filename
 
  173                    << 
"\" on Rank 0...";
 
  175             in = 
rcp (
new std::ifstream (filename.c_str()));
 
  179                 cerr << 
"failed." << endl;
 
  185                 cerr << 
"succeeded." << endl;
 
  189           Teuchos::broadcast (comm, 0, &didReadFile);
 
  192             "Failed to open input file \"" + filename + 
"\".");
 
  194           return read (comm, in);
 
  214           const int myRank = comm.
getRank ();
 
  215           std::pair<bool, std::string> result;
 
  219               result.first = 
false;
 
  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;
 
  242               msgSize = result.second.size();
 
  245           int success = result.first ? 1 : 0;
 
  246           Teuchos::broadcast (comm, 0, &success);
 
  252               Teuchos::broadcast (comm, 0, &msgSize);
 
  255                 std::string errMsg (msgSize, 
' ');
 
  257                   std::copy (result.second.begin(), result.second.end(),
 
  260                 Teuchos::broadcast (comm, 0, static_cast<int> (msgSize), &errMsg[0]);
 
  265                   "Unknown error when reading Matrix Market sparse matrix file; " 
  266                   "the error is \"unknown\" because the error message has length 0.");
 
  269             else if (myRank == 0) {
 
  272               cerr << 
"The following error occurred when reading the " 
  273                 "sparse matrix: " << result.second << endl;
 
  314             const bool maybeBannerLine = 
true;
 
  315             size_t numLinesRead = 0;
 
  316             bool commentLine = 
false;
 
  319               const bool readFailed = ! getline (in, line);
 
  321                 "Failed to get Matrix Market banner line from input, after reading " 
  322                 << numLinesRead << 
"line" << (numLinesRead != 1 ? 
"s." : 
"."));
 
  329             } 
while (commentLine); 
 
  332             const bool readFailed = ! getline (in, line);
 
  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;
 
  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>
 
  383           size_t lineNumber = 1;
 
  387           std::ostringstream err;
 
  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;
 
  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;
 
  457             rcp (
new raw_adder_type (numRows, numCols, numEntries,
 
  461             rcp (
new adder_type (rawAdder, pBanner->symmType ()));
 
  464           reader.setAdder (adder);
 
  469           std::pair<bool, std::vector<size_t> > results =
 
  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;
 
  487               return std::make_pair (
false, err.str ());
 
  499             const bool doMerge = 
false;
 
  500             const bool replace = 
false;
 
  501             rawAdder->print (cout, doMerge, replace);
 
  504           return std::make_pair (
true, err.str());
 
  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;
 
  537 #endif // __Teuchos_MatrixMarket_Raw_Checker_hpp 
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. 
 
RCP< const ParameterList > getValidParameters() const 
 
virtual int getRank() const =0
Returns the rank of this process. 
 
Adds entries with optional symmetry to a sparse matrix. 
 
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Macro for throwing an exception with breakpointing to ease debugging. 
 
void setParameters(const RCP< ParameterList > ¶ms)
Set parameters from the given ParameterList. 
 
bool echo_
Whether to echo the sparse matrix to stdout after reading it. 
 
T * get() const 
Get the raw C++ pointer to the underlying object. 
 
Coordinate-format sparse matrix data reader. 
 
This structure defines some basic traits for a scalar field type. 
 
bool debug_
Whether to print debugging output to stderr. 
 
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Deprecated. 
 
Checker()
Constructor that sets default Boolean parameters. 
 
bool readFile(const Teuchos::Comm< int > &comm, const std::string &filename)
Read the sparse matrix from the given file. 
 
void reportBadness(std::ostream &out, const std::pair< bool, std::vector< size_t > > &results)
To be called only on MPI Rank 0. 
 
std::pair< bool, std::string > readOnRank0(std::istream &in)
Read the sparse matrix on MPI Rank 0. 
 
A list of parameters of arbitrary type. 
 
Checker(const RCP< ParameterList > ¶ms)
Constructor that takes a ParameterList of parameters. 
 
Abstract interface for distributed-memory communication. 
 
RCP< const Teuchos::MatrixMarket::Banner > readBanner(std::istream &in, size_t &lineNumber)
Read in the Banner line from the given input stream. 
 
Smart reference counting pointer class for automatic garbage collection. 
 
Tool for debugging the syntax of a Matrix Market file containing a sparse matrix. ...
 
bool tolerant_
Whether to parse the Matrix Market file tolerantly. 
 
Parse a Matrix Market banner line. 
 
Checker(const bool echo, const bool tolerant, const bool debug)
Constructor that takes Boolean parameters. 
 
bool read(const Teuchos::Comm< int > &comm, const RCP< std::istream > &in)
Read the sparse matrix from the given input stream. 
 
To be used with Checker for "raw" sparse matrix input. 
 
bool is_null() const 
Returns true if the underlying pointer is null.