Beispiel #1
0
        //internal double[] GetDistancesToAcceptingStates(int[] sources,int[] acceptingStates)
        internal double[] GetDistancesToAcceptingStates(int[] acceptingStates)
        {
            if (MustEdges == null)
            {
                return(null);
            }


            //calculate distances from accepting states
            //by running shortest paths on the reversed graph
            Edge[] reversedEdges = new Edge[MustEdges.Length];

            for (int i = 0; i < reversedEdges.Length; i++)
            {
                Edge l = MustEdges[i];
                reversedEdges[i] = new Edge(l.target, l.source, l.label, l.weight);
            }

            BasicGraph basicGraph = new BasicGraph(0, reversedEdges);

            MultipleSourcesShortestPaths mssp = new MultipleSourcesShortestPaths(basicGraph, acceptingStates);

            mssp.Calculate();
            double[] exps = new double[NumberOfVertices];
            for (int i = 0; i < NumberOfVertices; i++)
            {
                exps[i] = mssp.GetDistTo(i);
            }


            return(exps);
        }
        /// <summary>
        /// Returns a strategy to reach targets from a vertex.
        /// </summary>
        /// <param name="vertex"></param>
        /// <returns></returns>
        internal Strategy[] GetStrategyReachableFromVertex(int vertex)
        {
            Strategy [] strategies = this.GetStrategies();



            if (VertIsNondet(vertex))
            {
                throw new ArgumentException("vertex is a choice point");
            }

            //ArrayList links=new ArrayList();


            HSet linkSet = new HSet();

            foreach (Strategy s in strategies)
            {
                if (s.edge != null)
                {
                    linkSet.Insert(s.edge);

                    if (VertIsNondet(s.edge.target))
                    {
                        foreach (Edge l in graph.EdgesAtVertex(s.edge.target))
                        {
                            linkSet.Insert(l);
                        }
                    }
                }
            }



            BasicGraph bg = new BasicGraph(0, linkSet.ToArray(typeof(Edge)));

            bool [] reachables = bg.GetReachableArray(vertex);

            for (int i = 0; i < reachables.Length; i++)
            {
                if (reachables[i] == false)
                {
                    strategies[i].edge = null;
                }
            }


            return(strategies);
        }