示例#1
0
            private void AddNodesOfContinuationId(long continuationId)
            {
                var choice = _ltmdp.GetContinuationGraphElement(continuationId);

                var cidNode = CidToNodeIndex(continuationId);

                if (choice.IsChoiceTypeUnsplitOrFinal)
                {
                    var transitionTargetIndex = choice.To;
                    var transitionTargetNode  = TransitionTargetToNodeIndex(transitionTargetIndex);
                    _baseGraph.AddVerticesAndEdge(new Edge <EdgeType>(cidNode, transitionTargetNode, EdgeType.Deterministic));
                    return;
                }
                if (choice.IsChoiceTypeForward)
                {
                    // no recursive descent here
                    var forwardToCid     = choice.To;
                    var forwardToCidNode = CidToNodeIndex(forwardToCid);
                    _baseGraph.AddVerticesAndEdge(new Edge <EdgeType>(cidNode, forwardToCidNode, EdgeType.Deterministic));
                    return;
                }

                // Assume that no child has probability of 0
                var type = choice.IsChoiceTypeProbabilitstic ? EdgeType.Probabilistic:EdgeType.NonDeterministic;

                for (var childCid = choice.From; childCid <= choice.To; childCid++)
                {
                    var childCidNode = CidToNodeIndex(childCid);
                    _baseGraph.AddVerticesAndEdge(new Edge <EdgeType>(cidNode, childCidNode, type));
                    AddNodesOfContinuationId(childCid);
                }
            }
示例#2
0
        private void AddNodesOfContinuationId(long continuationId, long locationForContinuationGraphElement)
        {
            BufferCidMapping(continuationId, locationForContinuationGraphElement);

            var choice = _ltmdp.GetContinuationGraphElement(continuationId);

            if (choice.IsChoiceTypeUnsplitOrFinal)
            {
                Assert.That(choice.To <= int.MaxValue, "choice.To must be smaller than int.MaxValue");

                var transitionTarget = _ltmdp.GetTransitionTarget((int)choice.To);
                var targetEntry      = new StateStorageEntry(transitionTarget.Formulas, transitionTarget.TargetState);
                var targetState      = _mapper[targetEntry];

                NestedMarkovDecisionProcess.AddContinuationGraphLeaf(locationForContinuationGraphElement, targetState, choice.Probability);
                return;
            }
            if (choice.IsChoiceTypeForward)
            {
                // no recursive descent here
                var bufferedTargetCid = GetBufferedNmdpCid(choice.To);
                NestedMarkovDecisionProcess.AddContinuationGraphInnerNode(locationForContinuationGraphElement, choice.ChoiceType, bufferedTargetCid, bufferedTargetCid, choice.Probability);
                return;
            }

            var offsetTo         = choice.To - choice.From;
            var numberOfChildren = offsetTo + 1;

            var placesForChildren = NestedMarkovDecisionProcess.GetPlaceForNewContinuationGraphElements(numberOfChildren);

            NestedMarkovDecisionProcess.AddContinuationGraphInnerNode(locationForContinuationGraphElement, choice.ChoiceType, placesForChildren, placesForChildren + offsetTo, choice.Probability);

            for (var currentChildNo = 0; currentChildNo < numberOfChildren; currentChildNo++)
            {
                var originalContinuationId = choice.From + currentChildNo;
                var newLocation            = placesForChildren + currentChildNo;
                AddNodesOfContinuationId(originalContinuationId, newLocation);
            }
        }
示例#3
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);
                }
            }
        }