@ -28,19 +28,18 @@ namespace storm {
namespace parser {
/*!
* @ brief Perform first pass through the file and obtain number of
* non - zero cells and maximum node id .
*
* This method does the first pass through the . tra file and computes
* the number of non - zero elements .
* It also calculates the maximum node id and stores it in maxnode .
*
* @ return The number of non - zero elements
* @ param buf Data to scan . Is expected to be some char array .
* @ param maxnode Is set to highest id of all nodes .
*/
storm : : storage : : SparseMatrix < double > DeterministicSparseTransitionParser : : parseDeterministicTransitions ( std : : string const & filename , bool insertDiagonalEntriesIfMissing ) {
return DeterministicSparseTransitionParser : : parse ( filename , false , insertDiagonalEntriesIfMissing ) ;
}
storm : : storage : : SparseMatrix < double > DeterministicSparseTransitionParser : : parseDeterministicTransitionRewards ( std : : string const & filename , RewardMatrixInformationStruct const & rewardMatrixInformation ) {
return DeterministicSparseTransitionParser : : parse ( filename , true , false , rewardMatrixInformation ) ;
}
DeterministicSparseTransitionParser : : FirstPassResult DeterministicSparseTransitionParser : : firstPass ( char * buf , SupportedLineEndingsEnum lineEndings , bool insertDiagonalEntriesIfMissing ) {
DeterministicSparseTransitionParser : : FirstPassResult result ;
// Skip the format hint if it is there.
@ -107,16 +106,7 @@ DeterministicSparseTransitionParser::FirstPassResult DeterministicSparseTransiti
return result ;
}
/*!
* Reads a . tra file and produces a sparse matrix representing the described Markov Chain .
*
* Matrices created with this method have to be freed with the delete operator .
* @ param filename input . tra file ' s name .
* @ return a pointer to the created sparse matrix .
*/
storm : : storage : : SparseMatrix < double > DeterministicSparseTransitionParser : : parseDeterministicTransitions ( std : : string const & filename , bool insertDiagonalEntriesIfMissing ) {
storm : : storage : : SparseMatrix < double > DeterministicSparseTransitionParser : : parse ( std : : string const & filename , bool rewardFile , bool insertDiagonalEntriesIfMissing , RewardMatrixInformationStruct const & rewardMatrixInformation ) {
// Enforce locale where decimal point is '.'.
setlocale ( LC_NUMERIC , " C " ) ;
@ -152,9 +142,18 @@ storm::storage::SparseMatrix<double> DeterministicSparseTransitionParser::parseD
buf = storm : : parser : : forwardToNextLine ( buf , lineEndings ) ;
}
if ( rewardFile ) {
// The reward matrix should match the size of the transition matrix.
if ( firstPass . highestStateIndex + 1 > rewardMatrixInformation . rowCount | | firstPass . highestStateIndex + 1 > rewardMatrixInformation . columnCount ) {
LOG4CPLUS_ERROR ( logger , " Reward matrix has more rows or columns than transition matrix. " ) ;
throw storm : : exceptions : : WrongFormatException ( ) < < " Reward matrix has more rows or columns than transition matrix. " ;
} else {
// If we found the right number of states or less, we set it to the number of states represented by the transition matrix.
firstPass . highestStateIndex = rewardMatrixInformation . rowCount - 1 ;
}
}
// Creating matrix builder here.
// The number of non-zero elements is computed by firstPass().
// The contents are inserted during the readout of the file, below.
// The actual matrix will be build once all contents are inserted.
storm : : storage : : SparseMatrixBuilder < double > resultMatrix ( firstPass . highestStateIndex + 1 , firstPass . highestStateIndex + 1 , firstPass . numberOfNonzeroEntries ) ;
@ -168,6 +167,20 @@ storm::storage::SparseMatrix<double> DeterministicSparseTransitionParser::parseD
// Read all transitions from file. Note that we assume that the
// transitions are listed in canonical order, otherwise this will not
// work, i.e. the values in the matrix will be at wrong places.
// Different parsing routines for transition systems and transition rewards.
if ( rewardFile ) {
while ( buf [ 0 ] ! = ' \0 ' ) {
// Read next transition.
row = checked_strtol ( buf , & buf ) ;
col = checked_strtol ( buf , & buf ) ;
val = checked_strtod ( buf , & buf ) ;
resultMatrix . addNextValue ( row , col , val ) ;
buf = trimWhitespaces ( buf ) ;
}
} else {
while ( buf [ 0 ] ! = ' \0 ' ) {
// Read next transition.
@ -239,87 +252,9 @@ storm::storage::SparseMatrix<double> DeterministicSparseTransitionParser::parseD
// If we encountered deadlock and did not fix them, now is the time to throw the exception.
if ( ! fixDeadlocks & & hadDeadlocks ) throw storm : : exceptions : : WrongFormatException ( ) < < " Some of the nodes had deadlocks. You can use --fixDeadlocks to insert self-loops on the fly. " ;
return resultMatrix . build ( ) ;
}
/*!
* Reads a . tra file and produces a sparse matrix representing the described Markov Chain .
*
* Matrices created with this method have to be freed with the delete operator .
* @ param filename input . tra file ' s name .
* @ return a pointer to the created sparse matrix .
*/
storm : : storage : : SparseMatrix < double > DeterministicSparseTransitionParser : : parseDeterministicTransitionRewards ( std : : string const & filename , RewardMatrixInformationStruct const & rewardMatrixInformation ) {
// Enforce locale where decimal point is '.'.
setlocale ( LC_NUMERIC , " C " ) ;
if ( ! fileExistsAndIsReadable ( filename . c_str ( ) ) ) {
LOG4CPLUS_ERROR ( logger , " Error while parsing " < < filename < < " : File does not exist or is not readable. " ) ;
throw storm : : exceptions : : FileIoException ( ) < < " The supplied Transition input file \" " < < filename < < " \" does not exist or is not readable by this process. " ;
}
// Find out about the used line endings.
SupportedLineEndingsEnum lineEndings = findUsedLineEndings ( filename , true ) ;
// Open file.
MappedFile file ( filename . c_str ( ) ) ;
char * buf = file . data ;
// Perform first pass, i.e. count entries that are not zero.
DeterministicSparseTransitionParser : : FirstPassResult firstPass = DeterministicSparseTransitionParser : : firstPass ( file . data , lineEndings , false ) ;
LOG4CPLUS_INFO ( logger , " First pass on " < < filename < < " shows " < < firstPass . numberOfNonzeroEntries < < " NonZeros. " ) ;
// If first pass returned zero, the file format was wrong.
if ( firstPass . numberOfNonzeroEntries = = 0 ) {
LOG4CPLUS_ERROR ( logger , " Error while parsing " < < filename < < " : empty or erroneous file format. " ) ;
throw storm : : exceptions : : WrongFormatException ( ) ;
}
// Perform second pass.
// Skip the format hint if it is there.
buf = trimWhitespaces ( buf ) ;
if ( buf [ 0 ] ! = ' 0 ' ) {
buf = storm : : parser : : forwardToNextLine ( buf , lineEndings ) ;
}
// The reward matrix should match the size of the transition matrix.
if ( firstPass . highestStateIndex + 1 > rewardMatrixInformation . rowCount | | firstPass . highestStateIndex + 1 > rewardMatrixInformation . columnCount ) {
LOG4CPLUS_ERROR ( logger , " Reward matrix has more rows or columns than transition matrix. " ) ;
throw storm : : exceptions : : WrongFormatException ( ) < < " Reward matrix has more rows or columns than transition matrix. " ;
} else {
// If we found the right number of states or less, we set it to the number of states represented by the transition matrix.
firstPass . highestStateIndex = rewardMatrixInformation . rowCount - 1 ;
}
// Creating matrix builder here.
// The number of non-zero elements is computed by firstPass().
// The contents are inserted during the readout of the file, below.
// The actual matrix will be build once all contents are inserted.
storm : : storage : : SparseMatrixBuilder < double > resultMatrix ( firstPass . highestStateIndex + 1 , firstPass . highestStateIndex + 1 , firstPass . numberOfNonzeroEntries ) ;
uint_fast64_t row , col ;
double val ;
// Read all transitions from file. Note that we assume that the
// transitions are listed in canonical order, otherwise this will not
// work, i.e. the values in the matrix will be at wrong places.
while ( buf [ 0 ] ! = ' \0 ' ) {
// Read next transition.
row = checked_strtol ( buf , & buf ) ;
col = checked_strtol ( buf , & buf ) ;
val = checked_strtod ( buf , & buf ) ;
resultMatrix . addNextValue ( row , col , val ) ;
buf = trimWhitespaces ( buf ) ;
}
// Finally, build the actual matrix and return it.
return resultMatrix . build ( ) ;
}