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());
58 builder.addBasicElementConst(beConst->name(),
false);
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'");
84 builder.addBasicElementConst(
"Unique_Constant_Failure",
true);
85 failedBEs.insert(failedBEs.begin(),
"Unique_Constant_Failure");
90 builder.setTopLevel(
dft.getTopLevelElement()->name());
91 return std::make_shared<storm::dft::storage::DFT<ValueType>>(
builder.build());
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";
126 builder.addBasicElementConst(nameAdditional,
false);
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();
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();
157 builder.setTopLevel(
dft.getTopLevelElement()->name());
158 return std::make_shared<storm::dft::storage::DFT<ValueType>>(
builder.build());
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();
192 builder.addBasicElementConst(triggerName,
true);
194 builder.addBasicElementConst(beProb->name(),
false);
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;
204 builder.addBasicElementExponential(beErlang->name(), beErlang->activeFailureRate(), beErlang->dormancyFactor());
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);
209 builder.addBasicElementExponential(beName, beErlang->activeFailureRate(), beErlang->dormancyFactor());
211 childNames.push_back(beErlang->name());
213 builder.addSequenceEnforcer(beErlang->name() +
"_seq", childNames);
230 builder.setTopLevel(
dft.getTopLevelElement()->name());
231 return std::make_shared<storm::dft::storage::DFT<ValueType>>(
builder.build());