コード例 #1
0
ファイル: Edge.cs プロジェクト: barentswatch/NetTopologySuite
 /// <summary>
 /// Initializes this Edge's two DirectedEdges, and for each DirectedEdge: sets the
 /// Edge, sets the symmetric DirectedEdge, and adds this Edge to its from-Node.
 /// </summary>
 /// <param name="de0"></param>
 /// <param name="de1"></param>
 public void SetDirectedEdges(DirectedEdge de0, DirectedEdge de1)
 {
     dirEdge = new[] { de0, de1, };
     de0.Edge = this;
     de1.Edge = this;
     de0.Sym = de1;
     de1.Sym = de0;
     de0.FromNode.AddOutEdge(de0);
     de1.FromNode.AddOutEdge(de1);
 }
コード例 #2
0
        public void AddEdge(int v, int w,double weight)
        {
            DirectedEdge e1 = new DirectedEdge (v,w,weight);

            if (dictionary [v] == null) {
                dictionary [v] = new HashSet<DirectedEdge> (){ e1 };
            }
            else {
                dictionary [v].Add (e1);
            }
        }
コード例 #3
0
        public virtual void AddEdge(DirectedEdge edge)
        {
            edgeCount++;
            int from = edge.From;
            if (adjacents[from] == null)
            {
                adjacents[from] = new List<DirectedEdge>();
            }

            adjacents[from].Add(edge);
        }
コード例 #4
0
 /// <summary>
 /// Initializes an empty edge-weighted digraph with <tt>V</tt> vertices and 0 edges.
 /// </summary>
 /// <param name="v">V the number of vertices</param>
 /// <exception cref="ArgumentException">if <tt>V</tt> &lt; 0</exception>
 public AdjMatrixEdgeWeightedDigraph(int v)
 {
     if (v < 0) throw new ArgumentException("Number of vertices must be nonnegative");
     V = v;
     E = 0;
     _adj = new DirectedEdge[v][];
     for (var i = 0; i < v; i++)
     {
         _adj[i] = new DirectedEdge[v];
     }
 }
コード例 #5
0
ファイル: EdgeWorker.cs プロジェクト: vladdnc/Algorithms-NET
 public void Run()
 {
     var eu = new EdgeU(100, 50);
     var ed = new EdgeD(22, 11);
     var ew = new EdgeW(12, 34, 5.67);
     var dew = new DirectedEdge(12, 34, 5.67);
     Console.WriteLine(eu);
     Console.WriteLine(ed);
     Console.WriteLine(ew);
     Console.WriteLine(dew);
     Console.ReadLine();
 }
コード例 #6
0
 private void write_edges_with_shapeids(IList<VA.Shapes.Connections.ConnectorEdge> edges)
 {
     foreach (var edge in edges)
     {
         var e = new DirectedEdge(
             edge.From.ID,
             edge.To.ID,
             edge.Connector.ID
             );
         this.WriteObject(e);
     }
 }
コード例 #7
0
 /// <summary>
 /// Initializes a random edge-weighted digraph with <tt>V</tt> vertices and <em>E</em> edges.
 /// </summary>
 /// <param name="v">V the number of vertices</param>
 /// <param name="e">E the number of edges</param>
 /// <exception cref="ArgumentException">if <tt>V</tt> &lt; 0</exception>
 /// <exception cref="ArgumentException">if <tt>E</tt> &lt; 0</exception>
 public EdgeWeightedDigraph(int v, int e)
     : this(v)
 {
     if (e < 0) throw new ArgumentException("Number of edges in a Digraph must be nonnegative");
     for (var i = 0; i < e; i++)
     {
         var ve = StdRandom.Uniform(v);
         var we = StdRandom.Uniform(v);
         var weight = .01 * StdRandom.Uniform(100);
         var edge = new DirectedEdge(ve, we, weight);
         AddEdge(edge);
     }
 }
コード例 #8
0
 private void Relax(DirectedEdge edge)
 {
     int v = edge.From;
     int w = edge.To;
     if (distTo[w] > distTo[v] + edge.Weight)
     {
         edgeTo[w] = edge;
         distTo[w] = distTo[v] + edge.Weight;
         if (pq.Contains(w))
             pq.DecreaseKey(w, distTo[w]);
         else
             pq.Insert(w, distTo[w]);
     }
 }
コード例 #9
0
ファイル: DirectedEdge.cs プロジェクト: lishxi/_SharpMap
 /// <summary>
 /// Removes this directed edge from its containing graph.
 /// </summary>
 internal void Remove()
 {
     this.sym = null;
     this.parentEdge = null;
 }
コード例 #10
0
 public void Initial_vertex_should_be_correct()
 {
     var edge = new DirectedEdge<int>(1, 2);
     edge.InitialVertex.ShouldEqual(1);
 }
コード例 #11
0
 public static bool LeadsOutOf(this DirectedEdge edge, Path path)
 {
     return(path.All(n => edge.To != n) && path.Any(n => edge.From == n));
 }
コード例 #12
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="start"></param>
 /// <param name="geometryFactory"></param>
 public MinimalEdgeRing(DirectedEdge start, IGeometryFactory geometryFactory)
     : base(start, geometryFactory)
 {
 }
コード例 #13
0
ファイル: DijkstraSP.cs プロジェクト: kismy/Algorithms
    private bool Check(EdgeWeightedDigraph G, int s)
    {
        // check that edge weights are nonnegative
        foreach (DirectedEdge e in G.edges())
        {
            if (e.Weight() < 0)
            {
                throw new System.Exception("negative edge weight detected");
                return(false);
            }
        }

        // check that distTo[v] and edgeTo[v] are consistent
        if (distTo[s] != 0.0 || edgeTo[s] != null)
        {
            throw new System.Exception("distTo[s] and edgeTo[s] inconsistent");
            return(false);
        }
        for (int v = 0; v < G.V(); v++)
        {
            if (v == s)
            {
                continue;
            }
            if (edgeTo[v] == null && distTo[v] != double.PositiveInfinity)
            {
                throw new System.Exception("distTo[] and edgeTo[] inconsistent");
                return(false);
            }
        }

        // check that all edges e = v->w satisfy distTo[w] <= distTo[v] + e.weight()
        for (int v = 0; v < G.V(); v++)
        {
            foreach (DirectedEdge e in G.Adj(v))
            {
                int w = e.to();
                if (distTo[v] + e.Weight() < distTo[w])
                {
                    throw new System.Exception("edge " + e + " not relaxed");
                    return(false);
                }
            }
        }

        // check that all edges e = v->w on SPT satisfy distTo[w] == distTo[v] + e.weight()
        for (int w = 0; w < G.V(); w++)
        {
            if (edgeTo[w] == null)
            {
                continue;
            }
            DirectedEdge e = edgeTo[w];
            int          v = e.from();
            if (w != e.to())
            {
                return(false);
            }
            if (distTo[v] + e.Weight() != distTo[w])
            {
                throw new System.Exception("edge " + e + " on shortest path not tight");
                return(false);
            }
        }
        return(true);
    }
コード例 #14
0
ファイル: AcyclicLP.cs プロジェクト: vladdnc/Algorithms-NET
 /// <summary>
 /// relax edge e, but update if you find a *longer* path
 /// </summary>
 /// <param name="e"></param>
 private void Relax(DirectedEdge e)
 {
     int v = e.From(), w = e.To();
     if (_distTo[w] < _distTo[v] + e.Weight)
     {
         _distTo[w] = _distTo[v] + e.Weight;
         _edgeTo[w] = e;
     }
 }
コード例 #15
0
        private void ReleaseEdge(object sender, MouseButtonEventArgs args)
        {
            Contract.Assert(!args.Handled);
            Contract.Assert(sender != null);
            Contract.Assert(_source != null);

            var vertex = sender as Vertex;

            if (vertex != null)
            {
                String sourceName = (String)_source.GetValue(NameProperty),
                       sinkName   = (String)vertex.GetValue(NameProperty);

                if (GetValue(GraphProperty) is DirectedWeightedGraph)
                {
                    var           g      = (DirectedWeightedGraph)GetValue(GraphProperty);
                    Graphs.Vertex source = g.Vertices.Single(v => v.Name == sourceName),
                                  sink   = g.Vertices.Single(v => v.Name == sinkName);
                    var e  = new DirectedWeightedEdge(source, sink, 0); // нужно сделать вызов диалога задания веса
                    var ed = g[source, sink];
                    if (ed == null)
                    {
                        g.AddEdge(e);
                    }
                    else
                    {
                        g.RemoveEdge(ed);
                    }
                }

                if (GetValue(GraphProperty) is DirectedGraph)
                {
                    var           g      = (DirectedGraph)GetValue(GraphProperty);
                    Graphs.Vertex source = g.Vertices.Single(v => v.Name == sourceName),
                                  sink   = g.Vertices.Single(v => v.Name == sinkName);
                    var e  = new DirectedEdge(source, sink);
                    var ed = g[source, sink];
                    if (ed == null)
                    {
                        g.AddEdge(e);
                    }
                    else
                    {
                        g.RemoveEdge(ed);
                    }
                }

                if (GetValue(GraphProperty) is UndirectedGraph)
                {
                    var           g      = (UndirectedGraph)GetValue(GraphProperty);
                    Graphs.Vertex source = g.Vertices.Single(v => v.Name == sourceName),
                                  sink   = g.Vertices.Single(v => v.Name == sinkName);
                    var e  = new UndirectedEdge(source, sink);
                    var ed = g[source, sink];
                    if (ed == null)
                    {
                        g.AddEdge(e);
                    }
                    else
                    {
                        g.RemoveEdge(ed);
                    }
                }
            }

            LayoutRoot.Children.Remove(_arrow);
            _arrow = null;
            LayoutRoot.MouseMove -= DirectEdge;
            foreach (var v in LayoutRoot.Children)
            {
                v.MouseLeftButtonUp -= ReleaseEdge;
            }
            LayoutRoot.ReleaseMouseCapture();
        }
