16namespace modelchecker {
22uint64_t DFTASFChecker::getClaimVariableIndex(uint64_t spare, uint64_t child)
const {
27 std::vector<uint64_t> beVariables;
28 uint64_t failedBeVariables;
29 std::vector<uint64_t> failsafeBeVariables;
30 bool failedBeIsSet =
false;
31 notFailed = dft.nrBasicElements() + 1;
34 for (
size_t i = 0; i < dft.nrElements(); ++i) {
35 std::shared_ptr<storm::dft::storage::elements::DFTElement<ValueType>
const> element = dft.getElement(i);
36 varNames.push_back(
"t_" + element->name());
37 timePointVariables.emplace(i, varNames.size() - 1);
38 switch (element->type()) {
40 auto be = std::static_pointer_cast<storm::dft::storage::elements::DFTBE<double>
const>(element);
41 switch (be->beType()) {
43 beVariables.push_back(varNames.size() - 1);
46 STORM_LOG_WARN(
"Constant BEs are only experimentally supported in the SMT encoding");
48 auto be = std::static_pointer_cast<storm::dft::storage::elements::BEConst<double>
const>(element);
50 STORM_LOG_THROW(!failedBeIsSet, storm::exceptions::NotSupportedException,
51 "DFTs containing more than one constantly failed BE are not supported");
52 notFailed = dft.nrBasicElements();
53 failedBeVariables = varNames.size() - 1;
56 failsafeBeVariables.push_back(varNames.size() - 1);
61 STORM_LOG_THROW(
false, storm::exceptions::NotImplementedException,
"BE type '" << be->beType() <<
"' not known.");
67 auto spare = std::static_pointer_cast<storm::dft::storage::elements::DFTSpare<double>
const>(element);
68 for (
auto const &spareChild : spare->children()) {
69 varNames.push_back(
"c_" + element->name() +
"_" + spareChild->name());
70 claimVariables.emplace(
SpareAndChildPair(element->id(), spareChild->id()), varNames.size() - 1);
75 varNames.push_back(
"dep_" + element->name());
76 dependencyVariables.emplace(element->id(), varNames.size() - 1);
84 for (
size_t i = 0; i < dft.nrBasicElements(); ++i) {
85 varNames.push_back(
"m_" + std::to_string(i));
86 markovianVariables.emplace(i, varNames.size() - 1);
92 for (
auto const &beV : beVariables) {
93 constraints.push_back(std::make_shared<BetweenValues>(beV, 1, notFailed - 1));
97 for (
auto const &beV : failsafeBeVariables) {
98 constraints.push_back(std::make_shared<BetweenValues>(beV, 1, notFailed));
103 constraints.push_back(std::make_shared<IsConstantValue>(failedBeVariables, 0));
106 std::vector<uint64_t> allBeVariables;
107 allBeVariables.insert(std::end(allBeVariables), std::begin(beVariables), std::end(beVariables));
108 allBeVariables.insert(std::end(allBeVariables), std::begin(failsafeBeVariables), std::end(failsafeBeVariables));
111 if (beVariables.size() > 1) {
112 constraints.push_back(std::make_shared<PairwiseDifferent>(beVariables));
113 constraints.back()->setDescription(
"No two BEs fail at the same time");
116 bool descFlag =
true;
117 for (
auto const &failsafeBe : failsafeBeVariables) {
118 std::vector<std::shared_ptr<SmtConstraint>> unequalConstraints;
119 for (
auto const &otherBe : allBeVariables) {
120 if (otherBe != failsafeBe) {
121 unequalConstraints.push_back(std::make_shared<IsUnequal>(failsafeBe, otherBe));
124 constraints.push_back(
125 std::make_shared<Implies>(std::make_shared<IsNotConstantValue>(failsafeBe, notFailed), std::make_shared<And>(unequalConstraints)));
127 constraints.back()->setDescription(
"Initially failsafe BEs don't fail at the same time as other BEs");
133 for (
auto const &claimVariable : claimVariables) {
134 constraints.push_back(std::make_shared<BetweenValues>(claimVariable.second, 0, notFailed));
138 for (
size_t i = 0; i < dft.nrElements(); ++i) {
139 std::shared_ptr<storm::dft::storage::elements::DFTElement<ValueType>
const> element = dft.getElement(i);
143 std::vector<uint64_t> childVarIndices;
144 if (element->isGate()) {
145 std::shared_ptr<storm::dft::storage::elements::DFTGate<ValueType>
const> gate = dft.getGate(i);
146 for (
auto const &child : gate->children()) {
147 childVarIndices.push_back(timePointVariables.at(child->id()));
151 switch (element->type()) {
156 generateAndConstraint(i, childVarIndices, element);
159 generateOrConstraint(i, childVarIndices, element);
162 generateVotConstraint(i, childVarIndices, element);
165 generatePandConstraint(i, childVarIndices, element);
168 generatePorConstraint(i, childVarIndices, element);
171 generateSeqConstraint(childVarIndices, element);
174 generateSpareConstraint(i, childVarIndices, element);
177 generatePdepConstraint(i, childVarIndices, element);
180 STORM_LOG_THROW(
false, storm::exceptions::NotSupportedException,
"SMT encoding for type '" << element->type() <<
"' is not supported.");
189 addMarkovianConstraints();
192 std::vector<std::shared_ptr<SmtConstraint>> failsafeNotIConstr;
193 for (uint64_t i = 0; i < dft.nrBasicElements(); ++i) {
194 failsafeNotIConstr.clear();
195 for (
auto const &beV : failsafeBeVariables) {
196 failsafeNotIConstr.push_back(std::make_shared<IsNotConstantValue>(beV, i + 1));
199 constraints.push_back(
200 std::make_shared<Implies>(std::make_shared<IsBoolValue>(markovianVariables.at(i),
true), std::make_shared<And>(failsafeNotIConstr)));
202 constraints.back()->setDescription(
"Failsafe BEs fail only if they are triggered");
207 std::vector<std::shared_ptr<SmtConstraint>> triggerConstraints;
208 for (
size_t i = 0; i < dft.nrElements(); ++i) {
209 std::shared_ptr<storm::dft::storage::elements::DFTElement<ValueType>
const> element = dft.getElement(i);
210 if (element->isBasicElement()) {
211 auto be = std::static_pointer_cast<storm::dft::storage::elements::DFTBE<double>
const>(element);
213 triggerConstraints.clear();
214 for (
auto const &dependency : be->ingoingDependencies()) {
215 triggerConstraints.push_back(std::make_shared<IsConstantValue>(timePointVariables.at(dependency->triggerEvent()->id()), notFailed));
217 if (!triggerConstraints.empty()) {
218 constraints.push_back(std::make_shared<Implies>(std::make_shared<IsConstantValue>(timePointVariables.at(be->id()), notFailed),
219 std::make_shared<And>(triggerConstraints)));
220 constraints.back()->setDescription(
"Failsafe BE " + be->name() +
" stays failsafe if no trigger fails");
229void DFTASFChecker::generateAndConstraint(
size_t i, std::vector<uint64_t> childVarIndices,
232 constraints.push_back(std::make_shared<IsMaximum>(timePointVariables.at(i), childVarIndices));
233 constraints.back()->setDescription(
"AND gate " + element->name());
236void DFTASFChecker::generateOrConstraint(
size_t i, std::vector<uint64_t> childVarIndices,
239 constraints.push_back(std::make_shared<IsMinimum>(timePointVariables.at(i), childVarIndices));
240 constraints.back()->setDescription(
"OR gate " + element->name());
243void DFTASFChecker::generateVotConstraint(
size_t i, std::vector<uint64_t> childVarIndices,
245 auto vot = std::static_pointer_cast<storm::dft::storage::elements::DFTVot<double>
const>(element);
247 std::vector<uint64_t> tmpVars;
253 std::vector<uint64_t> combinationChildren;
254 STORM_LOG_ASSERT(vot->nrChildren() < 64,
"Too many children of a VOT Gate.");
255 for (uint8_t j = 0; j < static_cast<uint8_t>(vot->nrChildren()); ++j) {
256 if (combination & (1ul << j)) {
257 combinationChildren.push_back(childVarIndices.at(j));
261 varNames.push_back(
"v_" + vot->name() +
"_" + std::to_string(k));
262 size_t index = varNames.size() - 1;
263 tmpVars.push_back(index);
264 tmpTimePointVariables.push_back(index);
266 constraints.push_back(std::make_shared<IsMaximum>(index, combinationChildren));
267 constraints.back()->setDescription(
"VOT gate " + element->name() +
": AND no. " + std::to_string(k));
271 }
while (combination < (1ul << vot->nrChildren()) && combination != 0);
274 constraints.push_back(std::make_shared<IsMinimum>(timePointVariables.at(i), tmpVars));
275 constraints.back()->setDescription(
"VOT gate " + element->name() +
": OR");
278void DFTASFChecker::generatePandConstraint(
size_t i, std::vector<uint64_t> childVarIndices,
281 std::shared_ptr<SmtConstraint> ifC = std::make_shared<Sorted>(childVarIndices);
282 std::shared_ptr<SmtConstraint> thenC = std::make_shared<IsEqual>(timePointVariables.at(i), childVarIndices.back());
283 std::shared_ptr<SmtConstraint> elseC = std::make_shared<IsConstantValue>(timePointVariables.at(i), notFailed);
284 constraints.push_back(std::make_shared<IfThenElse>(ifC, thenC, elseC));
285 constraints.back()->setDescription(
"PAND gate " + element->name());
288void DFTASFChecker::generatePorConstraint(
size_t i, std::vector<uint64_t> childVarIndices,
292 std::vector<std::shared_ptr<SmtConstraint>> firstSmallestC;
293 uint64_t timeFirstChild = childVarIndices.front();
294 for (uint64_t i = 1;
i < childVarIndices.size(); ++
i) {
295 firstSmallestC.push_back(std::make_shared<IsLess>(timeFirstChild, childVarIndices.at(i)));
297 std::shared_ptr<SmtConstraint> ifC = std::make_shared<And>(firstSmallestC);
298 std::shared_ptr<SmtConstraint> thenC = std::make_shared<IsEqual>(timePointVariables.at(i), childVarIndices.front());
299 std::shared_ptr<SmtConstraint> elseC = std::make_shared<IsConstantValue>(timePointVariables.at(i), notFailed);
300 constraints.push_back(std::make_shared<IfThenElse>(ifC, thenC, elseC));
301 constraints.back()->setDescription(
"POR gate " + element->name());
304void DFTASFChecker::generateSeqConstraint(std::vector<uint64_t> childVarIndices,
308 auto seq = std::static_pointer_cast<storm::dft::storage::elements::DFTRestriction<double>
const>(element);
309 for (
auto const &child : seq->children()) {
310 childVarIndices.push_back(timePointVariables.at(child->id()));
313 constraints.push_back(std::make_shared<Sorted>(childVarIndices));
314 constraints.back()->setDescription(
"SEQ gate " + element->name());
317void DFTASFChecker::generateSpareConstraint(
size_t i, std::vector<uint64_t> childVarIndices,
319 auto spare = std::static_pointer_cast<storm::dft::storage::elements::DFTSpare<double>
const>(element);
320 auto const &children = spare->children();
321 uint64_t firstChild = children.front()->id();
322 uint64_t lastChild = children.back()->id();
325 constraints.push_back(std::make_shared<IsConstantValue>(getClaimVariableIndex(spare->id(), firstChild), 0));
326 constraints.back()->setDescription(
"SPARE gate " + spare->name() +
" claims first child");
329 std::shared_ptr<SmtConstraint> leftC = std::make_shared<IsLess>(getClaimVariableIndex(spare->id(), lastChild), childVarIndices.back());
330 constraints.push_back(std::make_shared<Implies>(leftC, std::make_shared<IsEqual>(timePointVariables.at(i), childVarIndices.back())));
331 constraints.back()->setDescription(
"Last child & claimed -> SPARE fails");
335 for (uint64_t currChild = 0; currChild < children.size() - 1; ++currChild) {
336 uint64_t timeCurrChild = childVarIndices.at(currChild);
338 std::shared_ptr<SmtConstraint> tryClaimC = generateTryToClaimConstraint(spare, currChild + 1, timeCurrChild);
339 constraints.push_back(
340 std::make_shared<Iff>(std::make_shared<IsLess>(getClaimVariableIndex(spare->id(), children.at(currChild)->id()), timeCurrChild), tryClaimC));
341 constraints.back()->setDescription(
"Try to claim " + std::to_string(currChild + 2) +
"th child");
346 uint64_t childIndex, uint64_t timepoint)
const {
347 auto child = spare->children().at(childIndex);
348 uint64_t timeChild = timePointVariables.at(child->id());
349 uint64_t claimChild = getClaimVariableIndex(spare->id(), child->id());
351 std::vector<std::shared_ptr<SmtConstraint>> noClaimingPossible;
353 if (childIndex + 1 < spare->children().size()) {
355 noClaimingPossible.push_back(generateTryToClaimConstraint(spare, childIndex + 1, timepoint));
358 noClaimingPossible.push_back(std::make_shared<IsEqual>(timePointVariables.at(spare->id()), timepoint));
360 std::shared_ptr<SmtConstraint> elseCaseC = std::make_shared<And>(noClaimingPossible);
363 std::vector<std::shared_ptr<SmtConstraint>> claimingPossibleC;
365 claimingPossibleC.push_back(std::make_shared<IsLess>(timepoint, timeChild));
367 for (
auto const &otherSpare : child->parents()) {
368 if (otherSpare->id() == spare->id()) {
372 claimingPossibleC.push_back(std::make_shared<IsLess>(timepoint, getClaimVariableIndex(otherSpare->id(), child->id())));
376 std::shared_ptr<SmtConstraint> firstCaseC =
377 std::make_shared<IfThenElse>(std::make_shared<And>(claimingPossibleC), std::make_shared<IsEqual>(claimChild, timepoint), elseCaseC);
381void DFTASFChecker::addClaimingConstraints() {
384 for (
size_t i = 0;
i < dft.nrElements(); ++
i) {
385 std::shared_ptr<storm::dft::storage::elements::DFTElement<ValueType>
const> element = dft.getElement(i);
386 if (element->isSpareGate()) {
387 auto spare = std::static_pointer_cast<storm::dft::storage::elements::DFTSpare<double>
const>(element);
388 for (
auto const &child : spare->children()) {
389 std::vector<std::shared_ptr<SmtConstraint>> additionalC;
390 uint64_t timeClaiming = getClaimVariableIndex(spare->id(), child->id());
391 std::shared_ptr<SmtConstraint> leftC = std::make_shared<IsLessConstant>(timeClaiming, notFailed);
393 additionalC.push_back(std::make_shared<IsLess>(timeClaiming, timePointVariables.at(child->id())));
395 for (
auto const &parent : child->parents()) {
396 if (parent->isSpareGate() && parent->id() != spare->id()) {
398 additionalC.push_back(std::make_shared<IsConstantValue>(getClaimVariableIndex(parent->id(), child->id()), notFailed));
401 constraints.push_back(std::make_shared<Implies>(leftC, std::make_shared<And>(additionalC)));
402 constraints.back()->setDescription(
"Child " + child->name() +
" must be operational at time of claiming by spare " + spare->name() +
403 " and can only be claimed by one spare.");
409void DFTASFChecker::generatePdepConstraint(
size_t i, std::vector<uint64_t> childVarIndices,
411 auto dependency = std::static_pointer_cast<storm::dft::storage::elements::DFTDependency<double>
const>(element);
412 auto const &dependentEvents = dependency->dependentEvents();
413 auto const &trigger = dependency->triggerEvent();
414 std::vector<uint64_t> dependentIndices;
415 for (
size_t j = 0; j < dependentEvents.size(); ++j) {
416 dependentIndices.push_back(timePointVariables.at(dependentEvents[j]->id()));
419 constraints.push_back(std::make_shared<IsMaximum>(dependencyVariables.at(i), dependentIndices));
420 constraints.back()->setDescription(
"Dependency " + element->name() +
": Last element");
421 constraints.push_back(std::make_shared<IsEqual>(timePointVariables.at(i), timePointVariables.at(trigger->id())));
422 constraints.back()->setDescription(
"Dependency " + element->name() +
": Trigger element");
425void DFTASFChecker::addMarkovianConstraints() {
426 uint64_t nrMarkovian = dft.nrBasicElements();
427 std::set<size_t> depElements;
429 std::vector<std::vector<std::shared_ptr<SmtConstraint>>> markovianC(nrMarkovian);
430 std::vector<std::vector<std::shared_ptr<SmtConstraint>>> nonMarkovianC(nrMarkovian);
431 std::vector<std::vector<std::shared_ptr<SmtConstraint>>> notColdC(nrMarkovian);
434 for (
size_t j = 0; j < dft.nrElements(); ++j) {
435 std::shared_ptr<storm::dft::storage::elements::DFTElement<ValueType>
const> element = dft.getElement(j);
436 if (element->hasOutgoingDependencies()) {
437 for (uint64_t i = 0;
i < nrMarkovian; ++
i) {
438 std::shared_ptr<SmtConstraint> triggerFailed = std::make_shared<IsLessEqualConstant>(timePointVariables.at(j), i);
439 std::vector<std::shared_ptr<SmtConstraint>> depFailed;
440 for (
auto const &dependency : element->outgoingDependencies()) {
441 for (
auto const &depElement : dependency->dependentEvents()) {
442 depFailed.push_back(std::make_shared<IsLessEqualConstant>(timePointVariables.at(depElement->id()), i));
445 markovianC[
i].push_back(std::make_shared<Implies>(triggerFailed, std::make_shared<And>(depFailed)));
449 for (uint64_t i = 0;
i < nrMarkovian; ++
i) {
450 constraints.push_back(std::make_shared<Iff>(std::make_shared<IsBoolValue>(markovianVariables.at(i),
true), std::make_shared<And>(markovianC[i])));
451 constraints.back()->setDescription(
"Markovian (" + std::to_string(i) +
") iff all dependent events which trigger failed also failed.");
455 for (
size_t j = 0; j < dft.nrElements(); ++j) {
456 std::shared_ptr<storm::dft::storage::elements::DFTElement<ValueType>
const> element = dft.getElement(j);
457 if (element->isBasicElement()) {
458 auto be = std::static_pointer_cast<storm::dft::storage::elements::DFTBE<double>
const>(element);
460 if (be->hasIngoingDependencies()) {
461 depElements.emplace(j);
462 for (uint64_t i = 0;
i < nrMarkovian - 1; ++
i) {
463 std::shared_ptr<SmtConstraint> nextFailure = std::make_shared<IsConstantValue>(timePointVariables.at(j), i + 1);
464 std::vector<std::shared_ptr<SmtConstraint>> triggerFailed;
465 for (
auto const &dependency : be->ingoingDependencies()) {
466 triggerFailed.push_back(std::make_shared<IsLessEqualConstant>(timePointVariables.at(dependency->triggerEvent()->id()), i));
468 nonMarkovianC[
i].push_back(std::make_shared<Implies>(nextFailure, std::make_shared<Or>(triggerFailed)));
473 for (uint64_t i = 0;
i < nrMarkovian; ++
i) {
474 std::vector<std::shared_ptr<SmtConstraint>> dependentConstr;
475 for (
auto dependentEvent : depElements) {
476 std::shared_ptr<SmtConstraint> nextFailure = std::make_shared<IsConstantValue>(timePointVariables.at(dependentEvent), i + 1);
477 dependentConstr.push_back(nextFailure);
480 nonMarkovianC[
i].push_back(std::make_shared<Or>(dependentConstr));
481 constraints.push_back(
482 std::make_shared<Implies>(std::make_shared<IsBoolValue>(markovianVariables.at(i),
false), std::make_shared<And>(nonMarkovianC[i])));
483 constraints.back()->setDescription(
"Non-Markovian (" + std::to_string(i) +
") -> next failure is dependent BE.");
487 for (
size_t j = 0; j < dft.nrElements(); ++j) {
488 std::shared_ptr<storm::dft::storage::elements::DFTElement<ValueType>
const> element = dft.getElement(j);
489 if (element->isBasicElement()) {
490 auto be = std::static_pointer_cast<storm::dft::storage::elements::DFTBE<double>
const>(element);
491 for (uint64_t i = 0;
i < nrMarkovian; ++
i) {
492 std::shared_ptr<SmtConstraint> nextFailure = std::make_shared<IsConstantValue>(timePointVariables.at(j), i + 1);
495 notColdC[
i].push_back(std::make_shared<Implies>(nextFailure, std::make_shared<IsTrue>(be->canFail())));
499 for (uint64_t i = 0;
i < nrMarkovian; ++
i) {
500 constraints.push_back(std::make_shared<Implies>(std::make_shared<IsBoolValue>(markovianVariables.at(i),
true), std::make_shared<And>(notColdC[i])));
501 constraints.back()->setDescription(
"Markovian (" + std::to_string(i) +
") -> positive failure rate.");
506 std::ofstream stream;
508 stream <<
"; time point variables\n";
509 for (
auto const &timeVarEntry : timePointVariables) {
510 stream <<
"(declare-fun " << varNames[timeVarEntry.second] <<
"() Int)\n";
512 stream <<
"; claim variables\n";
513 for (
auto const &claimVarEntry : claimVariables) {
514 stream <<
"(declare-fun " << varNames[claimVarEntry.second] <<
"() Int)\n";
516 stream <<
"; Markovian variables\n";
517 for (
auto const &markovianVarEntry : markovianVariables) {
518 stream <<
"(declare-fun " << varNames[markovianVarEntry.second] <<
"() Bool)\n";
520 stream <<
"; Dependency variables\n";
521 for (
auto const &depVarEntry : dependencyVariables) {
522 stream <<
"(declare-fun " << varNames[depVarEntry.second] <<
"() Int)\n";
524 if (!tmpTimePointVariables.empty()) {
525 stream <<
"; Temporary variables\n";
526 for (
auto const &tmpVar : tmpTimePointVariables) {
527 stream <<
"(declare-fun " << varNames[tmpVar] <<
"() Int)\n";
530 for (
auto const &constraint : constraints) {
531 if (!constraint->description().empty()) {
532 stream <<
"; " << constraint->description() <<
'\n';
534 stream <<
"(assert " << constraint->toSmtlib2(varNames) <<
")\n";
536 stream <<
"(check-sat)\n";
547 for (
auto const &timeVarEntry : timePointVariables) {
548 manager->declareIntegerVariable(varNames[timeVarEntry.second]);
550 for (
auto const &claimVarEntry : claimVariables) {
551 manager->declareIntegerVariable(varNames[claimVarEntry.second]);
553 for (
auto const &markovianVarEntry : markovianVariables) {
554 manager->declareBooleanVariable(varNames[markovianVarEntry.second]);
556 if (!tmpTimePointVariables.empty()) {
557 for (
auto const &tmpVar : tmpTimePointVariables) {
558 manager->declareIntegerVariable(varNames[tmpVar]);
561 for (
auto const &depVarEntry : dependencyVariables) {
562 manager->declareIntegerVariable(varNames[depVarEntry.second]);
565 for (
auto const &constraint : constraints) {
566 solver->add(constraint->toExpression(varNames, manager));
571 STORM_LOG_ASSERT(solver,
"SMT Solver was not initialized, call toSolver() before checking queries");
576 std::shared_ptr<SmtConstraint> tleFailedConstr = std::make_shared<IsConstantValue>(timePointVariables.at(dft.getTopLevelIndex()), bound);
577 std::shared_ptr<storm::expressions::ExpressionManager> manager = solver->getManager().getSharedPointer();
578 solver->add(tleFailedConstr->toExpression(varNames, manager));
585 STORM_LOG_ASSERT(solver,
"SMT Solver was not initialized, call toSolver() before checking queries");
590 std::shared_ptr<SmtConstraint> tleNeverFailedConstr = std::make_shared<IsLessEqualConstant>(timePointVariables.at(dft.getTopLevelIndex()), bound);
591 std::shared_ptr<storm::expressions::ExpressionManager> manager = solver->getManager().getSharedPointer();
592 solver->add(tleNeverFailedConstr->toExpression(varNames, manager));
599 STORM_LOG_ASSERT(solver,
"SMT Solver was not initialized, timeout cannot be set");
600 solver->setTimeout(milliseconds);
604 STORM_LOG_ASSERT(solver,
"SMT Solver was not initialized, timeout cannot be unset");
605 solver->unsetTimeout();
609 STORM_LOG_ASSERT(solver,
"SMT Solver was not initialized, call toSolver() before checking queries");
614 STORM_LOG_ASSERT(solver,
"SMT Solver was not initialized, call toSolver() before checking queries");
615 std::vector<uint64_t> markovianIndices;
616 checkbound = std::min<int>(checkbound, markovianVariables.size());
618 for (uint64_t i = 0; i < checkbound; ++i) {
619 markovianIndices.push_back(markovianVariables.at(i));
624 std::shared_ptr<SmtConstraint> tleFailedConstr = std::make_shared<IsLessEqualConstant>(timePointVariables.at(dft.getTopLevelIndex()), checkbound);
625 std::shared_ptr<storm::expressions::ExpressionManager> manager = solver->getManager().getSharedPointer();
626 solver->add(tleFailedConstr->toExpression(varNames, manager));
628 std::shared_ptr<SmtConstraint> nonMarkovianConstr = std::make_shared<FalseCountIsEqualConstant>(markovianIndices, nrNonMarkovian);
629 solver->add(nonMarkovianConstr->toExpression(varNames, manager));
636 STORM_LOG_ASSERT(solver,
"SMT Solver was not initialized, call toSolver() before checking queries");
637 std::vector<uint64_t> markovianIndices;
638 timepoint = std::min<int>(timepoint, markovianVariables.size());
640 for (uint64_t i = 0; i < timepoint; ++i) {
641 markovianIndices.push_back(markovianVariables.at(i));
646 std::shared_ptr<SmtConstraint> tleFailedConstr = std::make_shared<IsConstantValue>(timePointVariables.at(dft.getTopLevelIndex()), timepoint);
647 std::shared_ptr<storm::expressions::ExpressionManager> manager = solver->getManager().getSharedPointer();
648 solver->add(tleFailedConstr->toExpression(varNames, manager));
650 std::shared_ptr<SmtConstraint> nonMarkovianConstr = std::make_shared<FalseCountIsEqualConstant>(markovianIndices, nrNonMarkovian);
651 solver->add(nonMarkovianConstr->toExpression(varNames, manager));
658 std::vector<std::shared_ptr<SmtConstraint>> andConstr;
659 std::vector<std::shared_ptr<SmtConstraint>> orConstr;
660 STORM_LOG_DEBUG(
"Check " << dft.getElement(dep1Index)->name() <<
" and " << dft.getElement(dep2Index)->name());
663 andConstr.push_back(std::make_shared<IsLessEqual>(timePointVariables.at(dep2Index), timePointVariables.at(dep1Index)));
664 andConstr.push_back(std::make_shared<IsLess>(timePointVariables.at(dep1Index), dependencyVariables.at(dep2Index)));
665 std::shared_ptr<SmtConstraint> betweenConstr1 = std::make_shared<And>(andConstr);
669 andConstr.push_back(std::make_shared<IsLessEqual>(timePointVariables.at(dep1Index), timePointVariables.at(dep2Index)));
670 andConstr.push_back(std::make_shared<IsLess>(timePointVariables.at(dep2Index), dependencyVariables.at(dep1Index)));
671 std::shared_ptr<SmtConstraint> betweenConstr2 = std::make_shared<And>(andConstr);
675 orConstr.push_back(betweenConstr1);
676 orConstr.push_back(betweenConstr2);
680 andConstr.push_back(std::make_shared<IsLess>(timePointVariables.at(dep1Index), dependencyVariables.at(dep1Index)));
681 andConstr.push_back(std::make_shared<IsLess>(timePointVariables.at(dep2Index), dependencyVariables.at(dep2Index)));
682 andConstr.push_back(std::make_shared<Or>(orConstr));
684 std::shared_ptr<SmtConstraint> checkConstr = std::make_shared<And>(andConstr);
686 std::shared_ptr<storm::expressions::ExpressionManager> manager = solver->getManager().getSharedPointer();
688 solver->add(checkConstr->toExpression(varNames, manager));