Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
                }
            }
        }