コード例 #16
0
        public static Dictionary <string, string> ReorderParserRules(int pos, Document document, LspAntlr.ReorderType type)
        {
            var result = new Dictionary <string, string>();

            // Check if lexer grammar.
            AntlrGrammarDetails pd_parser = ParserDetailsFactory.Create(document) as AntlrGrammarDetails;
            ExtractGrammarType  lp        = new ExtractGrammarType();

            ParseTreeWalker.Default.Walk(lp, pd_parser.ParseTree);
            var is_lexer = lp.Type == ExtractGrammarType.GrammarType.Lexer;

            if (is_lexer)
            {
                return(result);
            }

            Table table = new Table(pd_parser, document);

            table.ReadRules();
            table.FindPartitions();
            table.FindStartRules();

            // Find new order or rules.
            string old_code = document.Code;
            List <Pair <int, int> > reorder = new List <Pair <int, int> >();

            if (type == LspAntlr.ReorderType.DFS)
            {
                Digraph <string> graph = new Digraph <string>();
                foreach (var r in table.rules)
                {
                    if (!r.is_parser_rule)
                    {
                        continue;
                    }
                    graph.AddVertex(r.LHS);
                }
                foreach (var r in table.rules)
                {
                    if (!r.is_parser_rule)
                    {
                        continue;
                    }
                    var j = r.RHS;
                    //j.Reverse();
                    foreach (var rhs in j)
                    {
                        var sym = table.rules.Where(t => t.LHS == rhs).FirstOrDefault();
                        if (!sym.is_parser_rule)
                        {
                            continue;
                        }
                        var e = new DirectedEdge <string>(r.LHS, rhs);
                        graph.AddEdge(e);
                    }
                }
                List <string> starts = new List <string>();
                foreach (var r in table.rules)
                {
                    if (r.is_parser_rule && r.is_start)
                    {
                        starts.Add(r.LHS);
                    }
                }
                Graphs.DepthFirstOrder <string, DirectedEdge <string> > sort = new DepthFirstOrder <string, DirectedEdge <string> >(graph, starts);
                var ordered = sort.ToList();
                foreach (var s in ordered)
                {
                    var row = table.rules[table.nt_to_index[s]];
                    reorder.Add(new Pair <int, int>(row.start_index, row.end_index));
                }
            }
            else if (type == LspAntlr.ReorderType.BFS)
            {
                Digraph <string> graph = new Digraph <string>();
                foreach (var r in table.rules)
                {
                    if (!r.is_parser_rule)
                    {
                        continue;
                    }
                    graph.AddVertex(r.LHS);
                }
                foreach (var r in table.rules)
                {
                    if (!r.is_parser_rule)
                    {
                        continue;
                    }
                    var j = r.RHS;
                    //j.Reverse();
                    foreach (var rhs in j)
                    {
                        var sym = table.rules.Where(t => t.LHS == rhs).FirstOrDefault();
                        if (!sym.is_parser_rule)
                        {
                            continue;
                        }
                        var e = new DirectedEdge <string>(r.LHS, rhs);
                        graph.AddEdge(e);
                    }
                }
                List <string> starts = new List <string>();
                foreach (var r in table.rules)
                {
                    if (r.is_parser_rule && r.is_start)
                    {
                        starts.Add(r.LHS);
                    }
                }
                Graphs.BreadthFirstOrder <string, DirectedEdge <string> > sort = new BreadthFirstOrder <string, DirectedEdge <string> >(graph, starts);
                var ordered = sort.ToList();
                foreach (var s in ordered)
                {
                    var row = table.rules[table.nt_to_index[s]];
                    reorder.Add(new Pair <int, int>(row.start_index, row.end_index));
                }
            }
            else if (type == LspAntlr.ReorderType.Alphabetically)
            {
                var ordered = table.rules
                              .Where(r => r.is_parser_rule)
                              .Select(r => r.LHS)
                              .OrderBy(r => r).ToList();
                foreach (var s in ordered)
                {
                    var row = table.rules[table.nt_to_index[s]];
                    reorder.Add(new Pair <int, int>(row.start_index, row.end_index));
                }
            }
            else
            {
                return(result);
            }

            StringBuilder sb       = new StringBuilder();
            int           previous = 0;

            {
                int    index_start = table.rules[0].start_index;
                int    len         = 0;
                string pre         = old_code.Substring(previous, index_start - previous);
                sb.Append(pre);
                previous = index_start + len;
            }
            foreach (var l in reorder)
            {
                int    index_start = l.a;
                int    len         = l.b - l.a;
                string add         = old_code.Substring(index_start, len);
                sb.Append(add);
            }
            // Now add all non-parser rules.
            foreach (var r in table.rules)
            {
                if (r.is_parser_rule)
                {
                    continue;
                }
                int    index_start = r.start_index;
                int    len         = r.end_index - r.start_index;
                string add         = old_code.Substring(index_start, len);
                sb.Append(add);
            }
            //string rest = old_code.Substring(previous);
            //sb.Append(rest);
            string new_code = sb.ToString();

            result.Add(document.FullPath, new_code);

            return(result);
        }
コード例 #17
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="de"></param>
 /// <param name="er"></param>
 public override void SetEdgeRing(DirectedEdge de, EdgeRing er)
 {
     de.MinEdgeRing = er;
 }
コード例 #18
0
    private void augment()
    {
        EdgeWeightedDigraph edgeWeightedDigraph = new EdgeWeightedDigraph(2 * this.N + 2);
        int num  = 2 * this.N;
        int num2 = 2 * this.N + 1;

        for (int i = 0; i < this.N; i++)
        {
            if (this.xy[i] == -1)
            {
                edgeWeightedDigraph.addEdge(new DirectedEdge(num, i, (double)0f));
            }
        }
        for (int i = 0; i < this.N; i++)
        {
            if (this.yx[i] == -1)
            {
                edgeWeightedDigraph.addEdge(new DirectedEdge(this.N + i, num2, this.py[i]));
            }
        }
        for (int i = 0; i < this.N; i++)
        {
            for (int j = 0; j < this.N; j++)
            {
                if (this.xy[i] == j)
                {
                    edgeWeightedDigraph.addEdge(new DirectedEdge(this.N + j, i, (double)0f));
                }
                else
                {
                    edgeWeightedDigraph.addEdge(new DirectedEdge(i, this.N + j, this.reduced(i, j)));
                }
            }
        }
        DijkstraSP dijkstraSP = new DijkstraSP(edgeWeightedDigraph, num);
        Iterator   iterator   = dijkstraSP.pathTo(num2).iterator();

        while (iterator.hasNext())
        {
            DirectedEdge directedEdge = (DirectedEdge)iterator.next();
            int          num3         = directedEdge.from();
            int          num4         = directedEdge.to() - this.N;
            if (num3 < this.N)
            {
                this.xy[num3] = num4;
                this.yx[num4] = num3;
            }
        }
        for (int j = 0; j < this.N; j++)
        {
            double[] arg_180_0 = this.px;
            int      num5      = j;
            double[] array     = arg_180_0;
            array[num5] += dijkstraSP.distTo(j);
        }
        for (int j = 0; j < this.N; j++)
        {
            double[] arg_1B6_0 = this.py;
            int      num5      = j;
            double[] array     = arg_1B6_0;
            array[num5] += dijkstraSP.distTo(this.N + j);
        }
    }
コード例 #19
0
 /// <summary>
 /// Adds a DirectedEdge which is known to form part of this ring.
 /// </summary>
 /// <param name="de">The DirectedEdge to add.</param>
 public void Add(DirectedEdge de)
 {
     deList.Add(de);
 }
コード例 #20
0
 public void AddEdge(DirectedEdge e)
 {
     m_adj[e.From()].Add(e);
     m_e++;
 }
コード例 #21
0
        private double Solve(DirectedWeightedGraph digraph, int root)
        {
            int    vertex_size = digraph.V;
            int    edge_size   = digraph.E;
            double res         = 0;                                                    //记录最终的最小树形图的
            int    v;
            List <DirectedEdge> edge = ((IEnumerable <DirectedEdge>)digraph).ToList(); //digraph.ToList();

            while (true)
            {
                for (int i = 0; i < vertex_size; ++i)
                {
                    inw[i] = double.PositiveInfinity;//初始化权重很大
                }
                for (int i = 0; i < edge_size; ++i)
                {
                    DirectedEdge dedge = (DirectedEdge)edge[i];
                    if (dedge.Src != dedge.End && dedge.Weight < inw[dedge.End])
                    {
                        //如果不是一个环、边的权值小于指向节点的权值。记录前驱
                        pre[dedge.End] = dedge.Src;
                        inw[dedge.End] = dedge.Weight;
                    }
                }
                //不能存在孤立点
                for (int i = 0; i < vertex_size; ++i)
                {
                    if (i != root && double.IsInfinity(inw[i]))
                    {
                        return(-1);
                    }
                }
                //找有向环
                int tn = 0;//记录当前查找中的环总数
                for (int i = 0; i < vertex_size; ++i)
                {
                    id[i]  = -1;
                    vis[i] = -1;
                }
                inw[root] = 0;//这是根
                for (int i = 0; i < vertex_size; ++i)
                {
                    res += inw[i]; //累加
                    v    = i;      //v 是开始遍历的节点。
                    //找图中的有向环 三种情况会终止while循环
                    //1,直到出现带有同样标记的点说明成环
                    //2,节点已经属于其他环
                    //3,遍历到根
                    while (vis[v] != i && id[v] == -1 && v != root)
                    {
                        vis[v] = i;      //已经访问了
                        v      = pre[v]; //向上查找
                    }
                    //因为找到某节点属于其他环  或者 遍历到根  说明当前没有找到有向环
                    if (v != root && id[v] == -1)//必须上述查找已经找到有向环
                    {
                        for (int u = pre[v]; u != v; u = pre[u])
                        {
                            id[u] = tn; //记录节点所属的 环编号
                        }
                        id[v] = tn++;   //记录节点所属的 环编号  环编号累加
                    }
                }
                if (tn == 0)
                {
                    break;//不存在有向环
                }
                //可能存在独立点
                for (int i = 0; i < vertex_size; i++)
                {
                    if (id[i] == -1)
                    {
                        id[i] = tn++;//环数累加
                    }
                }
                //对有向环缩点  和SCC缩点很像吧
                for (int i = 0; i < edge_size; ++i)
                {
                    DirectedEdge dedge = (DirectedEdge)edge[i];
                    v         = dedge.Src;
                    dedge.Src = id[dedge.Src];
                    dedge.End = id[dedge.End];
                    //<u, v>有向边
                    //两点不在同一个环 u到v的距离为 边权cost - in[v]
                    if (dedge.Src != dedge.End)
                    {
                        dedge.Weight -= inw[v];//更新边权值 继续下一条边的判定
                    }
                }
                vertex_size = tn;//以环总数为下次操作的点数 继续执行上述操作 直到没有环
                root        = id[root];
            }
            return(res);
        }
