11 uint_fast64_t timeout) {
12 std::shared_ptr<storm::dft::modelchecker::DFTASFChecker> smtChecker =
nullptr;
15 smtChecker = std::make_shared<storm::dft::modelchecker::DFTASFChecker>(checker);
16 smtChecker->toSolver();
19 std::vector<bool> dynamicBehavior = getDynamicBehavior(dft);
21 std::vector<std::pair<uint64_t, uint64_t>> res;
28 if (dynamicBehavior[dep1Index] && dynamicBehavior[dep2Index]) {
33 res.emplace_back(std::pair<uint64_t, uint64_t>(dep1Index, dep2Index));
35 switch (smtChecker->checkDependencyConflict(dep1Index, dep2Index, timeout)) {
38 res.emplace_back(std::pair<uint64_t, uint64_t>(dep1Index, dep2Index));
43 res.emplace_back(std::pair<uint64_t, uint64_t>(dep1Index, dep2Index));
52 res.emplace_back(std::pair<uint64_t, uint64_t>(dep1Index, dep2Index));
67 STORM_LOG_WARN(
"SMT encoding for rational functions is not supported");
70 std::vector<bool> dynamicBehavior = getDynamicBehavior(dft);
72 std::vector<std::pair<uint64_t, uint64_t>> res;
79 if (dynamicBehavior[dep1Index] && dynamicBehavior[dep2Index]) {
81 res.emplace_back(std::pair<uint64_t, uint64_t>(dep1Index, dep2Index));
93 std::vector<bool> dynamicBehaviorVector(dft.
nrElements(),
false);
95 std::queue<std::shared_ptr<storm::dft::storage::elements::DFTElement<ValueType>
const>> elementQueue;
98 for (
size_t i = 0; i < dft.
nrElements(); ++i) {
100 switch (element->type()) {
104 auto gate = std::static_pointer_cast<storm::dft::storage::elements::DFTChildren<ValueType>
const>(element);
105 dynamicBehaviorVector[gate->id()] =
true;
106 for (
auto const& child : gate->children()) {
108 if (!dynamicBehaviorVector.at(child->id())) {
109 elementQueue.push(child);
116 auto spare = std::static_pointer_cast<storm::dft::storage::elements::DFTSpare<ValueType>
const>(element);
119 for (
auto const& child : spare->children()) {
122 if (child->nrParents() > 1) {
124 for (
auto const& parent : child->parents()) {
125 if (parent->isSpareGate() and parent->id() != spare->id()) {
126 dynamicBehaviorVector[spare->id()] =
true;
133 if (!dynamicBehaviorVector[spare->id()]) {
137 for (
auto const& dep : member->outgoingDependencies()) {
139 for (
auto const& depEvent : dep->dependentEvents()) {
141 auto const& childModuleElements = dft.
module(child->id()).getElements();
142 if (std::find(childModuleElements.begin(), childModuleElements.end(), depEvent->id()) == childModuleElements.end()) {
143 dynamicBehaviorVector[spare->id()] =
true;
147 if (dynamicBehaviorVector[spare->id()]) {
151 if (dynamicBehaviorVector[spare->id()]) {
156 if (dynamicBehaviorVector[spare->id()]) {
161 if (dynamicBehaviorVector[spare->id()]) {
162 for (
auto const& child : spare->children()) {
164 if (!dynamicBehaviorVector.at(child->id())) {
165 elementQueue.push(child);
172 auto seq = std::static_pointer_cast<storm::dft::storage::elements::DFTSeq<ValueType>
const>(element);
174 if (!seq->allChildrenBEs()) {
175 dynamicBehaviorVector[seq->id()] =
true;
176 for (
auto const& child : seq->children()) {
178 if (!dynamicBehaviorVector.at(child->id())) {
179 elementQueue.push(child);
191 while (!elementQueue.empty()) {
192 std::shared_ptr<storm::dft::storage::elements::DFTElement<ValueType>
const> currentElement = elementQueue.front();
194 switch (currentElement->type()) {
200 dynamicBehaviorVector[currentElement->id()] =
true;
201 auto gate = std::static_pointer_cast<storm::dft::storage::elements::DFTGate<ValueType>
const>(currentElement);
202 for (
auto const& child : gate->children()) {
204 if (!dynamicBehaviorVector.at(child->id())) {
205 elementQueue.push(child);
212 auto be = std::static_pointer_cast<storm::dft::storage::elements::DFTBE<ValueType>
const>(currentElement);
213 dynamicBehaviorVector[be->id()] =
true;
215 for (
auto const& dep : be->ingoingDependencies()) {
216 if (!dynamicBehaviorVector.at(dep->id())) {
217 elementQueue.push(dep);
223 auto dep = std::static_pointer_cast<storm::dft::storage::elements::DFTDependency<ValueType>
const>(currentElement);
224 dynamicBehaviorVector[dep->id()] =
true;
226 auto trigger = dep->triggerEvent();
227 if (!dynamicBehaviorVector.at(trigger->id())) {
228 elementQueue.push(trigger);
236 return dynamicBehaviorVector;