15namespace modelchecker {
21uint64_t DFTASFChecker::getClaimVariableIndex(uint64_t spare, uint64_t child)
const {
26 std::vector<uint64_t> beVariables;
27 uint64_t failedBeVariables;
28 std::vector<uint64_t> failsafeBeVariables;
29 bool failedBeIsSet =
false;
30 notFailed = dft.nrBasicElements() + 1;
33 for (
size_t i = 0; i < dft.nrElements(); ++i) {
34 std::shared_ptr<storm::dft::storage::elements::DFTElement<ValueType>
const> element = dft.getElement(i);
35 varNames.push_back(
"t_" + element->name());
36 timePointVariables.emplace(i, varNames.size() - 1);
37 switch (element->type()) {
39 auto be = std::static_pointer_cast<storm::dft::storage::elements::DFTBE<double>
const>(element);
40 switch (be->beType()) {
42 beVariables.push_back(varNames.size() - 1);
45 STORM_LOG_WARN(
"Constant BEs are only experimentally supported in the SMT encoding");
47 auto be = std::static_pointer_cast<storm::dft::storage::elements::BEConst<double>
const>(element);
49 STORM_LOG_THROW(!failedBeIsSet, storm::exceptions::NotSupportedException,
50 "DFTs containing more than one constantly failed BE are not supported");
51 notFailed = dft.nrBasicElements();
52 failedBeVariables = varNames.size() - 1;
55 failsafeBeVariables.push_back(varNames.size() - 1);
60 STORM_LOG_THROW(
false, storm::exceptions::NotImplementedException,
"BE type '" << be->beType() <<
"' not known.");
66 auto spare = std::static_pointer_cast<storm::dft::storage::elements::DFTSpare<double>
const>(element);
67 for (
auto const &spareChild : spare->children()) {
68 varNames.push_back(
"c_" + element->name() +
"_" + spareChild->name());
69 claimVariables.emplace(
SpareAndChildPair(element->id(), spareChild->id()), varNames.size() - 1);
74 varNames.push_back(
"dep_" + element->name());
75 dependencyVariables.emplace(element->id(), varNames.size() - 1);
83 for (
size_t i = 0; i < dft.nrBasicElements(); ++i) {
84 varNames.push_back(
"m_" + std::to_string(i));
85 markovianVariables.emplace(i, varNames.size() - 1);
91 for (
auto const &beV : beVariables) {
92 constraints.push_back(std::make_shared<BetweenValues>(beV, 1, notFailed - 1));
96 for (
auto const &beV : failsafeBeVariables) {
97 constraints.push_back(std::make_shared<BetweenValues>(beV, 1, notFailed));
102 constraints.push_back(std::make_shared<IsConstantValue>(failedBeVariables, 0));
105 std::vector<uint64_t> allBeVariables;
106 allBeVariables.insert(std::end(allBeVariables), std::begin(beVariables), std::end(beVariables));
107 allBeVariables.insert(std::end(allBeVariables), std::begin(failsafeBeVariables), std::end(failsafeBeVariables));
110 if (beVariables.size() > 1) {
111 constraints.push_back(std::make_shared<PairwiseDifferent>(beVariables));
112 constraints.back()->setDescription(
"No two BEs fail at the same time");
115 bool descFlag =
true;
116 for (
auto const &failsafeBe : failsafeBeVariables) {
117 std::vector<std::shared_ptr<SmtConstraint>> unequalConstraints;
118 for (
auto const &otherBe : allBeVariables) {
119 if (otherBe != failsafeBe) {
120 unequalConstraints.push_back(std::make_shared<IsUnequal>(failsafeBe, otherBe));
123 constraints.push_back(
124 std::make_shared<Implies>(std::make_shared<IsNotConstantValue>(failsafeBe, notFailed), std::make_shared<And>(unequalConstraints)));
126 constraints.back()->setDescription(
"Initially failsafe BEs don't fail at the same time as other BEs");
132 for (
auto const &claimVariable : claimVariables) {
133 constraints.push_back(std::make_shared<BetweenValues>(claimVariable.second, 0, notFailed));
137 for (
size_t i = 0; i < dft.nrElements(); ++i) {
138 std::shared_ptr<storm::dft::storage::elements::DFTElement<ValueType>
const> element = dft.getElement(i);
142 std::vector<uint64_t> childVarIndices;
143 if (element->isGate()) {
144 std::shared_ptr<storm::dft::storage::elements::DFTGate<ValueType>
const> gate = dft.getGate(i);
145 for (
auto const &child : gate->children()) {
146 childVarIndices.push_back(timePointVariables.at(child->id()));
150 switch (element->type()) {
155 generateAndConstraint(i, childVarIndices, element);
158 generateOrConstraint(i, childVarIndices, element);
161 generateVotConstraint(i, childVarIndices, element);
164 generatePandConstraint(i, childVarIndices, element);
167 generatePorConstraint(i, childVarIndices, element);
170 generateSeqConstraint(childVarIndices, element);
173 generateSpareConstraint(i, childVarIndices, element);
176 generatePdepConstraint(i, childVarIndices, element);
179 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"SMT encoding for type '" << element->type() <<
"' is not supported.");
188 addMarkovianConstraints();
191 std::vector<std::shared_ptr<SmtConstraint>> failsafeNotIConstr;
192 for (uint64_t i = 0; i < dft.nrBasicElements(); ++i) {
193 failsafeNotIConstr.clear();
194 for (
auto const &beV : failsafeBeVariables) {
195 failsafeNotIConstr.push_back(std::make_shared<IsNotConstantValue>(beV, i + 1));
198 constraints.push_back(
199 std::make_shared<Implies>(std::make_shared<IsBoolValue>(markovianVariables.at(i),
true), std::make_shared<And>(failsafeNotIConstr)));
201 constraints.back()->setDescription(
"Failsafe BEs fail only if they are triggered");
206 std::vector<std::shared_ptr<SmtConstraint>> triggerConstraints;
207 for (
size_t i = 0; i < dft.nrElements(); ++i) {
208 std::shared_ptr<storm::dft::storage::elements::DFTElement<ValueType>
const> element = dft.getElement(i);
209 if (element->isBasicElement()) {
210 auto be = std::static_pointer_cast<storm::dft::storage::elements::DFTBE<double>
const>(element);
212 triggerConstraints.clear();
213 for (
auto const &dependency : be->ingoingDependencies()) {
214 triggerConstraints.push_back(std::make_shared<IsConstantValue>(timePointVariables.at(dependency->triggerEvent()->id()), notFailed));
216 if (!triggerConstraints.empty()) {
217 constraints.push_back(std::make_shared<Implies>(std::make_shared<IsConstantValue>(timePointVariables.at(be->id()), notFailed),
218 std::make_shared<And>(triggerConstraints)));
219 constraints.back()->setDescription(
"Failsafe BE " + be->name() +
" stays failsafe if no trigger fails");
228void DFTASFChecker::generateAndConstraint(
size_t i, std::vector<uint64_t> childVarIndices,
231 constraints.push_back(std::make_shared<IsMaximum>(timePointVariables.at(i), childVarIndices));
232 constraints.back()->setDescription(
"AND gate " + element->name());
235void DFTASFChecker::generateOrConstraint(
size_t i, std::vector<uint64_t> childVarIndices,
238 constraints.push_back(std::make_shared<IsMinimum>(timePointVariables.at(i), childVarIndices));
239 constraints.back()->setDescription(
"OR gate " + element->name());
242void DFTASFChecker::generateVotConstraint(
size_t i, std::vector<uint64_t> childVarIndices,
244 auto vot = std::static_pointer_cast<storm::dft::storage::elements::DFTVot<double>
const>(element);
246 std::vector<uint64_t> tmpVars;
252 std::vector<uint64_t> combinationChildren;
253 STORM_LOG_ASSERT(vot->nrChildren() < 64,
"Too many children of a VOT Gate.");
254 for (uint8_t j = 0; j < static_cast<uint8_t>(vot->nrChildren()); ++j) {
255 if (combination & (1ul << j)) {
256 combinationChildren.push_back(childVarIndices.at(j));
260 varNames.push_back(
"v_" + vot->name() +
"_" + std::to_string(k));
261 size_t index = varNames.size() - 1;
262 tmpVars.push_back(index);
263 tmpTimePointVariables.push_back(index);
265 constraints.push_back(std::make_shared<IsMaximum>(index, combinationChildren));
266 constraints.back()->setDescription(
"VOT gate " + element->name() +
": AND no. " + std::to_string(k));
270 }
while (combination < (1ul << vot->nrChildren()) && combination != 0);
273 constraints.push_back(std::make_shared<IsMinimum>(timePointVariables.at(i), tmpVars));
274 constraints.back()->setDescription(
"VOT gate " + element->name() +
": OR");
277void DFTASFChecker::generatePandConstraint(
size_t i, std::vector<uint64_t> childVarIndices,
280 std::shared_ptr<SmtConstraint> ifC = std::make_shared<Sorted>(childVarIndices);
281 std::shared_ptr<SmtConstraint> thenC = std::make_shared<IsEqual>(timePointVariables.at(i), childVarIndices.back());
282 std::shared_ptr<SmtConstraint> elseC = std::make_shared<IsConstantValue>(timePointVariables.at(i), notFailed);
283 constraints.push_back(std::make_shared<IfThenElse>(ifC, thenC, elseC));
284 constraints.back()->setDescription(
"PAND gate " + element->name());
287void DFTASFChecker::generatePorConstraint(
size_t i, std::vector<uint64_t> childVarIndices,
291 std::vector<std::shared_ptr<SmtConstraint>> firstSmallestC;
292 uint64_t timeFirstChild = childVarIndices.front();
293 for (uint64_t i = 1;
i < childVarIndices.size(); ++
i) {
294 firstSmallestC.push_back(std::make_shared<IsLess>(timeFirstChild, childVarIndices.at(i)));
296 std::shared_ptr<SmtConstraint> ifC = std::make_shared<And>(firstSmallestC);
297 std::shared_ptr<SmtConstraint> thenC = std::make_shared<IsEqual>(timePointVariables.at(i), childVarIndices.front());
298 std::shared_ptr<SmtConstraint> elseC = std::make_shared<IsConstantValue>(timePointVariables.at(i), notFailed);
299 constraints.push_back(std::make_shared<IfThenElse>(ifC, thenC, elseC));
300 constraints.back()->setDescription(
"POR gate " + element->name());
303void DFTASFChecker::generateSeqConstraint(std::vector<uint64_t> childVarIndices,
307 auto seq = std::static_pointer_cast<storm::dft::storage::elements::DFTRestriction<double>
const>(element);
308 for (
auto const &child : seq->children()) {
309 childVarIndices.push_back(timePointVariables.at(child->id()));
312 constraints.push_back(std::make_shared<Sorted>(childVarIndices));
313 constraints.back()->setDescription(
"SEQ gate " + element->name());
316void DFTASFChecker::generateSpareConstraint(
size_t i, std::vector<uint64_t> childVarIndices,
318 auto spare = std::static_pointer_cast<storm::dft::storage::elements::DFTSpare<double>
const>(element);
319 auto const &children = spare->children();
320 uint64_t firstChild = children.front()->id();
321 uint64_t lastChild = children.back()->id();
324 constraints.push_back(std::make_shared<IsConstantValue>(getClaimVariableIndex(spare->id(), firstChild), 0));
325 constraints.back()->setDescription(
"SPARE gate " + spare->name() +
" claims first child");
328 std::shared_ptr<SmtConstraint> leftC = std::make_shared<IsLess>(getClaimVariableIndex(spare->id(), lastChild), childVarIndices.back());
329 constraints.push_back(std::make_shared<Implies>(leftC, std::make_shared<IsEqual>(timePointVariables.at(i), childVarIndices.back())));
330 constraints.back()->setDescription(
"Last child & claimed -> SPARE fails");
334 for (uint64_t currChild = 0; currChild < children.size() - 1; ++currChild) {
335 uint64_t timeCurrChild = childVarIndices.at(currChild);
337 std::shared_ptr<SmtConstraint> tryClaimC = generateTryToClaimConstraint(spare, currChild + 1, timeCurrChild);
338 constraints.push_back(
339 std::make_shared<Iff>(std::make_shared<IsLess>(getClaimVariableIndex(spare->id(), children.at(currChild)->id()), timeCurrChild), tryClaimC));
340 constraints.back()->setDescription(
"Try to claim " + std::to_string(currChild + 2) +
"th child");
345 uint64_t childIndex, uint64_t timepoint)
const {
346 auto child = spare->children().at(childIndex);
347 uint64_t timeChild = timePointVariables.at(child->id());
348 uint64_t claimChild = getClaimVariableIndex(spare->id(), child->id());
350 std::vector<std::shared_ptr<SmtConstraint>> noClaimingPossible;
352 if (childIndex + 1 < spare->children().size()) {
354 noClaimingPossible.push_back(generateTryToClaimConstraint(spare, childIndex + 1, timepoint));
357 noClaimingPossible.push_back(std::make_shared<IsEqual>(timePointVariables.at(spare->id()), timepoint));
359 std::shared_ptr<SmtConstraint> elseCaseC = std::make_shared<And>(noClaimingPossible);
362 std::vector<std::shared_ptr<SmtConstraint>> claimingPossibleC;
364 claimingPossibleC.push_back(std::make_shared<IsLess>(timepoint, timeChild));
366 for (
auto const &otherSpare : child->parents()) {
367 if (otherSpare->id() == spare->id()) {
371 claimingPossibleC.push_back(std::make_shared<IsLess>(timepoint, getClaimVariableIndex(otherSpare->id(), child->id())));
375 std::shared_ptr<SmtConstraint> firstCaseC =
376 std::make_shared<IfThenElse>(std::make_shared<And>(claimingPossibleC), std::make_shared<IsEqual>(claimChild, timepoint), elseCaseC);
380void DFTASFChecker::addClaimingConstraints() {
383 for (
size_t i = 0;
i < dft.nrElements(); ++
i) {
384 std::shared_ptr<storm::dft::storage::elements::DFTElement<ValueType>
const> element = dft.getElement(i);
385 if (element->isSpareGate()) {
386 auto spare = std::static_pointer_cast<storm::dft::storage::elements::DFTSpare<double>
const>(element);
387 for (
auto const &child : spare->children()) {
388 std::vector<std::shared_ptr<SmtConstraint>> additionalC;
389 uint64_t timeClaiming = getClaimVariableIndex(spare->id(), child->id());
390 std::shared_ptr<SmtConstraint> leftC = std::make_shared<IsLessConstant>(timeClaiming, notFailed);
392 additionalC.push_back(std::make_shared<IsLess>(timeClaiming, timePointVariables.at(child->id())));
394 for (
auto const &parent : child->parents()) {
395 if (parent->isSpareGate() && parent->id() != spare->id()) {
397 additionalC.push_back(std::make_shared<IsConstantValue>(getClaimVariableIndex(parent->id(), child->id()), notFailed));
400 constraints.push_back(std::make_shared<Implies>(leftC, std::make_shared<And>(additionalC)));
401 constraints.back()->setDescription(
"Child " + child->name() +
" must be operational at time of claiming by spare " + spare->name() +
402 " and can only be claimed by one spare.");
408void DFTASFChecker::generatePdepConstraint(
size_t i, std::vector<uint64_t> childVarIndices,
410 auto dependency = std::static_pointer_cast<storm::dft::storage::elements::DFTDependency<double>
const>(element);
411 auto const &dependentEvents = dependency->dependentEvents();
412 auto const &trigger = dependency->triggerEvent();
413 std::vector<uint64_t> dependentIndices;
414 for (
size_t j = 0; j < dependentEvents.size(); ++j) {
415 dependentIndices.push_back(timePointVariables.at(dependentEvents[j]->id()));
418 constraints.push_back(std::make_shared<IsMaximum>(dependencyVariables.at(i), dependentIndices));
419 constraints.back()->setDescription(
"Dependency " + element->name() +
": Last element");
420 constraints.push_back(std::make_shared<IsEqual>(timePointVariables.at(i), timePointVariables.at(trigger->id())));
421 constraints.back()->setDescription(
"Dependency " + element->name() +
": Trigger element");
424void DFTASFChecker::addMarkovianConstraints() {
425 uint64_t nrMarkovian = dft.nrBasicElements();
426 std::set<size_t> depElements;
428 std::vector<std::vector<std::shared_ptr<SmtConstraint>>> markovianC(nrMarkovian);
429 std::vector<std::vector<std::shared_ptr<SmtConstraint>>> nonMarkovianC(nrMarkovian);
430 std::vector<std::vector<std::shared_ptr<SmtConstraint>>> notColdC(nrMarkovian);
433 for (
size_t j = 0; j < dft.nrElements(); ++j) {
434 std::shared_ptr<storm::dft::storage::elements::DFTElement<ValueType>
const> element = dft.getElement(j);
435 if (element->hasOutgoingDependencies()) {
436 for (uint64_t i = 0;
i < nrMarkovian; ++
i) {
437 std::shared_ptr<SmtConstraint> triggerFailed = std::make_shared<IsLessEqualConstant>(timePointVariables.at(j), i);
438 std::vector<std::shared_ptr<SmtConstraint>> depFailed;
439 for (
auto const &dependency : element->outgoingDependencies()) {
440 for (
auto const &depElement : dependency->dependentEvents()) {
441 depFailed.push_back(std::make_shared<IsLessEqualConstant>(timePointVariables.at(depElement->id()), i));
444 markovianC[
i].push_back(std::make_shared<Implies>(triggerFailed, std::make_shared<And>(depFailed)));
448 for (uint64_t i = 0;
i < nrMarkovian; ++
i) {
449 constraints.push_back(std::make_shared<Iff>(std::make_shared<IsBoolValue>(markovianVariables.at(i),
true), std::make_shared<And>(markovianC[i])));
450 constraints.back()->setDescription(
"Markovian (" + std::to_string(i) +
") iff all dependent events which trigger failed also failed.");
454 for (
size_t j = 0; j < dft.nrElements(); ++j) {
455 std::shared_ptr<storm::dft::storage::elements::DFTElement<ValueType>
const> element = dft.getElement(j);
456 if (element->isBasicElement()) {
457 auto be = std::static_pointer_cast<storm::dft::storage::elements::DFTBE<double>
const>(element);
459 if (be->hasIngoingDependencies()) {
460 depElements.emplace(j);
461 for (uint64_t i = 0;
i < nrMarkovian - 1; ++
i) {
462 std::shared_ptr<SmtConstraint> nextFailure = std::make_shared<IsConstantValue>(timePointVariables.at(j), i + 1);
463 std::vector<std::shared_ptr<SmtConstraint>> triggerFailed;
464 for (
auto const &dependency : be->ingoingDependencies()) {
465 triggerFailed.push_back(std::make_shared<IsLessEqualConstant>(timePointVariables.at(dependency->triggerEvent()->id()), i));
467 nonMarkovianC[
i].push_back(std::make_shared<Implies>(nextFailure, std::make_shared<Or>(triggerFailed)));
472 for (uint64_t i = 0;
i < nrMarkovian; ++
i) {
473 std::vector<std::shared_ptr<SmtConstraint>> dependentConstr;
474 for (
auto dependentEvent : depElements) {
475 std::shared_ptr<SmtConstraint> nextFailure = std::make_shared<IsConstantValue>(timePointVariables.at(dependentEvent), i + 1);
476 dependentConstr.push_back(nextFailure);
479 nonMarkovianC[
i].push_back(std::make_shared<Or>(dependentConstr));
480 constraints.push_back(
481 std::make_shared<Implies>(std::make_shared<IsBoolValue>(markovianVariables.at(i),
false), std::make_shared<And>(nonMarkovianC[i])));
482 constraints.back()->setDescription(
"Non-Markovian (" + std::to_string(i) +
") -> next failure is dependent BE.");
486 for (
size_t j = 0; j < dft.nrElements(); ++j) {
487 std::shared_ptr<storm::dft::storage::elements::DFTElement<ValueType>
const> element = dft.getElement(j);
488 if (element->isBasicElement()) {
489 auto be = std::static_pointer_cast<storm::dft::storage::elements::DFTBE<double>
const>(element);
490 for (uint64_t i = 0;
i < nrMarkovian; ++
i) {
491 std::shared_ptr<SmtConstraint> nextFailure = std::make_shared<IsConstantValue>(timePointVariables.at(j), i + 1);
494 notColdC[
i].push_back(std::make_shared<Implies>(nextFailure, std::make_shared<IsTrue>(be->canFail())));
498 for (uint64_t i = 0;
i < nrMarkovian; ++
i) {
499 constraints.push_back(std::make_shared<Implies>(std::make_shared<IsBoolValue>(markovianVariables.at(i),
true), std::make_shared<And>(notColdC[i])));
500 constraints.back()->setDescription(
"Markovian (" + std::to_string(i) +
") -> positive failure rate.");
505 std::ofstream stream;
507 stream <<
"; time point variables\n";
508 for (
auto const &timeVarEntry : timePointVariables) {
509 stream <<
"(declare-fun " << varNames[timeVarEntry.second] <<
"() Int)\n";
511 stream <<
"; claim variables\n";
512 for (
auto const &claimVarEntry : claimVariables) {
513 stream <<
"(declare-fun " << varNames[claimVarEntry.second] <<
"() Int)\n";
515 stream <<
"; Markovian variables\n";
516 for (
auto const &markovianVarEntry : markovianVariables) {
517 stream <<
"(declare-fun " << varNames[markovianVarEntry.second] <<
"() Bool)\n";
519 stream <<
"; Dependency variables\n";
520 for (
auto const &depVarEntry : dependencyVariables) {
521 stream <<
"(declare-fun " << varNames[depVarEntry.second] <<
"() Int)\n";
523 if (!tmpTimePointVariables.empty()) {
524 stream <<
"; Temporary variables\n";
525 for (
auto const &tmpVar : tmpTimePointVariables) {
526 stream <<
"(declare-fun " << varNames[tmpVar] <<
"() Int)\n";
529 for (
auto const &constraint : constraints) {
530 if (!constraint->description().empty()) {
531 stream <<
"; " << constraint->description() <<
'\n';
533 stream <<
"(assert " << constraint->toSmtlib2(varNames) <<
")\n";
535 stream <<
"(check-sat)\n";
546 for (
auto const &timeVarEntry : timePointVariables) {
547 manager->declareIntegerVariable(varNames[timeVarEntry.second]);
549 for (
auto const &claimVarEntry : claimVariables) {
550 manager->declareIntegerVariable(varNames[claimVarEntry.second]);
552 for (
auto const &markovianVarEntry : markovianVariables) {
553 manager->declareBooleanVariable(varNames[markovianVarEntry.second]);
555 if (!tmpTimePointVariables.empty()) {
556 for (
auto const &tmpVar : tmpTimePointVariables) {
557 manager->declareIntegerVariable(varNames[tmpVar]);
560 for (
auto const &depVarEntry : dependencyVariables) {
561 manager->declareIntegerVariable(varNames[depVarEntry.second]);
564 for (
auto const &constraint : constraints) {
565 solver->add(constraint->toExpression(varNames, manager));
570 STORM_LOG_ASSERT(solver,
"SMT Solver was not initialized, call toSolver() before checking queries");
575 std::shared_ptr<SmtConstraint> tleFailedConstr = std::make_shared<IsConstantValue>(timePointVariables.at(dft.getTopLevelIndex()), bound);
576 std::shared_ptr<storm::expressions::ExpressionManager> manager = solver->getManager().getSharedPointer();
577 solver->add(tleFailedConstr->toExpression(varNames, manager));
584 STORM_LOG_ASSERT(solver,
"SMT Solver was not initialized, call toSolver() before checking queries");
589 std::shared_ptr<SmtConstraint> tleNeverFailedConstr = std::make_shared<IsLessEqualConstant>(timePointVariables.at(dft.getTopLevelIndex()), bound);
590 std::shared_ptr<storm::expressions::ExpressionManager> manager = solver->getManager().getSharedPointer();
591 solver->add(tleNeverFailedConstr->toExpression(varNames, manager));
598 STORM_LOG_ASSERT(solver,
"SMT Solver was not initialized, timeout cannot be set");
599 solver->setTimeout(milliseconds);
603 STORM_LOG_ASSERT(solver,
"SMT Solver was not initialized, timeout cannot be unset");
604 solver->unsetTimeout();
608 STORM_LOG_ASSERT(solver,
"SMT Solver was not initialized, call toSolver() before checking queries");
613 STORM_LOG_ASSERT(solver,
"SMT Solver was not initialized, call toSolver() before checking queries");
614 std::vector<uint64_t> markovianIndices;
615 checkbound = std::min<int>(checkbound, markovianVariables.size());
617 for (uint64_t i = 0; i < checkbound; ++i) {
618 markovianIndices.push_back(markovianVariables.at(i));
623 std::shared_ptr<SmtConstraint> tleFailedConstr = std::make_shared<IsLessEqualConstant>(timePointVariables.at(dft.getTopLevelIndex()), checkbound);
624 std::shared_ptr<storm::expressions::ExpressionManager> manager = solver->getManager().getSharedPointer();
625 solver->add(tleFailedConstr->toExpression(varNames, manager));
627 std::shared_ptr<SmtConstraint> nonMarkovianConstr = std::make_shared<FalseCountIsEqualConstant>(markovianIndices, nrNonMarkovian);
628 solver->add(nonMarkovianConstr->toExpression(varNames, manager));
635 STORM_LOG_ASSERT(solver,
"SMT Solver was not initialized, call toSolver() before checking queries");
636 std::vector<uint64_t> markovianIndices;
637 timepoint = std::min<int>(timepoint, markovianVariables.size());
639 for (uint64_t i = 0; i < timepoint; ++i) {
640 markovianIndices.push_back(markovianVariables.at(i));
645 std::shared_ptr<SmtConstraint> tleFailedConstr = std::make_shared<IsConstantValue>(timePointVariables.at(dft.getTopLevelIndex()), timepoint);
646 std::shared_ptr<storm::expressions::ExpressionManager> manager = solver->getManager().getSharedPointer();
647 solver->add(tleFailedConstr->toExpression(varNames, manager));
649 std::shared_ptr<SmtConstraint> nonMarkovianConstr = std::make_shared<FalseCountIsEqualConstant>(markovianIndices, nrNonMarkovian);
650 solver->add(nonMarkovianConstr->toExpression(varNames, manager));
657 std::vector<std::shared_ptr<SmtConstraint>> andConstr;
658 std::vector<std::shared_ptr<SmtConstraint>> orConstr;
659 STORM_LOG_DEBUG(
"Check " << dft.getElement(dep1Index)->name() <<
" and " << dft.getElement(dep2Index)->name());
662 andConstr.push_back(std::make_shared<IsGreaterEqual>(timePointVariables.at(dep1Index), timePointVariables.at(dep2Index)));
663 andConstr.push_back(std::make_shared<IsLess>(timePointVariables.at(dep1Index), dependencyVariables.at(dep2Index)));
664 std::shared_ptr<SmtConstraint> betweenConstr1 = std::make_shared<And>(andConstr);
668 andConstr.push_back(std::make_shared<IsGreaterEqual>(timePointVariables.at(dep2Index), timePointVariables.at(dep1Index)));
669 andConstr.push_back(std::make_shared<IsLess>(timePointVariables.at(dep2Index), dependencyVariables.at(dep1Index)));
670 std::shared_ptr<SmtConstraint> betweenConstr2 = std::make_shared<And>(andConstr);
674 orConstr.push_back(betweenConstr1);
675 orConstr.push_back(betweenConstr2);
679 andConstr.push_back(std::make_shared<IsLess>(timePointVariables.at(dep1Index), dependencyVariables.at(dep1Index)));
680 andConstr.push_back(std::make_shared<IsLess>(timePointVariables.at(dep2Index), dependencyVariables.at(dep2Index)));
681 andConstr.push_back(std::make_shared<Or>(orConstr));
683 std::shared_ptr<SmtConstraint> checkConstr = std::make_shared<And>(andConstr);
685 std::shared_ptr<storm::expressions::ExpressionManager> manager = solver->getManager().getSharedPointer();
687 solver->add(checkConstr->toExpression(varNames, manager));