9namespace transformations {
11template<
typename ValueType>
15 size_t noConstFailed = 0;
16 for (
size_t i = 0; i < dft.
nrElements(); ++i) {
17 std::shared_ptr<storm::dft::storage::elements::DFTElement<ValueType>
const> element = dft.
getElement(i);
18 if (element->isBasicElement()) {
19 auto be = std::static_pointer_cast<storm::dft::storage::elements::DFTBE<ValueType>
const>(element);
21 auto beConst = std::static_pointer_cast<storm::dft::storage::elements::BEConst<ValueType>
const>(be);
22 if (beConst->canFail()) {
24 if (noConstFailed > 1) {
30 if (noConstFailed > 1) {
39template<
typename ValueType>
42 std::vector<std::string> failedBEs;
44 for (
size_t i = 0; i < dft.
nrElements(); ++i) {
45 std::shared_ptr<storm::dft::storage::elements::DFTElement<ValueType>
const> element = dft.
getElement(i);
46 switch (element->type()) {
48 auto be = std::static_pointer_cast<storm::dft::storage::elements::DFTBE<ValueType>
const>(element);
49 switch (be->beType()) {
52 auto beConst = std::static_pointer_cast<storm::dft::storage::elements::BEConst<ValueType>
const>(be);
53 if (beConst->canFail()) {
55 failedBEs.push_back(beConst->name());
63 "BE with constant probability distribution are not supported and need to be transformed before.");
82 if (!failedBEs.empty()) {
83 STORM_LOG_TRACE(
"Add unique constant failed BE 'Unique_Constant_Failure'");
85 failedBEs.insert(failedBEs.begin(),
"Unique_Constant_Failure");
87 builder.
addPdep(
"Failure_Trigger", failedBEs, storm::utility::one<ValueType>());
91 return std::make_shared<storm::dft::storage::DFT<ValueType>>(builder.
build());
94template<
typename ValueType>
100 if (dft.
getDependency(dependencyId)->dependentEvents().size() > 1) {
107template<
typename ValueType>
111 for (
size_t i = 0; i < dft.
nrElements(); ++i) {
112 std::shared_ptr<storm::dft::storage::elements::DFTElement<ValueType>
const> element = dft.
getElement(i);
113 switch (element->type()) {
115 auto dep = std::static_pointer_cast<storm::dft::storage::elements::DFTDependency<ValueType>
const>(element);
116 if (dep->dependentEvents().size() == 1) {
124 std::string nameAdditional = dep->name() +
"_additional";
129 builder.
addPdep(dep->name() +
"_pdep", {dep->triggerEvent()->name(), nameAdditional}, dep->probability());
131 for (
size_t j = 0; j < dep->dependentEvents().size(); ++j) {
132 std::string nameDep = dep->name() +
"_" + std::to_string(j);
133 std::string dependentName = dep->dependentEvents()[j]->name();
135 builder.
addPdep(nameDep, {nameAdditional, dependentName}, storm::utility::one<ValueType>());
140 for (
size_t j = 0; j < dep->dependentEvents().size(); ++j) {
141 std::string nameDep = dep->name() +
"_" + std::to_string(j);
142 std::string dependentName = dep->dependentEvents()[j]->name();
144 builder.
addPdep(nameDep, {dep->triggerEvent()->name(), dependentName}, storm::utility::one<ValueType>());
158 return std::make_shared<storm::dft::storage::DFT<ValueType>>(builder.
build());
161template<
typename ValueType>
163 for (
size_t i = 0; i < dft.
nrElements(); ++i) {
164 std::shared_ptr<storm::dft::storage::elements::DFTElement<ValueType>
const> element = dft.
getElement(i);
165 if (element->isBasicElement()) {
166 auto be = std::static_pointer_cast<storm::dft::storage::elements::DFTBE<ValueType>
const>(element);
175template<
typename ValueType>
180 for (
size_t i = 0; i < dft.
nrElements(); ++i) {
181 std::shared_ptr<storm::dft::storage::elements::DFTElement<ValueType>
const> element = dft.
getElement(i);
182 switch (element->type()) {
184 auto be = std::static_pointer_cast<storm::dft::storage::elements::DFTBE<ValueType>
const>(element);
185 switch (be->beType()) {
187 STORM_LOG_TRACE(
"Replace " << *be <<
" with constant failsafe BE and PDEP.");
188 auto beProb = std::static_pointer_cast<storm::dft::storage::elements::BEProbability<ValueType>
const>(be);
191 std::string triggerName =
"constantBeTrigger_" + beProb->name();
196 builder.
addPdep(beProb->name() +
"_pdep", {triggerName, beProb->name()}, beProb->activeFailureProbability());
201 auto beErlang = std::static_pointer_cast<storm::dft::storage::elements::BEErlang<ValueType>
const>(be);
203 std::vector<std::string> childNames;
206 for (
size_t j = 0; j < beErlang->phases() - 1; ++j) {
207 std::string beName = beErlang->name() +
"_" + std::to_string(j);
208 childNames.push_back(beName);
211 childNames.push_back(beErlang->name());
231 return std::make_shared<storm::dft::storage::DFT<ValueType>>(builder.
build());
void addPdep(std::string const &name, std::vector< std::string > const &children, ValueType probability)
Create (probabilistic) dependency (PDEP) and add it to DFT.
void addBasicElementConst(std::string const &name, bool failed)
Create BE which is constant failed or constant failsafe and add it to DFT.
storm::dft::storage::DFT< ValueType > build()
Create DFT.
void cloneElement(DFTElementCPointer element)
Clone element and add it via the builder.
void setTopLevel(std::string const &tle)
Set top level element.
void addBasicElementExponential(std::string const &name, ValueType rate, ValueType dormancyFactor, bool transient=false)
Create BE with exponential distribution and add it to DFT.
void addSequenceEnforcer(std::string const &name, std::vector< std::string > const &children)
Create sequence enforcer (SEQ) and add it to DFT.
Represents a Dynamic Fault Tree.
std::shared_ptr< storm::dft::storage::elements::DFTDependency< ValueType > const > getDependency(size_t index) const
DFTElementCPointer getElement(size_t index) const
Get a pointer to an element in the DFT.
DFTElementCPointer getTopLevelElement() const
std::vector< size_t > const & getDependencies() const
size_t nrElements() const
#define STORM_LOG_TRACE(message)
#define STORM_LOG_THROW(cond, exception, message)
bool isOne(ValueType const &a)