コード例 #22
0
        public void Run()
        {
            Console.WriteLine("Choose file:");      // Prompt
            Console.WriteLine("1 - tinyEWDn.txt");  // Prompt
            Console.WriteLine("2 - tinyEWDnc.txt"); // Prompt
            //Console.WriteLine("3 - mediumEWG.txt"); // Prompt

            Console.WriteLine("or quit"); // Prompt

            var    fileNumber = Console.ReadLine();
            string fileName;

            switch (fileNumber)
            {
            case "1":
                fileName = "tinyEWDn.txt";
                break;

            case "2":
                fileName = "tinyEWDnc.txt";
                break;

            //case "3":
            //    fileName = "largeEWG.zip";
            //    break;
            case "quit":
                return;

            default:
                return;
            }


            var @in   = new In($"Files\\Graphs\\{fileName}");
            var lines = @in.ReadAllLines();

            var lineIterator = 0;
            var v            = 0;
            var e            = 0;
            var edges        = new List <DirectedEdge>();

            foreach (var line in lines)
            {
                if (lineIterator == 0)
                {
                    v = Convert.ToInt32(line);
                }
                if (lineIterator == 1)
                {
                    e = Convert.ToInt32(line);
                }
                if (lineIterator > 1)
                {
                    var lineSplitted = line.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                    var ve           = Convert.ToInt32(lineSplitted[0]);
                    var we           = Convert.ToInt32(lineSplitted[1]);
                    var weight       = Convert.ToDouble(lineSplitted[2], CultureInfo.InvariantCulture);
                    var edge         = new DirectedEdge(ve, we, weight);
                    edges.Add(edge);
                }

                lineIterator++;
            }

            var edgeWeightedDigraph = new EdgeWeightedDigraph(v, e, edges);

            Console.WriteLine(edgeWeightedDigraph);

            const int s = 0;
            // compute shortest paths
            var sp = new BellmanFordSP(edgeWeightedDigraph, s);

            // print negative cycle
            if (sp.HasNegativeCycle())
            {
                foreach (var edge in sp.NegativeCycle())
                {
                    Console.WriteLine(edge);
                }
            }
            else
            {
                // print shortest path
                for (var t = 0; t < edgeWeightedDigraph.V; t++)
                {
                    if (sp.HasPathTo(t))
                    {
                        Console.Write($"{s} to {t} {$"{sp.DistTo(t):0.00}"}  ");
                        foreach (var edge in sp.PathTo(t))
                        {
                            Console.Write($"{edge}   ");
                        }
                        Console.WriteLine();
                    }
                    else
                    {
                        Console.WriteLine($"{s} to {t}         no path{Environment.NewLine}");
                    }
                }
            }
            Console.ReadLine();
        }
コード例 #23
0
    /**/ public static void main(string[] strarr)
    {
        DirectedEdge obj = new DirectedEdge(12, 23, 3.14);

        StdOut.println(obj);
    }
コード例 #24
0
 private void Relax( DirectedEdge edge )
 {
     int v = edge.From;
      int w = edge.To;
      if ( _distanceTo[w] > _distanceTo[v] + edge.Weight )
      {
     _distanceTo[w] = _distanceTo[v] + edge.Weight;
     _edgeTo[w] = edge;
     if ( _priorityQueue.Contains( w ) )
     {
        _priorityQueue.DecreaseKey( w, _distanceTo[w] );
     }
     else
     {
        _priorityQueue.Insert( w, _distanceTo[w] );
     }
      }
 }
コード例 #25
0
        public void CommandifiedGraphAddRemoveGraphAndEdgesWithUndoTest()
        {
            Guid sessionId = Guid.NewGuid();
            CQManager.ActivateCommandQueueStack(sessionId);

            DirectedGraph<int, DirectedEdge<int>> graph = new DirectedGraph<int, DirectedEdge<int>>(true);
            graph.Add(42);
            graph.Add(13);
            graph.Add(10);
            graph.Add(new DirectedEdge<int>(42, 13));	// 42 -> 13
            graph.Add(new DirectedEdge<int>(42, 10));	// 42 -> 10
            Assert.IsTrue(graph.Contains(42));
            Assert.IsTrue(graph.Contains(13));
            Assert.IsTrue(graph.Contains(10));
            Assert.AreEqual(2, graph.EdgeCount);
            Assert.IsTrue(graph.ContainsEdge(42, 13));
            Assert.IsTrue(graph.ContainsEdge(42, 10));

            // create graph to add to this graph. Doesn't have to be a commandified graph, as we're not rolling back the actions on that graph.
            DirectedGraph<int, DirectedEdge<int>> graphToAdd = new DirectedGraph<int, DirectedEdge<int>>();
            graphToAdd.Add(1);
            graphToAdd.Add(2);
            graphToAdd.Add(3);
            graphToAdd.Add(new DirectedEdge<int>(1, 2));	// 1 -> 2
            graphToAdd.Add(new DirectedEdge<int>(1, 3));	// 1 -> 3
            graphToAdd.Add(new DirectedEdge<int>(2, 3));	// 2 -> 3
            Assert.AreEqual(3, graphToAdd.VertexCount);
            Assert.AreEqual(3, graphToAdd.EdgeCount);

            // add this graph to the main graph. This is an undoable action.
            graph.Add(graphToAdd);
            Assert.AreEqual(6, graph.VertexCount);
            Assert.AreEqual(5, graph.EdgeCount);
            Assert.IsTrue(graph.Contains(1));
            Assert.IsTrue(graph.Contains(2));
            Assert.IsTrue(graph.Contains(3));
            Assert.IsTrue(graph.ContainsEdge(1, 2));
            Assert.IsTrue(graph.ContainsEdge(1, 3));
            Assert.IsTrue(graph.ContainsEdge(2, 3));

            // undo add
            CQManager.UndoLastCommand();
            Assert.AreEqual(3, graph.VertexCount);
            Assert.AreEqual(2, graph.EdgeCount);
            Assert.IsFalse(graph.Contains(1));
            Assert.IsFalse(graph.Contains(2));
            Assert.IsFalse(graph.Contains(3));
            Assert.IsFalse(graph.ContainsEdge(1, 2));
            Assert.IsFalse(graph.ContainsEdge(1, 3));
            Assert.IsFalse(graph.ContainsEdge(2, 3));

            // redo
            CQManager.RedoLastCommand();
            Assert.AreEqual(6, graph.VertexCount);
            Assert.AreEqual(5, graph.EdgeCount);
            Assert.IsTrue(graph.Contains(1));
            Assert.IsTrue(graph.Contains(2));
            Assert.IsTrue(graph.Contains(3));
            Assert.IsTrue(graph.ContainsEdge(1, 2));
            Assert.IsTrue(graph.ContainsEdge(1, 3));
            Assert.IsTrue(graph.ContainsEdge(2, 3));

            // remove the graph we added
            graph.Remove(graphToAdd);
            Assert.AreEqual(3, graph.VertexCount);
            Assert.AreEqual(2, graph.EdgeCount);
            Assert.IsFalse(graph.Contains(1));
            Assert.IsFalse(graph.Contains(2));
            Assert.IsFalse(graph.Contains(3));
            Assert.IsFalse(graph.ContainsEdge(1, 2));
            Assert.IsFalse(graph.ContainsEdge(1, 3));
            Assert.IsFalse(graph.ContainsEdge(2, 3));

            CQManager.UndoLastCommand();
            Assert.AreEqual(6, graph.VertexCount);
            Assert.AreEqual(5, graph.EdgeCount);
            Assert.IsTrue(graph.Contains(1));
            Assert.IsTrue(graph.Contains(2));
            Assert.IsTrue(graph.Contains(3));
            Assert.IsTrue(graph.ContainsEdge(1, 2));
            Assert.IsTrue(graph.ContainsEdge(1, 3));
            Assert.IsTrue(graph.ContainsEdge(2, 3));

            DirectedEdge<int> newEdge = new DirectedEdge<int>(42, 1);		// 42 -> 1
            graph.Add(newEdge);
            Assert.AreEqual(6, graph.EdgeCount);
            Assert.IsTrue(graph.ContainsEdge(42, 1));
            Assert.IsFalse(graph.ContainsEdge(1, 42));

            CQManager.UndoLastCommand();
            Assert.AreEqual(5, graph.EdgeCount);
            Assert.IsFalse(graph.ContainsEdge(42, 1));

            CQManager.RedoLastCommand();
            Assert.AreEqual(6, graph.EdgeCount);
            Assert.IsTrue(graph.ContainsEdge(42, 1));

            graph.Remove(newEdge);
            Assert.AreEqual(5, graph.EdgeCount);
            Assert.IsFalse(graph.ContainsEdge(42, 1));

            CQManager.UndoLastCommand();
            Assert.AreEqual(6, graph.EdgeCount);
            Assert.IsTrue(graph.ContainsEdge(42, 1));

            graph.Disconnect(42, 1, false);
            Assert.AreEqual(5, graph.EdgeCount);
            Assert.IsFalse(graph.ContainsEdge(42, 1));

            CQManager.UndoLastCommand();
            Assert.AreEqual(6, graph.EdgeCount);
            Assert.IsTrue(graph.ContainsEdge(42, 1));

            CQManager.ActivateCommandQueueStack(Guid.Empty);
        }
