10 uint_fast64_t timeout) {
11 std::shared_ptr<storm::dft::modelchecker::DFTASFChecker> smtChecker =
nullptr;
14 smtChecker = std::make_shared<storm::dft::modelchecker::DFTASFChecker>(checker);
15 smtChecker->toSolver();
18 std::vector<bool> dynamicBehavior = getDynamicBehavior(dft);
20 std::vector<std::pair<uint64_t, uint64_t>> res;
27 if (dynamicBehavior[dep1Index] && dynamicBehavior[dep2Index]) {
32 res.emplace_back(std::pair<uint64_t, uint64_t>(dep1Index, dep2Index));
34 switch (smtChecker->checkDependencyConflict(dep1Index, dep2Index, timeout)) {
37 res.emplace_back(std::pair<uint64_t, uint64_t>(dep1Index, dep2Index));
42 res.emplace_back(std::pair<uint64_t, uint64_t>(dep1Index, dep2Index));
51 res.emplace_back(std::pair<uint64_t, uint64_t>(dep1Index, dep2Index));
66 STORM_LOG_WARN(
"SMT encoding for rational functions is not supported");
69 std::vector<bool> dynamicBehavior = getDynamicBehavior(dft);
71 std::vector<std::pair<uint64_t, uint64_t>> res;
78 if (dynamicBehavior[dep1Index] && dynamicBehavior[dep2Index]) {
80 res.emplace_back(std::pair<uint64_t, uint64_t>(dep1Index, dep2Index));
92 std::vector<bool> dynamicBehaviorVector(dft.
nrElements(),
false);
94 std::queue<std::shared_ptr<storm::dft::storage::elements::DFTElement<ValueType>
const>> elementQueue;
97 for (
size_t i = 0; i < dft.
nrElements(); ++i) {
99 switch (element->type()) {
103 auto gate = std::static_pointer_cast<storm::dft::storage::elements::DFTChildren<ValueType>
const>(element);
104 dynamicBehaviorVector[gate->id()] =
true;
105 for (
auto const& child : gate->children()) {
107 if (!dynamicBehaviorVector.at(child->id())) {
108 elementQueue.push(child);
115 auto spare = std::static_pointer_cast<storm::dft::storage::elements::DFTSpare<ValueType>
const>(element);
118 for (
auto const& child : spare->children()) {
121 if (child->nrParents() > 1) {
123 for (
auto const& parent : child->parents()) {
124 if (parent->isSpareGate() and parent->id() != spare->id()) {
125 dynamicBehaviorVector[spare->id()] =
true;
132 if (!dynamicBehaviorVector[spare->id()]) {
136 for (
auto const& dep : member->outgoingDependencies()) {
138 for (
auto const& depEvent : dep->dependentEvents()) {
140 auto const& childModuleElements = dft.
module(child->id()).getElements();
141 if (std::find(childModuleElements.begin(), childModuleElements.end(), depEvent->id()) == childModuleElements.end()) {
142 dynamicBehaviorVector[spare->id()] =
true;
146 if (dynamicBehaviorVector[spare->id()]) {
150 if (dynamicBehaviorVector[spare->id()]) {
155 if (dynamicBehaviorVector[spare->id()]) {
160 if (dynamicBehaviorVector[spare->id()]) {
161 for (
auto const& child : spare->children()) {
163 if (!dynamicBehaviorVector.at(child->id())) {
164 elementQueue.push(child);
171 auto seq = std::static_pointer_cast<storm::dft::storage::elements::DFTSeq<ValueType>
const>(element);
173 if (!seq->allChildrenBEs()) {
174 dynamicBehaviorVector[seq->id()] =
true;
175 for (
auto const& child : seq->children()) {
177 if (!dynamicBehaviorVector.at(child->id())) {
178 elementQueue.push(child);
190 while (!elementQueue.empty()) {
191 std::shared_ptr<storm::dft::storage::elements::DFTElement<ValueType>
const> currentElement = elementQueue.front();
193 switch (currentElement->type()) {
199 dynamicBehaviorVector[currentElement->id()] =
true;
200 auto gate = std::static_pointer_cast<storm::dft::storage::elements::DFTGate<ValueType>
const>(currentElement);
201 for (
auto const& child : gate->children()) {
203 if (!dynamicBehaviorVector.at(child->id())) {
204 elementQueue.push(child);
211 auto be = std::static_pointer_cast<storm::dft::storage::elements::DFTBE<ValueType>
const>(currentElement);
212 dynamicBehaviorVector[be->id()] =
true;
214 for (
auto const& dep : be->ingoingDependencies()) {
215 if (!dynamicBehaviorVector.at(dep->id())) {
216 elementQueue.push(dep);
222 auto dep = std::static_pointer_cast<storm::dft::storage::elements::DFTDependency<ValueType>
const>(currentElement);
223 dynamicBehaviorVector[dep->id()] =
true;
225 auto trigger = dep->triggerEvent();
226 if (!dynamicBehaviorVector.at(trigger->id())) {
227 elementQueue.push(trigger);
235 return dynamicBehaviorVector;