private double CalculateMaximumProbabilityOfCid(AutoResizeBigVector <double> cache, PrecalculatedTransitionTarget[] precalculatedTransitionTargets, double[] stateProbabilities, long currentCid) { if (cache != null && HasCacheEntry(cache, currentCid)) { return(cache[(int)currentCid]); } var result = double.NaN; LabeledTransitionMarkovDecisionProcess.ContinuationGraphElement cge = Ltmdp.GetContinuationGraphElement(currentCid); if (cge.IsChoiceTypeUnsplitOrFinal) { var transitionTargetPosition = cge.To; var transitionTarget = Ltmdp.GetTransitionTarget(transitionTargetPosition); if (precalculatedTransitionTargets[transitionTargetPosition].HasFlag(PrecalculatedTransitionTarget.Satisfied)) { result = 1.0; } else if (precalculatedTransitionTargets[transitionTargetPosition].HasFlag(PrecalculatedTransitionTarget.Excluded)) { result = 0.0; } else { result = stateProbabilities[transitionTarget.TargetState]; } } else { if (cge.IsChoiceTypeForward) { // Note, cgi.Probability is used in the branch "else if (cge.IsChoiceTypeProbabilitstic)" result = CalculateMaximumProbabilityOfCid(cache, precalculatedTransitionTargets, stateProbabilities, cge.From); } if (cge.IsChoiceTypeNondeterministic) { var biggest = double.NegativeInfinity; for (var i = cge.From; i <= cge.To; i++) { var resultOfChild = CalculateMaximumProbabilityOfCid(cache, precalculatedTransitionTargets, stateProbabilities, i); if (resultOfChild > biggest) { biggest = resultOfChild; } } result = biggest; } else if (cge.IsChoiceTypeProbabilitstic) { var sum = 0.0; for (var i = cge.From; i <= cge.To; i++) { var transitionProbability = Ltmdp.GetContinuationGraphElement(i).Probability; var resultOfChild = CalculateMaximumProbabilityOfCid(cache, precalculatedTransitionTargets, stateProbabilities, i); sum += transitionProbability * resultOfChild; } result = sum; } } if (cache != null) { cache[(int)currentCid] = result; } return(result); }
private static void ExportCid(LabeledTransitionMarkovDecisionProcess ltmdp, TextWriter sb, string fromNode, bool fromProbabilistic, long currentCid) { LabeledTransitionMarkovDecisionProcess.ContinuationGraphElement choice = ltmdp.GetContinuationGraphElement(currentCid); if (choice.IsChoiceTypeUnsplitOrFinal) { var thisNode = $"cid{currentCid}"; sb.WriteLine($" {thisNode} [ shape=point,width=0.1,height=0.1,label=\"\" ];"); if (fromProbabilistic) { sb.WriteLine($" {fromNode}->{thisNode} [ arrowhead =\"onormal\", label=\"{choice.Probability.ToString(CultureInfo.InvariantCulture)}\"];"); } else { sb.WriteLine($" {fromNode}->{thisNode} [ arrowhead =\"normal\"];"); } var transitionTarget = ltmdp.GetTransitionTarget(choice.To); sb.Write($" {thisNode} -> {transitionTarget.TargetState} [ arrowhead =\"normal\","); sb.Write("label=\""); for (int i = 0; i < ltmdp.StateFormulaLabels.Length; i++) { if (i > 0) { sb.Write(","); } if (transitionTarget.Formulas[i]) { sb.Write("t"); } else { sb.Write("f"); } } sb.WriteLine("\"];"); } else if (choice.IsChoiceTypeForward) { // only forward node (no recursion) // do not print thisNode var toNode = $"cid{choice.To}"; sb.WriteLine($" {fromNode}->{toNode} [ style =\"dashed\", label=\"{choice.Probability.ToString(CultureInfo.InvariantCulture)}\"];"); } else { // we print how we came to this node var thisNode = $"cid{currentCid}"; sb.WriteLine($" {thisNode} [ shape=point,width=0.1,height=0.1,label=\"\" ];"); if (fromProbabilistic) { sb.WriteLine($" {fromNode}->{thisNode} [ arrowhead =\"onormal\", label=\"{choice.Probability.ToString(CultureInfo.InvariantCulture)}\"];"); } else { sb.WriteLine($" {fromNode}->{thisNode} [ arrowhead =\"normal\"];"); } for (var i = choice.From; i <= choice.To; i++) { ExportCid(ltmdp, sb, thisNode, choice.IsChoiceTypeProbabilitstic, i); } } }