diff --git a/prism/src/explicit/DTMCModelChecker.java b/prism/src/explicit/DTMCModelChecker.java index 31f6df88..20845e4a 100644 --- a/prism/src/explicit/DTMCModelChecker.java +++ b/prism/src/explicit/DTMCModelChecker.java @@ -82,6 +82,41 @@ public class DTMCModelChecker extends ProbModelChecker // Model checking functions + @Override + protected StateValues checkProbPathFormulaSimple(Model model, Expression expr, MinMax minMax, BitSet statesOfInterest) throws PrismException + { + expr = Expression.convertSimplePathFormulaToCanonicalForm(expr); + ExpressionTemporal exprTemp = Expression.getTemporalOperatorForSimplePathFormula(expr); + + if (model.getModelType() == ModelType.DTMC && + (exprTemp.getBounds().hasRewardBounds() || + exprTemp.getBounds().countTimeBoundsDiscrete() > 1)) { + // We have a DTMC and reward bounds or multiple time / step bounds + // transform model and expression and recurse + + List boundsToReplace = exprTemp.getBounds().getStepBoundsForDiscreteTime(); + if (!boundsToReplace.isEmpty()) { + // exempt first time bound, is handled by standard simple path formula procedure + boundsToReplace.remove(0); + } + boundsToReplace.addAll(exprTemp.getBounds().getRewardBounds()); + + ModelExpressionTransformation transformed = + CounterTransformation.replaceBoundsWithCounters(this, (DTMC) model, expr, boundsToReplace, statesOfInterest); + mainLog.println("\nPerforming actual calculations for\n"); + mainLog.println("DTMC "+transformed.getTransformedModel().infoString()); + mainLog.println("Formula: "+transformed.getTransformedExpression() +"\n"); + + // We can now delegate to ProbModelChecker.checkProbPathFormulaSimple as there is + // at most one time / step bound remaining + StateValues svTransformed = super.checkProbPathFormulaSimple(transformed.getTransformedModel(), transformed.getTransformedExpression(), minMax, transformed.getTransformedStatesOfInterest()); + return transformed.projectToOriginalModel(svTransformed); + } else { + // We are fine, delegate to ProbModelChecker.checkProbPathFormulaSimple + return super.checkProbPathFormulaSimple(model, expr, minMax, statesOfInterest); + } + } + @Override protected StateValues checkProbPathFormulaLTL(Model model, Expression expr, boolean qual, MinMax minMax, BitSet statesOfInterest) throws PrismException {