//*************************************************************************
        //  Constructor: DuplicateEdgeDetectorTest()
        //
        /// <summary>
        /// Initializes a new instance of the <see
        /// cref="DuplicateEdgeDetectorTest" /> class.
        /// </summary>
        //*************************************************************************
        public DuplicateEdgeDetectorTest()
        {
            m_oDuplicateEdgeDetector = null;

            m_oDirectedGraph = null;
            m_oDirectedVertexA = null;
            m_oDirectedVertexB = null;
            m_oDirectedVertexC = null;
            m_oDirectedVertexD = null;
            m_oDirectedVertexWithNullName = null;

            m_oUndirectedGraph = null;
            m_oUndirectedVertexA = null;
            m_oUndirectedVertexB = null;
            m_oUndirectedVertexC = null;
            m_oUndirectedVertexD = null;
            m_oUndirectedVertexWithNullName = null;
        }
        //*************************************************************************
        //  Method: TryCalculateGraphMetrics()
        //
        /// <summary>
        /// Attempts to calculate the graph metrics while optionally running on a
        /// background thread.
        /// </summary>
        ///
        /// <param name="graph">
        /// The graph to calculate metrics for.  The graph may contain duplicate
        /// edges and self-loops.
        /// </param>
        ///
        /// <param name="backgroundWorker">
        /// The BackgroundWorker whose thread is calling this method, or null if
        /// the method is being called by some other thread.
        /// </param>
        ///
        /// <param name="graphMetrics">
        /// Where the graph metrics get stored if true is returned.  
        /// </param>
        ///
        /// <returns>
        /// true if the graph metrics were calculated, false if the user wants to
        /// cancel.
        /// </returns>
        //*************************************************************************
        public Boolean TryCalculateGraphMetrics(
            IGraph graph,
            BackgroundWorker backgroundWorker,
            out OverallMetrics graphMetrics
            )
        {
            Debug.Assert(graph != null);
            AssertValid();

            graphMetrics = null;

            if (backgroundWorker != null)
            {
            if (backgroundWorker.CancellationPending)
            {
                return (false);
            }

            ReportProgress(1, 3, backgroundWorker);
            }

            DuplicateEdgeDetector oDuplicateEdgeDetector =
            new DuplicateEdgeDetector(graph);

            Int32 iVertices = graph.Vertices.Count;
            Int32 iEdges = graph.Edges.Count;
            Int32 iSelfLoops = CountSelfLoops(graph);

            Int32 iConnectedComponents, iSingleVertexConnectedComponents,
            iMaximumConnectedComponentVertices,
            iMaximumConnectedComponentEdges;

            CalculateConnectedComponentMetrics(graph, out iConnectedComponents,
            out iSingleVertexConnectedComponents,
            out iMaximumConnectedComponentVertices,
            out iMaximumConnectedComponentEdges);

            Nullable<Int32> iMaximumGeodesicDistance;
            Nullable<Double> dAverageGeodesicDistance;

            if (backgroundWorker != null)
            {
            ReportProgress(2, 3, backgroundWorker);
            }

            CalculateGeodesicDistances(graph, out iMaximumGeodesicDistance,
            out dAverageGeodesicDistance);

            OverallMetrics oOverallMetrics = new OverallMetrics(
            graph.Directedness,
            oDuplicateEdgeDetector.UniqueEdges,
            oDuplicateEdgeDetector.EdgesWithDuplicates,
            iSelfLoops,
            iVertices,

            CalculateGraphDensity(graph, iVertices,
                oDuplicateEdgeDetector.
                    TotalEdgesAfterMergingDuplicatesNoSelfLoops),

            iConnectedComponents,
            iSingleVertexConnectedComponents,
            iMaximumConnectedComponentVertices,
            iMaximumConnectedComponentEdges,
            iMaximumGeodesicDistance,
            dAverageGeodesicDistance
            );

            graphMetrics = oOverallMetrics;

            return (true);
        }
        public void TestGraphContainsDuplicateEdges9()
        {
            // Undirected graph, duplicate A,B.

            m_oDuplicateEdgeDetector =
            new DuplicateEdgeDetector(m_oUndirectedGraph);

            IEdgeCollection oEdges = m_oUndirectedGraph.Edges;

            oEdges.Add(m_oUndirectedVertexA, m_oUndirectedVertexB, false);
            oEdges.Add(m_oUndirectedVertexA, m_oUndirectedVertexA, false);
            oEdges.Add(m_oUndirectedVertexB, m_oUndirectedVertexB, false);
            oEdges.Add(m_oUndirectedVertexC, m_oUndirectedVertexD, false);
            oEdges.Add(m_oUndirectedVertexC, m_oUndirectedVertexWithNullName,
            false);

            oEdges.Add(m_oUndirectedVertexA, m_oUndirectedVertexB, false);

            Assert.IsTrue(m_oDuplicateEdgeDetector.GraphContainsDuplicateEdges);
            Assert.AreEqual(3, m_oDuplicateEdgeDetector.UniqueEdges);
            Assert.AreEqual(2, m_oDuplicateEdgeDetector.EdgesWithDuplicates);

            Assert.AreEqual(2, m_oDuplicateEdgeDetector.
            TotalEdgesAfterMergingDuplicatesNoSelfLoops);
        }
        public void TestGraphContainsDuplicateEdges7()
        {
            // Directed graph, many duplicates.

            m_oDuplicateEdgeDetector = new DuplicateEdgeDetector(m_oDirectedGraph);

            IEdgeCollection oEdges = m_oDirectedGraph.Edges;

            oEdges.Add(m_oDirectedVertexA, m_oDirectedVertexB, true);
            oEdges.Add(m_oDirectedVertexA, m_oDirectedVertexA, true);
            oEdges.Add(m_oDirectedVertexA, m_oDirectedVertexA, true);
            oEdges.Add(m_oDirectedVertexA, m_oDirectedVertexB, true);
            oEdges.Add(m_oDirectedVertexB, m_oDirectedVertexA, true);
            oEdges.Add(m_oDirectedVertexB, m_oDirectedVertexB, true);
            oEdges.Add(m_oDirectedVertexB, m_oDirectedVertexA, true);
            oEdges.Add(m_oDirectedVertexB, m_oDirectedVertexA, true);
            oEdges.Add(m_oDirectedVertexB, m_oDirectedVertexB, true);
            oEdges.Add(m_oDirectedVertexA, m_oDirectedVertexA, true);
            oEdges.Add(m_oDirectedVertexC, m_oDirectedVertexD, true);
            oEdges.Add(m_oDirectedVertexB, m_oDirectedVertexA, true);
            oEdges.Add(m_oDirectedVertexA, m_oDirectedVertexB, true);

            Assert.IsTrue(m_oDuplicateEdgeDetector.GraphContainsDuplicateEdges);
            Assert.AreEqual(1, m_oDuplicateEdgeDetector.UniqueEdges);
            Assert.AreEqual(12, m_oDuplicateEdgeDetector.EdgesWithDuplicates);

            Assert.AreEqual(3, m_oDuplicateEdgeDetector.
            TotalEdgesAfterMergingDuplicatesNoSelfLoops);
        }
        public void TestGraphContainsDuplicateEdges6()
        {
            // Directed graph, non-duplicate null name, C.

            m_oDuplicateEdgeDetector = new DuplicateEdgeDetector(m_oDirectedGraph);

            IEdgeCollection oEdges = m_oDirectedGraph.Edges;

            oEdges.Add(m_oDirectedVertexA, m_oDirectedVertexB, true);
            oEdges.Add(m_oDirectedVertexB, m_oDirectedVertexA, true);
            oEdges.Add(m_oDirectedVertexA, m_oDirectedVertexA, true);
            oEdges.Add(m_oDirectedVertexB, m_oDirectedVertexB, true);
            oEdges.Add(m_oDirectedVertexC, m_oDirectedVertexD, true);
            oEdges.Add(m_oDirectedVertexC, m_oDirectedVertexWithNullName, true);

            oEdges.Add(m_oDirectedVertexWithNullName, m_oDirectedVertexC, true);

            Assert.IsFalse(m_oDuplicateEdgeDetector.GraphContainsDuplicateEdges);
            Assert.AreEqual(5, m_oDuplicateEdgeDetector.UniqueEdges);
            Assert.AreEqual(0, m_oDuplicateEdgeDetector.EdgesWithDuplicates);

            Assert.AreEqual(3, m_oDuplicateEdgeDetector.
            TotalEdgesAfterMergingDuplicatesNoSelfLoops);
        }
        public void TearDown()
        {
            m_oDuplicateEdgeDetector = null;

            m_oDirectedGraph = null;
            m_oDirectedVertexA = null;
            m_oDirectedVertexB = null;
            m_oDirectedVertexC = null;
            m_oDirectedVertexD = null;
            m_oDirectedVertexWithNullName = null;

            m_oUndirectedGraph = null;
            m_oUndirectedVertexA = null;
            m_oUndirectedVertexB = null;
            m_oUndirectedVertexC = null;
            m_oUndirectedVertexD = null;
            m_oUndirectedVertexWithNullName = null;
        }
