Ejemplo n.º 1
0
        public void IfCase()
        {
            BasicBlock.clearIndexCounter();
            var cfg = GenerateCFG(
                @"
{
a = 3;
b = 2;
c = a + b;
if t
{
a = a;
}
else 
{
b = b;
}
}
");
            var spanningTree = new SpanningTree(cfg);
            var actual       = spanningTree.dfst;
            var expected     = new List <IndexEdge>()
            {
                new IndexEdge(4, 0),
                new IndexEdge(0, 2),
                new IndexEdge(2, 3),
                new IndexEdge(3, 5),
                new IndexEdge(0, 1)
            };

            Assert.AreEqual(expected, actual);
        }
Ejemplo n.º 2
0
        public override void RunAlgorithm(IGraph graph)
        {
            // reset edge styles
            foreach (var edge in graph.Edges)
            {
                graph.SetStyle(edge, graph.EdgeDefaults.Style);
            }
            // calculate the spanning tree
            var result = new SpanningTree {
                Costs = { Delegate = GetEdgeWeight }
            }.Run(graph);
            // highlight the tree nodes and edges
            var nodes = new HashSet <INode>();

            foreach (var edge in result.Edges)
            {
                edge.Tag = new Tag {
                    CurrentColor = Colors.Blue
                };
                nodes.Add(edge.GetSourceNode());
                nodes.Add(edge.GetTargetNode());
            }
            foreach (var node in nodes)
            {
                node.Tag = new Tag {
                    CurrentColor = Colors.Blue
                };
            }
        }
Ejemplo n.º 3
0
        static void Benchmark(int vertices, int maxEdges, int increment, int repetitions, string filename)
        {
            Stopwatch timer = new Stopwatch();

            using (StreamWriter file = new StreamWriter("Results/Data/" + filename + ".csv"))
            {
                for (int edges = 10000; edges <= maxEdges; edges += increment)
                {
                    long averageTime = 0;
                    var  rand        = new Random();
                    for (int j = 0; j < repetitions; j++)
                    {
                        Graph g = GraphGenerator(vertices, edges);
                        timer.Start();
                        SpanningTreeInfo sti = SpanningTree.GetSpanning(g);
                        timer.Stop();
                        averageTime += timer.ElapsedMilliseconds;
                        timer.Reset();
                    }
                    averageTime /= repetitions;
                    file.WriteLine("{0},{1}", edges, averageTime);
                    Console.WriteLine(edges + " " + averageTime);
                }
            }
        }
Ejemplo n.º 4
0
 public Edge(SpanningTree <T> .Node source, SpanningTree <T> .Node target, int order, T value)
 {
     this.source = source;
     this.target = target;
     this.order  = order;
     this.@value = value;
 }
Ejemplo n.º 5
0
 private void ProcessClusters()
 {
     if (_touchTracker.SpanningTreeCount > 0)
     {
         UpdateTouchOrder();
         for (int i = 0; i < _touchOrder.Count; i++)
         {
             SpanningTree tree = _touchTracker.GetSpanningTree(_touchOrder[i].TreeIndex);
             tree.GetTouchCluster(_cluster);
             try
             {
                 var  touch     = _cluster.Touches[_cluster.ActiveTouchId];
                 bool processed = ProcessTouch(touch, _cluster);
                 if (RecordDebugInfo)
                 {
                     _debugBuffer.AppendFormat("{0}[{1}]{2}", _cluster.ClusterId, _cluster.ActiveTouchId,
                                               processed ? "* " : "- ");
                 }
             }
             catch (Exception e)
             {
                 Debug.LogErrorFormat(this, "Exception processing cluster. {0} touches, activeTouchId = {1}\n{2}",
                                      _cluster.Touches.Count, _cluster.ActiveTouchId, e.ToString());
             }
         }
         _usedTargets.Clear();
     }
 }
Ejemplo n.º 6
0
        public void TestSplit()
        {
            var          mol       = smilesParser.ParseSmiles("C1CC1C2CCC2");
            SpanningTree st        = new SpanningTree(mol);
            IRingSet     rings     = st.GetAllRings();
            IBond        splitBond = null;

            for (int i = 0; i < mol.Bonds.Count; i++)
            {
                if (rings.GetRings(mol.Bonds[i]).Count() == 0)
                {
                    splitBond = mol.Bonds[i];
                    break;
                }
            }
            var             frags       = FragmentUtils.SplitMolecule(mol, splitBond);
            SmilesGenerator sg          = new SmilesGenerator();
            var             uniqueFrags = new HashSet <string>();

            foreach (var frag in frags)
            {
                uniqueFrags.Add(sg.Create(frag));
            }
            Assert.AreEqual(2, uniqueFrags.Count);
            // You can put the fragments back together with a ring closure and dot
            // [CH]12CC1.[CH]12CCC1
            Assert.IsTrue(uniqueFrags.IsSupersetOf(new[] { "[CH]1CC1", "[CH]1CCC1" }));
        }
Ejemplo n.º 7
0
 public MapGraph(List<Node> nodes, List<Edge> edges, DelaunayTriangles dt, SpanningTree spt, List<RoomArea> roomareas)
 {
     NodeList = nodes;
     EdgeList = edges;
     DT = dt;
     SPT = spt;
     RoomAreas = roomareas;
 }
Ejemplo n.º 8
0
        public void CanBuildSpanningTreeUsingKruskalAlgorithm()
        {
            var kruskal = SpanningTree.Kruskal(inputGraph);

            Assert.AreEqual(8, kruskal.Vertexes.Count);
            Assert.AreEqual(7, kruskal.Edges.Count);
            Assert.AreEqual(71, kruskal.Edges.Sum(_ => _.Weight));
        }
Ejemplo n.º 9
0
        public void CanBuildSpanningTreeUsingBoruvkaAlgorithm()
        {
            var boruvka = SpanningTree.Boruvka(inputGraph);

            Assert.AreEqual(8, boruvka.Vertexes.Count);
            Assert.AreEqual(7, boruvka.Edges.Count);
            Assert.AreEqual(71, boruvka.Edges.Sum(_ => _.Weight));
        }
Ejemplo n.º 10
0
 private void DisplayTreeInRenderer(LineRenderer lineRenderer, SpanningTree tree)
 {
     _lines.Clear();
     ComputeDisplayEdges(tree.Root, tree);
     lineRenderer.positionCount = _lines.Count;
     for (int i = 0; i < _lines.Count; i++)
     {
         lineRenderer.SetPosition(i, _lines[i]);
     }
     lineRenderer.enabled = true;
 }
Ejemplo n.º 11
0
 /// <summary>
 /// Identifies a touch cluster which contains a given touch ID
 /// </summary>
 /// <param name="touchId"></param>
 /// <param name="cluster"></param>
 /// <returns></returns>
 public bool GetTouchClusterForTouchId(int touchId, TouchCluster cluster)
 {
     for (int i = 0; i < _touchTracker.SpanningTreeCount; i++)
     {
         SpanningTree tree = _touchTracker.GetSpanningTree(i);
         if (tree.ContainsTouchId(touchId))
         {
             return(tree.GetTouchCluster(cluster));
         }
     }
     cluster.Clear();
     return(false);
 }
        public void Minimum()
        {
            IGraph <int, WeightedEdge <int> > G = new DirectedGraph <int, WeightedEdge <int> >();

            {
                G.Vertexes.Add(1);
                G.Vertexes.Add(2);
                G.Vertexes.Add(3);
                G.Edges.Add(new WeightedEdge <int>(1, 2, 1));
                G.Edges.Add(new WeightedEdge <int>(1, 3, 1));
                G.Edges.Add(new WeightedEdge <int>(2, 3, 2));
            }
            Assert.AreEqual(2, SpanningTree.MinimumByKruskal(G, WeightedEdge <int> .WeightFunc, out var edges));
            Assert.AreEqual(2, edges.Count);
        }
Ejemplo n.º 13
0
    public void CalculateMin()
    {
        this.Reset();
        IntrusiveMinHeap <SpanningTree <T> .Edge> intrusiveMinHeap = new IntrusiveMinHeap <SpanningTree <T> .Edge>();

        foreach (SpanningTree <T> .Node node in this.nodes)
        {
            if (node.connected)
            {
                continue;
            }
            foreach (SpanningTree <T> .Edge edge in node.edges)
            {
                if (edge.target.connected)
                {
                    continue;
                }
                intrusiveMinHeap.Add(edge);
            }
            node.connected = true;
            while (!intrusiveMinHeap.Empty)
            {
                SpanningTree <T> .Edge edge1 = intrusiveMinHeap.Pop();
                SpanningTree <T> .Node node1 = edge1.target;
                if (node1.connected)
                {
                    continue;
                }
                node1.connected = true;
                foreach (SpanningTree <T> .Edge edge2 in node1.edges)
                {
                    if (edge2.target == edge1.source)
                    {
                        edge1 = edge2;
                    }
                    if (edge2.target.connected)
                    {
                        continue;
                    }
                    intrusiveMinHeap.Add(edge2);
                }
                this.edges.Add(edge1);
            }
        }
    }
Ejemplo n.º 14
0
        private void UpdateTouchOrder()
        {
            if (_touchTracker.SpanningTreeCount == 0)
            {
                _touchOrder.Clear();
                return;
            }

            // mark all trackers as unused
            for (int i = 0; i < _touchOrder.Count; i++)
            {
                SetTouchOrderTree(i, -1);
            }

            // find the trackers for each cluster and set the correct tree index
            for (int i = 0; i < _touchTracker.SpanningTreeCount; i++)
            {
                SpanningTree tree  = _touchTracker.GetSpanningTree(i);
                int          index = TouchOrderFindIndex(tree.GetActiveTouchId());
                if (index != -1)
                {
                    // Set current tree index for this touch id
                    SetTouchOrderTree(index, i);
                }
                else
                {
                    // Add new tree to end of order
                    _touchOrder.Add(new TouchOrder
                    {
                        FingerId  = tree.GetActiveTouchId(),
                        TreeIndex = i
                    });
                }
            }

            // Remove any trackers that no longer have trees associated.
            for (int i = _touchOrder.Count - 1; i >= 0; i--)
            {
                if (_touchOrder[i].TreeIndex == -1)
                {
                    _touchOrder.RemoveAt(i);
                }
            }
        }
Ejemplo n.º 15
0
        public void test_kruskal()
        {
            Graph            g = g1();
            SpanningTreeInfo s = SpanningTree.GetSpanning(g);

            Assert.AreEqual(16, s.cost);

            Graph            mg  = mstGraph();
            SpanningTreeInfo mst = SpanningTree.GetSpanning(mg);

            Assert.AreEqual(10, mst.cost);
            // Test for listing edges
            /* foreach(Edge e in mst.edges) */
            /* { */
            /*  Console.WriteLine("From {0} to {1} with cost {2}", */
            /*          e.source, e.destination, e.weight); */
            /* } */
            /* Assert.True(false); */
        }
Ejemplo n.º 16
0
        public void IntegrationTest()
        {
            var graph     = GraphGenerator.GenerateGraph(10000, 500000, 1, 400);
            var stopwatch = new Stopwatch();

            stopwatch.Start();
            var boruvka = SpanningTree.Boruvka(graph);

            stopwatch.Stop();
            Debug.WriteLine(stopwatch.ElapsedTicks);

            stopwatch.Restart();
            var kruskal = SpanningTree.Kruskal(graph);

            stopwatch.Stop();
            Debug.WriteLine(stopwatch.ElapsedTicks);

            Assert.AreEqual(boruvka.Weight, kruskal.Weight);
        }
Ejemplo n.º 17
0
        private void ComputeDisplayEdges(SpanningTree.Node current, SpanningTree tree)
        {
            if (current == null)
            {
                return;
            }
            TouchPt touch = tree.GetTouchPoint(current);
            Vector2 pos;

            RectTransformUtility.ScreenPointToLocalPointInRectangle((RectTransform)transform, touch.position,
                                                                    Camera.main, out pos);

            _lines.Add(pos);

            foreach (var neighbor in current.Neighbors)
            {
                ComputeDisplayEdges(neighbor, tree);
                _lines.Add(pos);
            }
        }
Ejemplo n.º 18
0
        public void Simple()
        {
            BasicBlock.clearIndexCounter();
            var cfg = GenerateCFG(
                @"
{
a = 3;
b = 2;
c = a + b;
}
");
            var spanningTree = new SpanningTree(cfg);
            var actual       = spanningTree.dfst;
            var expected     = new List <IndexEdge>()
            {
                new IndexEdge(1, 0),
                new IndexEdge(0, 2)
            };

            Assert.AreEqual(expected, actual);
        }
Ejemplo n.º 19
0
        /// <summary>  Returns a ringset containing all rings in the given AtomContainer
        ///
        /// </summary>
        /// <param name="atomContainer">    The AtomContainer to be searched for rings
        /// </param>
        /// <returns>                   A RingSet with all rings in the AtomContainer
        /// </returns>
        /// <exception cref="CDKException"> An exception thrown if something goes wrong or if the timeout limit is reached
        /// </exception>
        public virtual IRingSet findAllRings(IAtomContainer atomContainer)
        {
            startTime = (System.DateTime.Now.Ticks - 621355968000000000) / 10000;
            SpanningTree spanningTree;

            try
            {
                spanningTree = new SpanningTree((IAtomContainer)atomContainer.Clone());
            }
            //UPGRADE_NOTE: Exception 'java.lang.CloneNotSupportedException' was converted to 'System.Exception' which has different behavior. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1100'"
            catch (System.Exception e)
            {
                throw new CDKException("Could not clone IAtomContainer!", e);
            }
            spanningTree.identifyBonds();
            if (spanningTree.BondsCyclicCount < 37)
            {
                findAllRings(atomContainer, false);
            }
            return(findAllRings(atomContainer, true));
        }
Ejemplo n.º 20
0
        private static List <IBond> GetSplitableBonds(IAtomContainer atomContainer)
        {
            // do ring detection
            var spanningTree = new SpanningTree(atomContainer);
            var allRings     = spanningTree.GetAllRings();

            // find the splitable bonds
            List <IBond> splitableBonds = new List <IBond>();

            foreach (var bond in atomContainer.Bonds)
            {
                bool isInRing   = false;
                bool isTerminal = false;

                // lets see if it's in a ring
                var rings = allRings.GetRings(bond);
                if (rings.Any())
                {
                    isInRing = true;
                }

                // lets see if it is a terminal bond
                foreach (var atom in bond.Atoms)
                {
                    if (atomContainer.GetConnectedBonds(atom).Count() == 1)
                    {
                        isTerminal = true;
                        break;
                    }
                }

                if (!(isInRing || isTerminal))
                {
                    splitableBonds.Add(bond);
                }
            }
            return(splitableBonds);
        }
Ejemplo n.º 21
0
    // Use this for initialization
    void Start()
    {
        DT = new DelaunayTriangles(new Rect(0,0,128,64));
        DT.VertexList.Add(new Vertex(3,6));
        DT.VertexList.Add(new Vertex(34, 21));
        DT.VertexList.Add(new Vertex(10, 15));
        DT.VertexList.Add(new Vertex(98, 62));
        DT.VertexList.Add(new Vertex(73, 21));
        for (int i = 0; i < 20; i++) {
            float x = Random.Range(0, 128);
            float y = Random.Range(0, 64);
            DT.VertexList.Add(new Vertex(x,y));
        }

        List<Node> nodes = new List<Node>();
        foreach (Vertex v in DT.VertexList) {
            //sp.transform.position = v.Position;
            GameObject obj = GameObject.Instantiate(sp);
            obj.transform.position = v.Position;
            obj.SetActive(true);
            nodes.Add(new Node(v.Position));
        }
        DT.DelaunayTrianglation();
        //DT.DelaunayTrianglation();
        //Debug.Log(DT.RootTriangle.ToString());
        List<Edge> edges = new List<Edge>();
        foreach (Triangle t in DT.TriangleSet.Keys) {
            Node n1 = nodes.Find(n => n.Position.Equals(t.V1.Position));
            Node n2 = nodes.Find(n => n.Position.Equals(t.V2.Position));
            Node n3 = nodes.Find(n => n.Position.Equals(t.V3.Position));
            edges.Add(new Edge(n1, n2, (n1.Position - n2.Position).sqrMagnitude));
            edges.Add(new Edge(n2, n3, (n2.Position - n3.Position).sqrMagnitude));
            edges.Add(new Edge(n3, n1, (n3.Position - n1.Position).sqrMagnitude));
        }
        SpanningTree spt = new SpanningTree(nodes.ToArray(),edges.ToArray());
        spt.createTree(0);
        Spt = spt;
    }
Ejemplo n.º 22
0
        public void Complex()
        {
            BasicBlock.clearIndexCounter();
            var cfg = GenerateCFG(
                @"
{
a = 3;
if t
{
a = a;
while (true)
{
d = c;
}
}
else 
{
b = b;
}
}
");
            var spanningTree = new SpanningTree(cfg);
            var actual       = spanningTree.dfst;
            var expected     = new List <IndexEdge>()
            {
                new IndexEdge(8, 0),
                new IndexEdge(0, 2),
                new IndexEdge(2, 3),
                new IndexEdge(3, 5),
                new IndexEdge(3, 4),
                new IndexEdge(4, 6),
                new IndexEdge(6, 7),
                new IndexEdge(7, 9),
                new IndexEdge(0, 1)
            };

            Assert.AreEqual(expected, actual);
        }
Ejemplo n.º 23
0
        private static void Main()
        {
            Console.WriteLine("\nTask 3.1 Edges~=1/10*Vertexes^2");

            for (var i = 1; i < 1e4 + 1; i += 100)
            {
                var stopWatch = new Stopwatch();
                var graph     = GraphGenerator.GenerateGraph(i, i * (i - 1) / 10, 1, (int)1e6);

                stopWatch.Restart();
                var boruvkaSpanningTree = SpanningTree.Boruvka(graph);
                stopWatch.Stop();
                var burovkaTime = stopWatch.ElapsedTicks;

                stopWatch.Restart();
                var kruskalSpanningTree = SpanningTree.Kruskal(graph);
                stopWatch.Stop();
                var kruskalTime = stopWatch.ElapsedTicks;

                var kruskalWeight = kruskalSpanningTree.Weight;
                var burovkaWeight = boruvkaSpanningTree.Weight;

                var testResult = new TestResult {
                    Edges          = graph.Edges.Count,
                    Vertexes       = graph.Vertexes.Count,
                    WeightsMatched = burovkaWeight == kruskalWeight ? "Passed" : "Failed",
                    BurovkaTime    = burovkaTime, KruskalTime = kruskalTime
                };

                Console.WriteLine(testResult);
            }

            Console.WriteLine("\nTask 3.1 Full Graph");
            for (var i = 1; i < 1e4 + 1; i += 100)
            {
                var stopWatch = new Stopwatch();
                var graph     = GraphGenerator.GenerateFullGraph(i, 1, (int)1e6);

                stopWatch.Restart();
                var boruvkaSpanningTree = SpanningTree.Boruvka(graph);
                stopWatch.Stop();
                var burovkaTime = stopWatch.ElapsedTicks;

                stopWatch.Restart();
                var kruskalSpanningTree = SpanningTree.Kruskal(graph);
                stopWatch.Stop();
                var kruskalTime = stopWatch.ElapsedTicks;

                var kruskalWeight = kruskalSpanningTree.Weight;
                var burovkaWeight = boruvkaSpanningTree.Weight;

                var testResult = new TestResult {
                    Edges          = graph.Edges.Count,
                    Vertexes       = graph.Vertexes.Count,
                    WeightsMatched = burovkaWeight == kruskalWeight ? "Passed" : "Failed",
                    BurovkaTime    = burovkaTime, KruskalTime = kruskalTime
                };
                Console.WriteLine(testResult);
            }

            Console.WriteLine("\nTask 3.2 Edges=100*Vertexes");
            for (var i = 201; i < 1e4 + 1; i += 100)
            {
                var stopWatch = new Stopwatch();
                var graph     = GraphGenerator.GenerateGraph(i, 100 * i, 1, (int)1e6);

                stopWatch.Restart();
                var boruvkaSpanningTree = SpanningTree.Boruvka(graph);
                stopWatch.Stop();
                var burovkaTime = stopWatch.ElapsedTicks;

                stopWatch.Restart();
                var kruskalSpanningTree = SpanningTree.Kruskal(graph);
                stopWatch.Stop();
                var kruskalTime = stopWatch.ElapsedTicks;

                var kruskalWeight = kruskalSpanningTree.Weight;
                var burovkaWeight = boruvkaSpanningTree.Weight;

                var testResult = new TestResult {
                    Edges          = graph.Edges.Count,
                    Vertexes       = graph.Vertexes.Count,
                    WeightsMatched = burovkaWeight == kruskalWeight ? "Passed" : "Failed",
                    BurovkaTime    = burovkaTime, KruskalTime = kruskalTime
                };

                Console.WriteLine(testResult);
            }

            Console.WriteLine("\nTask 3.2 Edges=1000*Vertexes");
            for (var i = 3001; i < 1e4 + 1; i += 100)
            {
                var stopWatch = new Stopwatch();
                var graph     = GraphGenerator.GenerateGraph(i, 1000 * i, 1, (int)1e6);

                stopWatch.Restart();
                var boruvkaSpanningTree = SpanningTree.Boruvka(graph);
                stopWatch.Stop();
                var burovkaTime = stopWatch.ElapsedTicks;

                stopWatch.Restart();
                var kruskalSpanningTree = SpanningTree.Kruskal(graph);
                stopWatch.Stop();
                var kruskalTime = stopWatch.ElapsedTicks;

                var kruskalWeight = kruskalSpanningTree.Weight;
                var burovkaWeight = boruvkaSpanningTree.Weight;

                var testResult = new TestResult {
                    Edges          = graph.Edges.Count,
                    Vertexes       = graph.Vertexes.Count,
                    WeightsMatched = burovkaWeight == kruskalWeight ? "Passed" : "Failed",
                    BurovkaTime    = burovkaTime, KruskalTime = kruskalTime
                };
                Console.WriteLine(testResult);
            }

            Console.WriteLine("\nTask 3.3");
            for (var i = (int)1e5; i < 1e7; i += (int)1e5)
            {
                var stopWatch = new Stopwatch();
                var graph     = GraphGenerator.GenerateGraph((int)(1e4) + 1, i, 1, (int)1e6);

                stopWatch.Restart();
                var boruvkaSpanningTree = SpanningTree.Boruvka(graph);
                stopWatch.Stop();
                var burovkaTime = stopWatch.ElapsedTicks;

                stopWatch.Restart();
                var kruskalSpanningTree = SpanningTree.Kruskal(graph);
                stopWatch.Stop();
                var kruskalTime = stopWatch.ElapsedTicks;

                var kruskalWeight = kruskalSpanningTree.Weight;
                var burovkaWeight = boruvkaSpanningTree.Weight;

                var testResult = new TestResult {
                    Edges          = graph.Edges.Count,
                    Vertexes       = graph.Vertexes.Count,
                    WeightsMatched = burovkaWeight == kruskalWeight ? "Passed" : "Failed",
                    BurovkaTime    = burovkaTime, KruskalTime = kruskalTime
                };
                Console.WriteLine(testResult);
            }

            Console.WriteLine("\nTask 3.4 Full Graph");
            for (var i = 1; i <= 200; i++)
            {
                var stopWatch = new Stopwatch();
                var graph     = GraphGenerator.GenerateFullGraph((int)(1e4) + 1, 1, i);

                stopWatch.Restart();
                var boruvkaSpanningTree = SpanningTree.Boruvka(graph);
                stopWatch.Stop();
                var burovkaTime = stopWatch.ElapsedTicks;

                stopWatch.Restart();
                var kruskalSpanningTree = SpanningTree.Kruskal(graph);
                stopWatch.Stop();
                var kruskalTime = stopWatch.ElapsedTicks;

                var kruskalWeight = kruskalSpanningTree.Weight;
                var burovkaWeight = boruvkaSpanningTree.Weight;

                var testResult = new TestResult {
                    Edges          = graph.Edges.Count,
                    Vertexes       = graph.Vertexes.Count,
                    WeightsMatched = burovkaWeight == kruskalWeight ? "Passed" : "Failed",
                    BurovkaTime    = burovkaTime, KruskalTime = kruskalTime
                };

                Console.WriteLine(testResult);
            }

            Console.WriteLine("\nTask 3.4 Edges = 1000 * Vertexes");
            for (var i = 1; i <= 200; i++)
            {
                var stopWatch = new Stopwatch();
                var graph     = GraphGenerator.GenerateGraph((int)(1e4) + 1, (int)1e7, 1, i);

                stopWatch.Restart();
                var boruvkaSpanningTree = SpanningTree.Boruvka(graph);
                stopWatch.Stop();
                var burovkaTime = stopWatch.ElapsedTicks;

                stopWatch.Restart();
                var kruskalSpanningTree = SpanningTree.Kruskal(graph);
                stopWatch.Stop();
                var kruskalTime = stopWatch.ElapsedTicks;

                var kruskalWeight = kruskalSpanningTree.Weight;
                var burovkaWeight = boruvkaSpanningTree.Weight;

                var testResult = new TestResult {
                    Edges          = graph.Edges.Count,
                    Vertexes       = graph.Vertexes.Count,
                    WeightsMatched = burovkaWeight == kruskalWeight ? "Passed" : "Failed",
                    BurovkaTime    = burovkaTime, KruskalTime = kruskalTime
                };
                Console.WriteLine(testResult);
            }
        }
Ejemplo n.º 24
0
        /// <summary>
        /// The method calculates the number of rotatable bonds of an atom container.
        /// If the boolean parameter is set to <see langword="true"/>, terminal bonds are included.
        /// </summary>
        /// <returns>number of rotatable bonds</returns>
        /// <param name="includeTerminals"><see langword="true"/> if terminal bonds are included</param>
        /// <param name="excludeAmides"><see langword="true"/> if amide C-N bonds should be excluded</param>
        public Result Calculate(IAtomContainer container, bool includeTerminals = false, bool excludeAmides = false)
        {
            container = (IAtomContainer)container.Clone();

            IRingSet ringSet;

            try
            {
                ringSet = new SpanningTree(container).GetBasicRings();
            }
            catch (NoSuchAtomException)
            {
                return(new Result(0));
            }

            foreach (var bond in container.Bonds)
            {
                if (ringSet.GetRings(bond).Count() > 0)
                {
                    bond.IsInRing = true;
                }
            }

            int rotatableBondsCount = 0;

            foreach (var bond in container.Bonds)
            {
                var atom0 = bond.Atoms[0];
                var atom1 = bond.Atoms[1];
                if (atom0.AtomicNumber.Equals(AtomicNumbers.H) || atom1.AtomicNumber.Equals(AtomicNumbers.H))
                {
                    continue;
                }
                if (bond.Order == BondOrder.Single)
                {
                    if (BondManipulator.IsLowerOrder(container.GetMaximumBondOrder(atom0), BondOrder.Triple) &&
                        BondManipulator.IsLowerOrder(container.GetMaximumBondOrder(atom1), BondOrder.Triple))
                    {
                        if (!bond.IsInRing)
                        {
                            if (excludeAmides && (IsAmide(atom0, atom1, container) || IsAmide(atom1, atom0, container)))
                            {
                                continue;
                            }

                            // if there are explicit H's we should ignore those bonds
                            var degree0 = container.GetConnectedBonds(atom0).Count() - GetConnectedHCount(container, atom0);
                            var degree1 = container.GetConnectedBonds(atom1).Count() - GetConnectedHCount(container, atom1);
                            if ((degree0 == 1) || (degree1 == 1))
                            {
                                if (includeTerminals)
                                {
                                    rotatableBondsCount += 1;
                                }
                            }
                            else
                            {
                                rotatableBondsCount += 1;
                            }
                        }
                    }
                }
            }

            return(new Result(rotatableBondsCount));
        }
Ejemplo n.º 25
0
        private void ProcessInput()
        {
            if (RendererPrefab != null)
            {
                if (_touchList.Count > 0)
                {
                    if (_currentTrees.Count == 0)
                    {
                        SpanningTree newTree = SpanningTree.Get();
                        newTree.SetTouchList(_touchList);
                        if (newTree.SeparateClusters(_currentTrees))
                        {
                            newTree.Dispose();
                        }
                    }
                    else
                    {
                        foreach (var tree in _currentTrees)
                        {
                            // UpdateTouchPoints returns zero if the tree has been emptied of all touch points
                            // SeparateClusters adds either tree, or the results of the split trees into _tempTrees
                            // and returns true if the tree was split
                            if (tree.UpdateTouchPoints(_touchList) == 0 || tree.SeparateClusters(_tempTrees))
                            {
                                tree.Dispose();
                            }
                        }

                        // Swap tree lists, making the result of the update the _currentTrees
                        var temp = _currentTrees;
                        _currentTrees = _tempTrees;
                        _tempTrees    = temp;
                        // clear the _tempTrees list
                        // Any trees that are not current have already been disposed
                        _tempTrees.Clear();


                        // Any touches left in _touchList are ones that are new
                        foreach (var touch in _touchList)
                        {
                            if (touch.phase == TouchPhase.Canceled || touch.phase == TouchPhase.Ended)
                            {
                                continue; // don't add old touches
                            }
                            // add any new touches into the closest tree
                            // but only if the distance is less than the maximum edge length
                            float        bestDistance = MultiselectEventSystem.current.MaxTouchClusterDistancePixels;
                            SpanningTree tree         = null;
                            foreach (var spanningTree in _currentTrees)
                            {
                                float treeDistance = spanningTree.ComputeMinimumDistanceToPoint(touch.position);
                                if (treeDistance < bestDistance)
                                {
                                    bestDistance = treeDistance;
                                    tree         = spanningTree;
                                }
                            }
                            if (tree != null)
                            {
                                tree.AddTouch(touch);
                                tree.ProcessTree();
                            }
                            else
                            {
                                // Too far from any tree, create a new one
                                tree = SpanningTree.Get();
                                tree.AddTouch(touch);
                                _currentTrees.Add(tree);
                            }
                        }
                    }

                    EnsureRenderers(_currentTrees.Count);
                    for (int i = 0; i < _currentTrees.Count; i++)
                    {
                        DisplayTreeInRenderer(_renderers[i], _currentTrees[i]);
                        _renderers[i].gameObject.SetActive(true);
                    }
                }
                else
                {
                    ReleaseTrees(_currentTrees);
                }

                for (int i = _currentTrees.Count; i < _renderers.Count; i++)
                {
                    _renderers[i].gameObject.SetActive(false);
                }
            }

            EnsurePointMarkers(_pointList.Count);
            RectTransform rcTransform = (RectTransform)transform;
            Vector2       offset      = rcTransform.localPosition.XY();

            for (int i = 0; i < _pointList.Count; i++)
            {
                TouchPt touch = _pointList[i];
                Vector2 pos;

                if (TouchCanvas.renderMode == RenderMode.ScreenSpaceOverlay)
                {
                    pos = touch.position - offset;
                }
                else
                {
                    RectTransformUtility.ScreenPointToLocalPointInRectangle((RectTransform)transform, touch.position,
                                                                            TouchCanvas.worldCamera, out pos);
                }

                _pointMarkers[i].transform.localPosition = pos.AsVector3();
                _pointMarkers[i].color = touch.phase == TouchPhase.Ended
                    ? TouchEnded
                    : touch.phase == TouchPhase.Canceled ? TouchCancelled : TouchActive;
            }
        }
Ejemplo n.º 26
0
 public void AddEdge(int a_idx, int b_idx, int cost, T value)
 {
     SpanningTree <T> .Node item = this.nodes[a_idx];
     SpanningTree <T> .Node node = this.nodes[b_idx];
     item.edges.Add(new SpanningTree <T> .Edge(item, node, cost, value));
 }
Ejemplo n.º 27
0
    public void createMapGraph(List<RoomArea> roomareas,float edgerelocationrate)
    {
        if (roomareas.Count == 0) {
            Debug.LogAssertion("Empty RoomAreas.");
            throw new ArgumentException();
        }
        //Vector2 upperlimit = AverageRoomSize * 100f;
        List<Vertex> vertexs = new List<Vertex>();
        foreach (RoomArea area in roomareas) {
            Vertex v = new Vertex(area.CenterToInt);
            vertexs.Add(v);
        }
        Debug.Log("v: "+vertexs.Count);
        List<Node> nodes = new List<Node>();
        List<Edge> edges = new List<Edge>();
        DelaunayTriangles dt = new DelaunayTriangles(new Rect(Vector2.zero, MaxMapSize), vertexs);
        if (vertexs.Count >= 3)
        {

            dt.DelaunayTrianglation();
            nodes = Node.createNodes(new List<Triangle>(dt.TriangleSet.Keys).ToArray());
            edges = Edge.createEdges(new List<Triangle>(dt.TriangleSet.Keys).ToArray());
            //Debug.Log(string.Format("N:{0},E:{1}", nodes.Count, edges.Count));
        }
        else{
            Debug.Log("Vertex amount lower than 3!!!");
            foreach (Vertex v in vertexs) {
                nodes.Add(new Node(v.Position));
            }
            Node n1 = nodes[0];
            Node n2 = nodes[nodes.Count - 1];
            float cost = (n1.Position - n2.Position).sqrMagnitude;
            edges.Add(new Edge(n1,n2,cost));
        }
        SpanningTree spt = new SpanningTree(nodes.ToArray(), edges.ToArray());
        Debug.LogFormat("N:{0},E:{1}",nodes.Count,edges.Count);
        //Debug.Log("Create Tree");
        spt.createTree(0);
        //Debug.Log("Create Tree End");
        ////Debug.Log("After: " + RoomAreas.Count);
        var es = new List<Edge>(spt.NewEdgeList);
        edges.RemoveAll(e => spt.NewEdgeList.Contains(e));
        ////Debug.Log("Edgecount: " + edges.Count);
        int limit = (int)(edges.Count * edgerelocationrate);
        ////Debug.Log("Limit: "+limit+","+edgerelocationrate);
        for (int i = 0; i < limit; i++)
        {
            //////Debug.Log("Edgecount: "+edges.Count);
            Edge adding = edges[GameController.Rnd.Next(edges.Count)];
            es.Add(adding);
            edges.Remove(adding);
            if (edges.Count == 0) break;
        }
        //es.Distinct();
        Mapgraph =  new MapGraph(spt.NewNodeList, es,dt,spt,roomareas);
    }
Ejemplo n.º 28
0
    void createMapGraph(List<RoomArea> roomareas, float edgerelocationrate)
    {
        Debug.logger.logEnabled = false;
        //Vector2 upperlimit = AverageRoomSize * 100f;
        List<Vertex> vertexs = new List<Vertex>();
        foreach (RoomArea area in roomareas)
        {
            Vertex v = new Vertex(area.CenterToInt);
            vertexs.Add(v);
        }
        Debug.logger.LogFormat(LogType.Log,"v:{0} A:{1}",vertexs.Count,roomareas.Count);
        List<Node> nodes = new List<Node>();
        List<Edge> edges = new List<Edge>();
        DelaunayTriangles dt = new DelaunayTriangles(new Rect(Vector2.zero, DgParam.MaxMapSize), vertexs);
        if (vertexs.Count > 3)
        {

            dt.DelaunayTrianglation();
            nodes = Node.createNodes(new List<Triangle>(dt.TriangleSet.Keys).ToArray());
            edges = Edge.createEdges(new List<Triangle>(dt.TriangleSet.Keys).ToArray());
            //Debug.Log(string.Format("N:{0},E:{1}", nodes.Count, edges.Count));
        }
        else
        {
            Debug.Log("Vertex amount lower than 3!!!");
            List<Node> ns = new List<Node>();
            List<Node> select = new List<Node>();
            List<Edge> eds = new List<Edge>();
            vertexs.ForEach(v => ns.Add(new Node(v.Position)));
            int maxcount = Mathf.Max(0,ns.Count - 1);
            for (int i = 0; i < maxcount; i++) {
                var rest = ns.FindAll(n=> !select.Contains(n));
                var sel = rest[Rnd.Next(rest.Count)];
                select.Add(sel);
            }
            var rest2 = ns.FindAll(n => !select.Contains(n));
            rest2.ForEach(s2 => {
                select.ForEach(s1 =>
                {
                    eds.Add(new Edge(s2,s1,(s1.Position-s2.Position).sqrMagnitude ));
                });
            });
            nodes = ns;
            edges = eds;
        }
        var restv = vertexs.FindAll( v => nodes.Find(n => n.Position.Equals(v.Position))==null);
        Debug.logger.LogFormat(LogType.Warning,"Rest Vertex:{0}", restv.Count());
        if (restv.Count != 0) {
            restv.ForEach(v => {
                var n1 = new Node(v.Position);
                var n2 = nodes[Rnd.Next(nodes.Count)];
                nodes.Add(n1);
                edges.Add(new Edge(n1,n2,(n1.Position - n2.Position).sqrMagnitude));
            });
        }
        SpanningTree spt = new SpanningTree(nodes.ToArray(), edges.ToArray());
        Debug.logger.LogFormat(LogType.Log,"N:{0},E:{1}", nodes.Count, edges.Count);
        //Debug.Log("Create Tree");
        spt.createTree(0);
        //Debug.Log("Create Tree End");
        ////Debug.Log("After: " + RoomAreas.Count);
        var es = new List<Edge>(spt.NewEdgeList);
        edges.RemoveAll(e => spt.NewEdgeList.Contains(e));
        ////Debug.Log("Edgecount: " + edges.Count);
        int limit = (int)(edges.Count * edgerelocationrate);
        ////Debug.Log("Limit: "+limit+","+edgerelocationrate);
        for (int i = 0; i < limit; i++)
        {
            //////Debug.Log("Edgecount: "+edges.Count);
            Edge adding = edges[Rnd.Next(edges.Count)];
            es.Add(adding);
            edges.Remove(adding);
            if (edges.Count == 0) break;
        }
        //es.Distinct();
        Mapgraph = new MapGraph(spt.NewNodeList, es, dt, spt, roomareas);
        Debug.logger.logEnabled = true;
    }