@ -1,9 +1,12 @@ 
			
		
	
		
			
				
					# include  "JaniGSPNBuilder.h" 
  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					# include  <memory> 
  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					# include  "storm/logic/Formulas.h" 
  
			
		
	
		
			
				
					namespace  storm  {  
			
		
	
		
			
				
					    namespace  builder  {  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        storm : : jani : : Model *  JaniGSPNBuilder : : build ( std : : string  const &  automatonName )  {  
			
		
	
		
			
				
					        storm : : jani : : Model *  JaniGSPNBuilder : : build ( std : : string  const &  automatonName ,  bool  buildStandardProperties )  {  
			
		
	
		
			
				
					            storm : : jani : : Model *  model  =  new  storm : : jani : : Model ( gspn . getName ( ) ,  storm : : jani : : ModelType : : MA ,  janiVersion ,  expressionManager ) ;  
			
		
	
		
			
				
					            storm : : jani : : Automaton  mainAutomaton ( automatonName ,  expressionManager - > declareIntegerVariable ( " loc " ) ) ;  
			
		
	
		
			
				
					            addVariables ( model ) ;  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -11,8 +14,15 @@ namespace storm { 
			
		
	
		
			
				
					            addEdges ( mainAutomaton ,  locId ) ;  
			
		
	
		
			
				
					            model - > addAutomaton ( mainAutomaton ) ;  
			
		
	
		
			
				
					            model - > setStandardSystemComposition ( ) ;  
			
		
	
		
			
				
					            if  ( buildStandardProperties )  {  
			
		
	
		
			
				
					                buildProperties ( model ) ;  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					            return  model ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					         
			
		
	
		
			
				
					        std : : vector < storm : : jani : : Property >  const &  JaniGSPNBuilder : : getStandardProperties ( )  const  {  
			
		
	
		
			
				
					            return  standardProperties ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					        void  JaniGSPNBuilder : : addVariables ( storm : : jani : : Model *  model )  {  
			
		
	
		
			
				
					            for  ( auto  const &  place  :  gspn . getPlaces ( ) )  {  
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -150,5 +160,116 @@ namespace storm { 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					         
			
		
	
		
			
				
					        storm : : jani : : Variable  const &  JaniGSPNBuilder : : addDeadlockTransientVariable ( storm : : jani : : Model *  model ,  std : : string  name ,  bool  ignoreCapacities ,  bool  ignoreInhibitorArcs ,  bool  ignoreEmptyPlaces )  {  
			
		
	
		
			
				
					             
			
		
	
		
			
				
					            storm : : expressions : : Expression  transientValue  =  expressionManager - > boolean ( true ) ;  
			
		
	
		
			
				
					             
			
		
	
		
			
				
					            // build the conjunction over all transitions
  
			
		
	
		
			
				
					            std : : vector < storm : : gspn : : Transition  const * >  transitions ;  
			
		
	
		
			
				
					            transitions . reserve ( gspn . getNumberOfImmediateTransitions ( )  +  gspn . getNumberOfTimedTransitions ( ) ) ;  
			
		
	
		
			
				
					            for  ( auto  const &  t  :  gspn . getImmediateTransitions ( ) )  {  
			
		
	
		
			
				
					                transitions . push_back ( & t ) ;  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					            for  ( auto  const &  t  :  gspn . getTimedTransitions ( ) )  {  
			
		
	
		
			
				
					                transitions . push_back ( & t ) ;  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					            bool  firstTransition  =  true ;  
			
		
	
		
			
				
					            for  ( auto  const &  transition  :  transitions )  {  
			
		
	
		
			
				
					                 
			
		
	
		
			
				
					                // build the disjunction over all in/out places and inhibitor arcs
  
			
		
	
		
			
				
					                storm : : expressions : : Expression  transitionDisabled  =  expressionManager - > boolean ( false ) ;  
			
		
	
		
			
				
					                bool  firstPlace  =  true ;  
			
		
	
		
			
				
					                if  ( ! ignoreEmptyPlaces )  {  
			
		
	
		
			
				
					                    for  ( auto  const &  placeIdMult  :  transition - > getInputPlaces ( ) )  {  
			
		
	
		
			
				
					                        storm : : expressions : : Expression  placeBlocksTransition  =  ( vars . at ( placeIdMult . first ) - > getExpressionVariable ( )  <  expressionManager - > integer ( placeIdMult . second ) ) ;  
			
		
	
		
			
				
					                        if  ( firstPlace )  {  
			
		
	
		
			
				
					                            transitionDisabled  =  placeBlocksTransition ;  
			
		
	
		
			
				
					                            firstPlace  =  false ;  
			
		
	
		
			
				
					                        }  else  {  
			
		
	
		
			
				
					                            transitionDisabled  =  transitionDisabled  | |  placeBlocksTransition ;  
			
		
	
		
			
				
					                        }  
			
		
	
		
			
				
					                    }  
			
		
	
		
			
				
					                }  
			
		
	
		
			
				
					                if  ( ! ignoreInhibitorArcs )  {  
			
		
	
		
			
				
					                    for  ( auto  const &  placeIdMult  :  transition - > getInhibitionPlaces ( ) )  {  
			
		
	
		
			
				
					                        storm : : expressions : : Expression  placeBlocksTransition  =  ( vars . at ( placeIdMult . first ) - > getExpressionVariable ( )  > =  expressionManager - > integer ( placeIdMult . second ) ) ;  
			
		
	
		
			
				
					                        if  ( firstPlace )  {  
			
		
	
		
			
				
					                            transitionDisabled  =  placeBlocksTransition ;  
			
		
	
		
			
				
					                            firstPlace  =  false ;  
			
		
	
		
			
				
					                        }  else  {  
			
		
	
		
			
				
					                            transitionDisabled  =  transitionDisabled  | |  placeBlocksTransition ;  
			
		
	
		
			
				
					                        }  
			
		
	
		
			
				
					                    }  
			
		
	
		
			
				
					                }  
			
		
	
		
			
				
					                if  ( ! ignoreCapacities )  {  
			
		
	
		
			
				
					                    for  ( auto  const &  placeIdMult  :  transition - > getOutputPlaces ( ) )  {  
			
		
	
		
			
				
					                        auto  const &  place  =  gspn . getPlace ( placeIdMult . first ) ;  
			
		
	
		
			
				
					                        if  ( place - > hasRestrictedCapacity ( ) )  {  
			
		
	
		
			
				
					                            storm : : expressions : : Expression  placeBlocksTransition  =  ( vars . at ( placeIdMult . first ) - > getExpressionVariable ( )  +  expressionManager - > integer ( placeIdMult . second )  >  expressionManager - > integer ( place - > getCapacity ( ) ) ) ;  
			
		
	
		
			
				
					                            if  ( firstPlace )  {  
			
		
	
		
			
				
					                                transitionDisabled  =  placeBlocksTransition ;  
			
		
	
		
			
				
					                                firstPlace  =  false ;  
			
		
	
		
			
				
					                            }  else  {  
			
		
	
		
			
				
					                                transitionDisabled  =  transitionDisabled  | |  placeBlocksTransition ;  
			
		
	
		
			
				
					                            }  
			
		
	
		
			
				
					                        }  
			
		
	
		
			
				
					                    }  
			
		
	
		
			
				
					                }  
			
		
	
		
			
				
					                 
			
		
	
		
			
				
					                if  ( firstTransition )  {  
			
		
	
		
			
				
					                    transientValue  =  transitionDisabled ;  
			
		
	
		
			
				
					                    firstTransition  =  false ;  
			
		
	
		
			
				
					                }  else  {  
			
		
	
		
			
				
					                    transientValue  =  transientValue  & &  transitionDisabled ;  
			
		
	
		
			
				
					                }  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					             
			
		
	
		
			
				
					            auto  exprVar  =  expressionManager - > declareBooleanVariable ( name ) ;  
			
		
	
		
			
				
					            auto  const &  janiVar  =  model - > addVariable ( * storm : : jani : : makeBooleanVariable ( name ,  exprVar ,  expressionManager - > boolean ( false ) ,  true ) ) ;  
			
		
	
		
			
				
					            storm : : jani : : Assignment  assignment ( janiVar ,  transientValue ) ;  
			
		
	
		
			
				
					            model - > getAutomata ( ) . front ( ) . getLocations ( ) . front ( ) . addTransientAssignment ( assignment ) ;  
			
		
	
		
			
				
					            return  janiVar ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					         
			
		
	
		
			
				
					         
			
		
	
		
			
				
					        std : : string  getUniqueVarName ( storm : : expressions : : ExpressionManager  const &  manager ,  std : : string  name )  {  
			
		
	
		
			
				
					            std : : string  res  =  name ;  
			
		
	
		
			
				
					            while  ( manager . hasVariable ( res ) )  {  
			
		
	
		
			
				
					                res . append ( " _ " ) ;  
			
		
	
		
			
				
					            }  
			
		
	
		
			
				
					            return  res ;  
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					         
			
		
	
		
			
				
					        void  JaniGSPNBuilder : : buildProperties ( storm : : jani : : Model *  model )  {  
			
		
	
		
			
				
					            standardProperties . clear ( ) ;  
			
		
	
		
			
				
					             
			
		
	
		
			
				
					            auto  const &  deadlockVar  =  addDeadlockTransientVariable ( model ,  getUniqueVarName ( * expressionManager ,  " deadl " ) ) ;  
			
		
	
		
			
				
					            auto  deadlock  =  std : : make_shared < storm : : logic : : AtomicExpressionFormula > ( deadlockVar . getExpressionVariable ( ) . getExpression ( ) ) ;  
			
		
	
		
			
				
					            auto  trueFormula  =  std : : make_shared < storm : : logic : : BooleanLiteralFormula > ( true ) ;  
			
		
	
		
			
				
					             
			
		
	
		
			
				
					            auto  maxReachDeadlock  =  std : : make_shared < storm : : logic : : ProbabilityOperatorFormula > (  
			
		
	
		
			
				
					                    std : : make_shared < storm : : logic : : EventuallyFormula > ( deadlock ,  storm : : logic : : FormulaContext : : Probability ) ,  
			
		
	
		
			
				
					                    storm : : logic : : OperatorInformation ( storm : : solver : : OptimizationDirection : : Maximize ) ) ;  
			
		
	
		
			
				
					            standardProperties . emplace_back ( " MaxPrReachDeadlock " ,  maxReachDeadlock ,  " The maximal probability to eventually reach a deadlock. " ) ;  
			
		
	
		
			
				
					             
			
		
	
		
			
				
					            auto  exprTB  =  expressionManager - > declareIntegerVariable ( getUniqueVarName ( * expressionManager ,  " TIME_BOUND " ) ) ;  
			
		
	
		
			
				
					            auto  janiTB  =  storm : : jani : : Constant ( exprTB . getName ( ) ,  exprTB ) ;  
			
		
	
		
			
				
					            model - > addConstant ( janiTB ) ;  
			
		
	
		
			
				
					            storm : : logic : : TimeBound  tb ( false ,  janiTB . getExpressionVariable ( ) . getExpression ( ) ) ;  
			
		
	
		
			
				
					            storm : : logic : : TimeBoundReference  tbr ( storm : : logic : : TimeBoundType : : Time ) ;  
			
		
	
		
			
				
					            auto  maxReachDeadlockTimeBounded  =  std : : make_shared < storm : : logic : : ProbabilityOperatorFormula > (  
			
		
	
		
			
				
					                    std : : make_shared < storm : : logic : : BoundedUntilFormula > ( trueFormula ,  deadlock ,  boost : : none ,  tb ,  tbr ) ,  
			
		
	
		
			
				
					                    storm : : logic : : OperatorInformation ( storm : : solver : : OptimizationDirection : : Maximize ) ) ;  
			
		
	
		
			
				
					            standardProperties . emplace_back ( " MaxPrReachDeadlockTB " ,  maxReachDeadlockTimeBounded ,  " The maximal probability to reach a deadlock within 'TIME_BOUND' steps. " ) ;  
			
		
	
		
			
				
					             
			
		
	
		
			
				
					            auto  expTimeDeadlock  =  std : : make_shared < storm : : logic : : TimeOperatorFormula > (  
			
		
	
		
			
				
					                    std : : make_shared < storm : : logic : : EventuallyFormula > ( deadlock ,  storm : : logic : : FormulaContext : : Time ) ,  
			
		
	
		
			
				
					                    storm : : logic : : OperatorInformation ( storm : : solver : : OptimizationDirection : : Maximize ) ) ;  
			
		
	
		
			
				
					            standardProperties . emplace_back ( " MinExpTimeDeadlock " ,  expTimeDeadlock ,  " The minimal expected time to reach a deadlock. " ) ;  
			
		
	
		
			
				
					             
			
		
	
		
			
				
					        }  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					         
			
		
	
		
			
				
					    }  
			
		
	
		
			
				
					}