コード例 #26
0
ファイル: DijkstraSP.cs プロジェクト: vladdnc/Algorithms-NET
 /// <summary>
 /// relax edge e and update pq if changed
 /// </summary>
 /// <param name="e"></param>
 private void Relax(DirectedEdge e)
 {
     int v = e.From(), w = e.To();
     if (_distTo[w] > _distTo[v] + e.Weight)
     {
         _distTo[w] = _distTo[v] + e.Weight;
         _edgeTo[w] = e;
         if (_pq.Contains(w)) _pq.DecreaseKey(w, _distTo[w]);
         else _pq.Insert(w, _distTo[w]);
     }
 }
コード例 #27
0
        private bool IsRightPath(DirectedEdge[] path, params int[] nodes)
        {
            if(path != null && path.Length > 0)
            {
                List<int> tmp = new List<int>();
                tmp.Add(path[0].From);
                foreach(DirectedEdge e in path)
                {
                    tmp.Add(e.To);
                }

                if (tmp.Count != nodes.Length) return false;

                for(int i = 0; i < nodes.Length; i++)
                {
                    if (nodes[i] != tmp[i]) return false;
                }

                return true;
            }

            return false;
        }
コード例 #28
0
 /// <summary>
 /// Removes this directed edge from its containing graph.
 /// </summary>
 internal void Remove()
 {
     _sym = null;
     _parentEdge = null;
 }
コード例 #29
0
 /// <summary>
 /// Constructs an Edge initialized with the given DirectedEdges, and for each
 /// DirectedEdge: sets the Edge, sets the symmetric DirectedEdge, and adds
 /// this Edge to its from-Node.
 /// </summary>
 /// <param name="de0"></param>
 /// <param name="de1"></param>
 public Edge(DirectedEdge de0, DirectedEdge de1)
 {
     SetDirectedEdges(de0, de1);
 }
コード例 #30
0
        public void Run()
        {
            Console.WriteLine("Choose file:"); // Prompt
            Console.WriteLine("1 - tinyEWD.txt"); // Prompt
            Console.WriteLine("2 - mediumEWD.txt"); // Prompt
            //Console.WriteLine("3 - mediumEWG.txt"); // Prompt

            Console.WriteLine("or quit"); // Prompt

            var fileNumber = Console.ReadLine();
            string fileName;
            switch (fileNumber)
            {
                case "1":
                    fileName = "tinyEWD.txt";
                    break;
                case "2":
                    fileName = "mediumEWD.txt";
                    break;
                //case "3":
                //    fileName = "largeEWG.zip";
                //    break;
                case "quit":
                    return;
                default:
                    return;
            }

            var @in = new In($"Files\\Graphs\\{fileName}");
            var lines = @in.ReadAllLines();

            var lineIterator = 0;
            var v = 0;
            var e = 0;
            var edges = new List<DirectedEdge>();
            foreach (var line in lines)
            {
                if (lineIterator == 0)
                {
                    v = Convert.ToInt32(line);
                }
                if (lineIterator == 1)
                {
                    e = Convert.ToInt32(line);
                }
                if (lineIterator > 1)
                {
                    var lineSplitted = line.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries);
                    var ve = Convert.ToInt32(lineSplitted[0]);
                    var we = Convert.ToInt32(lineSplitted[1]);
                    var weight = Convert.ToDouble(lineSplitted[2], CultureInfo.InvariantCulture);
                    var edge = new DirectedEdge(ve, we, weight);
                    edges.Add(edge);
                }

                lineIterator++;
            }

            var edgeWeightedGraph = new EdgeWeightedDigraph(v, e, edges);
            Console.WriteLine(edgeWeightedGraph);
            Console.ReadLine();
        }
コード例 #31
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="de"></param>
 /// <returns></returns>
 public override DirectedEdge GetNext(DirectedEdge de)
 {
     return(de.NextMin);
 }
コード例 #32
0
        public void Execute()
        {
            var hNodeDictionary = FUsedGraph.GetNodeDictionary();
            var hNodeCount      = hNodeDictionary.Count;

            // Erstellen der SuperQuelle
            var hSuperSource = new Node(hNodeCount);

            FUsedGraph.TryToAddNode(hSuperSource);

            // Erstellen der SuperSenke
            var hSuperTarget = new Node(hNodeCount + 1);

            FUsedGraph.TryToAddNode(hSuperTarget);

            var hPseudoEdges = new List <Edge>();

            // Die SuperQuelle mit den Knoten der Gruppe A verbinden
            for (var hNodeInGroupAId = 0; hNodeInGroupAId < FNodesGroupALimit; hNodeInGroupAId++)
            {
                var hNodeInGroupA = hNodeDictionary[hNodeInGroupAId];
                var hNewEdge      = new DirectedEdge(hSuperSource, hNodeInGroupA);
                hNewEdge.AddWeight(new CapacityWeighted(1));
                FUsedGraph.AddEdge(hNewEdge);
                hPseudoEdges.Add(hNewEdge);
            }

            for (var hNodeInGroupAId = FNodesGroupALimit; hNodeInGroupAId < hNodeCount; hNodeInGroupAId++)
            {
                var hNodeInGroupB = hNodeDictionary[hNodeInGroupAId];
                var hNewEdge      = new DirectedEdge(hNodeInGroupB, hSuperTarget);
                hNewEdge.AddWeight(new CapacityWeighted(1));
                FUsedGraph.AddEdge(hNewEdge);
                hPseudoEdges.Add(hNewEdge);
            }

            FUsedGraph.UpdateNeighbourInfoInNodes();
            var hEdmondsKarpAlgorithm = new EdmondsKarpAlgorithm(FUsedGraph);
            var hFlow = hEdmondsKarpAlgorithm.Execute(hSuperSource.Id, hSuperTarget.Id);


            // PseudoKanten wieder entfernen
            foreach (var hPseudoEdge in hPseudoEdges)
            {
                FUsedGraph.RemoveEdge(hPseudoEdge);
            }
            // Superquelle und -senke wieder entfernen.
            FUsedGraph.RemoveNode(hSuperSource);
            FUsedGraph.RemoveNode(hSuperTarget);

            var hFlowCopy = new List <string>(hFlow.Keys);

            foreach (var hFlowEdge in hFlowCopy)
            {
                var hNodes            = hFlowEdge.Split('-');
                var hEdgeSourceNodeId = Convert.ToInt32(hNodes[0]);
                var hEdgeTargetNodeId = Convert.ToInt32(hNodes[1]);

                if (hEdgeSourceNodeId == hSuperSource.Id)
                {
                    hFlow.Remove(hFlowEdge);
                }
                else if (hEdgeTargetNodeId == hSuperTarget.Id)
                {
                    hFlow.Remove(hFlowEdge);
                }
                else if (hFlow[hFlowEdge] == 0.0)
                {
                    hFlow.Remove(hFlowEdge);
                }
            }

            Console.WriteLine("Die Anzahl der maximalen Matchings beträgt\t" + hFlow.Count);
        }
コード例 #33
0
 /// <summary>
 /// Adds a DirectedEdge which is known to form part of this ring.
 /// </summary>
 /// <param name="de">The DirectedEdge to add.</param>
 private void Add(DirectedEdge de)
 {
     _deList.Add(de);
 }
コード例 #34
0
 public void AddEdge(DirectedEdge edge)
 {
     adj[edge.From].Add(edge);
     E++;
 }
コード例 #35
0
        private readonly DirectedEdge[][] _edgeTo; // edgeTo[v][w] = last edge on shortest v->w path

        #endregion Fields

        #region Constructors

        /// <summary>
        /// Computes a shortest paths tree from each vertex to to every other vertex in
        /// the edge-weighted digraph <tt>G</tt>. If no such shortest path exists for
        /// some pair of vertices, it computes a negative cycle.
        /// </summary>
        /// <param name="g">G the edge-weighted digraph</param>
        public FloydWarshall(AdjMatrixEdgeWeightedDigraph g)
        {
            var vv = g.V;
            _distTo = new double[vv][];
            for (var i = 0; i < vv; i++)
            {
                _distTo[i] = new double[vv];
            }
            _edgeTo = new DirectedEdge[vv][];

            for (var i = 0; i < vv; i++)
            {
                _edgeTo[i] = new DirectedEdge[vv];
            }

            // initialize distances to infinity
            for (var v = 0; v < vv; v++)
            {
                for (var w = 0; w < vv; w++)
                {
                    _distTo[v][w] = double.PositiveInfinity;
                }
            }

            // initialize distances using edge-weighted digraph's
            for (var v = 0; v < g.V; v++)
            {
                foreach (var e in g.Adj(v))
                {
                    _distTo[e.From()][e.To()] = e.Weight;
                    _edgeTo[e.From()][e.To()] = e;
                }
                // in case of self-loops
                if (_distTo[v][v] >= 0.0)
                {
                    _distTo[v][v] = 0.0;
                    _edgeTo[v][v] = null;
                }
            }

            // Floyd-Warshall updates
            for (var i = 0; i < vv; i++)
            {
                // compute shortest paths using only 0, 1, ..., i as intermediate vertices
                for (var v = 0; v < vv; v++)
                {
                    if (_edgeTo[v][i] == null) continue;  // optimization
                    for (var w = 0; w < vv; w++)
                    {
                        if (_distTo[v][w] > _distTo[v][i] + _distTo[i][w])
                        {
                            _distTo[v][w] = _distTo[v][i] + _distTo[i][w];
                            _edgeTo[v][w] = _edgeTo[i][w];
                        }
                    }
                    // check for negative cycle
                    if (_distTo[v][v] < 0.0)
                    {
                        HasNegativeCycle = true;
                        return;
                    }
                }
            }
        }
