Beispiel #1
0
        public void AncestorAndRefMultiCycle_allAncestorsMoveToMerged()
        {
            //V2   -> n  ==> 13 -> V2
            //  |<== 16   -> V3 -> n

            // Each of nodes has its own ancestor
            // all these 'side' -ancestors has to move to main node

            var v2 = CreateNode("v2", new ConstrainsState(StatePrimitive.I32, StatePrimitive.Real));
            var v3 = CreateNode("v3", new ConstrainsState(StatePrimitive.I24, StatePrimitive.Real));

            var i13 = CreateNode("13");
            var i16 = CreateNode("16");
            var n   = CreateNode("n");

            v2.AddAncestor(n);
            n.State = new StateRefTo(i13);
            i13.AddAncestor(v2);
            v2.AddAncestor(i16);
            i16.AddAncestor(v3);
            i16.State = new StateRefTo(v2);
            v3.AddAncestor(n);

            var ancestors = new[]
            { CreateNode("anc1"), CreateNode("anc2"), CreateNode("anc3"), CreateNode("anc4"), CreateNode("anc5") };

            v2.AddAncestor(ancestors[0]);
            n.AddAncestor(ancestors[1]);
            i13.AddAncestor(ancestors[2]);
            v2.AddAncestor(ancestors[3]);
            i16.AddAncestor(ancestors[4]);

            var algorithm = new NodeToposort2(6);

            algorithm.AddMany(v2, i13, i16, v3, n);
            algorithm.AddMany(ancestors);
            algorithm.OptimizeTopology();

            AssertHaveNoAncestorCycles(v2, v3, n, i13, i16);
            AssertHaveNoAncestorCycles(ancestors);

            Assert.AreEqual(1 + ancestors.Length, algorithm.NonReferenceOrdered.Length);
            var theNode = algorithm.NonReferenceOrdered[0];

            Assert.IsInstanceOf <ConstrainsState>(theNode.State);
            Assert.AreEqual(new ConstrainsState(StatePrimitive.I32, StatePrimitive.Real), theNode.State);
            CollectionAssert.AreEquivalent(ancestors, theNode.Ancestors);
        }
Beispiel #2
0
        public void AncestorAndRefMultiCycle()
        {
            //V2   -> n  ==> 13 -> V2
            //  |<== 16   -> V3 -> n


            var v2 = CreateNode("v2", new ConstrainsState(StatePrimitive.I32, StatePrimitive.Real));
            var v3 = CreateNode("v3", new ConstrainsState(StatePrimitive.I24, StatePrimitive.Real));

            var i13 = CreateNode("13");
            var i16 = CreateNode("16");
            var n   = CreateNode("n");

            v2.AddAncestor(n);
            n.State = new StateRefTo(i13);
            i13.AddAncestor(v2);
            v2.AddAncestor(i16);
            i16.AddAncestor(v3);
            i16.State = new StateRefTo(v2);
            v3.AddAncestor(n);

            var algorithm = new NodeToposort2(6);

            algorithm.AddMany(v2, i13, i16, v3, n);
            algorithm.OptimizeTopology();

            AssertHaveNoAncestorCycles(v2, v3, n, i13, i16);

            Assert.AreEqual(1, algorithm.NonReferenceOrdered.Length);
            var theNode = algorithm.NonReferenceOrdered[0];

            Assert.IsInstanceOf <ConstrainsState>(theNode.State);
            Assert.AreEqual(new ConstrainsState(StatePrimitive.I32, StatePrimitive.Real), theNode.State);
        }
Beispiel #3
0
        public void AncestorMultiCycleSimpliest()
        {
            //V2 13 V3 N

            //V2[a b] => n       => V2
            //        => 16 =>  n
            var v2 = CreateNode("v2");

            var i16 = CreateNode("16");
            var n   = CreateNode("n");

            v2.State = new ConstrainsState(StatePrimitive.I32, StatePrimitive.Real);

            v2.AddAncestor(n);
            n.AddAncestor(v2);
            v2.AddAncestor(i16);
            i16.AddAncestor(n);

            var algorithm = new NodeToposort2(3);

            algorithm.AddMany(v2, i16, n);
            algorithm.OptimizeTopology();

            AssertHaveNoAncestorCycles(v2);
            AssertHaveNoAncestorCycles(n);
            AssertHaveNoAncestorCycles(i16);

            Assert.AreEqual(1, algorithm.NonReferenceOrdered.Length);
            var theNode = algorithm.NonReferenceOrdered[0];

            Assert.IsInstanceOf <ConstrainsState>(theNode.State);
            Assert.AreEqual(new ConstrainsState(StatePrimitive.I32, StatePrimitive.Real), theNode.State);
        }
