|
|
@ -48,7 +48,7 @@ namespace parser{ |
|
|
|
* @param buf Data to scan. Is expected to be some char array. |
|
|
|
* @param maxnode Is set to highest id of all nodes. |
|
|
|
*/ |
|
|
|
static uint_fast32_t makeFirstPass(char* buf, uint_fast32_t &maxnode) |
|
|
|
uint_fast32_t TraParser::firstPass(char* buf, uint_fast32_t &maxnode) |
|
|
|
{ |
|
|
|
uint_fast32_t non_zero = 0; |
|
|
|
|
|
|
@ -117,7 +117,8 @@ static uint_fast32_t makeFirstPass(char* buf, uint_fast32_t &maxnode) |
|
|
|
* @return a pointer to the created sparse matrix. |
|
|
|
*/ |
|
|
|
|
|
|
|
mrmc::storage::SquareSparseMatrix<double> * readTraFile(const char * filename) { |
|
|
|
TraParser::TraParser(const char * filename) |
|
|
|
{ |
|
|
|
/*
|
|
|
|
* enforce locale where decimal point is '.' |
|
|
|
*/ |
|
|
@ -133,7 +134,7 @@ mrmc::storage::SquareSparseMatrix<double> * readTraFile(const char * filename) { |
|
|
|
* perform first pass, i.e. count entries that are not zero and not on the diagonal |
|
|
|
*/ |
|
|
|
uint_fast32_t maxnode; |
|
|
|
uint_fast32_t non_zero = makeFirstPass(file.data, maxnode); |
|
|
|
uint_fast32_t non_zero = this->firstPass(file.data, maxnode); |
|
|
|
/*
|
|
|
|
* if first pass returned zero, the file format was wrong |
|
|
|
*/ |
|
|
@ -148,7 +149,6 @@ mrmc::storage::SquareSparseMatrix<double> * readTraFile(const char * filename) { |
|
|
|
* |
|
|
|
* from here on, we already know that the file header is correct |
|
|
|
*/ |
|
|
|
mrmc::storage::SquareSparseMatrix<double> *sp = NULL; |
|
|
|
|
|
|
|
/*
|
|
|
|
* read file header, extract number of states |
|
|
@ -165,13 +165,13 @@ mrmc::storage::SquareSparseMatrix<double> * readTraFile(const char * filename) { |
|
|
|
* non-zero elements has to be specified (which is non_zero, computed by make_first_pass) |
|
|
|
*/ |
|
|
|
LOG4CPLUS_INFO(logger, "Attempting to create matrix of size " << (maxnode+1) << " x " << (maxnode+1) << "."); |
|
|
|
sp = new mrmc::storage::SquareSparseMatrix<double>(maxnode + 1); |
|
|
|
if (sp == NULL) |
|
|
|
this->matrix = new mrmc::storage::SquareSparseMatrix<double>(maxnode + 1); |
|
|
|
if (this->matrix == NULL) |
|
|
|
{ |
|
|
|
LOG4CPLUS_ERROR(logger, "Could not create matrix of size " << (maxnode+1) << " x " << (maxnode+1) << "."); |
|
|
|
throw std::bad_alloc(); |
|
|
|
} |
|
|
|
sp->initialize(non_zero); |
|
|
|
this->matrix->initialize(non_zero); |
|
|
|
|
|
|
|
uint_fast64_t row, col; |
|
|
|
double val; |
|
|
@ -196,15 +196,14 @@ mrmc::storage::SquareSparseMatrix<double> * readTraFile(const char * filename) { |
|
|
|
LOG4CPLUS_ERROR(logger, "Found transition probability of " << val << ", but we think probabilities should be from (0,1]."); |
|
|
|
throw mrmc::exceptions::wrong_file_format(); |
|
|
|
} |
|
|
|
sp->addNextValue(row,col,val); |
|
|
|
this->matrix->addNextValue(row,col,val); |
|
|
|
buf = skipWS(buf); |
|
|
|
} |
|
|
|
|
|
|
|
/*
|
|
|
|
* clean up |
|
|
|
*/ |
|
|
|
sp->finalize(); |
|
|
|
return sp; |
|
|
|
this->matrix->finalize(); |
|
|
|
} |
|
|
|
|
|
|
|
} //namespace parser
|
|
|
|