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();
21 std::vector<std::pair<uint64_t, uint64_t>> res;
24 for (
size_t i = 0; i <
dft.getDependencies().size(); ++i) {
25 dep1Index =
dft.getDependencies().at(i);
26 for (
size_t j = i + 1; j <
dft.getDependencies().size(); ++j) {
27 dep2Index =
dft.getDependencies().at(j);
28 if (dynamicBehavior[dep1Index] && dynamicBehavior[dep2Index]) {
30 if (
dft.getDependency(dep1Index)->triggerEvent() ==
dft.getDependency(dep2Index)->triggerEvent()) {
31 STORM_LOG_TRACE(
"Conflict between " <<
dft.getElement(dep1Index)->name() <<
" and " <<
dft.getElement(dep2Index)->name()
33 res.emplace_back(std::pair<uint64_t, uint64_t>(dep1Index, dep2Index));
35 switch (smtChecker->checkDependencyConflict(dep1Index, dep2Index, timeout)) {
37 STORM_LOG_TRACE(
"Conflict between " <<
dft.getElement(dep1Index)->name() <<
" and " <<
dft.getElement(dep2Index)->name());
38 res.emplace_back(std::pair<uint64_t, uint64_t>(dep1Index, dep2Index));
41 STORM_LOG_TRACE(
"Unknown: Conflict between " <<
dft.getElement(dep1Index)->name() <<
" and "
42 <<
dft.getElement(dep2Index)->name());
43 res.emplace_back(std::pair<uint64_t, uint64_t>(dep1Index, dep2Index));
46 STORM_LOG_TRACE(
"No conflict between " <<
dft.getElement(dep1Index)->name() <<
" and " <<
dft.getElement(dep2Index)->name());
51 STORM_LOG_TRACE(
"Conflict between " <<
dft.getElement(dep1Index)->name() <<
" and " <<
dft.getElement(dep2Index)->name());
52 res.emplace_back(std::pair<uint64_t, uint64_t>(dep1Index, dep2Index));
55 STORM_LOG_TRACE(
"Static behavior: No conflict between " <<
dft.getElement(dep1Index)->name() <<
" and " <<
dft.getElement(dep2Index)->name());
67 STORM_LOG_WARN(
"SMT encoding for rational functions is not supported");
72 std::vector<std::pair<uint64_t, uint64_t>> res;
75 for (
size_t i = 0; i <
dft.getDependencies().size(); ++i) {
76 dep1Index =
dft.getDependencies().at(i);
77 for (
size_t j = i + 1; j <
dft.getDependencies().size(); ++j) {
78 dep2Index =
dft.getDependencies().at(j);
79 if (dynamicBehavior[dep1Index] && dynamicBehavior[dep2Index]) {
80 STORM_LOG_TRACE(
"Conflict between " <<
dft.getElement(dep1Index)->name() <<
" and " <<
dft.getElement(dep2Index)->name());
81 res.emplace_back(std::pair<uint64_t, uint64_t>(dep1Index, dep2Index));
83 STORM_LOG_TRACE(
"Static behavior: No conflict between " <<
dft.getElement(dep1Index)->name() <<
" and " <<
dft.getElement(dep2Index)->name());
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) {
99 auto element =
dft.getElement(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()]) {
134 for (
auto const& memberID :
dft.module(child->id()).getElements()) {
136 auto member =
dft.getElement(memberID);
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;