19template<
typename ValueType>
21 using DFTElementPointer = std::shared_ptr<DFTElement<ValueType>>;
22 using DFTElementVector = std::vector<DFTElementPointer>;
35 std::shared_ptr<DFTElement<ValueType>>
clone()
const override {
49 return this->
isFDEP() ?
"FDEP" :
"PDEP";
94 STORM_LOG_ASSERT(mDependentEvents.size() > 0,
"Dependent event does not exists.");
95 return mDependentEvents;
103 mDependentEvents.push_back(dependentEvent);
113 std::find_if(this->mDependentEvents.begin(), this->mDependentEvents.end(), [&
id](DFTElementPointer elem) ->
bool { return elem->id() == id; });
114 return it != this->mDependentEvents.end();
134 std::set<size_t> unit = {this->
mId};
135 for (
auto const& depEv : mDependentEvents) {
136 depEv->extendUnit(unit);
137 if (unit.count(mTriggerEvent->id()) != 0) {
141 return std::vector<size_t>(unit.begin(), unit.end());
144 void extendSubDft(std::set<size_t>& elemsInSubtree, std::vector<size_t>
const& parentsOfSubRoot,
bool blockParents,
bool sparesAsLeaves)
const override {
145 if (elemsInSubtree.count(this->id())) {
149 if (elemsInSubtree.empty()) {
153 for (
auto const& depEv : mDependentEvents) {
154 depEv->extendSubDft(elemsInSubtree, parentsOfSubRoot, blockParents, sparesAsLeaves);
155 if (elemsInSubtree.empty()) {
159 if (elemsInSubtree.empty()) {
163 mTriggerEvent->extendSubDft(elemsInSubtree, parentsOfSubRoot, blockParents, sparesAsLeaves);
167 std::stringstream stream;
170 stream << depEv->name() <<
" ";
174 stream <<
" with probability " << this->
probability();
180 ValueType mProbability;
181 DFTElementPointer mTriggerEvent;
182 DFTElementVector mDependentEvents;
Dependency gate with probability p.
bool isDependency() const override
Check whether the element is a dependency.
std::string toString() const override
Print information about element to string.
std::shared_ptr< DFTElement< ValueType > > clone() const override
Create a shallow copy of the element.
DFTElementVector const & dependentEvents() const
Get dependent events.
bool isTypeEqualTo(DFTElement< ValueType > const &other) const override
Check whether two elements have the same type.
void extendSubDft(std::set< size_t > &elemsInSubtree, std::vector< size_t > const &parentsOfSubRoot, bool blockParents, bool sparesAsLeaves) const override
Helper to the independent subtree computation.
virtual ~DFTDependency()=default
Destructor.
void setTriggerElement(DFTElementPointer const &triggerEvent)
Set the trigger event, i.e., the first child.
DFTElementPointer const & triggerEvent() const
Get trigger event, i.e., the first child.
ValueType const & probability() const
Get probability of forwarding the failure.
void extendSpareModule(std::set< size_t > &) const override
bool containsDependentEvent(size_t id)
Check whether the given element is a dependent event.
DFTDependency(size_t id, std::string const &name, ValueType probability)
Constructor.
virtual size_t nrChildren() const override
Get number of children.
bool isFDEP() const
Check whether the dependency is an FDEP, i.e., p=1.
std::string typestring() const override
Get type as string.
std::vector< size_t > independentUnit() const override
Computes the independent unit of this element, that is, all elements which are direct or indirect suc...
void addDependentEvent(DFTElementPointer const &dependentEvent)
Add dependent event.
storm::dft::storage::elements::DFTElementType type() const override
Get type.
Abstract base class for DFT elements.
virtual size_t id() const
Get id.
virtual std::string const & name() const
Get name.
virtual void extendSubDft(std::set< size_t > &elemsInSubtree, std::vector< size_t > const &parentsOfSubRoot, bool blockParents, bool sparesAsLeaves) const
Helper to the independent subtree computation.
#define STORM_LOG_ASSERT(cond, message)
DFTElementType
Element types in a DFT.
bool isOne(ValueType const &a)