Beispiel #4
0
        public void TwoNodesReferencesEachOther_OneNodeInResult()
        {
            var a1 = CreateNode("a1");
            var a2 = CreateNode("a2");

            a1.State = new StateRefTo(a2);
            a2.State = new StateRefTo(a1);
            var algorithm = new NodeToposort2(3);

            algorithm.AddMany(a1, a2);
            algorithm.OptimizeTopology();
            Assert.AreEqual(1, algorithm.NonReferenceOrdered.Length);
        }
Beispiel #5
0
        public void ConcreteAncestorCycle_OneNodeInResult()
        {
            var a1 = CreateNode("a1");
            var a2 = CreateNode("a2");

            a1.State = new ConstrainsState(StatePrimitive.I32, StatePrimitive.I96);
            a1.AddAncestor(a2);
            a2.AddAncestor(a1);
            var algorithm = new NodeToposort2(3);

            algorithm.AddMany(a1, a2);
            algorithm.OptimizeTopology();
            Assert.AreEqual(1, algorithm.NonReferenceOrdered.Length);
            Assert.AreEqual(a2, algorithm.NonReferenceOrdered[0]);
        }
Beispiel #6
0
        public void NodeReferencesOtherNode_OneOfTheNodesHasAncestorsOfBoth()
        {
            var a1 = CreateNode("a1");
            var a2 = CreateNode("a2");
            var c1 = CreateNode("c1");
            var c2 = CreateNode("c2");

            c1.AddAncestor(a1);
            c2.AddAncestor(a2);
            c1.State = new StateRefTo(c2);

            var algorithm = new NodeToposort2(3);

            algorithm.AddMany(a1, a2, c1, c2);
            algorithm.OptimizeTopology();

            Assert.AreEqual(3, algorithm.NonReferenceOrdered.Length);
            TicNode central = null;

            if (algorithm.NonReferenceOrdered.Contains(c1))
            {
                central = c1;
            }
            if (algorithm.NonReferenceOrdered.Contains(c2))
            {
                if (central != null)
                {
                    Assert.Fail("Both referenced still remains in algorithm");
                }
                central = c2;
            }
            Assert.IsNotNull(central);
            Assert.AreEqual(2, central.Ancestors.Count);
            Assert.True(central.Ancestors.Contains(a1));
            Assert.True(central.Ancestors.Contains(a2));
        }
Beispiel #7
0
        public void AncestorAndRefMultiCycle2()
        {
            //V2   -> n  ==> 13 <== V2
            //         |-> 16  ==> V3 -> n

            // After adding - all references should dissapear
            // So the graph has to look like:
            // v2->13->v2
            //  |->v3->13

            var v2 = CreateNode("v2");
            var v3 = CreateNode("v3");

            var i13 = CreateNode("13");
            var i16 = CreateNode("16");
            var n   = CreateNode("n");

            v2.AddAncestor(n);
            n.State  = new StateRefTo(i13);
            v2.State = new StateRefTo(i13);
            n.AddAncestor(i16);
            i16.State = new StateRefTo(v3);
            v3.AddAncestor(n);

            var algorithm = new NodeToposort2(6);

            algorithm.AddMany(v2, i13, i16, v3, n);
            algorithm.OptimizeTopology();

            AssertHaveNoAncestorCycles(v2, v3, n, i13, i16);

            Assert.AreEqual(1, algorithm.NonReferenceOrdered.Length);
            var theNode = algorithm.NonReferenceOrdered[0];

            Assert.IsInstanceOf <ConstrainsState>(theNode.State);
        }