コード例 #36
0
        public void Run()
        {
            Console.WriteLine("Choose file:");      // Prompt
            Console.WriteLine("1 - tinyEWD.txt");   // Prompt
            Console.WriteLine("2 - mediumEWD.txt"); // Prompt
            //Console.WriteLine("3 - mediumEWG.txt"); // Prompt

            Console.WriteLine("or quit"); // Prompt

            var    fileNumber = Console.ReadLine();
            string fileName;

            switch (fileNumber)
            {
            case "1":
                fileName = "tinyEWD.txt";
                break;

            case "2":
                fileName = "mediumEWD.txt";
                break;

            //case "3":
            //    fileName = "largeEWG.zip";
            //    break;
            case "quit":
                return;

            default:
                return;
            }


            var @in   = new In($"Files\\Graphs\\{fileName}");
            var lines = @in.ReadAllLines();

            var lineIterator = 0;
            var v            = 0;
            var e            = 0;
            var edges        = new List <DirectedEdge>();

            foreach (var line in lines)
            {
                if (lineIterator == 0)
                {
                    v = Convert.ToInt32(line);
                }
                if (lineIterator == 1)
                {
                    e = Convert.ToInt32(line);
                }
                if (lineIterator > 1)
                {
                    var lineSplitted = line.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                    var ve           = Convert.ToInt32(lineSplitted[0]);
                    var we           = Convert.ToInt32(lineSplitted[1]);
                    var weight       = Convert.ToDouble(lineSplitted[2], CultureInfo.InvariantCulture);
                    var edge         = new DirectedEdge(ve, we, weight);
                    edges.Add(edge);
                }

                lineIterator++;
            }

            var edgeWeightedGraph = new EdgeWeightedDigraph(v, e, edges);

            Console.WriteLine(edgeWeightedGraph);
            Console.ReadLine();
        }
コード例 #37
0
 /// <summary>
 /// Returns 1 if this DirectedEdge has a greater angle with the
 /// positive x-axis than b", 0 if the DirectedEdges are collinear, and -1 otherwise.
 /// Using the obvious algorithm of simply computing the angle is not robust,
 /// since the angle calculation is susceptible to roundoff. A robust algorithm
 /// is:
 /// first compare the quadrants. If the quadrants are different, it it
 /// trivial to determine which vector is "greater".
 /// if the vectors lie in the same quadrant, the robust
 /// <c>RobustCgAlgorithms.ComputeOrientation(Coordinate, Coordinate, Coordinate)</c>
 /// function can be used to decide the relative orientation of the vectors.
 /// </summary>
 /// <param name="e"></param>
 /// <returns></returns>
 public virtual int CompareDirection(DirectedEdge e)
 {
     // if the rays are in different quadrants, determining the ordering is trivial
     if (_quadrant > e.Quadrant)
         return 1;
     if (_quadrant < e.Quadrant)
         return -1;
     // vectors are in the same quadrant - check relative orientation of direction vectors
     // this is > e if it is CCW of e
     int i = CgAlgorithms.ComputeOrientation(e.StartPoint, e.EndPoint, _p1);
     return i;
 }
コード例 #38
0
 public void AddEdge(DirectedEdge e)
 {
     _adj[e.From].Add(e);
 }
コード例 #39
0
 private void TraceBackDirectedCycle(DirectedEdge e, int w)
 {
     _cycle = new Collections.Stack<DirectedEdge>();
     while (e.From() != w)
     {
         _cycle.Push(e);
         e = _edgeTo[e.From()];
     }
     _cycle.Push(e);
 }
コード例 #40
0
        // Note: indirect append means that adtress (with unfilled values) will be inserted inbetween start and end adtree.
        //       Unfilled values are expected to be filled later otherwise the adtree will be not valid.
        private void TryToAppendIndirectly(AttachingPosition appendingPositionOfStartElement,
                                           IAdTree start, IAdTree end,
                                           string expectedSignature,
                                           List <IAdTree> results)
        {
            using (Trace.Entering())
            {
                GrammarCharacter startGrammarCharacter = GrammarCharacter.e;
                GrammarCharacter endGrammarCharacter   = GrammarCharacter.e;

                // If start adTree connects the bridge on its left.
                if (appendingPositionOfStartElement == AttachingPosition.ParrentForLeft)
                {
                    startGrammarCharacter = start.Pattern.LeftRule.GrammarCharacter;
                    endGrammarCharacter   = end.RulingGrammarCharacter;
                }
                // If start adTree connects the bridge on its right.
                else if (appendingPositionOfStartElement == AttachingPosition.ParrentForRight)
                {
                    startGrammarCharacter = start.Pattern.RightRule.GrammarCharacter;
                    endGrammarCharacter   = end.RulingGrammarCharacter;
                }
                // If the bridge connects the start adtree on its left.
                else if (appendingPositionOfStartElement == AttachingPosition.ChildOnLeft)
                {
                    startGrammarCharacter = start.RulingGrammarCharacter;
                    endGrammarCharacter   = end.RulingGrammarCharacter;
                }
                // If the bridge connects the start adtree on its right.
                else if (appendingPositionOfStartElement == AttachingPosition.ChildOnRight)
                {
                    startGrammarCharacter = start.RulingGrammarCharacter;
                    endGrammarCharacter   = end.RulingGrammarCharacter;
                }

                // Get all possibile ways how to get from start to end grammar character and path is not greater than 4.
                IEnumerable <IReadOnlyList <DirectedEdge <GrammarCharacter, Pattern> > > connectionPaths = myConstructiveDictionary.PatternGraph
                                                                                                           .FindAllEdges(startGrammarCharacter, endGrammarCharacter).ToList();

                // Go via all possible ways.
                foreach (IReadOnlyList <DirectedEdge <GrammarCharacter, Pattern> > path in connectionPaths)
                {
                    IAdTree startCopy = start.MakeShallowCopy();
                    IAdTree endCopy   = end.MakeShallowCopy();

                    IAdTree previousBridge = null;

                    // Go via the path.
                    for (int i = 0; i < path.Count; ++i)
                    {
                        DirectedEdge <GrammarCharacter, Pattern> edge = path[i];

                        BigInteger attributes = edge.Value.UpRule.AttributesRule is IReferenceValueRule <BigInteger> referenceAttributes ? referenceAttributes.ReferenceValue : myConstructiveDictionary.AttributesModel.GetAttributes(edge.Value.UpRule.GrammarCharacter);
                        IAdTree    bridge = new AdTree(new Morpheme(myConstructiveDictionary.AttributesModel, "", attributes), edge.Value);

                        // If it is the first item on the path.
                        if (i == 0)
                        {
                            if (appendingPositionOfStartElement == AttachingPosition.ParrentForLeft)
                            {
                                if (startCopy.Left == null && startCopy.CanAttachToLeft(bridge, myConstructiveDictionary.AttributesModel))
                                {
                                    startCopy.Left = bridge;
                                }
                                else
                                {
                                    break;
                                }
                            }
                            else if (appendingPositionOfStartElement == AttachingPosition.ParrentForRight)
                            {
                                if (startCopy.Right == null && startCopy.CanAttachToRight(bridge, myConstructiveDictionary.AttributesModel))
                                {
                                    startCopy.Right = bridge;
                                }
                                else
                                {
                                    break;
                                }
                            }
                            else if (appendingPositionOfStartElement == AttachingPosition.ChildOnLeft)
                            {
                                if (bridge.Left == null && bridge.CanAttachToLeft(startCopy, myConstructiveDictionary.AttributesModel))
                                {
                                    bridge.Left = startCopy;
                                }
                                else
                                {
                                    break;
                                }
                            }
                            else if (appendingPositionOfStartElement == AttachingPosition.ChildOnRight)
                            {
                                if (bridge.Right == null && bridge.CanAttachToRight(startCopy, myConstructiveDictionary.AttributesModel))
                                {
                                    bridge.Right = startCopy;
                                }
                                else
                                {
                                    break;
                                }
                            }
                        }
                        else
                        {
                            if (previousBridge.Left == null && previousBridge.CanAttachToLeft(bridge, myConstructiveDictionary.AttributesModel))
                            {
                                previousBridge.Left = bridge;
                            }
                            else if (previousBridge.Right == null && previousBridge.CanAttachToRight(bridge, myConstructiveDictionary.AttributesModel))
                            {
                                previousBridge.Right = bridge;
                            }
                            else
                            {
                                break;
                            }
                        }

                        // If the signature does not match then break it.
                        var currentSignature = bridge.Root.GetSignature();
                        if (!expectedSignature.StartsWith(currentSignature))
                        {
                            break;
                        }

                        // If it is the last item in the path.
                        if (i == path.Count - 1)
                        {
                            if (bridge.Left == null && bridge.CanAttachToLeft(endCopy, myConstructiveDictionary.AttributesModel))
                            {
                                bridge.Left = endCopy;

                                currentSignature = endCopy.Root.GetSignature();
                                if (expectedSignature.StartsWith(currentSignature))
                                {
                                    results.Add(endCopy);
                                }
                            }
                            else if (bridge.Right == null && bridge.CanAttachToRight(endCopy, myConstructiveDictionary.AttributesModel))
                            {
                                bridge.Right = endCopy;

                                currentSignature = endCopy.Root.GetSignature();
                                if (expectedSignature.StartsWith(currentSignature))
                                {
                                    results.Add(endCopy);
                                }
                            }
                            else
                            {
                                break;
                            }
                        }

                        previousBridge = bridge;
                    }
                }
            }
        }
コード例 #41
0
 public void Adjacency_should_work_correctly()
 {
     var edge = new DirectedEdge<int>(1, 2);
     edge.AdjacentTo(1).ShouldBeTrue();
     edge.AdjacentTo(2).ShouldBeTrue();
 }
