@ -5,48 +5,49 @@
namespace storm {
namespace transformations {
namespace dft {
// Prevent some magic constants
static constexpr const uint64_t defaultPriority = 1 ;
static constexpr const uint64_t defaultCapacity = 1 ;
template < typename ValueType >
DftToGspnTransformator < ValueType > : : DftToGspnTransformator ( storm : : storage : : DFT < ValueType > const & dft ) : mDft ( dft ) {
template < typename ValueType >
DftToGspnTransformator < ValueType > : : DftToGspnTransformator ( storm : : storage : : DFT < ValueType > const & dft ) : mDft ( dft ) {
// Intentionally left empty.
}
template < typename ValueType >
void DftToGspnTransformator < ValueType > : : transform ( std : : set < uint64_t > const & dontCareElements , bool smart ) {
template < typename ValueType >
void DftToGspnTransformator < ValueType > : : transform ( std : : set < uint64_t > const & dontCareElements , bool smart , bool mergeDCFailed ) {
this - > dontCareElements = dontCareElements ;
this - > smart = smart ;
this - > mergedDCFailed = mergeDCFailed ;
builder . setGspnName ( " DftToGspnTransformation " ) ;
// Translate all GSPN elements
// Translate all GSPN elements
translateGSPNElements ( ) ;
// Create initial template
// TODO
}
template < typename ValueType >
uint64_t DftToGspnTransformator < ValueType > : : toplevelFailedPlaceId ( ) {
STORM_LOG_ASSERT ( failedPlaces . size ( ) > mDft . getTopLevelIndex ( ) , " Failed place for top level element does not exist. " ) ;
return failedPlaces . at ( mDft . getTopLevelIndex ( ) ) ;
}
template < typename ValueType >
gspn : : GSPN * DftToGspnTransformator < ValueType > : : obtainGSPN ( ) {
template < typename ValueType >
gspn : : GSPN * DftToGspnTransformator < ValueType > : : obtainGSPN ( ) {
return builder . buildGspn ( ) ;
}
template < typename ValueType >
template < typename ValueType >
void DftToGspnTransformator < ValueType > : : translateGSPNElements ( ) {
// Loop through every DFT element and create its corresponding GSPN template.
// Loop through every DFT element and create its corresponding GSPN template.
for ( std : : size_t i = 0 ; i < mDft . nrElements ( ) ; i + + ) {
auto dftElement = mDft . getElement ( i ) ;
auto dftElement = mDft . getElement ( i ) ;
// Check which type the element is and call the corresponding translate-function.
switch ( dftElement - > type ( ) ) {
// Check which type the element is and call the corresponding translate-function.
switch ( dftElement - > type ( ) ) {
case storm : : storage : : DFTElementType : : BE :
translateBE ( std : : static_pointer_cast < storm : : storage : : DFTBE < ValueType > const > ( dftElement ) ) ;
break ;
@ -57,38 +58,40 @@ namespace storm {
translateCONSTS ( dftElement ) ;
break ;
case storm : : storage : : DFTElementType : : AND :
translateAND ( std : : static_pointer_cast < storm : : storage : : DFTAnd < ValueType > const > ( dftElement ) ) ;
break ;
case storm : : storage : : DFTElementType : : OR :
translateOR ( std : : static_pointer_cast < storm : : storage : : DFTOr < ValueType > const > ( dftElement ) ) ;
break ;
case storm : : storage : : DFTElementType : : VOT :
translateVOT ( std : : static_pointer_cast < storm : : storage : : DFTVot < ValueType > const > ( dftElement ) ) ;
break ;
case storm : : storage : : DFTElementType : : PAND :
translatePAND ( std : : static_pointer_cast < storm : : storage : : DFTPand < ValueType > const > ( dftElement ) , std : : static_pointer_cast < storm : : storage : : DFTPand < ValueType > const > ( dftElement ) - > isInclusive ( ) ) ;
break ;
translateAND ( std : : static_pointer_cast < storm : : storage : : DFTAnd < ValueType > const > ( dftElement ) ) ;
break ;
case storm : : storage : : DFTElementType : : OR :
translateOR ( std : : static_pointer_cast < storm : : storage : : DFTOr < ValueType > const > ( dftElement ) ) ;
break ;
case storm : : storage : : DFTElementType : : VOT :
translateVOT ( std : : static_pointer_cast < storm : : storage : : DFTVot < ValueType > const > ( dftElement ) ) ;
break ;
case storm : : storage : : DFTElementType : : PAND :
translatePAND ( std : : static_pointer_cast < storm : : storage : : DFTPand < ValueType > const > ( dftElement ) ,
std : : static_pointer_cast < storm : : storage : : DFTPand < ValueType > const > ( dftElement ) - > isInclusive ( ) ) ;
break ;
case storm : : storage : : DFTElementType : : POR :
translatePOR ( std : : static_pointer_cast < storm : : storage : : DFTPor < ValueType > const > ( dftElement ) , std : : static_pointer_cast < storm : : storage : : DFTPor < ValueType > const > ( dftElement ) - > isInclusive ( ) ) ;
translatePOR ( std : : static_pointer_cast < storm : : storage : : DFTPor < ValueType > const > ( dftElement ) ,
std : : static_pointer_cast < storm : : storage : : DFTPor < ValueType > const > ( dftElement ) - > isInclusive ( ) ) ;
break ;
case storm : : storage : : DFTElementType : : SPARE :
translateSPARE ( std : : static_pointer_cast < storm : : storage : : DFTSpare < ValueType > const > ( dftElement ) ) ;
break ;
case storm : : storage : : DFTElementType : : SPARE :
translateSPARE ( std : : static_pointer_cast < storm : : storage : : DFTSpare < ValueType > const > ( dftElement ) ) ;
break ;
case storm : : storage : : DFTElementType : : PDEP :
translatePDEP ( std : : static_pointer_cast < storm : : storage : : DFTDependency < ValueType > const > ( dftElement ) ) ;
break ;
case storm : : storage : : DFTElementType : : SEQ :
case storm : : storage : : DFTElementType : : SEQ :
translateSeq ( std : : static_pointer_cast < storm : : storage : : DFTSeq < ValueType > const > ( dftElement ) ) ;
break ;
default :
STORM_LOG_ASSERT ( false , " DFT type " < < dftElement - > type ( ) < < " unknown. " ) ;
break ;
}
}
}
template < typename ValueType >
default :
STORM_LOG_ASSERT ( false , " DFT type " < < dftElement - > type ( ) < < " unknown. " ) ;
break ;
}
}
}
template < typename ValueType >
void DftToGspnTransformator < ValueType > : : translateBE ( std : : shared_ptr < storm : : storage : : DFTBE < ValueType > const > dftBE ) {
double xcenter = mDft . getElementLayoutInfo ( dftBE - > id ( ) ) . x ;
double ycenter = mDft . getElementLayoutInfo ( dftBE - > id ( ) ) . y ;
@ -111,21 +114,21 @@ namespace storm {
builder . addInhibitionArc ( activePlace , tPassive ) ;
builder . addInhibitionArc ( failedPlace , tPassive ) ;
builder . addOutputArc ( tPassive , failedPlace ) ;
if ( ! smart | | dftBE - > nrRestrictions ( ) > 0 ) {
uint64_t disabledPlace = addDisabledPlace ( dftBE , storm : : gspn : : LayoutInfo ( xcenter - 9.0 , ycenter ) ) ;
uint64_t disabledPlace = addDisabledPlace ( dftBE , storm : : gspn : : LayoutInfo ( xcenter - 9.0 , ycenter ) ) ;
builder . addInhibitionArc ( disabledPlace , tActive ) ;
builder . addInhibitionArc ( disabledPlace , tPassive ) ;
}
if ( ! smart | | mDft . isRepresentative ( dftBE - > id ( ) ) ) {
uint64_t unavailablePlace = addUnavailablePlace ( dftBE , storm : : gspn : : LayoutInfo ( xcenter + 9.0 , ycenter ) ) ;
uint64_t unavailablePlace = addUnavailablePlace ( dftBE , storm : : gspn : : LayoutInfo ( xcenter + 9.0 , ycenter ) ) ;
builder . addOutputArc ( tActive , unavailablePlace ) ;
builder . addOutputArc ( tPassive , unavailablePlace ) ;
}
}
template < typename ValueType >
template < typename ValueType >
void DftToGspnTransformator < ValueType > : : translateCONSTF ( std : : shared_ptr < storm : : storage : : DFTElement < ValueType > const > dftConstF ) {
double xcenter = mDft . getElementLayoutInfo ( dftConstF - > id ( ) ) . x ;
double ycenter = mDft . getElementLayoutInfo ( dftConstF - > id ( ) ) . y ;
@ -137,7 +140,7 @@ namespace storm {
}
}
template < typename ValueType >
template < typename ValueType >
void DftToGspnTransformator < ValueType > : : translateCONSTS ( std : : shared_ptr < storm : : storage : : DFTElement < ValueType > const > dftConstS ) {
double xcenter = mDft . getElementLayoutInfo ( dftConstS - > id ( ) ) . x ;
double ycenter = mDft . getElementLayoutInfo ( dftConstS - > id ( ) ) . y ;
@ -156,46 +159,46 @@ namespace storm {
}
}
template < typename ValueType >
template < typename ValueType >
void DftToGspnTransformator < ValueType > : : translateAND ( std : : shared_ptr < storm : : storage : : DFTAnd < ValueType > const > dftAnd ) {
double xcenter = mDft . getElementLayoutInfo ( dftAnd - > id ( ) ) . x ;
double ycenter = mDft . getElementLayoutInfo ( dftAnd - > id ( ) ) . y ;
uint64_t failedPlace = addFailedPlace ( dftAnd , storm : : gspn : : LayoutInfo ( xcenter , ycenter - 3.0 ) ) ;
uint64_t failedPlace = addFailedPlace ( dftAnd , storm : : gspn : : LayoutInfo ( xcenter , ycenter - 3.0 ) ) ;
uint64_t tFailed = builder . addImmediateTransition ( getFailPriority ( dftAnd ) , 0.0 , dftAnd - > name ( ) + STR_FAILING ) ;
builder . setTransitionLayoutInfo ( tFailed , storm : : gspn : : LayoutInfo ( xcenter , ycenter + 3.0 ) ) ;
uint64_t tFailed = builder . addImmediateTransition ( getFailPriority ( dftAnd ) , 0.0 , dftAnd - > name ( ) + STR_FAILING ) ;
builder . setTransitionLayoutInfo ( tFailed , storm : : gspn : : LayoutInfo ( xcenter , ycenter + 3.0 ) ) ;
builder . addInhibitionArc ( failedPlace , tFailed ) ;
builder . addOutputArc ( tFailed , failedPlace ) ;
if ( ! smart | | mDft . isRepresentative ( dftAnd - > id ( ) ) ) {
uint64_t unavailablePlace = addUnavailablePlace ( dftAnd , storm : : gspn : : LayoutInfo ( xcenter + 6.0 , ycenter - 3.0 ) ) ;
uint64_t unavailablePlace = addUnavailablePlace ( dftAnd , storm : : gspn : : LayoutInfo ( xcenter + 6.0 , ycenter - 3.0 ) ) ;
builder . addOutputArc ( tFailed , unavailablePlace ) ;
}
for ( auto const & child : dftAnd - > children ( ) ) {
for ( auto const & child : dftAnd - > children ( ) ) {
builder . addInputArc ( getFailedPlace ( child ) , tFailed ) ;
builder . addOutputArc ( tFailed , getFailedPlace ( child ) ) ;
}
}
}
template < typename ValueType >
template < typename ValueType >
void DftToGspnTransformator < ValueType > : : translateOR ( std : : shared_ptr < storm : : storage : : DFTOr < ValueType > const > dftOr ) {
double xcenter = mDft . getElementLayoutInfo ( dftOr - > id ( ) ) . x ;
double ycenter = mDft . getElementLayoutInfo ( dftOr - > id ( ) ) . y ;
uint64_t failedPlace = addFailedPlace ( dftOr , storm : : gspn : : LayoutInfo ( xcenter , ycenter - 3.0 ) ) ;
uint64_t failedPlace = addFailedPlace ( dftOr , storm : : gspn : : LayoutInfo ( xcenter , ycenter - 3.0 ) ) ;
bool isRepresentative = mDft . isRepresentative ( dftOr - > id ( ) ) ;
uint64_t unavailablePlace = 0 ;
if ( ! smart | | isRepresentative ) {
unavailablePlace = addUnavailablePlace ( dftOr , storm : : gspn : : LayoutInfo ( xcenter + 6.0 , ycenter - 3.0 ) ) ;
unavailablePlace = addUnavailablePlace ( dftOr , storm : : gspn : : LayoutInfo ( xcenter + 6.0 , ycenter - 3.0 ) ) ;
}
for ( size_t i = 0 ; i < dftOr - > nrChildren ( ) ; + + i ) {
auto const & child = dftOr - > children ( ) . at ( i ) ;
uint64_t tFailed = builder . addImmediateTransition ( getFailPriority ( dftOr ) , 0.0 , dftOr - > name ( ) + STR_FAILING + std : : to_string ( i ) ) ;
builder . setTransitionLayoutInfo ( tFailed , storm : : gspn : : LayoutInfo ( xcenter - 5.0 + i * 3.0 , ycenter + 3.0 ) ) ;
for ( size_t i = 0 ; i < dftOr - > nrChildren ( ) ; + + i ) {
auto const & child = dftOr - > children ( ) . at ( i ) ;
uint64_t tFailed = builder . addImmediateTransition ( getFailPriority ( dftOr ) , 0.0 , dftOr - > name ( ) + STR_FAILING + std : : to_string ( i ) ) ;
builder . setTransitionLayoutInfo ( tFailed , storm : : gspn : : LayoutInfo ( xcenter - 5.0 + i * 3.0 , ycenter + 3.0 ) ) ;
builder . addInhibitionArc ( failedPlace , tFailed ) ;
builder . addOutputArc ( tFailed , failedPlace ) ;
if ( ! smart | | isRepresentative ) {
@ -204,23 +207,23 @@ namespace storm {
builder . addInputArc ( getFailedPlace ( child ) , tFailed ) ;
builder . addOutputArc ( tFailed , getFailedPlace ( child ) ) ;
}
}
template < typename ValueType >
}
template < typename ValueType >
void DftToGspnTransformator < ValueType > : : translateVOT ( std : : shared_ptr < storm : : storage : : DFTVot < ValueType > const > dftVot ) {
// TODO: finish layouting
double xcenter = mDft . getElementLayoutInfo ( dftVot - > id ( ) ) . x ;
double ycenter = mDft . getElementLayoutInfo ( dftVot - > id ( ) ) . y ;
uint64_t failedPlace = addFailedPlace ( dftVot , storm : : gspn : : LayoutInfo ( xcenter , ycenter - 3.0 ) ) ;
uint64_t failedPlace = addFailedPlace ( dftVot , storm : : gspn : : LayoutInfo ( xcenter , ycenter - 3.0 ) ) ;
uint64_t tFailed = builder . addImmediateTransition ( getFailPriority ( dftVot ) , 0.0 , dftVot - > name ( ) + STR_FAILING ) ;
builder . addOutputArc ( tFailed , failedPlace ) ;
builder . addInhibitionArc ( failedPlace , tFailed ) ;
if ( ! smart | | mDft . isRepresentative ( dftVot - > id ( ) ) ) {
uint64_t unavailablePlace = addUnavailablePlace ( dftVot , storm : : gspn : : LayoutInfo ( xcenter + 6.0 , ycenter - 3.0 ) ) ;
uint64_t unavailablePlace = addUnavailablePlace ( dftVot , storm : : gspn : : LayoutInfo ( xcenter + 6.0 , ycenter - 3.0 ) ) ;
builder . addOutputArc ( tFailed , unavailablePlace ) ;
}
@ -228,8 +231,8 @@ namespace storm {
builder . setPlaceLayoutInfo ( collectorPlace , storm : : gspn : : LayoutInfo ( xcenter , ycenter ) ) ;
builder . addInputArc ( collectorPlace , tFailed , dftVot - > threshold ( ) ) ;
for ( size_t i = 0 ; i < dftVot - > nrChildren ( ) ; + + i ) {
auto const & child = dftVot - > children ( ) . at ( i ) ;
for ( size_t i = 0 ; i < dftVot - > nrChildren ( ) ; + + i ) {
auto const & child = dftVot - > children ( ) . at ( i ) ;
uint64_t childNextPlace = builder . addPlace ( defaultCapacity , 1 , dftVot - > name ( ) + " _child_next " + std : : to_string ( i ) ) ;
uint64_t tCollect = builder . addImmediateTransition ( getFailPriority ( dftVot ) , 0.0 , dftVot - > name ( ) + " _child_collect " + std : : to_string ( i ) ) ;
@ -238,46 +241,46 @@ namespace storm {
builder . addInputArc ( getFailedPlace ( child ) , tCollect ) ;
builder . addOutputArc ( tCollect , getFailedPlace ( child ) ) ;
}
}
}
template < typename ValueType >
template < typename ValueType >
void DftToGspnTransformator < ValueType > : : translatePAND ( std : : shared_ptr < storm : : storage : : DFTPand < ValueType > const > dftPand , bool inclusive ) {
double xcenter = mDft . getElementLayoutInfo ( dftPand - > id ( ) ) . x ;
double ycenter = mDft . getElementLayoutInfo ( dftPand - > id ( ) ) . y ;
uint64_t failedPlace = addFailedPlace ( dftPand , storm : : gspn : : LayoutInfo ( xcenter + 3.0 , ycenter - 3.0 ) ) ;
uint64_t failedPlace = addFailedPlace ( dftPand , storm : : gspn : : LayoutInfo ( xcenter + 3.0 , ycenter - 3.0 ) ) ;
uint64_t tFailed = builder . addImmediateTransition ( getFailPriority ( dftPand ) , 0.0 , dftPand - > name ( ) + STR_FAILING ) ;
builder . setTransitionLayoutInfo ( tFailed , storm : : gspn : : LayoutInfo ( xcenter + 3.0 , ycenter + 3.0 ) ) ;
uint64_t tFailed = builder . addImmediateTransition ( getFailPriority ( dftPand ) , 0.0 , dftPand - > name ( ) + STR_FAILING ) ;
builder . setTransitionLayoutInfo ( tFailed , storm : : gspn : : LayoutInfo ( xcenter + 3.0 , ycenter + 3.0 ) ) ;
builder . addInhibitionArc ( failedPlace , tFailed ) ;
builder . addOutputArc ( tFailed , failedPlace ) ;
if ( ! smart | | mDft . isRepresentative ( dftPand - > id ( ) ) ) {
uint64_t unavailablePlace = addUnavailablePlace ( dftPand , storm : : gspn : : LayoutInfo ( xcenter + 9.0 , ycenter - 3.0 ) ) ;
uint64_t unavailablePlace = addUnavailablePlace ( dftPand , storm : : gspn : : LayoutInfo ( xcenter + 9.0 , ycenter - 3.0 ) ) ;
builder . addOutputArc ( tFailed , unavailablePlace ) ;
}
if ( inclusive ) {
// Inclusive PAND
uint64_t failSafePlace = builder . addPlace ( defaultCapacity , 0 , dftPand - > name ( ) + STR_FAILSAVE ) ;
builder . setPlaceLayoutInfo ( failSafePlace , storm : : gspn : : LayoutInfo ( xcenter - 3.0 , ycenter - 3.0 ) ) ;
builder . setPlaceLayoutInfo ( failSafePlace , storm : : gspn : : LayoutInfo ( xcenter - 3.0 , ycenter - 3.0 ) ) ;
builder . addInhibitionArc ( failSafePlace , tFailed ) ;
// Transitions for failed place
for ( auto const & child : dftPand - > children ( ) ) {
for ( auto const & child : dftPand - > children ( ) ) {
builder . addInputArc ( getFailedPlace ( child ) , tFailed ) ;
builder . addOutputArc ( tFailed , getFailedPlace ( child ) ) ;
}
// Transitions for fail-safe place
for ( uint64_t i = 1 ; i < dftPand - > nrChildren ( ) ; + + i ) {
auto const & child = dftPand - > children ( ) . at ( i ) ;
auto const & child = dftPand - > children ( ) . at ( i ) ;
uint64_t tFailSafe = builder . addImmediateTransition ( getFailPriority ( dftPand ) , 0.0 , dftPand - > name ( ) + STR_FAILSAVING + std : : to_string ( i ) ) ;
builder . setTransitionLayoutInfo ( tFailSafe , storm : : gspn : : LayoutInfo ( xcenter - 6.0 + i * 3.0 , ycenter + 3.0 ) ) ;
builder . setTransitionLayoutInfo ( tFailSafe , storm : : gspn : : LayoutInfo ( xcenter - 6.0 + i * 3.0 , ycenter + 3.0 ) ) ;
builder . addInputArc ( getFailedPlace ( child ) , tFailSafe ) ;
builder . addOutputArc ( tFailSafe , getFailedPlace ( child ) ) ;
builder . addInhibitionArc ( getFailedPlace ( dftPand - > children ( ) . at ( i - 1 ) ) , tFailSafe ) ;
builder . addInhibitionArc ( getFailedPlace ( dftPand - > children ( ) . at ( i - 1 ) ) , tFailSafe ) ;
builder . addOutputArc ( tFailSafe , failSafePlace ) ;
builder . addInhibitionArc ( failSafePlace , tFailSafe ) ;
}
@ -286,7 +289,7 @@ namespace storm {
uint64_t failSafeXPlace = 0 ;
uint64_t tFailSafeX = 0 ;
for ( size_t i = 0 ; i < dftPand - > nrChildren ( ) ; + + i ) {
auto const & child = dftPand - > children ( ) . at ( i ) ;
auto const & child = dftPand - > children ( ) . at ( i ) ;
if ( i > 0 ) {
// Set inhibition arc to previous transition
@ -295,8 +298,8 @@ namespace storm {
if ( i < dftPand - > nrChildren ( ) - 1 ) {
// Not last child
tFailSafeX = builder . addImmediateTransition ( getFailPriority ( dftPand ) , 0.0 , dftPand - > name ( ) + STR_FAILING + " _ " + std : : to_string ( i ) ) ;
builder . setTransitionLayoutInfo ( tFailSafeX , storm : : gspn : : LayoutInfo ( xcenter - 3.0 , ycenter + 3.0 ) ) ;
tFailSafeX = builder . addImmediateTransition ( getFailPriority ( dftPand ) , 0.0 , dftPand - > name ( ) + STR_FAILING + " _ " + std : : to_string ( i ) ) ;
builder . setTransitionLayoutInfo ( tFailSafeX , storm : : gspn : : LayoutInfo ( xcenter - 3.0 , ycenter + 3.0 ) ) ;
} else {
// Last child
tFailSafeX = tFailed ;
@ -311,7 +314,7 @@ namespace storm {
if ( i < dftPand - > nrChildren ( ) - 1 ) {
// Add fail-safe X place
failSafeXPlace = builder . addPlace ( defaultCapacity , 0 , dftPand - > name ( ) + " _F_ " + std : : to_string ( i ) ) ;
builder . setPlaceLayoutInfo ( failSafeXPlace , storm : : gspn : : LayoutInfo ( xcenter - 3.0 + i * 3.0 , ycenter ) ) ;
builder . setPlaceLayoutInfo ( failSafeXPlace , storm : : gspn : : LayoutInfo ( xcenter - 3.0 + i * 3.0 , ycenter ) ) ;
builder . addOutputArc ( tFailSafeX , failSafeXPlace ) ;
builder . addInhibitionArc ( failSafeXPlace , tFailSafeX ) ;
}
@ -319,15 +322,15 @@ namespace storm {
}
}
template < typename ValueType >
template < typename ValueType >
void DftToGspnTransformator < ValueType > : : translatePOR ( std : : shared_ptr < storm : : storage : : DFTPor < ValueType > const > dftPor , bool inclusive ) {
double xcenter = mDft . getElementLayoutInfo ( dftPor - > id ( ) ) . x ;
double ycenter = mDft . getElementLayoutInfo ( dftPor - > id ( ) ) . y ;
uint64_t failedPlace = addFailedPlace ( dftPor , storm : : gspn : : LayoutInfo ( xcenter + 3.0 , ycenter - 3.0 ) ) ;
uint64_t failedPlace = addFailedPlace ( dftPor , storm : : gspn : : LayoutInfo ( xcenter + 3.0 , ycenter - 3.0 ) ) ;
uint64_t tFailed = builder . addImmediateTransition ( getFailPriority ( dftPor ) , 0.0 , dftPor - > name ( ) + STR_FAILING ) ;
builder . setTransitionLayoutInfo ( tFailed , storm : : gspn : : LayoutInfo ( xcenter + 3.0 , ycenter + 3.0 ) ) ;
builder . setTransitionLayoutInfo ( tFailed , storm : : gspn : : LayoutInfo ( xcenter + 3.0 , ycenter + 3.0 ) ) ;
builder . addOutputArc ( tFailed , failedPlace ) ;
builder . addInhibitionArc ( failedPlace , tFailed ) ;
@ -336,22 +339,22 @@ namespace storm {
builder . addOutputArc ( tFailed , getFailedPlace ( dftPor - > children ( ) . front ( ) ) ) ;
if ( ! smart | | mDft . isRepresentative ( dftPor - > id ( ) ) ) {
uint64_t unavailablePlace = addUnavailablePlace ( dftPor , storm : : gspn : : LayoutInfo ( xcenter + 9.0 , ycenter - 3.0 ) ) ;
uint64_t unavailablePlace = addUnavailablePlace ( dftPor , storm : : gspn : : LayoutInfo ( xcenter + 9.0 , ycenter - 3.0 ) ) ;
builder . addOutputArc ( tFailed , unavailablePlace ) ;
}
if ( inclusive ) {
// Inclusive POR
uint64_t failSafePlace = builder . addPlace ( defaultCapacity , 0 , dftPor - > name ( ) + STR_FAILSAVE ) ;
builder . setPlaceLayoutInfo ( failSafePlace , storm : : gspn : : LayoutInfo ( xcenter - 3.0 , ycenter - 3.0 ) ) ;
builder . setPlaceLayoutInfo ( failSafePlace , storm : : gspn : : LayoutInfo ( xcenter - 3.0 , ycenter - 3.0 ) ) ;
builder . addInhibitionArc ( failSafePlace , tFailed ) ;
// For all children except the first one
for ( size_t i = 1 ; i < dftPor - > nrChildren ( ) ; + + i ) {
auto const & child = dftPor - > children ( ) . at ( i ) ;
auto const & child = dftPor - > children ( ) . at ( i ) ;
uint64_t tFailSafe = builder . addImmediateTransition ( getFailPriority ( dftPor ) , 0.0 , dftPor - > name ( ) + STR_FAILSAVING + std : : to_string ( i ) ) ;
builder . setTransitionLayoutInfo ( tFailSafe , storm : : gspn : : LayoutInfo ( xcenter - 3.0 + i * 3.0 , ycenter + 3.0 ) ) ;
builder . setTransitionLayoutInfo ( tFailSafe , storm : : gspn : : LayoutInfo ( xcenter - 3.0 + i * 3.0 , ycenter + 3.0 ) ) ;
builder . addInputArc ( getFailedPlace ( child ) , tFailSafe ) ;
builder . addOutputArc ( tFailSafe , getFailedPlace ( child ) ) ;
@ -363,38 +366,38 @@ namespace storm {
// Exclusive POR
// For all children except the first one
for ( auto const & child : dftPor - > children ( ) ) {
for ( auto const & child : dftPor - > children ( ) ) {
builder . addInhibitionArc ( getFailedPlace ( child ) , tFailed ) ;
}
}
}
template < typename ValueType >
template < typename ValueType >
void DftToGspnTransformator < ValueType > : : translateSPARE ( std : : shared_ptr < storm : : storage : : DFTSpare < ValueType > const > dftSpare ) {
double xcenter = mDft . getElementLayoutInfo ( dftSpare - > id ( ) ) . x ;
double ycenter = mDft . getElementLayoutInfo ( dftSpare - > id ( ) ) . y ;
uint64_t failedPlace = addFailedPlace ( dftSpare , storm : : gspn : : LayoutInfo ( xcenter + 10.0 , ycenter - 8.0 ) ) ;
uint64_t failedPlace = addFailedPlace ( dftSpare , storm : : gspn : : LayoutInfo ( xcenter + 10.0 , ycenter - 8.0 ) ) ;
bool isRepresentative = mDft . isRepresentative ( dftSpare - > id ( ) ) ;
uint64_t unavailablePlace = 0 ;
if ( ! smart | | isRepresentative ) {
unavailablePlace = addUnavailablePlace ( dftSpare , storm : : gspn : : LayoutInfo ( xcenter + 16.0 , ycenter - 8.0 ) ) ;
unavailablePlace = addUnavailablePlace ( dftSpare , storm : : gspn : : LayoutInfo ( xcenter + 16.0 , ycenter - 8.0 ) ) ;
}
uint64_t activePlace = builder . addPlace ( defaultCapacity , isActiveInitially ( dftSpare ) ? 1 : 0 , dftSpare - > name ( ) + STR_ACTIVATED ) ;
builder . setPlaceLayoutInfo ( activePlace , storm : : gspn : : LayoutInfo ( xcenter - 20.0 , ycenter - 12.0 ) ) ;
builder . setPlaceLayoutInfo ( activePlace , storm : : gspn : : LayoutInfo ( xcenter - 20.0 , ycenter - 12.0 ) ) ;
activePlaces . emplace ( dftSpare - > id ( ) , activePlace ) ;
std : : vector < uint64_t > tNextClaims ;
std : : vector < uint64_t > tNextConsiders ;
for ( size_t i = 0 ; i < dftSpare - > nrChildren ( ) ; + + i ) {
auto const & child = dftSpare - > children ( ) . at ( i ) ;
auto const & child = dftSpare - > children ( ) . at ( i ) ;
// Consider next child
size_t considerPlace = builder . addPlace ( defaultCapacity , i = = 0 ? 1 : 0 , dftSpare - > name ( ) + " _consider_ " + child - > name ( ) ) ;
builder . setPlaceLayoutInfo ( considerPlace , storm : : gspn : : LayoutInfo ( xcenter - 15.0 + i * 14.0 , ycenter - 8.0 ) ) ;
size_t considerPlace = builder . addPlace ( defaultCapacity , i = = 0 ? 1 : 0 , dftSpare - > name ( ) + " _consider_ " + child - > name ( ) ) ;
builder . setPlaceLayoutInfo ( considerPlace , storm : : gspn : : LayoutInfo ( xcenter - 15.0 + i * 14.0 , ycenter - 8.0 ) ) ;
if ( i > 0 ) {
// Set output transition from previous next_claim
@ -405,7 +408,7 @@ namespace storm {
// Cannot claim child
uint64_t tConsiderNext = builder . addImmediateTransition ( getFailPriority ( dftSpare ) , 0.0 , dftSpare - > name ( ) + " _cannot_claim_ " + child - > name ( ) ) ;
builder . setTransitionLayoutInfo ( tConsiderNext , storm : : gspn : : LayoutInfo ( xcenter - 7.0 + i * 14.0 , ycenter - 8.0 ) ) ;
builder . setTransitionLayoutInfo ( tConsiderNext , storm : : gspn : : LayoutInfo ( xcenter - 7.0 + i * 14.0 , ycenter - 8.0 ) ) ;
builder . addInputArc ( considerPlace , tConsiderNext ) ;
builder . addInputArc ( unavailablePlaces . at ( child - > id ( ) ) , tConsiderNext ) ;
builder . addOutputArc ( tConsiderNext , unavailablePlaces . at ( child - > id ( ) ) ) ;
@ -413,9 +416,9 @@ namespace storm {
// Claimed child
size_t claimedPlace = builder . addPlace ( defaultCapacity , 0 , dftSpare - > name ( ) + " _claimed_ " + child - > name ( ) ) ;
builder . setPlaceLayoutInfo ( claimedPlace , storm : : gspn : : LayoutInfo ( xcenter - 15.0 + i * 14.0 , ycenter + 5.0 ) ) ;
builder . setPlaceLayoutInfo ( claimedPlace , storm : : gspn : : LayoutInfo ( xcenter - 15.0 + i * 14.0 , ycenter + 5.0 ) ) ;
uint64_t tClaim = builder . addImmediateTransition ( getFailPriority ( dftSpare ) , 0.0 , dftSpare - > name ( ) + " _claim_ " + child - > name ( ) ) ;
builder . setTransitionLayoutInfo ( tClaim , storm : : gspn : : LayoutInfo ( xcenter - 15.0 + i * 14.0 , ycenter ) ) ;
builder . setTransitionLayoutInfo ( tClaim , storm : : gspn : : LayoutInfo ( xcenter - 15.0 + i * 14.0 , ycenter ) ) ;
builder . addInhibitionArc ( unavailablePlaces . at ( child - > id ( ) ) , tClaim ) ;
builder . addInputArc ( considerPlace , tClaim ) ;
builder . addOutputArc ( tClaim , claimedPlace ) ;
@ -423,7 +426,7 @@ namespace storm {
// Claim next
uint64_t tClaimNext = builder . addImmediateTransition ( getFailPriority ( dftSpare ) , 0.0 , dftSpare - > name ( ) + " _next_claim_ " + std : : to_string ( i ) ) ;
builder . setTransitionLayoutInfo ( tClaimNext , storm : : gspn : : LayoutInfo ( xcenter - 7.0 + i * 14.0 , ycenter + 5.0 ) ) ;
builder . setTransitionLayoutInfo ( tClaimNext , storm : : gspn : : LayoutInfo ( xcenter - 7.0 + i * 14.0 , ycenter + 5.0 ) ) ;
builder . addInputArc ( claimedPlace , tClaimNext ) ;
builder . addInputArc ( getFailedPlace ( child ) , tClaimNext ) ;
builder . addOutputArc ( tClaimNext , getFailedPlace ( child ) ) ;
@ -432,8 +435,8 @@ namespace storm {
// Activate all elements in spare module
uint64_t l = 0 ;
for ( uint64_t k : mDft . module ( child - > id ( ) ) ) {
uint64_t tActivate = builder . addImmediateTransition ( defaultPriority , 0.0 , dftSpare - > name ( ) + " _activate_ " + std : : to_string ( i ) + " _ " + std : : to_string ( k ) ) ;
builder . setTransitionLayoutInfo ( tActivate , storm : : gspn : : LayoutInfo ( xcenter - 18.0 + ( i + l ) * 3 , ycenter - 12.0 ) ) ;
uint64_t tActivate = builder . addImmediateTransition ( defaultPriority , 0.0 , dftSpare - > name ( ) + " _activate_ " + std : : to_string ( i ) + " _ " + std : : to_string ( k ) ) ;
builder . setTransitionLayoutInfo ( tActivate , storm : : gspn : : LayoutInfo ( xcenter - 18.0 + ( i + l ) * 3 , ycenter - 12.0 ) ) ;
builder . addInhibitionArc ( activePlaces . at ( k ) , tActivate ) ;
builder . addInputArc ( claimedPlace , tActivate ) ;
builder . addInputArc ( activePlace , tActivate ) ;
@ -452,26 +455,26 @@ namespace storm {
builder . addOutputArc ( tNextConsiders . back ( ) , unavailablePlace ) ;
builder . addOutputArc ( tNextClaims . back ( ) , unavailablePlace ) ;
}
}
}
template < typename ValueType >
template < typename ValueType >
void DftToGspnTransformator < ValueType > : : translatePDEP ( std : : shared_ptr < storm : : storage : : DFTDependency < ValueType > const > dftDependency ) {
double xcenter = mDft . getElementLayoutInfo ( dftDependency - > id ( ) ) . x ;
double ycenter = mDft . getElementLayoutInfo ( dftDependency - > id ( ) ) . y ;
if ( ! smart ) {
addFailedPlace ( dftDependency , storm : : gspn : : LayoutInfo ( xcenter + 10.0 , ycenter - 8.0 ) ) ;
addUnavailablePlace ( dftDependency , storm : : gspn : : LayoutInfo ( xcenter + 16.0 , ycenter - 8.0 ) ) ;
addFailedPlace ( dftDependency , storm : : gspn : : LayoutInfo ( xcenter + 10.0 , ycenter - 8.0 ) ) ;
addUnavailablePlace ( dftDependency , storm : : gspn : : LayoutInfo ( xcenter + 16.0 , ycenter - 8.0 ) ) ;
}
uint64_t forwardPlace = 0 ;
if ( dftDependency - > probability ( ) < 1.0 ) {
// PDEP
forwardPlace = builder . addPlace ( defaultCapacity , 0 , dftDependency - > name ( ) + " _forward " ) ;
builder . setPlaceLayoutInfo ( forwardPlace , storm : : gspn : : LayoutInfo ( xcenter + 1.0 , ycenter + 2.0 ) ) ;
builder . setPlaceLayoutInfo ( forwardPlace , storm : : gspn : : LayoutInfo ( xcenter + 1.0 , ycenter + 2.0 ) ) ;
uint64_t coinPlace = builder . addPlace ( defaultCapacity , 1 , dftDependency - > name ( ) + " _coin " ) ;
builder . setPlaceLayoutInfo ( coinPlace , storm : : gspn : : LayoutInfo ( xcenter - 5.0 , ycenter + 2.0 ) ) ;
builder . setPlaceLayoutInfo ( coinPlace , storm : : gspn : : LayoutInfo ( xcenter - 5.0 , ycenter + 2.0 ) ) ;
uint64_t tStartFlip = builder . addImmediateTransition ( defaultPriority , 0.0 , dftDependency - > name ( ) + " _start_flip " ) ;
builder . addInputArc ( coinPlace , tStartFlip ) ;
@ -479,7 +482,7 @@ namespace storm {
builder . addOutputArc ( tStartFlip , getFailedPlace ( dftDependency - > triggerEvent ( ) ) ) ;
uint64_t flipPlace = builder . addPlace ( defaultCapacity , 0 , dftDependency - > name ( ) + " _flip " ) ;
builder . setPlaceLayoutInfo ( flipPlace , storm : : gspn : : LayoutInfo ( xcenter - 2.0 , ycenter + 2.0 ) ) ;
builder . setPlaceLayoutInfo ( flipPlace , storm : : gspn : : LayoutInfo ( xcenter - 2.0 , ycenter + 2.0 ) ) ;
builder . addOutputArc ( tStartFlip , flipPlace ) ;
uint64_t tWinFlip = builder . addImmediateTransition ( defaultPriority , dftDependency - > probability ( ) , " _win_flip " ) ;
@ -493,7 +496,7 @@ namespace storm {
forwardPlace = getFailedPlace ( dftDependency - > triggerEvent ( ) ) ;
}
for ( auto const & child : dftDependency - > dependentEvents ( ) ) {
for ( auto const & child : dftDependency - > dependentEvents ( ) ) {
uint64_t tForwardFailure = builder . addImmediateTransition ( defaultPriority , 0.0 , dftDependency - > name ( ) + " _propagate_ " + child - > name ( ) ) ;
builder . addInputArc ( forwardPlace , tForwardFailure ) ;
builder . addOutputArc ( tForwardFailure , forwardPlace ) ;
@ -506,43 +509,45 @@ namespace storm {
builder . addOutputArc ( tForwardFailure , unavailablePlaces . at ( child - > id ( ) ) ) ;
}
}
}
template < typename ValueType >
}
template < typename ValueType >
void DftToGspnTransformator < ValueType > : : translateSeq ( std : : shared_ptr < storm : : storage : : DFTSeq < ValueType > const > dftSeq ) {
STORM_LOG_THROW ( dftSeq - > allChildrenBEs ( ) , storm : : exceptions : : NotImplementedException , " Sequence enforcers with gates as children are currently not supported " ) ;
double xcenter = mDft . getElementLayoutInfo ( dftSeq - > id ( ) ) . x ;
double ycenter = mDft . getElementLayoutInfo ( dftSeq - > id ( ) ) . y ;
if ( ! smart ) {
addFailedPlace ( dftSeq , storm : : gspn : : LayoutInfo ( xcenter + 10.0 , ycenter - 8.0 ) ) ;
addUnavailablePlace ( dftSeq , storm : : gspn : : LayoutInfo ( xcenter + 16.0 , ycenter - 8.0 ) ) ;
addFailedPlace ( dftSeq , storm : : gspn : : LayoutInfo ( xcenter + 10.0 , ycenter - 8.0 ) ) ;
addUnavailablePlace ( dftSeq , storm : : gspn : : LayoutInfo ( xcenter + 16.0 , ycenter - 8.0 ) ) ;
}
uint64_t tEnable = 0 ;
uint64_t nextPlace = 0 ;
for ( size_t i = 0 ; i < dftSeq - > nrChildren ( ) ; + + i ) {
auto const & child = dftSeq - > children ( ) . at ( i ) ;
auto const & child = dftSeq - > children ( ) . at ( i ) ;
nextPlace = builder . addPlace ( defaultCapacity , i = = 0 ? 1 : 0 , dftSeq - > name ( ) + " _next_ " + child - > name ( ) ) ;
builder . setPlaceLayoutInfo ( nextPlace , storm : : gspn : : LayoutInfo ( xcenter - 5.0 + i * 3.0 , ycenter - 3.0 ) ) ;
nextPlace = builder . addPlace ( defaultCapacity , i = = 0 ? 1 : 0 , dftSeq - > name ( ) + " _next_ " + child - > name ( ) ) ;
builder . setPlaceLayoutInfo ( nextPlace , storm : : gspn : : LayoutInfo ( xcenter - 5.0 + i * 3.0 , ycenter - 3.0 ) ) ;
if ( i > 0 ) {
if ( i > 0 ) {
builder . addOutputArc ( tEnable , nextPlace ) ;
}
tEnable = builder . addImmediateTransition ( defaultPriority , 0.0 , dftSeq - > name ( ) + " _unblock_ " + child - > name ( ) ) ;
builder . setTransitionLayoutInfo ( tEnable , storm : : gspn : : LayoutInfo ( xcenter - 5.0 + i * 3.0 , ycenter + 3.0 ) ) ;
tEnable = builder . addImmediateTransition ( defaultPriority , 0.0 , dftSeq - > name ( ) + " _unblock_ " + child - > name ( ) ) ;
builder . setTransitionLayoutInfo ( tEnable , storm : : gspn : : LayoutInfo ( xcenter - 5.0 + i * 3.0 , ycenter + 3.0 ) ) ;
builder . addInputArc ( nextPlace , tEnable ) ;
builder . addInputArc ( disabledPlaces . at ( child - > id ( ) ) , tEnable ) ;
if ( i > 0 ) {
builder . addInputArc ( getFailedPlace ( dftSeq - > children ( ) . at ( i - 1 ) ) , tEnable ) ;
if ( i > 0 ) {
builder . addInputArc ( getFailedPlace ( dftSeq - > children ( ) . at ( i - 1 ) ) , tEnable ) ;
}
}
}
template < typename ValueType >
uint64_t DftToGspnTransformator < ValueType > : : addFailedPlace ( std : : shared_ptr < storm : : storage : : DFTElement < ValueType > const > dftElement , storm : : gspn : : LayoutInfo const & layoutInfo , bool initialFailed ) {
uint64_t
DftToGspnTransformator < ValueType > : : addFailedPlace ( std : : shared_ptr < storm : : storage : : DFTElement < ValueType > const > dftElement , storm : : gspn : : LayoutInfo const & layoutInfo ,
bool initialFailed ) {
uint64_t failedPlace = builder . addPlace ( defaultCapacity , initialFailed ? 1 : 0 , dftElement - > name ( ) + STR_FAILED ) ;
assert ( failedPlaces . size ( ) = = dftElement - > id ( ) ) ;
failedPlaces . push_back ( failedPlace ) ;
@ -552,42 +557,44 @@ namespace storm {
template < typename ValueType >
uint64_t DftToGspnTransformator < ValueType > : : addUnavailablePlace ( std : : shared_ptr < storm : : storage : : DFTElement < ValueType > const > dftElement , storm : : gspn : : LayoutInfo const & layoutInfo , bool initialAvailable ) {
uint64_t DftToGspnTransformator < ValueType > : : addUnavailablePlace ( std : : shared_ptr < storm : : storage : : DFTElement < ValueType > const > dftElement ,
storm : : gspn : : LayoutInfo const & layoutInfo , bool initialAvailable ) {
uint64_t unavailablePlace = builder . addPlace ( defaultCapacity , initialAvailable ? 0 : 1 , dftElement - > name ( ) + " _unavail " ) ;
unavailablePlaces . emplace ( dftElement - > id ( ) , unavailablePlace ) ;
builder . setPlaceLayoutInfo ( unavailablePlace , layoutInfo ) ;
return unavailablePlace ;
}
template < typename ValueType >
uint64_t DftToGspnTransformator < ValueType > : : addDisabledPlace ( std : : shared_ptr < const storm : : storage : : DFTBE < ValueType > > dftBe , storm : : gspn : : LayoutInfo const & layoutInfo ) {
uint64_t
DftToGspnTransformator < ValueType > : : addDisabledPlace ( std : : shared_ptr < const storm : : storage : : DFTBE < ValueType > > dftBe , storm : : gspn : : LayoutInfo const & layoutInfo ) {
uint64_t disabledPlace = builder . addPlace ( dftBe - > nrRestrictions ( ) , dftBe - > nrRestrictions ( ) , dftBe - > name ( ) + " _dabled " ) ;
disabledPlaces . emplace ( dftBe - > id ( ) , disabledPlace ) ;
builder . setPlaceLayoutInfo ( disabledPlace , layoutInfo ) ;
return disabledPlace ;
}
template < typename ValueType >
template < typename ValueType >
bool DftToGspnTransformator < ValueType > : : isActiveInitially ( std : : shared_ptr < storm : : storage : : DFTElement < ValueType > const > dftElement ) {
// If element is in the top module, return true.
// If element is in the top module, return true.
return ! mDft . hasRepresentant ( dftElement - > id ( ) ) ;
}
template < typename ValueType >
uint64_t DftToGspnTransformator < ValueType > : : getFailPriority ( std : : shared_ptr < storm : : storage : : DFTElement < ValueType > const > dftElement )
{
}
template < typename ValueType >
uint64_t DftToGspnTransformator < ValueType > : : getFailPriority ( std : : shared_ptr < storm : : storage : : DFTElement < ValueType > const > dftElement ) {
// Temporariliy use one priority for all
return defaultPriority ;
//return mDft.maxRank() - dftElement->rank() + 2;
}
}
// Explicitly instantiate the class.
template class DftToGspnTransformator < double > ;
template
class DftToGspnTransformator < double > ;
# ifdef STORM_HAVE_CARL
# ifdef STORM_HAVE_CARL
// template class DftToGspnTransformator<storm::RationalFunction>;
# endif
# endif
} // namespace dft
} // namespace transformations