@ -8,7 +8,7 @@
namespace storm {
namespace builder {
storm : : jani : : Model * JaniGSPNBuilder : : build ( std : : string const & automatonName , bool buildStandardProperties ) {
storm : : jani : : Model * JaniGSPNBuilder : : build ( std : : string const & automatonName ) {
storm : : jani : : ModelType modelType = storm : : jani : : ModelType : : MA ;
if ( gspn . getNumberOfTimedTransitions ( ) = = 0 ) {
storm : : jani : : ModelType modelType = storm : : jani : : ModelType : : MDP ;
@ -22,15 +22,8 @@ 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 ( ) ) {
@ -188,11 +181,10 @@ 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 ( ) ) ;
@ -204,7 +196,7 @@ namespace storm {
}
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 ;
@ -244,7 +236,7 @@ namespace storm {
}
}
}
if ( firstTransition ) {
transientValue = transitionDisabled ;
firstTransition = false ;
@ -271,36 +263,50 @@ namespace storm {
}
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. " ) ;
std : : vector < storm : : jani : : Property > const & JaniGSPNBuilder : : getStandardProperties ( storm : : jani : : Model * model , std : : shared_ptr < storm : : logic : : AtomicExpressionFormula > atomicFormula , std : : string name , std : : string description , bool maximal ) {
std : : vector < storm : : jani : : Property > standardProperties ;
std : : string dirShort = maximal ? " Max " : " Min " ;
std : : string dirLong = maximal ? " maximal " : " minimal " ;
storm : : solver : : OptimizationDirection optimizationDirection = maximal ? storm : : solver : : OptimizationDirection : : Maximize : storm : : solver : : OptimizationDirection : : Minimize ;
// Build reachability property
auto reachFormula = std : : make_shared < storm : : logic : : ProbabilityOperatorFormula > (
std : : make_shared < storm : : logic : : EventuallyFormula > ( atomicFormula , storm : : logic : : FormulaContext : : Probability ) ,
storm : : logic : : OperatorInformation ( optimizationDirection ) ) ;
standardProperties . emplace_back ( dirShort + " PrReach " + name , reachFormula , " The " + dirLong + " probability to eventually reach " + description + " . " ) ;
// Build time bounded reachability property
// Add variable for time bound
auto exprTB = expressionManager - > declareRationalVariable ( 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. " ) ;
auto trueFormula = std : : make_shared < storm : : logic : : BooleanLiteralFormula > ( true ) ;
auto reachTimeBoundFormula = std : : make_shared < storm : : logic : : ProbabilityOperatorFormula > (
std : : make_shared < storm : : logic : : BoundedUntilFormula > ( trueFormula , atomicFormula , boost : : none , tb , tbr ) ,
storm : : logic : : OperatorInformation ( optimizationDirection ) ) ;
standardProperties . emplace_back ( dirShort + " PrReach " + name + " TB " , reachTimeBoundFormula , " The " + dirLong + " probability to reach " + description + " within 'TIME_BOUND' steps. " ) ;
// Use complementary direction for expected time
dirShort = maximal ? " Min " : " Max " ;
dirLong = maximal ? " minimal " : " maximal " ;
optimizationDirection = maximal ? storm : : solver : : OptimizationDirection : : Minimize : storm : : solver : : OptimizationDirection : : Maximize ;
// Build expected time property
auto expTimeFormula = std : : make_shared < storm : : logic : : TimeOperatorFormula > (
std : : make_shared < storm : : logic : : EventuallyFormula > ( atomicFormula , storm : : logic : : FormulaContext : : Time ) ,
storm : : logic : : OperatorInformation ( optimizationDirection ) ) ;
standardProperties . emplace_back ( dirShort + " ExpTime " + name , expTimeFormula , " The " + dirLong + " expected time to reach " + description + " . " ) ;
}
std : : vector < storm : : jani : : Property > const & JaniGSPNBuilder : : getDeadlockProperties ( storm : : jani : : Model * model ) {
auto const & deadlockVar = addDeadlockTransientVariable ( model , getUniqueVarName ( * expressionManager , " deadl " ) ) ;
auto deadlockFormula = std : : make_shared < storm : : logic : : AtomicExpressionFormula > ( deadlockVar . getExpressionVariable ( ) . getExpression ( ) ) ;
return getStandardProperties ( model , deadlockFormula , " Deadlock " , " a deadlock " , true ) ;
}
}
}