28 changed files with 635 additions and 385 deletions
-
22src/storm-dft/builder/DFTBuilder.cpp
-
4src/storm-dft/builder/DFTBuilder.h
-
26src/storm-dft/builder/ExplicitDFTModelBuilder.cpp
-
16src/storm-dft/generator/DftNextStateGenerator.cpp
-
8src/storm-dft/modelchecker/dft/DFTASFChecker.cpp
-
25src/storm-dft/parser/DFTJsonParser.cpp
-
25src/storm-dft/storage/dft/DFT.cpp
-
21src/storm-dft/storage/dft/DFT.h
-
70src/storm-dft/storage/dft/DFTElementType.h
-
3src/storm-dft/storage/dft/DFTElements.h
-
83src/storm-dft/storage/dft/DFTIsomorphism.h
-
58src/storm-dft/storage/dft/DFTState.cpp
-
34src/storm-dft/storage/dft/DftJsonExporter.cpp
-
61src/storm-dft/storage/dft/elements/BEConst.h
-
103src/storm-dft/storage/dft/elements/BEExponential.h
-
6src/storm-dft/storage/dft/elements/DFTAnd.h
-
143src/storm-dft/storage/dft/elements/DFTBE.h
-
58src/storm-dft/storage/dft/elements/DFTConst.h
-
10src/storm-dft/storage/dft/elements/DFTDependency.h
-
112src/storm-dft/storage/dft/elements/DFTElement.h
-
4src/storm-dft/storage/dft/elements/DFTOr.h
-
5src/storm-dft/storage/dft/elements/DFTPand.h
-
5src/storm-dft/storage/dft/elements/DFTPor.h
-
30src/storm-dft/storage/dft/elements/DFTRestriction.h
-
1src/storm-dft/storage/dft/elements/DFTSpare.h
-
5src/storm-dft/storage/dft/elements/DFTVot.h
-
63src/storm-dft/transformations/DftToGspnTransformator.cpp
-
19src/storm-dft/transformations/DftToGspnTransformator.h
@ -0,0 +1,61 @@ |
|||
#pragma once |
|||
|
|||
#include "DFTBE.h" |
|||
|
|||
namespace storm { |
|||
namespace storage { |
|||
|
|||
/*! |
|||
* BE which is either constant failed or constant failsafe. |
|||
*/ |
|||
template<typename ValueType> |
|||
class BEConst : public DFTBE<ValueType> { |
|||
|
|||
public: |
|||
/*! |
|||
* Constructor. |
|||
* @param id Id. |
|||
* @param name Name. |
|||
* @param failed True iff the const BE is failed, otherwise it is failsafe. |
|||
*/ |
|||
BEConst(size_t id, std::string const& name, bool failed) : DFTBE<ValueType>(id, name), mFailed(failed) { |
|||
// Intentionally empty |
|||
} |
|||
|
|||
DFTElementType type() const override { |
|||
return DFTElementType::BE_CONST; |
|||
} |
|||
|
|||
/*! |
|||
* Return whether the BE has failed. |
|||
* @return True iff the BE is const failed. |
|||
*/ |
|||
bool failed() const { |
|||
return mFailed; |
|||
} |
|||
|
|||
bool canFail() const override { |
|||
return this->failed(); |
|||
} |
|||
|
|||
bool isTypeEqualTo(DFTElement <ValueType> const& other) const override { |
|||
if (!DFTElement<ValueType>::isTypeEqualTo(other)) { |
|||
return false; |
|||
} |
|||
auto& otherBE = static_cast<BEConst<ValueType> const&>(other); |
|||
return this->failed() == otherBE.failed(); |
|||
} |
|||
|
|||
std::string toString() const override { |
|||
std::stringstream stream; |
|||
stream << "{" << this->name() << "} BE(const " << (this->failed() ? "failed" : "failsafe") << ")"; |
|||
return stream.str(); |
|||
} |
|||
|
|||
private: |
|||
bool mFailed; |
|||
|
|||
}; |
|||
|
|||
} |
|||
} |
@ -0,0 +1,103 @@ |
|||
#pragma once |
|||
|
|||
#include "DFTBE.h" |
|||
|
|||
namespace storm { |
|||
namespace storage { |
|||
|
|||
/*! |
|||
* BE with exponential failure rate. |
|||
*/ |
|||
template<typename ValueType> |
|||
class BEExponential : public DFTBE<ValueType> { |
|||
|
|||
public: |
|||
/*! |
|||
* Constructor. |
|||
* @param id Id. |
|||
* @param name Name. |
|||
* @param failureRate Active failure rate. |
|||
* @param dormancyFactor Dormancy factor. |
|||
* @param transient True iff the BE experiences transient failures. |
|||
*/ |
|||
BEExponential(size_t id, std::string const& name, ValueType failureRate, ValueType dormancyFactor, bool transient = false) : |
|||
DFTBE<ValueType>(id, name), mActiveFailureRate(failureRate), mPassiveFailureRate(dormancyFactor * failureRate), mTransient(transient) { |
|||
STORM_LOG_ASSERT(!storm::utility::isZero<ValueType>(failureRate), "Exponential failure rate should not be zero."); |
|||
} |
|||
|
|||
DFTElementType type() const override { |
|||
return DFTElementType::BE_EXP; |
|||
} |
|||
|
|||
/*! |
|||
* Return failure rate in active state. |
|||
* @return Active failure rate. |
|||
*/ |
|||
ValueType const& activeFailureRate() const { |
|||
return mActiveFailureRate; |
|||
} |
|||
|
|||
/*! |
|||
* Return failure rate in passive state. |
|||
* @return Passive failure rate. |
|||
*/ |
|||
ValueType const& passiveFailureRate() const { |
|||
return mPassiveFailureRate; |
|||
} |
|||
|
|||
/*! |
|||
* Return dormancy factor given by passive_failure_rate/active_failure_rate. |
|||
* @return Dormancy factor. |
|||
*/ |
|||
ValueType dormancyFactor() const { |
|||
if (storm::utility::isZero<ValueType>(this->activeFailureRate())) { |
|||
// Return default value of 1 |
|||
return storm::utility::one<ValueType>(); |
|||
} else { |
|||
return this->passiveFailureRate() / this->activeFailureRate(); |
|||
} |
|||
} |
|||
|
|||
/*! |
|||
* Return whether the BE experiences transient failures. |
|||
* @return True iff BE is transient. |
|||
*/ |
|||
bool isTransient() const { |
|||
return mTransient; |
|||
} |
|||
|
|||
bool canFail() const override { |
|||
return !storm::utility::isZero(this->activeFailureRate()); |
|||
} |
|||
|
|||
/*! |
|||
* Return whether the BE is a cold BE, i.e., passive failure rate = 0. |
|||
* @return True iff BE is cold BE. |
|||
*/ |
|||
bool isColdBasicElement() const { |
|||
return storm::utility::isZero(this->passiveFailureRate()); |
|||
} |
|||
|
|||
bool isTypeEqualTo(DFTElement <ValueType> const& other) const override { |
|||
if (!DFTElement<ValueType>::isTypeEqualTo(other)) { |
|||
return false; |
|||
} |
|||
auto& otherBE = static_cast<BEExponential<ValueType> const&>(other); |
|||
return (this->activeFailureRate() == otherBE.activeFailureRate()) && (this->passiveFailureRate() == otherBE.passiveFailureRate()); |
|||
} |
|||
|
|||
std::string toString() const override { |
|||
std::stringstream stream; |
|||
stream << "{" << this->name() << "} BE exp(" << this->activeFailureRate() << ", " << this->passiveFailureRate() << ")"; |
|||
return stream.str(); |
|||
} |
|||
|
|||
private: |
|||
ValueType mActiveFailureRate; |
|||
ValueType mPassiveFailureRate; |
|||
bool mTransient; |
|||
|
|||
}; |
|||
|
|||
} |
|||
} |
@ -1,131 +1,98 @@ |
|||
#pragma once |
|||
|
|||
#include "DFTElement.h" |
|||
|
|||
namespace storm { |
|||
namespace storage { |
|||
|
|||
/*! |
|||
* Abstract base class for basic elements (BEs) in DFTs. |
|||
*/ |
|||
template<typename ValueType> |
|||
class DFTBE : public DFTElement<ValueType> { |
|||
|
|||
using DFTDependencyPointer = std::shared_ptr<DFTDependency<ValueType>>; |
|||
using DFTDependencyVector = std::vector<DFTDependencyPointer>; |
|||
|
|||
protected: |
|||
ValueType mActiveFailureRate; |
|||
ValueType mPassiveFailureRate; |
|||
DFTDependencyVector mIngoingDependencies; |
|||
bool mTransient; |
|||
|
|||
public: |
|||
DFTBE(size_t id, std::string const& name, ValueType failureRate, ValueType dormancyFactor, bool transient = false) : |
|||
DFTElement<ValueType>(id, name), mActiveFailureRate(failureRate), mPassiveFailureRate(dormancyFactor * failureRate), mTransient(transient) |
|||
{} |
|||
|
|||
DFTElementType type() const override { |
|||
return DFTElementType::BE; |
|||
/*! |
|||
* Constructor. |
|||
* @param id Id. |
|||
* @param name Name. |
|||
*/ |
|||
DFTBE(size_t id, std::string const& name) : DFTElement<ValueType>(id, name) { |
|||
// Intentionally empty |
|||
} |
|||
|
|||
virtual size_t nrChildren() const override { |
|||
size_t nrChildren() const override { |
|||
return 0; |
|||
} |
|||
|
|||
ValueType const& activeFailureRate() const { |
|||
return mActiveFailureRate; |
|||
} |
|||
|
|||
ValueType const& passiveFailureRate() const { |
|||
return mPassiveFailureRate; |
|||
} |
|||
|
|||
ValueType dormancyFactor() const { |
|||
if (storm::utility::isZero<ValueType>(this->activeFailureRate())) { |
|||
// Return default value of 0 |
|||
return storm::utility::zero<ValueType>(); |
|||
} else { |
|||
return this->passiveFailureRate() / this->activeFailureRate(); |
|||
} |
|||
} |
|||
/*! |
|||
* Return whether the BE can fail. |
|||
* @return True iff BE is not failsafe. |
|||
*/ |
|||
virtual bool canFail() const = 0; |
|||
|
|||
bool isTransient() const { |
|||
return mTransient; |
|||
} |
|||
|
|||
bool canFail() const { |
|||
return !storm::utility::isZero(mActiveFailureRate); |
|||
} |
|||
|
|||
bool addIngoingDependency(DFTDependencyPointer const& e) { |
|||
// TODO write this assertion for n-ary dependencies, probably by addign a method to the dependencies to support this. |
|||
/*! |
|||
* Add dependency which can trigger this BE. |
|||
* @param dependency Ingoing dependency. |
|||
*/ |
|||
void addIngoingDependency(std::shared_ptr<DFTDependency<ValueType>> const& dependency) { |
|||
// TODO write this assertion for n-ary dependencies, probably by adding a method to the dependencies to support this. |
|||
//STORM_LOG_ASSERT(e->dependentEvent()->id() == this->id(), "Ids do not match."); |
|||
if(std::find(mIngoingDependencies.begin(), mIngoingDependencies.end(), e) != mIngoingDependencies.end()) { |
|||
return false; |
|||
} |
|||
else |
|||
{ |
|||
mIngoingDependencies.push_back(e); |
|||
return true; |
|||
} |
|||
STORM_LOG_ASSERT(std::find(mIngoingDependencies.begin(), mIngoingDependencies.end(), dependency) == mIngoingDependencies.end(), |
|||
"Ingoing Dependency " << dependency << " already present."); |
|||
mIngoingDependencies.push_back(dependency); |
|||
} |
|||
|
|||
|
|||
/*! |
|||
* Return whether the BE has ingoing dependencies. |
|||
* @return True iff BE can be triggered by dependencies. |
|||
*/ |
|||
bool hasIngoingDependencies() const { |
|||
return !mIngoingDependencies.empty(); |
|||
} |
|||
|
|||
size_t nrIngoingDependencies() const { |
|||
return mIngoingDependencies.size(); |
|||
} |
|||
|
|||
DFTDependencyVector const& ingoingDependencies() const { |
|||
|
|||
/*! |
|||
* Return ingoing dependencies. |
|||
* @return List of dependencies which can trigger this BE. |
|||
*/ |
|||
std::vector<std::shared_ptr<DFTDependency<ValueType>>> const& ingoingDependencies() const { |
|||
return mIngoingDependencies; |
|||
} |
|||
|
|||
std::string toString() const override { |
|||
std::stringstream stream; |
|||
stream << *this; |
|||
return stream.str(); |
|||
} |
|||
|
|||
|
|||
bool isBasicElement() const override { |
|||
return true; |
|||
} |
|||
|
|||
bool isColdBasicElement() const { |
|||
return storm::utility::isZero(mPassiveFailureRate); |
|||
} |
|||
|
|||
virtual void extendSubDft(std::set<size_t>& elemsInSubtree, std::vector<size_t> const& parentsOfSubRoot, bool blockParents, bool sparesAsLeaves) const override { |
|||
if(elemsInSubtree.count(this->id())) { |
|||
|
|||
void extendSubDft(std::set<size_t>& elemsInSubtree, std::vector<size_t> const& parentsOfSubRoot, bool blockParents, bool sparesAsLeaves) const override { |
|||
if (elemsInSubtree.count(this->id())) { |
|||
return; |
|||
} |
|||
DFTElement<ValueType>::extendSubDft(elemsInSubtree, parentsOfSubRoot, blockParents, sparesAsLeaves); |
|||
if(elemsInSubtree.empty()) { |
|||
if (elemsInSubtree.empty()) { |
|||
// Parent in the subdft, ie it is *not* a subdft |
|||
return; |
|||
} |
|||
for(auto const& incDep : mIngoingDependencies) { |
|||
for (auto const& incDep : ingoingDependencies()) { |
|||
incDep->extendSubDft(elemsInSubtree, parentsOfSubRoot, blockParents, sparesAsLeaves); |
|||
if(elemsInSubtree.empty()) { |
|||
if (elemsInSubtree.empty()) { |
|||
// Parent in the subdft, ie it is *not* a subdft |
|||
return; |
|||
} |
|||
} |
|||
} |
|||
|
|||
bool isTypeEqualTo(DFTElement<ValueType> const& other) const override { |
|||
if(!DFTElement<ValueType>::isTypeEqualTo(other)) return false; |
|||
DFTBE<ValueType> const& otherBE = static_cast<DFTBE<ValueType> const&>(other); |
|||
return (mActiveFailureRate == otherBE.mActiveFailureRate) && (mPassiveFailureRate == otherBE.mPassiveFailureRate); |
|||
} |
|||
|
|||
virtual bool checkDontCareAnymore(storm::storage::DFTState<ValueType>& state, DFTStateSpaceGenerationQueues<ValueType>& queues) const override { |
|||
if(DFTElement<ValueType>::checkDontCareAnymore(state, queues)) { |
|||
state.beNoLongerFailable(this->mId); |
|||
|
|||
bool checkDontCareAnymore(storm::storage::DFTState<ValueType>& state, DFTStateSpaceGenerationQueues <ValueType>& queues) const override { |
|||
if (DFTElement<ValueType>::checkDontCareAnymore(state, queues)) { |
|||
state.beNoLongerFailable(this->id()); |
|||
return true; |
|||
} |
|||
return false; |
|||
} |
|||
|
|||
private: |
|||
std::vector<std::shared_ptr<DFTDependency<ValueType>>> mIngoingDependencies; |
|||
|
|||
}; |
|||
|
|||
template<typename ValueType> |
|||
inline std::ostream& operator<<(std::ostream& os, DFTBE<ValueType> const& be) { |
|||
return os << "{" << be.name() << "} BE(" << be.activeFailureRate() << ", " << be.passiveFailureRate() << ")"; |
|||
} |
|||
} |
|||
} |
@ -1,58 +0,0 @@ |
|||
#pragma once |
|||
|
|||
|
|||
#include "DFTElement.h" |
|||
namespace storm { |
|||
namespace storage { |
|||
template<typename ValueType> |
|||
class DFTConst : public DFTElement<ValueType> { |
|||
|
|||
bool mFailed; |
|||
|
|||
public: |
|||
DFTConst(size_t id, std::string const& name, bool failed) : |
|||
DFTElement<ValueType>(id, name), mFailed(failed) |
|||
{} |
|||
|
|||
DFTElementType type() const override { |
|||
if(mFailed) { |
|||
return DFTElementType::CONSTF; |
|||
} else { |
|||
return DFTElementType::CONSTS; |
|||
} |
|||
} |
|||
|
|||
|
|||
bool failed() const { |
|||
return mFailed; |
|||
} |
|||
|
|||
virtual bool isConstant() const override { |
|||
return true; |
|||
} |
|||
|
|||
virtual size_t nrChildren() const override { |
|||
return 0; |
|||
} |
|||
|
|||
std::string toString() const override { |
|||
std::stringstream stream; |
|||
stream << *this; |
|||
return stream.str(); |
|||
} |
|||
|
|||
bool isTypeEqualTo(DFTElement<ValueType> const& other) const override { |
|||
if(!DFTElement<ValueType>::isTypeEqualTo(other)) return false; |
|||
DFTConst<ValueType> const& otherCNST = static_cast<DFTConst<ValueType> const&>(other); |
|||
return (mFailed == otherCNST.mFailed); |
|||
} |
|||
|
|||
}; |
|||
|
|||
template<typename ValueType> |
|||
inline std::ostream& operator<<(std::ostream& os, DFTConst<ValueType> const& be) { |
|||
return os << "{" << be.name() << "} BE(const " << (be.failed() ? "failed" : "failsafe") << ")"; |
|||
} |
|||
|
|||
} |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue