@ -6,26 +6,30 @@
*/
# include "src/parser/DeterministicSparseTransitionParser.h"
# include "src/exceptions/FileIoException.h"
# include "src/exceptions/WrongFileFormatException.h"
# include "boost/integer/integer_mask.hpp"
# include <cstdlib>
# include <cstdio>
# include <cstring>
# include <clocale>
# include <iostream>
# include <errno.h>
# include <time.h>
# include <sys/stat.h>
# include <fcntl.h>
# include <locale.h>
# include <cstdlib>
# include <cstdio>
# include <cstring>
# include <clocale>
# include <iostream>
# include <string>
# include "src/exceptions/FileIoException.h"
# include "src/exceptions/WrongFileFormatException.h"
# include "boost/integer/integer_mask.hpp"
# include "log4cplus/logger.h"
# include "log4cplus/loggingmacros.h"
extern log4cplus : : Logger logger ;
namespace storm {
namespace parser {
namespace parser {
/*!
* @ brief Perform first pass through the file and obtain number of
@ -39,9 +43,9 @@ namespace parser{
* @ param buf Data to scan . Is expected to be some char array .
* @ param maxnode Is set to highest id of all nodes .
*/
uint_fast64_t DeterministicSparseTransitionParser : : firstPass ( char * buf , uint_fast64_t & maxnode ) {
uint_fast64_t DeterministicSparseTransitionParser : : firstPass ( char * buf , uint_fast64_t & maxnode ) {
uint_fast64_t non_zero = 0 ;
/*
* check file header and extract number of transitions
*/
@ -49,16 +53,16 @@ uint_fast64_t DeterministicSparseTransitionParser::firstPass(char* buf, uint_fas
LOG4CPLUS_ERROR ( logger , " Expected \" STATES \" but got \" " < < std : : string ( buf , 0 , 16 ) < < " \" . " ) ;
return 0 ;
}
buf + = 7 ; // skip "STATES "
buf + = 7 ; // skip "STATES "
if ( strtol ( buf , & buf , 10 ) = = 0 ) return 0 ;
buf = trimWhitespaces ( buf ) ;
if ( strncmp ( buf , " TRANSITIONS " , 12 ) ! = 0 ) {
LOG4CPLUS_ERROR ( logger , " Expected \" TRANSITIONS \" but got \" " < < std : : string ( buf , 0 , 16 ) < < " \" . " ) ;
return 0 ;
}
buf + = 12 ; // skip "TRANSITIONS "
buf + = 12 ; // skip "TRANSITIONS "
if ( ( non_zero = strtol ( buf , & buf , 10 ) ) = = 0 ) return 0 ;
/*
* check all transitions for non - zero diagonal entrys
*/
@ -86,7 +90,7 @@ uint_fast64_t DeterministicSparseTransitionParser::firstPass(char* buf, uint_fas
return 0 ;
}
// not needed anymore
//if (row == col) non_zero--;
// if (row == col) non_zero--;
buf = trimWhitespaces ( buf ) ;
}
@ -104,19 +108,18 @@ uint_fast64_t DeterministicSparseTransitionParser::firstPass(char* buf, uint_fas
*/
DeterministicSparseTransitionParser : : DeterministicSparseTransitionParser ( std : : string const & filename )
: matrix ( nullptr )
{
: matrix ( nullptr ) {
/*
* enforce locale where decimal point is ' . '
*/
setlocale ( LC_NUMERIC , " C " ) ;
setlocale ( LC_NUMERIC , " C " ) ;
/*
* open file
*/
MappedFile file ( filename . c_str ( ) ) ;
char * buf = file . data ;
/*
* perform first pass , i . e . count entries that are not zero and not on the diagonal
*/
@ -125,12 +128,11 @@ DeterministicSparseTransitionParser::DeterministicSparseTransitionParser(std::st
/*
* if first pass returned zero , the file format was wrong
*/
if ( non_zero = = 0 )
{
if ( non_zero = = 0 ) {
LOG4CPLUS_ERROR ( logger , " Error while parsing " < < filename < < " : erroneous file format. " ) ;
throw storm : : exceptions : : WrongFileFormatException ( ) ;
}
/*
* perform second pass
*
@ -140,12 +142,12 @@ DeterministicSparseTransitionParser::DeterministicSparseTransitionParser(std::st
/*
* read file header , extract number of states
*/
buf + = 7 ; // skip "STATES "
buf + = 7 ; // skip "STATES "
checked_strtol ( buf , & buf ) ;
buf = trimWhitespaces ( buf ) ;
buf + = 12 ; // skip "TRANSITIONS "
buf + = 12 ; // skip "TRANSITIONS "
checked_strtol ( buf , & buf ) ;
/*
* Creating matrix
* Memory for diagonal elements is automatically allocated , hence only the number of non - diagonal
@ -153,8 +155,7 @@ DeterministicSparseTransitionParser::DeterministicSparseTransitionParser(std::st
*/
LOG4CPLUS_INFO ( logger , " Attempting to create matrix of size " < < ( maxnode + 1 ) < < " x " < < ( maxnode + 1 ) < < " . " ) ;
this - > matrix = std : : shared_ptr < storm : : storage : : SparseMatrix < double > > ( new storm : : storage : : SparseMatrix < double > ( maxnode + 1 ) ) ;
if ( this - > matrix = = NULL )
{
if ( this - > matrix = = NULL ) {
LOG4CPLUS_ERROR ( logger , " Could not create matrix of size " < < ( maxnode + 1 ) < < " x " < < ( maxnode + 1 ) < < " . " ) ;
throw std : : bad_alloc ( ) ;
}
@ -166,24 +167,23 @@ DeterministicSparseTransitionParser::DeterministicSparseTransitionParser(std::st
/*
* read all transitions from file
*/
while ( buf [ 0 ] ! = ' \0 ' )
{
while ( buf [ 0 ] ! = ' \0 ' ) {
/*
* read row , col and value .
*/
row = checked_strtol ( buf , & buf ) ;
col = checked_strtol ( buf , & buf ) ;
val = checked_strtod ( buf , & buf ) ;
this - > matrix - > addNextValue ( row , col , val ) ;
this - > matrix - > addNextValue ( row , col , val ) ;
buf = trimWhitespaces ( buf ) ;
}
/*
* clean up
*/
this - > matrix - > finalize ( ) ;
}
} //namespace parser
} //namespace storm
} // namespace parser
} // namespace storm