Esempio n. 7
0
        TryCalculateGraphMetrics
        (
            IGraph graph,
            BackgroundWorker backgroundWorker,
            out OverallMetrics graphMetrics
        )
        {
            Debug.Assert(graph != null);
            AssertValid();

            graphMetrics = null;

            if (backgroundWorker != null)
            {
                if (backgroundWorker.CancellationPending)
                {
                    return(false);
                }

                ReportProgress(1, 3, backgroundWorker);
            }

            DuplicateEdgeDetector oDuplicateEdgeDetector =
                new DuplicateEdgeDetector(graph);

            Int32 iVertices  = graph.Vertices.Count;
            Int32 iEdges     = graph.Edges.Count;
            Int32 iSelfLoops = CountSelfLoops(graph);

            Int32 iConnectedComponents, iSingleVertexConnectedComponents,
                  iMaximumConnectedComponentVertices,
                  iMaximumConnectedComponentEdges;

            CalculateConnectedComponentMetrics(graph, out iConnectedComponents,
                                               out iSingleVertexConnectedComponents,
                                               out iMaximumConnectedComponentVertices,
                                               out iMaximumConnectedComponentEdges);

            Nullable <Int32>  iMaximumGeodesicDistance;
            Nullable <Double> dAverageGeodesicDistance;

            if (backgroundWorker != null)
            {
                ReportProgress(2, 3, backgroundWorker);
            }

            CalculateGeodesicDistances(graph, out iMaximumGeodesicDistance,
                                       out dAverageGeodesicDistance);

            OverallMetrics oOverallMetrics = new OverallMetrics(
                graph.Directedness,
                oDuplicateEdgeDetector.UniqueEdges,
                oDuplicateEdgeDetector.EdgesWithDuplicates,
                iSelfLoops,
                iVertices,

                CalculateGraphDensity(graph, iVertices,
                                      oDuplicateEdgeDetector.
                                      TotalEdgesAfterMergingDuplicatesNoSelfLoops),

                iConnectedComponents,
                iSingleVertexConnectedComponents,
                iMaximumConnectedComponentVertices,
                iMaximumConnectedComponentEdges,
                iMaximumGeodesicDistance,
                dAverageGeodesicDistance
                );

            graphMetrics = oOverallMetrics;

            return(true);
        }