#pragma once #include "DFTGate.h" namespace storm { namespace storage { template class DFTPor : public DFTGate { public: DFTPor(size_t id, std::string const& name, std::vector>> const& children = {}) : DFTGate(id, name, children) {} void checkFails(storm::storage::DFTState& state, DFTStateSpaceGenerationQueues& queues) const override { if(state.isOperational(this->mId)) { if (state.hasFailed(this->mChildren.front()->id())) { // First child has failed before others this->fail(state, queues); } else { for (size_t i = 1; i < this->nrChildren(); ++i) { if (state.hasFailed(this->mChildren[i]->id())) { // Child has failed before first child this->failsafe(state, queues); this->childrenDontCare(state, queues); } } } } } void checkFailsafe(storm::storage::DFTState& state, DFTStateSpaceGenerationQueues& queues) const override { if (state.isFailsafe(this->mChildren.front()->id())) { this->failsafe(state, queues); this->childrenDontCare(state, queues); } } virtual DFTElementType type() const override { return DFTElementType::POR; } std::string typestring() const override { return "POR"; } }; template inline std::ostream& operator<<(std::ostream& os, DFTPor const& gate) { return os << gate.toString(); } } }