コード例 #42
0
        public void CommandifiedGraphAddRemoveGraphAndEdgesWithUndoTest()
        {
            Guid sessionId = Guid.NewGuid();

            CQManager.ActivateCommandQueueStack(sessionId);

            DirectedGraph <int, DirectedEdge <int> > graph = new DirectedGraph <int, DirectedEdge <int> >(true);

            graph.Add(42);
            graph.Add(13);
            graph.Add(10);
            graph.Add(new DirectedEdge <int>(42, 13));                  // 42 -> 13
            graph.Add(new DirectedEdge <int>(42, 10));                  // 42 -> 10
            Assert.IsTrue(graph.Contains(42));
            Assert.IsTrue(graph.Contains(13));
            Assert.IsTrue(graph.Contains(10));
            Assert.AreEqual(2, graph.EdgeCount);
            Assert.IsTrue(graph.ContainsEdge(42, 13));
            Assert.IsTrue(graph.ContainsEdge(42, 10));

            // create graph to add to this graph. Doesn't have to be a commandified graph, as we're not rolling back the actions on that graph.
            DirectedGraph <int, DirectedEdge <int> > graphToAdd = new DirectedGraph <int, DirectedEdge <int> >();

            graphToAdd.Add(1);
            graphToAdd.Add(2);
            graphToAdd.Add(3);
            graphToAdd.Add(new DirectedEdge <int>(1, 2));               // 1 -> 2
            graphToAdd.Add(new DirectedEdge <int>(1, 3));               // 1 -> 3
            graphToAdd.Add(new DirectedEdge <int>(2, 3));               // 2 -> 3
            Assert.AreEqual(3, graphToAdd.VertexCount);
            Assert.AreEqual(3, graphToAdd.EdgeCount);

            // add this graph to the main graph. This is an undoable action.
            graph.Add(graphToAdd);
            Assert.AreEqual(6, graph.VertexCount);
            Assert.AreEqual(5, graph.EdgeCount);
            Assert.IsTrue(graph.Contains(1));
            Assert.IsTrue(graph.Contains(2));
            Assert.IsTrue(graph.Contains(3));
            Assert.IsTrue(graph.ContainsEdge(1, 2));
            Assert.IsTrue(graph.ContainsEdge(1, 3));
            Assert.IsTrue(graph.ContainsEdge(2, 3));

            // undo add
            CQManager.UndoLastCommand();
            Assert.AreEqual(3, graph.VertexCount);
            Assert.AreEqual(2, graph.EdgeCount);
            Assert.IsFalse(graph.Contains(1));
            Assert.IsFalse(graph.Contains(2));
            Assert.IsFalse(graph.Contains(3));
            Assert.IsFalse(graph.ContainsEdge(1, 2));
            Assert.IsFalse(graph.ContainsEdge(1, 3));
            Assert.IsFalse(graph.ContainsEdge(2, 3));

            // redo
            CQManager.RedoLastCommand();
            Assert.AreEqual(6, graph.VertexCount);
            Assert.AreEqual(5, graph.EdgeCount);
            Assert.IsTrue(graph.Contains(1));
            Assert.IsTrue(graph.Contains(2));
            Assert.IsTrue(graph.Contains(3));
            Assert.IsTrue(graph.ContainsEdge(1, 2));
            Assert.IsTrue(graph.ContainsEdge(1, 3));
            Assert.IsTrue(graph.ContainsEdge(2, 3));

            // remove the graph we added
            graph.Remove(graphToAdd);
            Assert.AreEqual(3, graph.VertexCount);
            Assert.AreEqual(2, graph.EdgeCount);
            Assert.IsFalse(graph.Contains(1));
            Assert.IsFalse(graph.Contains(2));
            Assert.IsFalse(graph.Contains(3));
            Assert.IsFalse(graph.ContainsEdge(1, 2));
            Assert.IsFalse(graph.ContainsEdge(1, 3));
            Assert.IsFalse(graph.ContainsEdge(2, 3));

            CQManager.UndoLastCommand();
            Assert.AreEqual(6, graph.VertexCount);
            Assert.AreEqual(5, graph.EdgeCount);
            Assert.IsTrue(graph.Contains(1));
            Assert.IsTrue(graph.Contains(2));
            Assert.IsTrue(graph.Contains(3));
            Assert.IsTrue(graph.ContainsEdge(1, 2));
            Assert.IsTrue(graph.ContainsEdge(1, 3));
            Assert.IsTrue(graph.ContainsEdge(2, 3));

            DirectedEdge <int> newEdge = new DirectedEdge <int>(42, 1);                         // 42 -> 1

            graph.Add(newEdge);
            Assert.AreEqual(6, graph.EdgeCount);
            Assert.IsTrue(graph.ContainsEdge(42, 1));
            Assert.IsFalse(graph.ContainsEdge(1, 42));

            CQManager.UndoLastCommand();
            Assert.AreEqual(5, graph.EdgeCount);
            Assert.IsFalse(graph.ContainsEdge(42, 1));

            CQManager.RedoLastCommand();
            Assert.AreEqual(6, graph.EdgeCount);
            Assert.IsTrue(graph.ContainsEdge(42, 1));

            graph.Remove(newEdge);
            Assert.AreEqual(5, graph.EdgeCount);
            Assert.IsFalse(graph.ContainsEdge(42, 1));

            CQManager.UndoLastCommand();
            Assert.AreEqual(6, graph.EdgeCount);
            Assert.IsTrue(graph.ContainsEdge(42, 1));

            graph.Disconnect(42, 1, false);
            Assert.AreEqual(5, graph.EdgeCount);
            Assert.IsFalse(graph.ContainsEdge(42, 1));

            CQManager.UndoLastCommand();
            Assert.AreEqual(6, graph.EdgeCount);
            Assert.IsTrue(graph.ContainsEdge(42, 1));

            CQManager.ActivateCommandQueueStack(Guid.Empty);
        }
コード例 #43
0
 public void Terminal_vertex_should_be_correct()
 {
     var edge = new DirectedEdge<int>(1, 2);
     edge.TerminalVertex.ShouldEqual(2);
 }
コード例 #44
0
ファイル: DeclarativeSort.cs プロジェクト: jli94/Fracture
 protected override Tags GetKeyForItem(DirectedEdge item)
 {
     return(item.Target);
 }
コード例 #45
0
ファイル: DirectedEdge.cs プロジェクト: lishxi/_SharpMap
 /// <summary>
 /// Returns 1 if this DirectedEdge has a greater angle with the
 /// positive x-axis than b", 0 if the DirectedEdges are collinear, and -1 otherwise.
 /// Using the obvious algorithm of simply computing the angle is not robust,
 /// since the angle calculation is susceptible to roundoff. A robust algorithm
 /// is:
 /// first compare the quadrants. If the quadrants are different, it it
 /// trivial to determine which vector is "greater".
 /// if the vectors lie in the same quadrant, the robust
 /// <c>RobustCGAlgorithms.ComputeOrientation(Coordinate, Coordinate, Coordinate)</c>
 /// function can be used to decide the relative orientation of the vectors.
 /// </summary>
 /// <param name="e"></param>
 /// <returns></returns>
 public int CompareDirection(DirectedEdge e)
 {
     int i = 0;
     // if the rays are in different quadrants, determining the ordering is trivial
     if (quadrant > e.Quadrant)
         i = 1;
     if (quadrant < e.Quadrant) 
         i = -1;
     // vectors are in the same quadrant - check relative orientation of direction vectors
     // this is > e if it is CCW of e
     i = CGAlgorithms.ComputeOrientation(e.p0, e.p1, p1);            
     return i;
 }
コード例 #46
0
        public void Run()
        {
            Console.WriteLine("Choose file:"); // Prompt
            Console.WriteLine("1 - rates.txt"); // Prompt
            //Console.WriteLine("2 - mediumEWD.txt"); // Prompt
            //Console.WriteLine("3 - mediumEWG.txt"); // Prompt

            Console.WriteLine("or quit"); // Prompt

            var fileNumber = Console.ReadLine();
            string fileName;
            switch (fileNumber)
            {
                case "1":
                    fileName = "rates.txt";
                    break;
                //case "2":
                //    fileName = "mediumEWD.txt";
                //    break;
                //case "3":
                //    fileName = "largeEWG.zip";
                //    break;
                case "quit":
                    return;
                default:
                    return;
            }

            var @in = new In($"Files\\Graphs\\{fileName}");
            var lines = @in.ReadAllLines();

            var lineIterator = 0;
            var currencyIterator = 0;
            // number of jobs
            var n = 0;

            // source and sink
            var source = 0;
            var sink = 0;

            var v = 0;
            var e = 0;
            var edges = new List<DirectedEdge>();
            string[] names = {};
            foreach (var line in lines)
            {
                if (lineIterator == 0)
                {
                    v = Convert.ToInt32(line);
                    names = new string[v];

                }

                if (lineIterator > 0)
                {
                    var wordsIterator = 0;
                    var ratesIterator = 0;
                    var lineSplitted = line.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                    foreach (var word in lineSplitted)
                    {
                        if (wordsIterator == 0)
                        {
                            names[wordsIterator] = word;
                        }

                        if (wordsIterator > 0)
                        {
                            double rate = Convert.ToSingle(word,CultureInfo.InvariantCulture);
                            var edge = new DirectedEdge(currencyIterator, ratesIterator, -Math.Log(rate));
                            edges.Add(edge);
                            e++;
                            ratesIterator++;
                        }
                        wordsIterator ++;
                    }

                    currencyIterator++;

                }

                lineIterator++;

            }

            var edgeWeightedDigraph = new EdgeWeightedDigraph(v, e, edges);
            Console.WriteLine(edgeWeightedDigraph);

            // find shortest path from s to each other vertex in DAG
            var arbitrage = new Arbitrage(edgeWeightedDigraph,source);
            var spt = arbitrage.GetShotestPath();
            // print results
            Console.WriteLine(" job   start  finish");
            Console.WriteLine("--------------------");
            if (spt.HasNegativeCycle())
            {
                var stake = 1000.0;
                foreach (var edge in spt.NegativeCycle())
                {
                    Console.Write($"{stake:0.00000} {names[edge.From()]} ");
                    stake *= Math.Exp(-edge.Weight);
                    Console.Write($"= {stake:0.00000} {names[edge.To()]}{Environment.NewLine}");
                }
            }
            else
            {
                Console.WriteLine("No arbitrage opportunity");
            }

            Console.ReadLine();
        }
コード例 #47
0
 /// <summary>
 /// Adds the directed edge <tt>e</tt> to the edge-weighted digraph (if there
 /// is not already an edge with the same endpoints).
 /// </summary>
 /// <param name="e">e the edge</param>
 public void AddEdge(DirectedEdge e)
 {
     var v = e.From();
     var w = e.To();
     if (_adj[v][w] != null) return;
     E++;
     _adj[v][w] = e;
 }
