|
|
@ -13,11 +13,113 @@ namespace storm { |
|
|
|
template <typename ValueType> |
|
|
|
void DftToGspnTransformator<ValueType>::transform() { |
|
|
|
mGspn = storm::gspn::GSPN(); |
|
|
|
mGspn.setName("DftToGspnTransformation"); |
|
|
|
|
|
|
|
// For debugging purposes
|
|
|
|
writeGspn(false); |
|
|
|
/*
|
|
|
|
// Testing place.
|
|
|
|
storm::gspn::Place place; |
|
|
|
place.setName("Left"); |
|
|
|
place.setID(0); |
|
|
|
place.setNumberOfInitialTokens(2); |
|
|
|
mGspn.addPlace(place); |
|
|
|
|
|
|
|
STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "The transformation to GSPN is not yet implemented."); |
|
|
|
storm::gspn::Place place2; |
|
|
|
place2.setName("Right"); |
|
|
|
place2.setID(1); |
|
|
|
place2.setNumberOfInitialTokens(0); |
|
|
|
mGspn.addPlace(place2); |
|
|
|
|
|
|
|
// Testing transition.
|
|
|
|
storm::gspn::ImmediateTransition<storm::gspn::GSPN::WeightType> immediateTransition; |
|
|
|
immediateTransition.setName("ImmediateTransition"); |
|
|
|
immediateTransition.setPriority(2); |
|
|
|
immediateTransition.setWeight(0.0); |
|
|
|
immediateTransition.setInputArcMultiplicity(place, 1); |
|
|
|
immediateTransition.setOutputArcMultiplicity(place2, 1); |
|
|
|
mGspn.addImmediateTransition(immediateTransition); |
|
|
|
|
|
|
|
storm::gspn::TimedTransition<double> timedTransition; |
|
|
|
timedTransition.setName("TimedTransition"); |
|
|
|
timedTransition.setPriority(1); |
|
|
|
timedTransition.setRate(0.3); |
|
|
|
timedTransition.setInhibitionArcMultiplicity(place2, 1); |
|
|
|
timedTransition.setOutputArcMultiplicity(place, 1); |
|
|
|
mGspn.addTimedTransition(timedTransition); |
|
|
|
|
|
|
|
// Testing DFT.
|
|
|
|
std::cout << "-------------------------------------------------------------------------" << std::endl; |
|
|
|
std::cout << "Number of elements in DFT: " << mDft.nrElements() << std::endl; |
|
|
|
std::cout << "Number of basic elements in DFT: " << mDft.nrBasicElements() << std::endl; |
|
|
|
std::cout << "Toplevel index of DFT: " << mDft.getTopLevelIndex() << std::endl; |
|
|
|
|
|
|
|
for (std::size_t i = 0; i < mDft.nrElements(); i++) { |
|
|
|
auto dftElement = mDft.getElement(i); |
|
|
|
std::cout << "Index: " << i |
|
|
|
<< " Gate: " << dftElement->isGate() |
|
|
|
<< " Dependency: " << dftElement->isDependency() |
|
|
|
<< " Restriction: " << dftElement->isRestriction() |
|
|
|
<< " String: " << dftElement->toString() |
|
|
|
<< " Name: " << dftElement->name() << std::endl; |
|
|
|
|
|
|
|
auto parents = dftElement->parentIds(); |
|
|
|
for (std::size_t j = 0; j < parents.size(); j++) { |
|
|
|
std::cout << "Parents of " << j << ": " << parents[j] << std::endl; |
|
|
|
} |
|
|
|
} |
|
|
|
std::cout << "-------------------------------------------------------------------------" << std::endl; |
|
|
|
*/ |
|
|
|
|
|
|
|
// Loop through every DFT element and draw them as a GSPN.
|
|
|
|
for (std::size_t i = 0; i < mDft.nrElements(); i++) { |
|
|
|
auto dftElement = mDft.getElement(i); |
|
|
|
|
|
|
|
// Check which type the element is and call the corresponding drawing-function.
|
|
|
|
switch (dftElement->type()) { |
|
|
|
case storm::storage::DFTElementType::AND: |
|
|
|
drawAND(dftElement->name()); |
|
|
|
break; |
|
|
|
case storm::storage::DFTElementType::OR: |
|
|
|
drawOR(dftElement->name(), 2); // TODO: set parameters correctly.
|
|
|
|
break; |
|
|
|
case storm::storage::DFTElementType::VOT: |
|
|
|
STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "The transformation of a VOT is not yet implemented."); |
|
|
|
break; |
|
|
|
case storm::storage::DFTElementType::PAND: |
|
|
|
STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "The transformation of a PAND is not yet implemented."); |
|
|
|
break; |
|
|
|
case storm::storage::DFTElementType::SPARE: |
|
|
|
STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "The transformation of a SPARE is not yet implemented."); |
|
|
|
break; |
|
|
|
case storm::storage::DFTElementType::POR: |
|
|
|
STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "The transformation of a POR is not yet implemented."); |
|
|
|
break; |
|
|
|
case storm::storage::DFTElementType::SEQ: |
|
|
|
STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "The transformation of a SEQ is not yet implemented."); |
|
|
|
break; |
|
|
|
case storm::storage::DFTElementType::MUTEX: |
|
|
|
STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "The transformation of a MUTEX is not yet implemented."); |
|
|
|
break; |
|
|
|
case storm::storage::DFTElementType::BE: |
|
|
|
drawBE(dftElement->name(), true, 0.5, 0.25); // TODO: set parameters correctly.
|
|
|
|
break; |
|
|
|
case storm::storage::DFTElementType::CONSTF: |
|
|
|
STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "The transformation of a CONSTF is not yet implemented."); |
|
|
|
break; |
|
|
|
case storm::storage::DFTElementType::CONSTS: |
|
|
|
STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "The transformation of a CONSTS is not yet implemented."); |
|
|
|
break; |
|
|
|
case storm::storage::DFTElementType::PDEP: |
|
|
|
STORM_LOG_THROW(false, storm::exceptions::NotImplementedException, "The transformation of a PDEP is not yet implemented."); |
|
|
|
break; |
|
|
|
default: |
|
|
|
STORM_LOG_ASSERT(false, "DFT type unknown."); |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Output.
|
|
|
|
writeGspn(true); |
|
|
|
writeGspn(false); |
|
|
|
} |
|
|
|
|
|
|
|
template <typename ValueType> |
|
|
@ -34,6 +136,72 @@ namespace storm { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
template <typename ValueType> |
|
|
|
void DftToGspnTransformator<ValueType>::drawBE(std::string name, bool activated, double activeFailureRate, double passiveFailureRate) { |
|
|
|
storm::gspn::Place placeBEActivated; |
|
|
|
placeBEActivated.setName(name + "_activated"); |
|
|
|
placeBEActivated.setNumberOfInitialTokens(activated ? 1 : 0); |
|
|
|
mGspn.addPlace(placeBEActivated); |
|
|
|
|
|
|
|
storm::gspn::Place placeBEFailed; |
|
|
|
placeBEFailed.setName(name + "_failed"); |
|
|
|
placeBEFailed.setNumberOfInitialTokens(0); |
|
|
|
mGspn.addPlace(placeBEFailed); |
|
|
|
|
|
|
|
storm::gspn::TimedTransition<double> timedTransitionActiveFailure; |
|
|
|
timedTransitionActiveFailure.setName(name + "_activeFailure"); |
|
|
|
timedTransitionActiveFailure.setPriority(1); |
|
|
|
timedTransitionActiveFailure.setRate(activeFailureRate); |
|
|
|
timedTransitionActiveFailure.setInputArcMultiplicity(placeBEActivated, 1); |
|
|
|
timedTransitionActiveFailure.setInhibitionArcMultiplicity(placeBEFailed, 1); |
|
|
|
timedTransitionActiveFailure.setOutputArcMultiplicity(placeBEActivated, 1); |
|
|
|
timedTransitionActiveFailure.setOutputArcMultiplicity(placeBEFailed, 1); |
|
|
|
mGspn.addTimedTransition(timedTransitionActiveFailure); |
|
|
|
|
|
|
|
storm::gspn::TimedTransition<double> timedTransitionPassiveFailure; |
|
|
|
timedTransitionPassiveFailure.setName(name + "_passiveFailure"); |
|
|
|
timedTransitionPassiveFailure.setPriority(1); |
|
|
|
timedTransitionPassiveFailure.setRate(passiveFailureRate); |
|
|
|
timedTransitionPassiveFailure.setInhibitionArcMultiplicity(placeBEActivated, 1); |
|
|
|
timedTransitionPassiveFailure.setInhibitionArcMultiplicity(placeBEFailed, 1); |
|
|
|
timedTransitionPassiveFailure.setOutputArcMultiplicity(placeBEFailed, 1); |
|
|
|
mGspn.addTimedTransition(timedTransitionPassiveFailure); |
|
|
|
} |
|
|
|
|
|
|
|
template <typename ValueType> |
|
|
|
void DftToGspnTransformator<ValueType>::drawAND(std::string name) { |
|
|
|
storm::gspn::Place placeANDFailed; |
|
|
|
placeANDFailed.setName(name + "_failed"); |
|
|
|
placeANDFailed.setNumberOfInitialTokens(0); |
|
|
|
mGspn.addPlace(placeANDFailed); |
|
|
|
|
|
|
|
storm::gspn::ImmediateTransition<storm::gspn::GSPN::WeightType> immediateTransitionANDFailing; |
|
|
|
immediateTransitionANDFailing.setName(name + "_failing"); |
|
|
|
immediateTransitionANDFailing.setPriority(1); |
|
|
|
immediateTransitionANDFailing.setWeight(0.0); |
|
|
|
immediateTransitionANDFailing.setInhibitionArcMultiplicity(placeANDFailed, 1); |
|
|
|
immediateTransitionANDFailing.setOutputArcMultiplicity(placeANDFailed, 1); |
|
|
|
mGspn.addImmediateTransition(immediateTransitionANDFailing); |
|
|
|
} |
|
|
|
|
|
|
|
template <typename ValueType> |
|
|
|
void DftToGspnTransformator<ValueType>::drawOR(std::string name, std::size_t numberOfChildren) { |
|
|
|
storm::gspn::Place placeORFailed; |
|
|
|
placeORFailed.setName(name + "_failed"); |
|
|
|
placeORFailed.setNumberOfInitialTokens(0); |
|
|
|
mGspn.addPlace(placeORFailed); |
|
|
|
|
|
|
|
for (std::size_t i = 0; i < numberOfChildren; i++) { |
|
|
|
storm::gspn::ImmediateTransition<storm::gspn::GSPN::WeightType> immediateTransitionORFailing; |
|
|
|
immediateTransitionORFailing.setName(name + std::to_string((int)i) + "_failing"); |
|
|
|
immediateTransitionORFailing.setPriority(1); |
|
|
|
immediateTransitionORFailing.setWeight(0.0); |
|
|
|
immediateTransitionORFailing.setInhibitionArcMultiplicity(placeORFailed, 1); |
|
|
|
immediateTransitionORFailing.setOutputArcMultiplicity(placeORFailed, 1); |
|
|
|
mGspn.addImmediateTransition(immediateTransitionORFailing); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Explicitly instantiate the class.
|
|
|
|
template class DftToGspnTransformator<double>; |
|
|
|
|
|
|
|