|
@ -6,7 +6,7 @@ namespace storm { |
|
|
namespace storage { |
|
|
namespace storage { |
|
|
|
|
|
|
|
|
template<typename ValueType> |
|
|
template<typename ValueType> |
|
|
DFTState<ValueType>::DFTState(DFT<ValueType> const& dft, DFTStateGenerationInfo const& stateGenerationInfo, size_t id) : mStatus(dft.stateBitVectorSize()), mId(id), mPseudoState(false), mDft(dft), mStateGenerationInfo(stateGenerationInfo) { |
|
|
|
|
|
|
|
|
DFTState<ValueType>::DFTState(DFT<ValueType> const& dft, DFTStateGenerationInfo const& stateGenerationInfo, size_t id) : mStatus(dft.stateBitVectorSize()), mId(id), failableElements(dft.nrElements()), mPseudoState(false), mDft(dft), mStateGenerationInfo(stateGenerationInfo) { |
|
|
// TODO Matthias: use construct()
|
|
|
// TODO Matthias: use construct()
|
|
|
|
|
|
|
|
|
// Initialize uses
|
|
|
// Initialize uses
|
|
@ -20,12 +20,14 @@ namespace storm { |
|
|
// Initialize activation
|
|
|
// Initialize activation
|
|
|
propagateActivation(mDft.getTopLevelIndex()); |
|
|
propagateActivation(mDft.getTopLevelIndex()); |
|
|
|
|
|
|
|
|
std::vector<size_t> alwaysActiveBEs = mDft.nonColdBEs(); |
|
|
|
|
|
mCurrentlyFailableBE.insert(mCurrentlyFailableBE.end(), alwaysActiveBEs.begin(), alwaysActiveBEs.end()); |
|
|
|
|
|
|
|
|
// Initialize currently failable BEs
|
|
|
|
|
|
for (size_t id : mDft.nonColdBEs()) { |
|
|
|
|
|
failableElements.addBE(id); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
template<typename ValueType> |
|
|
template<typename ValueType> |
|
|
DFTState<ValueType>::DFTState(storm::storage::BitVector const& status, DFT<ValueType> const& dft, DFTStateGenerationInfo const& stateGenerationInfo, size_t id) : mStatus(status), mId(id), mPseudoState(true), mDft(dft), mStateGenerationInfo(stateGenerationInfo) { |
|
|
|
|
|
|
|
|
DFTState<ValueType>::DFTState(storm::storage::BitVector const& status, DFT<ValueType> const& dft, DFTStateGenerationInfo const& stateGenerationInfo, size_t id) : mStatus(status), mId(id), failableElements(dft.nrElements()), mPseudoState(true), mDft(dft), mStateGenerationInfo(stateGenerationInfo) { |
|
|
// Intentionally left empty
|
|
|
// Intentionally left empty
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -33,8 +35,7 @@ namespace storm { |
|
|
void DFTState<ValueType>::construct() { |
|
|
void DFTState<ValueType>::construct() { |
|
|
STORM_LOG_TRACE("Construct concrete state from pseudo state " << mDft.getStateString(mStatus, mStateGenerationInfo, mId)); |
|
|
STORM_LOG_TRACE("Construct concrete state from pseudo state " << mDft.getStateString(mStatus, mStateGenerationInfo, mId)); |
|
|
// Clear information from pseudo state
|
|
|
// Clear information from pseudo state
|
|
|
mCurrentlyFailableBE.clear(); |
|
|
|
|
|
mFailableDependencies.clear(); |
|
|
|
|
|
|
|
|
failableElements.clear(); |
|
|
mUsedRepresentants.clear(); |
|
|
mUsedRepresentants.clear(); |
|
|
STORM_LOG_ASSERT(mPseudoState, "Only pseudo states can be constructed."); |
|
|
STORM_LOG_ASSERT(mPseudoState, "Only pseudo states can be constructed."); |
|
|
for(size_t index = 0; index < mDft.nrElements(); ++index) { |
|
|
for(size_t index = 0; index < mDft.nrElements(); ++index) { |
|
@ -42,7 +43,7 @@ namespace storm { |
|
|
if (mDft.isBasicElement(index) && isOperational(index)) { |
|
|
if (mDft.isBasicElement(index) && isOperational(index)) { |
|
|
std::shared_ptr<const DFTBE<ValueType>> be = mDft.getBasicElement(index); |
|
|
std::shared_ptr<const DFTBE<ValueType>> be = mDft.getBasicElement(index); |
|
|
if (be->canFail() && (!be->isColdBasicElement() || !mDft.hasRepresentant(index) || isActive(mDft.getRepresentant(index)))) { |
|
|
if (be->canFail() && (!be->isColdBasicElement() || !mDft.hasRepresentant(index) || isActive(mDft.getRepresentant(index)))) { |
|
|
mCurrentlyFailableBE.push_back(index); |
|
|
|
|
|
|
|
|
failableElements.addBE(index); |
|
|
STORM_LOG_TRACE("Currently failable: " << be->toString()); |
|
|
STORM_LOG_TRACE("Currently failable: " << be->toString()); |
|
|
} |
|
|
} |
|
|
} else if (mDft.getElement(index)->isSpareGate()) { |
|
|
} else if (mDft.getElement(index)->isSpareGate()) { |
|
@ -59,7 +60,7 @@ namespace storm { |
|
|
STORM_LOG_ASSERT(dependencyId == dependency->id(), "Ids do not match."); |
|
|
STORM_LOG_ASSERT(dependencyId == dependency->id(), "Ids do not match."); |
|
|
assert(dependency->dependentEvents().size() == 1); |
|
|
assert(dependency->dependentEvents().size() == 1); |
|
|
if (hasFailed(dependency->triggerEvent()->id()) && getElementState(dependency->dependentEvents()[0]->id()) == DFTElementState::Operational) { |
|
|
if (hasFailed(dependency->triggerEvent()->id()) && getElementState(dependency->dependentEvents()[0]->id()) == DFTElementState::Operational) { |
|
|
mFailableDependencies.push_back(dependencyId); |
|
|
|
|
|
|
|
|
failableElements.addDependency(dependencyId); |
|
|
STORM_LOG_TRACE("New dependency failure: " << dependency->toString()); |
|
|
STORM_LOG_TRACE("New dependency failure: " << dependency->toString()); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
@ -185,10 +186,7 @@ namespace storm { |
|
|
|
|
|
|
|
|
template<typename ValueType> |
|
|
template<typename ValueType> |
|
|
void DFTState<ValueType>::beNoLongerFailable(size_t id) { |
|
|
void DFTState<ValueType>::beNoLongerFailable(size_t id) { |
|
|
auto it = std::find(mCurrentlyFailableBE.begin(), mCurrentlyFailableBE.end(), id); |
|
|
|
|
|
if (it != mCurrentlyFailableBE.end()) { |
|
|
|
|
|
mCurrentlyFailableBE.erase(it); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
failableElements.removeBE(id); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
template<typename ValueType> |
|
|
template<typename ValueType> |
|
@ -202,13 +200,11 @@ namespace storm { |
|
|
assert(dependency->dependentEvents().size() == 1); |
|
|
assert(dependency->dependentEvents().size() == 1); |
|
|
if (getElementState(dependency->dependentEvents()[0]->id()) == DFTElementState::Operational) { |
|
|
if (getElementState(dependency->dependentEvents()[0]->id()) == DFTElementState::Operational) { |
|
|
STORM_LOG_ASSERT(!isFailsafe(dependency->dependentEvents()[0]->id()), "Dependent event is failsafe."); |
|
|
STORM_LOG_ASSERT(!isFailsafe(dependency->dependentEvents()[0]->id()), "Dependent event is failsafe."); |
|
|
if (std::find(mFailableDependencies.begin(), mFailableDependencies.end(), dependency->id()) == mFailableDependencies.end()) { |
|
|
|
|
|
mFailableDependencies.push_back(dependency->id()); |
|
|
|
|
|
|
|
|
failableElements.addDependency(dependency->id()); |
|
|
STORM_LOG_TRACE("New dependency failure: " << dependency->toString()); |
|
|
STORM_LOG_TRACE("New dependency failure: " << dependency->toString()); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
return nrFailableDependencies() > 0; |
|
|
|
|
|
|
|
|
return failableElements.hasDependencies(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
template<typename ValueType> |
|
|
template<typename ValueType> |
|
@ -237,43 +233,35 @@ namespace storm { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
template<typename ValueType> |
|
|
template<typename ValueType> |
|
|
ValueType DFTState<ValueType>::getFailableBERate(size_t index) const { |
|
|
|
|
|
STORM_LOG_ASSERT(index < nrFailableBEs(), "Index invalid."); |
|
|
|
|
|
return getBERate(mCurrentlyFailableBE[index]); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
template<typename ValueType> |
|
|
|
|
|
std::pair<std::shared_ptr<DFTBE<ValueType> const>, bool> DFTState<ValueType>::letNextBEFail(size_t index) { |
|
|
|
|
|
|
|
|
std::pair<std::shared_ptr<DFTBE<ValueType> const>, bool> DFTState<ValueType>::letNextBEFail(size_t id) { |
|
|
STORM_LOG_TRACE("currently failable: " << getCurrentlyFailableString()); |
|
|
STORM_LOG_TRACE("currently failable: " << getCurrentlyFailableString()); |
|
|
if (nrFailableDependencies() > 0) { |
|
|
|
|
|
|
|
|
if (failableElements.hasDependencies()) { |
|
|
// Consider failure due to dependency
|
|
|
// Consider failure due to dependency
|
|
|
STORM_LOG_ASSERT(index < nrFailableDependencies(), "Index invalid."); |
|
|
|
|
|
std::shared_ptr<DFTDependency<ValueType> const> dependency = mDft.getDependency(mFailableDependencies[index]); |
|
|
|
|
|
assert(dependency->dependentEvents().size() == 1); |
|
|
|
|
|
|
|
|
std::shared_ptr<DFTDependency<ValueType> const> dependency = mDft.getDependency(id); |
|
|
|
|
|
STORM_LOG_ASSERT(dependency->dependentEvents().size() == 1, "More than one dependent event"); |
|
|
std::pair<std::shared_ptr<DFTBE<ValueType> const>,bool> res(mDft.getBasicElement(dependency->dependentEvents()[0]->id()), true); |
|
|
std::pair<std::shared_ptr<DFTBE<ValueType> const>,bool> res(mDft.getBasicElement(dependency->dependentEvents()[0]->id()), true); |
|
|
STORM_LOG_ASSERT(!hasFailed(res.first->id()), "Element " << res.first->toString() << " has already failed."); |
|
|
STORM_LOG_ASSERT(!hasFailed(res.first->id()), "Element " << res.first->toString() << " has already failed."); |
|
|
mFailableDependencies.erase(mFailableDependencies.begin() + index); |
|
|
|
|
|
|
|
|
failableElements.removeDependency(id); |
|
|
setFailed(res.first->id()); |
|
|
setFailed(res.first->id()); |
|
|
setDependencySuccessful(dependency->id()); |
|
|
setDependencySuccessful(dependency->id()); |
|
|
beNoLongerFailable(res.first->id()); |
|
|
beNoLongerFailable(res.first->id()); |
|
|
return res; |
|
|
return res; |
|
|
} else { |
|
|
} else { |
|
|
// Consider "normal" failure
|
|
|
// Consider "normal" failure
|
|
|
STORM_LOG_ASSERT(index < nrFailableBEs(), "Index invalid."); |
|
|
|
|
|
std::pair<std::shared_ptr<DFTBE<ValueType> const>,bool> res(mDft.getBasicElement(mCurrentlyFailableBE[index]), false); |
|
|
|
|
|
|
|
|
std::pair<std::shared_ptr<DFTBE<ValueType> const>,bool> res(mDft.getBasicElement(id), false); |
|
|
STORM_LOG_ASSERT(!hasFailed(res.first->id()), "Element " << res.first->toString() << " has already failed."); |
|
|
STORM_LOG_ASSERT(!hasFailed(res.first->id()), "Element " << res.first->toString() << " has already failed."); |
|
|
STORM_LOG_ASSERT(res.first->canFail(), "Element " << *(res.first) << " cannot fail."); |
|
|
STORM_LOG_ASSERT(res.first->canFail(), "Element " << *(res.first) << " cannot fail."); |
|
|
mCurrentlyFailableBE.erase(mCurrentlyFailableBE.begin() + index); |
|
|
|
|
|
|
|
|
failableElements.removeBE(id); |
|
|
setFailed(res.first->id()); |
|
|
setFailed(res.first->id()); |
|
|
return res; |
|
|
return res; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
template<typename ValueType> |
|
|
template<typename ValueType> |
|
|
void DFTState<ValueType>::letDependencyBeUnsuccessful(size_t index) { |
|
|
|
|
|
STORM_LOG_ASSERT(nrFailableDependencies() > 0 && index < nrFailableDependencies(), "Index invalid."); |
|
|
|
|
|
std::shared_ptr<DFTDependency<ValueType> const> dependency = mDft.getDependency(getDependencyId(index)); |
|
|
|
|
|
mFailableDependencies.erase(mFailableDependencies.begin() + index); |
|
|
|
|
|
|
|
|
void DFTState<ValueType>::letDependencyBeUnsuccessful(size_t id) { |
|
|
|
|
|
STORM_LOG_ASSERT(failableElements.hasDependencies(), "Index invalid."); |
|
|
|
|
|
std::shared_ptr<DFTDependency<ValueType> const> dependency = mDft.getDependency(id); |
|
|
|
|
|
failableElements.removeDependency(id); |
|
|
setDependencyUnsuccessful(dependency->id()); |
|
|
setDependencyUnsuccessful(dependency->id()); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -299,7 +287,7 @@ namespace storm { |
|
|
std::shared_ptr<const DFTBE<ValueType>> be = mDft.getBasicElement(elem); |
|
|
std::shared_ptr<const DFTBE<ValueType>> be = mDft.getBasicElement(elem); |
|
|
if (be->isColdBasicElement() && be->canFail()) { |
|
|
if (be->isColdBasicElement() && be->canFail()) { |
|
|
// Add to failable BEs
|
|
|
// Add to failable BEs
|
|
|
mCurrentlyFailableBE.push_back(elem); |
|
|
|
|
|
|
|
|
failableElements.addBE(elem); |
|
|
} |
|
|
} |
|
|
} else if (mDft.getElement(elem)->isSpareGate() && !isActive(uses(elem))) { |
|
|
} else if (mDft.getElement(elem)->isSpareGate() && !isActive(uses(elem))) { |
|
|
propagateActivation(uses(elem)); |
|
|
propagateActivation(uses(elem)); |
|
|