10#include "Teuchos_MatrixMarket_Banner.hpp"
11#include "Teuchos_MatrixMarket_split.hpp"
23 using details::trim_and_lowercase;
26 Banner::validateObjectType (
const std::string& objectType,
const bool tolerant)
29 std::string out = trim_and_lowercase (
objectType);
31 const char*
const validValues[] = {
"matrix"};
32 const int numValidValues = 1;
36 return std::string (validValues[0]);
37 else if (validValues + numValidValues ==
38 std::find (validValues, validValues + numValidValues, out))
39 throw std::invalid_argument(
"Object type \"" + out +
"\" is "
40 "not one of the valid values");
46 Banner::validateMatrixType (
const std::string& matrixType,
const bool )
49 std::string out = trim_and_lowercase (
matrixType);
51 const char*
const validValues[] = {
"coordinate",
"array"};
52 const int numValidValues = 2;
53 if (validValues + numValidValues == std::find (validValues, validValues + numValidValues, out))
54 throw std::invalid_argument(
"Matrix type \"" + out +
"\" is not one of the valid values");
60 Banner::validateDataType (
const std::string& dataType,
const bool )
63 std::string out = trim_and_lowercase (
dataType);
65 const char*
const validValues[] = {
"real",
"complex",
"integer",
"pattern"};
66 const int numValidValues = 4;
67 if (validValues + numValidValues == std::find (validValues, validValues + numValidValues, out))
68 throw std::invalid_argument(
"Data type \"" + out +
"\" is not one of the valid values");
74 Banner::validateSymmType (
const std::string& symmType,
const bool tolerant)
77 std::string out = trim_and_lowercase (
symmType);
81 const char*
const validValues[] =
82 {
"general",
"nonsymmetric",
"unsymmetric",
"symmetric",
83 "skew-symmetric",
"skew",
"hermitian"};
84 const int numValidValues = 7;
85 if (validValues + numValidValues == std::find (validValues, validValues + numValidValues, out))
86 throw std::invalid_argument(
"Symmetry type \"" + out +
"\" is not one of the valid values");
89 if (out ==
"nonsymmetric" || out ==
"unsymmetric")
90 return std::string(
"general");
91 else if (out ==
"skew")
92 return std::string(
"skew-symmetric");
99 const char*
const validValues[] = {
"general",
"symmetric",
"skew-symmetric",
"hermitian"};
100 const int numValidValues = 4;
101 if (validValues + numValidValues == std::find (validValues, validValues + numValidValues, out))
102 throw std::invalid_argument(
"Symmetry type \"" + out +
"\" is not one of the valid values");
110 Banner::setDefaults (
const int howMany)
113 objectType_ =
"matrix";
115 matrixType_ =
"coordinate";
119 symmType_ =
"general";
132 throw std::invalid_argument (
"The banner line is empty");
135 start = line.find_first_not_of (
" \t");
136 if (start == std::string::npos) {
142 throw std::invalid_argument (
"The banner line contains only "
143 "whitespace characters");
146 else if (start != 0 && !
tolerant) {
149 throw std::invalid_argument (
"The banner line is not allowed to start "
150 "with whitespace characters");
157 size_t ppStart = line.find (
"%%", start);
159 if (
ppStart == std::string::npos) {
165 "Market file's banner line should always start with \"%%\". Here "
166 "is the offending line: " << std::endl << line);
179 "Market file's banner line needs to contain information after the "
180 "\"%%\" marker. Here is the offending line: " << std::endl << line);
189 std::vector<std::string> tokens = split (line,
" \t", 2);
198 "Market file's banner line must always begin with the \"Matrix"
199 "Market\" keyword. Here is the offending line: " << std::endl
204 if (!
tolerant && tokens[0] !=
"MatrixMarket") {
206 "Market file's banner line must always begin with the \"Matrix"
207 "Market\" keyword. Here is the offending line: " << std::endl
216 "Market file's banner line must always have 5 tokens, but yours "
218 <<
". Here is the offending line: " << std::endl << line);
222 objectType_ = validateObjectType (tokens[1],
tolerant);
225 matrixType_ = validateMatrixType (tokens[2],
tolerant);
228 dataType_ = validateDataType (tokens[3],
tolerant);
231 symmType_ = validateSymmType (tokens[4],
tolerant);
238 out <<
"%%MatrixMarket"
239 <<
" " <<
banner.objectType()
240 <<
" " <<
banner.matrixType()
241 <<
" " <<
banner.dataType()
242 <<
" " <<
banner.symmType();
Standard test and throw macros.
Parse a Matrix Market banner line.
Banner(const std::string &line, const bool tolerant=false)
const std::string & symmType() const
Symmetric storage type.
const std::string & objectType() const
The object type.
const std::string & dataType() const
Data type of matrix entries.
const std::string & matrixType() const
Storage type of the matrix.
Smart reference counting pointer class for automatic garbage collection.
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Macro for throwing an exception with breakpointing to ease debugging.
Matrix Market file utilities.
The Teuchos namespace contains all of the classes, structs and enums used by Teuchos,...