|
|
@ -4,10 +4,9 @@ namespace storm { |
|
|
|
namespace dft { |
|
|
|
namespace utility { |
|
|
|
|
|
|
|
std::vector<std::pair<uint64_t, uint64_t>> |
|
|
|
FDEPConflictFinder::getDependencyConflicts(storm::storage::DFT<double> const &dft, |
|
|
|
bool useSMT, |
|
|
|
uint_fast64_t timeout) { |
|
|
|
template<> |
|
|
|
std::vector<std::pair<uint64_t, uint64_t>> FDEPConflictFinder<double>::getDependencyConflicts(storm::storage::DFT<double> const& dft, bool useSMT, |
|
|
|
uint_fast64_t timeout) { |
|
|
|
|
|
|
|
std::shared_ptr<storm::modelchecker::DFTASFChecker> smtChecker = nullptr; |
|
|
|
if (useSMT) { |
|
|
@ -25,46 +24,30 @@ namespace storm { |
|
|
|
dep2Index = dft.getDependencies().at(j); |
|
|
|
if (dft.getDynamicBehavior()[dep1Index] && dft.getDynamicBehavior()[dep2Index]) { |
|
|
|
if (useSMT) { // if an SMT solver is to be used
|
|
|
|
if (dft.getDependency(dep1Index)->triggerEvent() == |
|
|
|
dft.getDependency(dep2Index)->triggerEvent()) { |
|
|
|
STORM_LOG_DEBUG("Conflict between " << dft.getElement(dep1Index)->name() << " and " |
|
|
|
<< dft.getElement(dep2Index)->name() |
|
|
|
<< ": Same trigger"); |
|
|
|
if (dft.getDependency(dep1Index)->triggerEvent() == dft.getDependency(dep2Index)->triggerEvent()) { |
|
|
|
STORM_LOG_DEBUG("Conflict between " << dft.getElement(dep1Index)->name() << " and " << dft.getElement(dep2Index)->name() << ": Same trigger"); |
|
|
|
res.emplace_back(std::pair<uint64_t, uint64_t>(dep1Index, dep2Index)); |
|
|
|
} else { |
|
|
|
switch (smtChecker->checkDependencyConflict(dep1Index, dep2Index, timeout)) { |
|
|
|
case storm::solver::SmtSolver::CheckResult::Sat: |
|
|
|
STORM_LOG_DEBUG( |
|
|
|
"Conflict between " << dft.getElement(dep1Index)->name() << " and " |
|
|
|
<< dft.getElement(dep2Index)->name()); |
|
|
|
STORM_LOG_DEBUG("Conflict between " << dft.getElement(dep1Index)->name() << " and " << dft.getElement(dep2Index)->name()); |
|
|
|
res.emplace_back(std::pair<uint64_t, uint64_t>(dep1Index, dep2Index)); |
|
|
|
break; |
|
|
|
case storm::solver::SmtSolver::CheckResult::Unknown: |
|
|
|
STORM_LOG_DEBUG( |
|
|
|
"Unknown: Conflict between " << dft.getElement(dep1Index)->name() |
|
|
|
<< " and " |
|
|
|
<< dft.getElement(dep2Index)->name()); |
|
|
|
STORM_LOG_DEBUG("Unknown: Conflict between " << dft.getElement(dep1Index)->name() << " and " << dft.getElement(dep2Index)->name()); |
|
|
|
res.emplace_back(std::pair<uint64_t, uint64_t>(dep1Index, dep2Index)); |
|
|
|
break; |
|
|
|
default: |
|
|
|
STORM_LOG_DEBUG( |
|
|
|
"No conflict between " << dft.getElement(dep1Index)->name() |
|
|
|
<< " and " |
|
|
|
<< dft.getElement(dep2Index)->name()); |
|
|
|
STORM_LOG_DEBUG("No conflict between " << dft.getElement(dep1Index)->name() << " and " << dft.getElement(dep2Index)->name()); |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
STORM_LOG_DEBUG( |
|
|
|
"Conflict between " << dft.getElement(dep1Index)->name() << " and " |
|
|
|
<< dft.getElement(dep2Index)->name()); |
|
|
|
STORM_LOG_DEBUG("Conflict between " << dft.getElement(dep1Index)->name() << " and " << dft.getElement(dep2Index)->name()); |
|
|
|
res.emplace_back(std::pair<uint64_t, uint64_t>(dep1Index, dep2Index)); |
|
|
|
} |
|
|
|
} else { |
|
|
|
STORM_LOG_DEBUG( |
|
|
|
"Static behavior: No conflict between " << dft.getElement(dep1Index)->name() |
|
|
|
<< " and " |
|
|
|
<< dft.getElement(dep2Index)->name()); |
|
|
|
STORM_LOG_DEBUG("Static behavior: No conflict between " << dft.getElement(dep1Index)->name() << " and " << dft.getElement(dep2Index)->name()); |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
@ -72,10 +55,9 @@ namespace storm { |
|
|
|
return res; |
|
|
|
} |
|
|
|
|
|
|
|
std::vector<std::pair<uint64_t, uint64_t>> |
|
|
|
FDEPConflictFinder::getDependencyConflicts(storm::storage::DFT<storm::RationalFunction> const &dft, |
|
|
|
bool useSMT, |
|
|
|
uint_fast64_t timeout) { |
|
|
|
template<> |
|
|
|
std::vector<std::pair<uint64_t, uint64_t>> FDEPConflictFinder<storm::RationalFunction>::getDependencyConflicts(storm::storage::DFT<storm::RationalFunction> const& dft, |
|
|
|
bool useSMT, uint_fast64_t timeout) { |
|
|
|
if (useSMT) { |
|
|
|
STORM_LOG_WARN("SMT encoding for rational functions is not supported"); |
|
|
|
} |
|
|
@ -88,15 +70,10 @@ namespace storm { |
|
|
|
for (size_t j = i + 1; j < dft.getDependencies().size(); ++j) { |
|
|
|
dep2Index = dft.getDependencies().at(j); |
|
|
|
if (dft.getDynamicBehavior()[dep1Index] && dft.getDynamicBehavior()[dep2Index]) { |
|
|
|
STORM_LOG_DEBUG( |
|
|
|
"Conflict between " << dft.getElement(dep1Index)->name() << " and " |
|
|
|
<< dft.getElement(dep2Index)->name()); |
|
|
|
STORM_LOG_DEBUG("Conflict between " << dft.getElement(dep1Index)->name() << " and " << dft.getElement(dep2Index)->name()); |
|
|
|
res.emplace_back(std::pair<uint64_t, uint64_t>(dep1Index, dep2Index)); |
|
|
|
} else { |
|
|
|
STORM_LOG_DEBUG( |
|
|
|
"Static behavior: No conflict between " << dft.getElement(dep1Index)->name() |
|
|
|
<< " and " |
|
|
|
<< dft.getElement(dep2Index)->name()); |
|
|
|
STORM_LOG_DEBUG("Static behavior: No conflict between " << dft.getElement(dep1Index)->name() << " and " << dft.getElement(dep2Index)->name()); |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
@ -104,8 +81,11 @@ namespace storm { |
|
|
|
return res; |
|
|
|
} |
|
|
|
|
|
|
|
class FDEPConflictFinder; |
|
|
|
template |
|
|
|
class FDEPConflictFinder<double>; |
|
|
|
|
|
|
|
template |
|
|
|
class FDEPConflictFinder<storm::RationalFunction>; |
|
|
|
} |
|
|
|
} |
|
|
|
} |