private static void ExportCid(NestedMarkovDecisionProcess nmdp, TextWriter sb, string fromNode, long currentCid) { NestedMarkovDecisionProcess.ContinuationGraphElement cge = nmdp.GetContinuationGraphElement(currentCid); if (cge.IsChoiceTypeUnsplitOrFinal) { var cgl = nmdp.GetContinuationGraphLeaf(currentCid); sb.WriteLine($" {fromNode} -> {cgl.ToState} [label=\"{Probability.PrettyPrint(cgl.Probability)}\"];"); } else if (cge.IsChoiceTypeDeterministic) { // only forward node (no recursion) var cgi = nmdp.GetContinuationGraphInnerNode(currentCid); var toNode = $"cid{cgi.ToCid}"; sb.WriteLine($" {fromNode}->{toNode} [ style =\"dashed\"];"); } else { var cgi = nmdp.GetContinuationGraphInnerNode(currentCid); var arrowhead = "normal"; if (cge.IsChoiceTypeProbabilitstic) { arrowhead = "onormal"; } for (var i = cgi.FromCid; i <= cgi.ToCid; i++) { var toNode = $"cid{i}"; sb.WriteLine($" {toNode} [ shape=point,width=0.1,height=0.1,label=\"\" ];"); sb.WriteLine($" {fromNode}->{toNode} [ arrowhead =\"{arrowhead}\"];"); ExportCid(nmdp, sb, toNode, i); } } }
private double CalculateMinimumProbabilityOfCid(double[] stateProbabilities, long currentCid) { NestedMarkovDecisionProcess.ContinuationGraphElement cge = Nmdp.GetContinuationGraphElement(currentCid); if (cge.IsChoiceTypeUnsplitOrFinal) { var cgl = Nmdp.GetContinuationGraphLeaf(currentCid); var transitionProbability = cgl.Probability; var targetStateProbability = stateProbabilities[cgl.ToState]; var probabilityToSatisfyStateWithThisTransition = transitionProbability * targetStateProbability; return(probabilityToSatisfyStateWithThisTransition); } else { var cgi = Nmdp.GetContinuationGraphInnerNode(currentCid); if (cge.IsChoiceTypeDeterministic) { return(CalculateMinimumProbabilityOfCid(stateProbabilities, cgi.FromCid)); } if (cge.IsChoiceTypeNondeterministic) { var smallest = double.PositiveInfinity; for (var i = cgi.FromCid; i <= cgi.ToCid; i++) { var resultOfChild = CalculateMinimumProbabilityOfCid(stateProbabilities, i); if (resultOfChild < smallest) { smallest = resultOfChild; } } return(smallest); } else if (cge.IsChoiceTypeProbabilitstic) { var sum = 0.0; for (var i = cgi.FromCid; i <= cgi.ToCid; i++) { var resultOfChild = CalculateMinimumProbabilityOfCid(stateProbabilities, i); sum += resultOfChild; } return(sum); } } return(double.NaN); }