コード例 #48
0
        public void Run()
        {
            Console.WriteLine("Choose file:");      // Prompt
            Console.WriteLine("1 - tinyEWDAG.txt"); // Prompt
            //Console.WriteLine("2 - mediumEWD.txt"); // Prompt
            //Console.WriteLine("3 - mediumEWG.txt"); // Prompt

            Console.WriteLine("or quit"); // Prompt

            var    fileNumber = Console.ReadLine();
            string fileName;

            switch (fileNumber)
            {
            case "1":
                fileName = "tinyEWDAG.txt";
                break;

            //case "2":
            //    fileName = "mediumEWD.txt";
            //    break;
            //case "3":
            //    fileName = "largeEWG.zip";
            //    break;
            case "quit":
                return;

            default:
                return;
            }


            var @in   = new In($"Files\\Graphs\\{fileName}");
            var lines = @in.ReadAllLines();

            var lineIterator = 0;
            var v            = 0;
            var e            = 0;
            var edges        = new List <DirectedEdge>();

            foreach (var line in lines)
            {
                if (lineIterator == 0)
                {
                    v = Convert.ToInt32(line);
                }
                if (lineIterator == 1)
                {
                    e = Convert.ToInt32(line);
                }
                if (lineIterator > 1)
                {
                    var lineSplitted = line.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                    var ve           = Convert.ToInt32(lineSplitted[0]);
                    var we           = Convert.ToInt32(lineSplitted[1]);
                    var weight       = Convert.ToDouble(lineSplitted[2], CultureInfo.InvariantCulture);
                    var edge         = new DirectedEdge(ve, we, weight);
                    edges.Add(edge);
                }

                lineIterator++;
            }

            var edgeWeightedDigraph = new EdgeWeightedDigraph(v, e, edges);

            Console.WriteLine(edgeWeightedDigraph);

            const int s = 5;

            // find shortest path from s to each other vertex in DAG
            var lp = new AcyclicLP(edgeWeightedDigraph, s);

            for (var vi = 0; vi < edgeWeightedDigraph.V; vi++)
            {
                if (lp.HasPathTo(vi))
                {
                    Console.Write($"{s} to {vi} {$"{lp.DistTo(vi):0.00}"}  ");
                    foreach (var ei in lp.PathTo(vi))
                    {
                        Console.Write($"{ei}   ");
                    }
                    Console.WriteLine();
                }
                else
                {
                    Console.Write($"{s} to {vi}         no path{Environment.NewLine}");
                }
            }
            Console.ReadLine();
        }
コード例 #49
0
        public void Run()
        {
            Console.WriteLine("Choose file:"); // Prompt
            Console.WriteLine("1 - tinyEWDAG.txt"); // Prompt
            //Console.WriteLine("2 - mediumEWD.txt"); // Prompt
            //Console.WriteLine("3 - mediumEWG.txt"); // Prompt

            Console.WriteLine("or quit"); // Prompt

            var fileNumber = Console.ReadLine();
            string fileName;
            switch (fileNumber)
            {
                case "1":
                    fileName = "tinyEWDAG.txt";
                    break;
                //case "2":
                //    fileName = "mediumEWD.txt";
                //    break;
                //case "3":
                //    fileName = "largeEWG.zip";
                //    break;
                case "quit":
                    return;
                default:
                    return;
            }

            var @in = new In($"Files\\Graphs\\{fileName}");
            var lines = @in.ReadAllLines();

            var lineIterator = 0;
            var v = 0;
            var e = 0;
            var edges = new List<DirectedEdge>();
            foreach (var line in lines)
            {
                if (lineIterator == 0)
                {
                    v = Convert.ToInt32(line);
                }
                if (lineIterator == 1)
                {
                    e = Convert.ToInt32(line);
                }
                if (lineIterator > 1)
                {
                    var lineSplitted = line.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                    var ve = Convert.ToInt32(lineSplitted[0]);
                    var we = Convert.ToInt32(lineSplitted[1]);
                    var weight = Convert.ToDouble(lineSplitted[2], CultureInfo.InvariantCulture);
                    var edge = new DirectedEdge(ve, we, weight);
                    edges.Add(edge);
                }

                lineIterator++;
            }

            var edgeWeightedDigraph = new EdgeWeightedDigraph(v, e, edges);
            Console.WriteLine(edgeWeightedDigraph);

            const int s = 5;

            // find shortest path from s to each other vertex in DAG
            var sp = new AcyclicSP(edgeWeightedDigraph, s);
            for (var vi = 0; vi < edgeWeightedDigraph.V; vi++)
            {
                if (sp.HasPathTo(vi))
                {
                    Console.Write($"{s} to {vi} {$"{sp.DistTo(vi):0.00}"}  ");
                    foreach (var ei in sp.PathTo(vi))
                    {
                        Console.Write($"{ei}   ");
                    }
                    Console.WriteLine();
                }
                else
                {
                    Console.Write($"{s} to {vi}         no path{Environment.NewLine}");
                }
            }
            Console.ReadLine();
        }
コード例 #50
0
 /// <summary>
 /// Initializes a new instance of the MinimalEdgeRing class.
 /// A MinimalEdgeRing is a ring of edges with the property that no node
 /// has degree greater than 2.  These are the form of rings required
 /// to represent polygons under the OGC SFS spatial data model.
 /// </summary>
 public MinimalEdgeRing(DirectedEdge start, GeometryFactory geometryFactory, CGAlgorithms cga) : base(start, geometryFactory, cga)
 {
 }
コード例 #51
0
        public void Run()
        {
            Console.WriteLine("Choose file:"); // Prompt
            Console.WriteLine("1 - tinyEWD.txt"); // Prompt
            Console.WriteLine("2 - mediumEWD.txt"); // Prompt
            //Console.WriteLine("3 - mediumEWG.txt"); // Prompt

            Console.WriteLine("or quit"); // Prompt

            var fileNumber = Console.ReadLine();
            string fileName;
            switch (fileNumber)
            {
                case "1":
                    fileName = "tinyEWD.txt";
                    break;
                case "2":
                    fileName = "mediumEWD.txt";
                    break;
                //case "3":
                //    fileName = "largeEWG.zip";
                //    break;
                case "quit":
                    return;
                default:
                    return;
            }

            var @in = new In($"Files\\Graphs\\{fileName}");
            var lines = @in.ReadAllLines();

            var lineIterator = 0;
            var v = 0;
            var e = 0;
            var edges = new List<DirectedEdge>();
            foreach (var line in lines)
            {
                if (lineIterator == 0)
                {
                    v = Convert.ToInt32(line);
                }
                if (lineIterator == 1)
                {
                    e = Convert.ToInt32(line);
                }
                if (lineIterator > 1)
                {
                    var lineSplitted = line.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries);
                    var ve = Convert.ToInt32(lineSplitted[0]);
                    var we = Convert.ToInt32(lineSplitted[1]);
                    var weight = Convert.ToDouble(lineSplitted[2], CultureInfo.InvariantCulture);
                    var edge = new DirectedEdge(ve, we, weight);
                    edges.Add(edge);
                }

                lineIterator++;
            }

            var adjMatrixEdgeWeightedDigraph = new AdjMatrixEdgeWeightedDigraph(v, e, edges);
            Console.WriteLine(adjMatrixEdgeWeightedDigraph);
            // run Floyd-Warshall algorithm
            var spt = new FloydWarshall(adjMatrixEdgeWeightedDigraph);

            // print all-pairs shortest path distances
            Console.Write("  ");
            for (var vv = 0; vv < adjMatrixEdgeWeightedDigraph.V; vv++)
            {
                Console.Write($"{vv} ");
            }
            Console.WriteLine();
            for (var vv = 0; vv < adjMatrixEdgeWeightedDigraph.V; vv++)
            {
                Console.Write($"{vv}: ");
                for (var w = 0; w < adjMatrixEdgeWeightedDigraph.V; w++)
                {
                    Console.Write(spt.HasPath(vv, w) ? $"{spt.Dist(vv, w):00} " : "  Inf ");
                }
                Console.WriteLine();
            }

            // print negative cycle
            if (spt.HasNegativeCycle)
            {
                Console.WriteLine("Negative cost cycle:");
                foreach (var edge in spt.NegativeCycle())
                    Console.WriteLine(edge);

                Console.WriteLine();
            }

            // print all-pairs shortest paths
            else
            {
                for (var vv = 0; vv < adjMatrixEdgeWeightedDigraph.V; vv++)
                {
                    for (var w = 0; w < adjMatrixEdgeWeightedDigraph.V; w++)
                    {
                        if (spt.HasPath(vv, w))
                        {
                            Console.Write($"{vv} to {w} {spt.Dist(vv, w):00}  ");
                            foreach (var edge in spt.Path(vv, w))
                                Console.Write($"{edge}  ");
                            Console.WriteLine();
                        }
                        else
                        {
                            Console.Write($"{vv} to {w} no path{Environment.NewLine}");
                        }
                    }
                }
            }

            Console.ReadLine();
        }
