Example #1
0
        public void Constructor_WeightedMarkovEdgeChains()
        {
            var weights = new Dictionary <Edge <int>, double>();
            var chain1  = new WeightedMarkovEdgeChain <int, Edge <int> >(weights);

            Assert.AreSame(weights, chain1.Weights);

            var chain2 = new VanishingWeightedMarkovEdgeChain <int, Edge <int> >(weights);

            Assert.AreSame(weights, chain2.Weights);

            chain2 = new VanishingWeightedMarkovEdgeChain <int, Edge <int> >(weights, 2.0);
            Assert.AreSame(weights, chain2.Weights);
        }
Example #2
0
        public void VanishingWeightedMarkovEdgeChain()
        {
            var weights = new Dictionary <EquatableEdge <int>, double>
            {
                [new EquatableEdge <int>(1, 2)] = 1.0,
                [new EquatableEdge <int>(1, 3)] = 2.0,
                [new EquatableEdge <int>(2, 3)] = -1.0,
                [new EquatableEdge <int>(2, 5)] = 10.0,
                [new EquatableEdge <int>(3, 4)] = 5.0,
                [new EquatableEdge <int>(4, 3)] = 25.0,
                [new EquatableEdge <int>(4, 5)] = 2.0,
                [new EquatableEdge <int>(4, 7)] = 1.0,
                [new EquatableEdge <int>(5, 2)] = 3.0,
                [new EquatableEdge <int>(5, 6)] = 1.0,
                [new EquatableEdge <int>(6, 7)] = 1.5,
                [new EquatableEdge <int>(7, 4)] = 0.25,
                [new EquatableEdge <int>(8, 3)] = 1.0
            };
            IVertexAndEdgeListGraph <int, EquatableEdge <int> > graph1 = CreateGraph1();

            var chain = new VanishingWeightedMarkovEdgeChain <int, EquatableEdge <int> >(weights)
            {
                Rand = new Random(123456)
            };

            Assert.IsTrue(chain.TryGetSuccessor(graph1, 1, out EquatableEdge <int> edge));
            Assert.AreEqual(1, edge.Source);
            Assert.AreEqual(2, edge.Target);
            Assert.IsTrue(chain.TryGetSuccessor(graph1, 2, out edge));
            Assert.AreEqual(2, edge.Source);
            Assert.AreEqual(5, edge.Target);
            Assert.IsTrue(chain.TryGetSuccessor(graph1, 5, out edge));
            Assert.AreEqual(5, edge.Source);
            Assert.AreEqual(6, edge.Target);
            Assert.IsTrue(chain.TryGetSuccessor(graph1, 6, out edge));
            Assert.AreEqual(6, edge.Source);
            Assert.AreEqual(7, edge.Target);
            Assert.IsTrue(chain.TryGetSuccessor(graph1, 7, out edge));
            Assert.AreEqual(7, edge.Source);
            Assert.AreEqual(4, edge.Target);
            Assert.IsTrue(chain.TryGetSuccessor(graph1, 4, out edge));
            Assert.AreEqual(4, edge.Source);
            Assert.AreEqual(3, edge.Target);
            Assert.IsFalse(chain.TryGetSuccessor(graph1, 3, out edge));

            weights = new Dictionary <EquatableEdge <int>, double>
            {
                [new EquatableEdge <int>(1, 2)] = 1.0,
                [new EquatableEdge <int>(1, 3)] = 2.0,
                [new EquatableEdge <int>(2, 3)] = -1.0,
                [new EquatableEdge <int>(2, 5)] = 10.0,
                [new EquatableEdge <int>(3, 4)] = 5.0,
                [new EquatableEdge <int>(4, 3)] = 25.0,
                [new EquatableEdge <int>(4, 5)] = 2.0,
                [new EquatableEdge <int>(4, 7)] = 1.0,
                [new EquatableEdge <int>(5, 2)] = 3.0,
                [new EquatableEdge <int>(5, 6)] = 1.0,
                [new EquatableEdge <int>(6, 7)] = 1.5,
                [new EquatableEdge <int>(7, 4)] = 0.25,
                [new EquatableEdge <int>(8, 3)] = 1.0
            };
            chain = new VanishingWeightedMarkovEdgeChain <int, EquatableEdge <int> >(weights)
            {
                Rand = new Random(123456)
            };
            EquatableEdge <int>[] edges = graph1.Edges.ToArray();
            Assert.IsTrue(chain.TryGetSuccessor(edges, 1, out edge));
            Assert.AreEqual(2, edge.Source);
            Assert.AreEqual(5, edge.Target);
            Assert.IsTrue(chain.TryGetSuccessor(edges, 5, out edge));
            Assert.AreEqual(2, edge.Source);
            Assert.AreEqual(5, edge.Target);
            Assert.IsTrue(chain.TryGetSuccessor(edges, 5, out edge));
            Assert.AreEqual(1, edge.Source);
            Assert.AreEqual(3, edge.Target);
            // etc.
            Assert.IsFalse(chain.TryGetSuccessor(Enumerable.Empty <EquatableEdge <int> >(), 1, out _));


            IVertexAndEdgeListGraph <int, EquatableEdge <int> > graph2 = CreateGraph2();

            weights = new Dictionary <EquatableEdge <int>, double>
            {
                [new EquatableEdge <int>(1, 2)] = 1.0,
                [new EquatableEdge <int>(1, 3)] = 2.0,
                [new EquatableEdge <int>(2, 3)] = -1.0,
                [new EquatableEdge <int>(2, 5)] = 10.0,
                [new EquatableEdge <int>(3, 4)] = 5.0,
                [new EquatableEdge <int>(4, 3)] = 25.0,
                [new EquatableEdge <int>(4, 5)] = 2.0,
                [new EquatableEdge <int>(4, 7)] = 1.0,
                [new EquatableEdge <int>(5, 2)] = 3.0,
                [new EquatableEdge <int>(5, 6)] = 1.0,
                [new EquatableEdge <int>(6, 7)] = 1.5,
                [new EquatableEdge <int>(7, 4)] = 0.25,
                [new EquatableEdge <int>(8, 3)] = 1.0
            };
            chain = new VanishingWeightedMarkovEdgeChain <int, EquatableEdge <int> >(weights)
            {
                Rand = new Random(123456)
            };
            Assert.IsTrue(chain.TryGetSuccessor(graph2, 1, out edge));
            Assert.AreEqual(1, edge.Source);
            Assert.AreEqual(2, edge.Target);
            Assert.IsFalse(chain.TryGetSuccessor(graph2, 2, out edge));

            weights = new Dictionary <EquatableEdge <int>, double>
            {
                [new EquatableEdge <int>(1, 2)] = 1.0,
                [new EquatableEdge <int>(1, 3)] = 2.0,
                [new EquatableEdge <int>(2, 3)] = -1.0,
                [new EquatableEdge <int>(2, 5)] = 10.0,
                [new EquatableEdge <int>(3, 4)] = 5.0,
                [new EquatableEdge <int>(4, 3)] = 25.0,
                [new EquatableEdge <int>(4, 5)] = 2.0,
                [new EquatableEdge <int>(4, 7)] = 1.0,
                [new EquatableEdge <int>(5, 2)] = 3.0,
                [new EquatableEdge <int>(5, 6)] = 1.0,
                [new EquatableEdge <int>(6, 7)] = 1.5,
                [new EquatableEdge <int>(7, 4)] = 0.25,
                [new EquatableEdge <int>(8, 3)] = 1.0
            };
            chain = new VanishingWeightedMarkovEdgeChain <int, EquatableEdge <int> >(weights)
            {
                Rand = new Random(123456)
            };
            edges = graph2.Edges.ToArray();
            Assert.IsTrue(chain.TryGetSuccessor(edges, 1, out edge));
            Assert.AreEqual(3, edge.Source);
            Assert.AreEqual(4, edge.Target);
            Assert.IsTrue(chain.TryGetSuccessor(edges, 4, out edge));
            Assert.AreEqual(1, edge.Source);
            Assert.AreEqual(3, edge.Target);
            Assert.IsTrue(chain.TryGetSuccessor(edges, 3, out edge));
            Assert.AreEqual(1, edge.Source);
            Assert.AreEqual(2, edge.Target);
            Assert.IsTrue(chain.TryGetSuccessor(edges, 2, out edge));
            Assert.AreEqual(5, edge.Source);
            Assert.AreEqual(2, edge.Target);
            // Etc.
        }