@ -23,7 +23,7 @@ namespace { 
		
	
		
			
				namespace  storm  { namespace  storm  {  
		
	
		
			
				    namespace  parser  {     namespace  parser  {  
		
	
		
			
				
 
		
	
		
			
				        GreatSpnEditorProjectParser : : GreatSpnEditorProjectParser ( std : : string  const &  constantDefinitionString )  :  manager ( std : : make_shared < storm : : expressions : : ExpressionManager > ( ) ) ,  expressionParser ( * manager ) {  
		
	
		
			
				        GreatSpnEditorProjectParser : : GreatSpnEditorProjectParser ( std : : string  const &  constantDefinitionString )  :  manager ( std : : make_shared < storm : : expressions : : ExpressionManager > ( ) )  {  
		
	
		
			
				            if  ( constantDefinitionString  ! =  " " )  {             if  ( constantDefinitionString  ! =  " " )  {  
		
	
		
			
				                std : : vector < std : : string >  constDefs ;                 std : : vector < std : : string >  constDefs ;  
		
	
		
			
				                boost : : split (  constDefs ,  constantDefinitionString ,  boost : : is_any_of ( " , " ) ) ;                 boost : : split (  constDefs ,  constantDefinitionString ,  boost : : is_any_of ( " , " ) ) ;  
		
	
	
		
			
				
					
					
					
						
							 
					
				 
				@ -39,7 +39,7 @@ namespace storm { 
		
	
		
			
				        storm : : gspn : : GSPN *  GreatSpnEditorProjectParser : : parse ( xercesc : : DOMElement  const *   elementRoot )  {         storm : : gspn : : GSPN *  GreatSpnEditorProjectParser : : parse ( xercesc : : DOMElement  const *   elementRoot )  {  
		
	
		
			
				            if  ( storm : : adapters : : XMLtoString ( elementRoot - > getTagName ( ) )  = =  " project " )  {             if  ( storm : : adapters : : XMLtoString ( elementRoot - > getTagName ( ) )  = =  " project " )  {  
		
	
		
			
				                traverseProjectElement ( elementRoot ) ;                 traverseProjectElement ( elementRoot ) ;  
		
	
		
			
				                return  builder . buildGspn ( ) ;  
		
	
		
			
				                return  builder . buildGspn ( manager ,  constantsSubstitution ) ;  
		
	
		
			
				            }  else  {             }  else  {  
		
	
		
			
				                // If the top-level node is not a "pnml" or "" node, then throw an exception.
                 // If the top-level node is not a "pnml" or "" node, then throw an exception.
  
		
	
		
			
				                STORM_LOG_THROW ( false ,  storm : : exceptions : : UnexpectedException ,  " Failed to identify the root element. \n " ) ;                 STORM_LOG_THROW ( false ,  storm : : exceptions : : UnexpectedException ,  " Failed to identify the root element. \n " ) ;  
		
	
	
		
			
				
					
						
							 
					
					
						
							 
					
					
				 
				@ -130,17 +130,23 @@ namespace storm { 
		
	
		
			
				
 
		
	
		
			
				            // traverse children
             // traverse children
  
		
	
		
			
				            // First pass: find constant definitions
             // First pass: find constant definitions
  
		
	
		
			
				            constantsSubstitution . clear ( ) ;  
		
	
		
			
				            expressionParser  =  std : : make_shared < storm : : parser : : ExpressionParser > ( * manager ) ;  
		
	
		
			
				            std : : unordered_map < std : : string ,  storm : : expressions : : Expression >  identifierMapping ;             std : : unordered_map < std : : string ,  storm : : expressions : : Expression >  identifierMapping ;  
		
	
		
			
				            expressionParser . setIdentifierMapping ( identifierMapping ) ;  
		
	
		
			
				            expressionParser - > setIdentifierMapping ( identifierMapping ) ;  
		
	
		
			
				            for  ( uint_fast64_t  i  =  0 ;  i  <  node - > getChildNodes ( ) - > getLength ( ) ;  + + i )  {             for  ( uint_fast64_t  i  =  0 ;  i  <  node - > getChildNodes ( ) - > getLength ( ) ;  + + i )  {  
		
	
		
			
				                auto  child  =  node - > getChildNodes ( ) - > item ( i ) ;                 auto  child  =  node - > getChildNodes ( ) - > item ( i ) ;  
		
	
		
			
				                auto  name  =  storm : : adapters : : getName ( child ) ;                 auto  name  =  storm : : adapters : : getName ( child ) ;  
		
	
		
			
				                if  ( name . compare ( " constant " )  = =  0  | |  name . compare ( " template " )  = =  0 )  {                 if  ( name . compare ( " constant " )  = =  0  | |  name . compare ( " template " )  = =  0 )  {  
		
	
		
			
				                    traverseConstantOrTemplateElement ( child ,  identifierMapping ) ;  
		
	
		
			
				                    traverseConstantOrTemplateElement ( child ) ;  
		
	
		
			
				                }                 }  
		
	
		
			
				            }             }  
		
	
		
			
				            expressionParser . setIdentifierMapping ( identifierMapping ) ;  
		
	
		
			
				             
		
	
		
			
				            // Update the expression parser to make the newly created variables known to it
  
		
	
		
			
				            expressionParser  =  std : : make_shared < storm : : parser : : ExpressionParser > ( * manager ) ;  
		
	
		
			
				            for  ( auto  const &  var  :  manager - > getVariables ( ) )  {  
		
	
		
			
				                identifierMapping . emplace ( var . getName ( ) ,  var . getExpression ( ) ) ;  
		
	
		
			
				            }  
		
	
		
			
				            expressionParser - > setIdentifierMapping ( identifierMapping ) ;  
		
	
		
			
				            // Second pass: traverse other children
             // Second pass: traverse other children
  
		
	
		
			
				            for  ( uint_fast64_t  i  =  0 ;  i  <  node - > getChildNodes ( ) - > getLength ( ) ;  + + i )  {             for  ( uint_fast64_t  i  =  0 ;  i  <  node - > getChildNodes ( ) - > getLength ( ) ;  + + i )  {  
		
	
		
			
				                auto  child  =  node - > getChildNodes ( ) - > item ( i ) ;                 auto  child  =  node - > getChildNodes ( ) - > item ( i ) ;  
		
	
	
		
			
				
					
					
					
						
							 
					
				 
				@ -162,7 +168,7 @@ namespace storm { 
		
	
		
			
				            }             }  
		
	
		
			
				        }         }  
		
	
		
			
				
 
		
	
		
			
				        void  GreatSpnEditorProjectParser : : traverseConstantOrTemplateElement ( xercesc : : DOMNode  const *  const  node ,  std : : unordered_map < std : : string ,  storm : : expressions : : Expression > &  identifierMapping )  {  
		
	
		
			
				        void  GreatSpnEditorProjectParser : : traverseConstantOrTemplateElement ( xercesc : : DOMNode  const *  const  node )  {  
		
	
		
			
				            std : : string  identifier ;             std : : string  identifier ;  
		
	
		
			
				            storm : : expressions : : Type  type ;             storm : : expressions : : Type  type ;  
		
	
		
			
				            std : : string  valueStr  =  " " ;             std : : string  valueStr  =  " " ;  
		
	
	
		
			
				
					
						
							 
					
					
						
							 
					
					
				 
				@ -193,24 +199,24 @@ namespace storm { 
		
	
		
			
				                }                 }  
		
	
		
			
				            }             }  
		
	
		
			
				                         
		
	
		
			
				            STORM_LOG_THROW ( identifierMapping . count ( identifier )  = =  0 ,  storm : : exceptions : : NotSupportedException ,  " Multiple definitions of constant ' "  < <  identifier  < <  " ' were found. " ) ;  
		
	
		
			
				            storm : : expressions : : Expression  valueExpression ;  
		
	
		
			
				            STORM_LOG_THROW ( ! manager - > hasVariable ( identifier ) ,  storm : : exceptions : : NotSupportedException ,  " Multiple definitions of constant ' "  < <  identifier  < <  " ' were found. " ) ;  
		
	
		
			
				            if  ( valueStr  = =  " " )  {             if  ( valueStr  = =  " " )  {  
		
	
		
			
				                auto  constDef  =  constantDefinitions . find ( identifier ) ;                 auto  constDef  =  constantDefinitions . find ( identifier ) ;  
		
	
		
			
				                STORM_LOG_THROW ( constDef  ! =  constantDefinitions . end ( ) ,  storm : : exceptions : : NotSupportedException ,  " Constant ' "  < <  identifier  < <  " ' has no value defined. " ) ;                 STORM_LOG_THROW ( constDef  ! =  constantDefinitions . end ( ) ,  storm : : exceptions : : NotSupportedException ,  " Constant ' "  < <  identifier  < <  " ' has no value defined. " ) ;  
		
	
		
			
				                valueStr  =  constDef - > second ;                 valueStr  =  constDef - > second ;  
		
	
		
			
				            }             }  
		
	
		
			
				            storm : : expressions : : Variable  var ;  
		
	
		
			
				            if  ( type . isRationalType ( ) )  {             if  ( type . isRationalType ( ) )  {  
		
	
		
			
				                expressionParser . setAcceptDoubleLiterals ( true ) ;  
		
	
		
			
				                valueExpression  =  manager - > rational ( expressionParser . parseFromString ( valueStr ) . evaluateAsRational ( ) ) ;  
		
	
		
			
				                var  =  manager - > declareRationalVariable ( identifier ) ;  
		
	
		
			
				                expressionParser - > setAcceptDoubleLiterals ( true ) ;  
		
	
		
			
				            }  else  if  ( type . isIntegerType ( ) )  {             }  else  if  ( type . isIntegerType ( ) )  {  
		
	
		
			
				                expressionParser . setAcceptDoubleLiterals ( false ) ;  
		
	
		
			
				                valueExpression  =  manager - > integer ( expressionParser . parseFromString ( valueStr ) . evaluateAsInt ( ) ) ;  
		
	
		
			
				                var  =  manager - > declareIntegerVariable ( identifier ) ;  
		
	
		
			
				                expressionParser - > setAcceptDoubleLiterals ( false ) ;  
		
	
		
			
				            }  else  {             }  else  {  
		
	
		
			
				                STORM_LOG_THROW ( false ,  storm : : exceptions : : NotSupportedException ,  " Unknown type of constant "  < <  type  < <  " . " ) ;                 STORM_LOG_THROW ( false ,  storm : : exceptions : : NotSupportedException ,  " Unknown type of constant "  < <  type  < <  " . " ) ;  
		
	
		
			
				            }             }  
		
	
		
			
				            identifierMapping . emplace ( identifier ,  valueExpression ) ;  
		
	
		
			
				
  
		
	
		
			
				            constantsSubstitution . emplace ( var ,  expressionParser - > parseFromString ( valueStr ) ) ;  
		
	
		
			
				              
		
	
		
			
				            // traverse children
             // traverse children
  
		
	
		
			
				            for  ( uint_fast64_t  i  =  0 ;  i  <  node - > getChildNodes ( ) - > getLength ( ) ;  + + i )  {             for  ( uint_fast64_t  i  =  0 ;  i  <  node - > getChildNodes ( ) - > getLength ( ) ;  + + i )  {  
		
	
		
			
				                auto  child  =  node - > getChildNodes ( ) - > item ( i ) ;                 auto  child  =  node - > getChildNodes ( ) - > item ( i ) ;  
		
	
	
		
			
				
					
						
							 
					
					
						
							 
					
					
				 
				@ -277,8 +283,7 @@ namespace storm { 
		
	
		
			
				                if  ( name . compare ( " name " )  = =  0 )  {                 if  ( name . compare ( " name " )  = =  0 )  {  
		
	
		
			
				                    placeName  =  storm : : adapters : : XMLtoString ( attr - > getNodeValue ( ) ) ;                     placeName  =  storm : : adapters : : XMLtoString ( attr - > getNodeValue ( ) ) ;  
		
	
		
			
				                }  else  if  ( name . compare ( " marking " )  = =  0 )  {                 }  else  if  ( name . compare ( " marking " )  = =  0 )  {  
		
	
		
			
				                    expressionParser . setAcceptDoubleLiterals ( false ) ;  
		
	
		
			
				                    initialTokens  =  expressionParser . parseFromString ( storm : : adapters : : XMLtoString ( attr - > getNodeValue ( ) ) ) . evaluateAsInt ( ) ;  
		
	
		
			
				                    initialTokens  =  parseInt ( storm : : adapters : : XMLtoString ( attr - > getNodeValue ( ) ) ) ;  
		
	
		
			
				                }  else  if  ( ignorePlaceAttribute ( name ) )  {                 }  else  if  ( ignorePlaceAttribute ( name ) )  {  
		
	
		
			
				                    // ignore node
                     // ignore node
  
		
	
		
			
				                }  else  {                 }  else  {  
		
	
	
		
			
				
					
						
							 
					
					
						
							 
					
					
				 
				@ -338,14 +343,11 @@ namespace storm { 
		
	
		
			
				                        STORM_PRINT_AND_LOG ( " unknown transition type:  "  < <  storm : : adapters : : XMLtoString ( attr - > getNodeValue ( ) ) ) ;                         STORM_PRINT_AND_LOG ( " unknown transition type:  "  < <  storm : : adapters : : XMLtoString ( attr - > getNodeValue ( ) ) ) ;  
		
	
		
			
				                    }                     }  
		
	
		
			
				                }  else  if ( name . compare ( " delay " )  = =  0 )  {                 }  else  if ( name . compare ( " delay " )  = =  0 )  {  
		
	
		
			
				                    expressionParser . setAcceptDoubleLiterals ( true ) ;  
		
	
		
			
				                    rate  =  expressionParser . parseFromString ( storm : : adapters : : XMLtoString ( attr - > getNodeValue ( ) ) ) . evaluateAsDouble ( ) ;  
		
	
		
			
				                    rate  =  parseReal ( storm : : adapters : : XMLtoString ( attr - > getNodeValue ( ) ) ) ;  
		
	
		
			
				                }  else  if ( name . compare ( " weight " )  = =  0 )  {                 }  else  if ( name . compare ( " weight " )  = =  0 )  {  
		
	
		
			
				                    expressionParser . setAcceptDoubleLiterals ( true ) ;  
		
	
		
			
				                    weight  =  expressionParser . parseFromString ( storm : : adapters : : XMLtoString ( attr - > getNodeValue ( ) ) ) . evaluateAsDouble ( ) ;  
		
	
		
			
				                    weight  =  parseReal ( storm : : adapters : : XMLtoString ( attr - > getNodeValue ( ) ) ) ;  
		
	
		
			
				                }  else  if ( name . compare ( " priority " )  = =  0 )  {                 }  else  if ( name . compare ( " priority " )  = =  0 )  {  
		
	
		
			
				                    expressionParser . setAcceptDoubleLiterals ( false ) ;  
		
	
		
			
				                    priority  =  expressionParser . parseFromString ( storm : : adapters : : XMLtoString ( attr - > getNodeValue ( ) ) ) . evaluateAsInt ( ) ;  
		
	
		
			
				                    priority  =  parseInt ( storm : : adapters : : XMLtoString ( attr - > getNodeValue ( ) ) ) ;  
		
	
		
			
				                }  else  if  ( name . compare ( " nservers " )  = =  0 )  {                 }  else  if  ( name . compare ( " nservers " )  = =  0 )  {  
		
	
		
			
				                    std : : string  nservers  =  storm : : adapters : : XMLtoString ( attr - > getNodeValue ( ) ) ;                     std : : string  nservers  =  storm : : adapters : : XMLtoString ( attr - > getNodeValue ( ) ) ;  
		
	
		
			
				                    if  ( nservers  = =  " Single " )  {                     if  ( nservers  = =  " Single " )  {  
		
	
	
		
			
				
					
					
					
						
							 
					
				 
				@ -353,8 +355,7 @@ namespace storm { 
		
	
		
			
				                    }  else  if  ( nservers  = =  " Infinite " )  {                     }  else  if  ( nservers  = =  " Infinite " )  {  
		
	
		
			
				                        // Ignore this case as we assume infinite by default (similar to GreatSpn)
                         // Ignore this case as we assume infinite by default (similar to GreatSpn)
  
		
	
		
			
				                    }  else  {                     }  else  {  
		
	
		
			
				                        expressionParser . setAcceptDoubleLiterals ( false ) ;  
		
	
		
			
				                        numServers  =  expressionParser . parseFromString ( nservers ) . evaluateAsInt ( ) ;  
		
	
		
			
				                        numServers  =  parseInt ( nservers ) ;  
		
	
		
			
				                    }                     }  
		
	
		
			
				                }  else  if  ( ignoreTransitionAttribute ( name ) )  {                 }  else  if  ( ignoreTransitionAttribute ( name ) )  {  
		
	
		
			
				                    // ignore node
                     // ignore node
  
		
	
	
		
			
				
					
						
							 
					
					
						
							 
					
					
				 
				@ -419,8 +420,7 @@ namespace storm { 
		
	
		
			
				                }  else  if  ( name . compare ( " kind " )  = =  0  | |  name . compare ( " type " )  = =  0 )  {                 }  else  if  ( name . compare ( " kind " )  = =  0  | |  name . compare ( " type " )  = =  0 )  {  
		
	
		
			
				                    kind  =  storm : : adapters : : XMLtoString ( attr - > getNodeValue ( ) ) ;                     kind  =  storm : : adapters : : XMLtoString ( attr - > getNodeValue ( ) ) ;  
		
	
		
			
				                }  else  if  ( name . compare ( " mult " )  = =  0 )  {                 }  else  if  ( name . compare ( " mult " )  = =  0 )  {  
		
	
		
			
				                    expressionParser . setAcceptDoubleLiterals ( false ) ;  
		
	
		
			
				                    mult  =  expressionParser . parseFromString ( storm : : adapters : : XMLtoString ( attr - > getNodeValue ( ) ) ) . evaluateAsInt ( ) ;  
		
	
		
			
				                    mult  =  parseInt ( storm : : adapters : : XMLtoString ( attr - > getNodeValue ( ) ) ) ;  
		
	
		
			
				                }  else  if  ( ignoreArcAttribute ( name ) )  {                 }  else  if  ( ignoreArcAttribute ( name ) )  {  
		
	
		
			
				                    // ignore node
                     // ignore node
  
		
	
		
			
				                }  else  {                 }  else  {  
		
	
	
		
			
				
					
						
							 
					
					
						
							 
					
					
				 
				@ -463,6 +463,21 @@ namespace storm { 
		
	
		
			
				            }             }  
		
	
		
			
				        }         }  
		
	
		
			
				                 
		
	
		
			
				        int64_t  GreatSpnEditorProjectParser : : parseInt ( std : : string  str )  {  
		
	
		
			
				            expressionParser - > setAcceptDoubleLiterals ( false ) ;  
		
	
		
			
				            auto  expr  =  expressionParser - > parseFromString ( str ) . substitute ( constantsSubstitution ) ;  
		
	
		
			
				            STORM_LOG_ASSERT ( ! expr . containsVariables ( ) ,  " Can not evaluate expression  "  < <  str  < <  "  as it contains undefined variables. " ) ;  
		
	
		
			
				            return  expr . evaluateAsInt ( ) ;  
		
	
		
			
				        }  
		
	
		
			
				         
		
	
		
			
				        double  GreatSpnEditorProjectParser : : parseReal ( std : : string  str )  {  
		
	
		
			
				            expressionParser - > setAcceptDoubleLiterals ( true ) ;  
		
	
		
			
				            auto  expr  =  expressionParser - > parseFromString ( str ) . substitute ( constantsSubstitution ) ;  
		
	
		
			
				            STORM_LOG_ASSERT ( ! expr . containsVariables ( ) ,  " Can not evaluate expression  "  < <  str  < <  "  as it contains undefined variables. " ) ;  
		
	
		
			
				            return  expr . evaluateAsDouble ( ) ;  
		
	
		
			
				        }  
		
	
		
			
				         
		
	
		
			
				         
		
	
		
			
				    }     }  
		
	
		
			
				} }  
		
	
		
			
				# endif 
 # endif