コード例 #52
0
        partial void test_math_nodeToolStripMenuItem_Click(object sender, EventArgs e)
        {
            string log = "";

            Node a = new Node(); // test constructor

            log += "\nNode " + a.ToString();
            a.ID = 0;             // test ID
            Node b = new Node(1); // test constructor

            log += "\n\nNode " + a.ToString();
            log += "\nNode " + b.ToString();
            object[] c0 = { 1.19, 4.23 };
            a.Coordinate = c0;
            object[] c1 = { 2.90, 3.01 };
            b.Coordinate = c1;             // test coordinate
            object[] c2 = { 1.09, 0.98 };
            Node     c  = new Node(2, c2); // test constructor

            Node[] n = { a, b, c };

            log += "\n";
            for (int i = 0; i < n.Length; i++)
            {
                log += "\nNode " + n[i].ToString();
            }

            Math.Vector x, y, z;

            // connect node 0 to node 1 with directed edge
            x = new Math.Vector((double)a.Coordinate[0], (double)a.Coordinate[1]);
            y = new Math.Vector((double)b.Coordinate[0], (double)b.Coordinate[1]);
            z = y - x;
            DirectedEdge e0 = new DirectedEdge(a, b);

            e0.Weight = z.Magnitude;
            a.Add(e0);
            b.Add(e0);
            // connect node 1 to node 2 with directed edge
            x = new Math.Vector((double)b.Coordinate[0], (double)b.Coordinate[1]);
            y = new Math.Vector((double)c.Coordinate[0], (double)c.Coordinate[1]);
            z = y - x;
            DirectedEdge e1 = new DirectedEdge(b, c);

            e1.Weight = z.Magnitude;
            b.Add(e1);
            c.Add(e1);
            // connect node 2 to node 0 with edge
            x = new Math.Vector((double)c.Coordinate[0], (double)c.Coordinate[1]);
            y = new Math.Vector((double)a.Coordinate[0], (double)a.Coordinate[1]);
            z = y - x;
            Edge e2 = (Edge) new Edge()
                      .Configure(c, a);

            e2.Weight = z.Magnitude;
            c.Add(e2);
            a.Add(e2);

            log += "\n";
            for (int i = 0; i < n.Length; i++)
            {
                log += "\nNode " + n[i].ToString();
            }

            richTextBox.Text = log;
        }
コード例 #53
0
        private bool MatchEdges(int from, DirectedEdge[] edges, params int[] to)
        {
            int edgesCount = 0;
            Dictionary<int, bool> tmp = new Dictionary<int, bool>();
            if (to != null)
            {
                foreach (int t in to)
                {
                    tmp[t] = false;
                }
            }

            if (edges != null)
            {
                edgesCount = edges.Length;
                foreach (DirectedEdge e in edges)
                {
                    if (e.From != from) return false;
                    if (!tmp.ContainsKey(e.To)) return false;
                    if (tmp[e.To]) return false;
                    tmp[e.To] = true;
                }
            }

            if (tmp.Count != edgesCount) return false;

            return true;

        }
コード例 #54
0
        /// <summary>
        /// Parse XML file
        /// </summary>
        private void ParseFile(XmlDocument doc)
        {
            vertices.Clear();
            edges.Clear();

            //Go through each node in XML file
            foreach (XmlNode node in doc.DocumentElement.ChildNodes)
            {
                var vertex = new Vertex();
                //One node (room)
                if (node.Name.Equals("Node"))
                {
                    //Go through properties of one node (room)
                    foreach (XmlNode n in node.ChildNodes)
                    {
                        if (n.Name.Equals("Identifier"))
                        {
                            vertex.Id = Int32.Parse(n.InnerText);
                            if (vertex.Id > maxId)
                            {
                                maxId = vertex.Id;
                            }
                        }
                        else if (n.Name.Equals("X"))
                        {
                            vertex.X = int.Parse(n.InnerText);
                        }
                        else if (n.Name.Equals("Y"))
                        {
                            vertex.Y = int.Parse(n.InnerText);
                        }
                        else if (n.Name.Equals("Rooms"))
                        {
                            foreach (XmlNode nc in n.ChildNodes)
                            {
                                if (nc.Name.Equals("Rm"))
                                {
                                    vertex.Rooms.Add(int.Parse(nc.InnerText));
                                }
                            }
                        }
                        else if (n.Name.Equals("StartLocation") && bool.Parse(n.InnerText))
                        {
                            // Set starting location.
                            startVertex = vertex;
                        }
                    }

                    vertices.Add(vertex);
                }
                else if (node.Name.Equals("Connection"))
                {
                    int    a = -1, b = -1;
                    double weight = -1;

                    foreach (XmlNode n in node.ChildNodes)
                    {
                        if (n.Name.Equals("A"))
                        {
                            a = Int32.Parse(n.InnerText);
                        }
                        else if (n.Name.Equals("B"))
                        {
                            b = Int32.Parse(n.InnerText);
                        }
                        else if (n.Name.Equals("Weight"))
                        {
                            weight = double.Parse(n.InnerText);
                        }
                    }

                    if (a != -1 && b != -1 && weight != -1)
                    {
                        var edge1 = new DirectedEdge(a, b, weight);
                        var edge2 = new DirectedEdge(b, a, weight);

                        edges.Add(edge1);
                        edges.Add(edge2);
                    }
                }
                else
                {
                    Debug.WriteLine("File is not formatted correctly.");
                }
            }

            graph = new EdgeWeightedDigraph(maxId + 1);

            foreach (var edge in edges)
            {
                graph.AddEdge(edge);
            }
        }
コード例 #55
0
ファイル: Edge.cs プロジェクト: DIVEROVIEDO/DotSpatial
 /// <summary>
 /// Constructs an Edge initialized with the given DirectedEdges, and for each
 /// DirectedEdge: sets the Edge, sets the symmetric DirectedEdge, and adds
 /// this Edge to its from-Node.
 /// </summary>
 /// <param name="de0"></param>
 /// <param name="de1"></param>
 public Edge(DirectedEdge de0, DirectedEdge de1)
 {
     SetDirectedEdges(de0, de1);
 }
コード例 #56
0
        public static void ShowCycles(int pos, Document document)
        {
            Dictionary <string, string> result = new Dictionary <string, string>();

            // Check if initial file is a grammar.
            ParsingResults pd_parser = ParsingResultsFactory.Create(document) as ParsingResults;

            if (pd_parser == null)
            {
                throw new LanguageServerException("A grammar file is not selected. Please select one first.");
            }
            Transform.ExtractGrammarType egt = new Transform.ExtractGrammarType();
            ParseTreeWalker.Default.Walk(egt, pd_parser.ParseTree);
            bool is_grammar = egt.Type == Transform.ExtractGrammarType.GrammarType.Parser ||
                              egt.Type == Transform.ExtractGrammarType.GrammarType.Combined ||
                              egt.Type == Transform.ExtractGrammarType.GrammarType.Lexer;

            if (!is_grammar)
            {
                throw new LanguageServerException("A grammar file is not selected. Please select one first.");
            }

            // Find all other grammars by walking dependencies (import, vocab, file names).
            HashSet <string> read_files = new HashSet <string>
            {
                document.FullPath
            };
            Dictionary <Workspaces.Document, List <TerminalNodeImpl> > every_damn_literal =
                new Dictionary <Workspaces.Document, List <TerminalNodeImpl> >();

            for (; ;)
            {
                int before_count = read_files.Count;
                foreach (string f in read_files)
                {
                    List <string> additional = ParsingResults.InverseImports.Where(
                        t => t.Value.Contains(f)).Select(
                        t => t.Key).ToList();
                    read_files = read_files.Union(additional).ToHashSet();
                }
                foreach (string f in read_files)
                {
                    var additional = ParsingResults.InverseImports.Where(
                        t => t.Key == f).Select(
                        t => t.Value);
                    foreach (var t in additional)
                    {
                        read_files = read_files.Union(t).ToHashSet();
                    }
                }
                int after_count = read_files.Count;
                if (after_count == before_count)
                {
                    break;
                }
            }

            // Construct graph of symbol usage.
            Transform.TableOfRules table = new Transform.TableOfRules(pd_parser, document);
            table.ReadRules();
            table.FindPartitions();
            table.FindStartRules();
            Digraph <string> graph = new Digraph <string>();

            foreach (Transform.TableOfRules.Row r in table.rules)
            {
                if (!r.is_parser_rule)
                {
                    continue;
                }
                graph.AddVertex(r.LHS);
            }
            foreach (Transform.TableOfRules.Row r in table.rules)
            {
                if (!r.is_parser_rule)
                {
                    continue;
                }
                List <string> j = r.RHS;
                //j.Reverse();
                foreach (string rhs in j)
                {
                    Transform.TableOfRules.Row sym = table.rules.Where(t => t.LHS == rhs).FirstOrDefault();
                    if (!sym.is_parser_rule)
                    {
                        continue;
                    }
                    DirectedEdge <string> e = new DirectedEdge <string>(r.LHS, rhs);
                    graph.AddEdge(e);
                }
            }
            List <string> starts           = new List <string>();
            List <string> parser_lhs_rules = new List <string>();

            foreach (Transform.TableOfRules.Row r in table.rules)
            {
                if (r.is_parser_rule)
                {
                    parser_lhs_rules.Add(r.LHS);
                    if (r.is_start)
                    {
                        starts.Add(r.LHS);
                    }
                }
            }

            IParseTree rule = null;
            IParseTree it   = pd_parser.AllNodes.Where(n =>
            {
                if (!(n is ANTLRv4Parser.ParserRuleSpecContext || n is ANTLRv4Parser.LexerRuleSpecContext))
                {
                    return(false);
                }
                Interval source_interval = n.SourceInterval;
                int a     = source_interval.a;
                int b     = source_interval.b;
                IToken ta = pd_parser.TokStream.Get(a);
                IToken tb = pd_parser.TokStream.Get(b);
                var start = ta.StartIndex;
                var stop  = tb.StopIndex + 1;
                return(start <= pos && pos < stop);
            }).FirstOrDefault();

            rule = it;
            var           k       = (ANTLRv4Parser.ParserRuleSpecContext)rule;
            var           tarjan  = new TarjanSCC <string, DirectedEdge <string> >(graph);
            List <string> ordered = new List <string>();
            var           sccs    = tarjan.Compute();

            StringBuilder sb = new StringBuilder();

            sb.AppendLine("Cycles in " + document.FullPath);
            var done = new List <IEnumerable <string> >();

            foreach (var scc in sccs)
            {
                if (scc.Value.Count() <= 1)
                {
                    continue;
                }
                if (!done.Contains(scc.Value))
                {
                    foreach (var s in scc.Value)
                    {
                        sb.Append(" ");
                        sb.Append(s);
                    }
                    sb.AppendLine();
                    sb.AppendLine();
                    done.Add(scc.Value);
                }
            }

            //var scc = sccs[k.RULE_REF().ToString()];
            //foreach (var v in scc)
            //{
            //    ordered.Add(v);
            //}
        }