Example #1
0
        TryCalculateGraphMetricsForOneGroup
        (
            GroupInformation oGroupInformation,
            CalculateGraphMetricsContext oCalculateGraphMetricsContext,
            out OverallMetrics oOverallMetrics
        )
        {
            Debug.Assert(oGroupInformation != null);
            Debug.Assert(oGroupInformation.Vertices != null);
            Debug.Assert(oGroupInformation.Vertices.Count > 0);
            Debug.Assert(oCalculateGraphMetricsContext != null);
            AssertValid();

            oOverallMetrics = null;

            ICollection <IVertex> oVertices = oGroupInformation.Vertices;

            // Create a new graph from the vertices in the group and the edges that
            // connect them.

            IGraph oNewGraph = SubgraphCalculator.GetSubgraphAsNewGraph(oVertices);

            // Calculate the overall metrics for the new graph using the
            // OverallMetricCalculator class in the Algorithms namespace, which
            // knows nothing about Excel.

            return((new Algorithms.OverallMetricCalculator()).
                   TryCalculateGraphMetrics(oNewGraph,
                                            oCalculateGraphMetricsContext.BackgroundWorker,
                                            out oOverallMetrics));
        }
        GetGeodesicDistanceStrings
        (
            OverallMetrics oOverallMetrics,
            out String sMaximumGeodesicDistance,
            out String sAverageGeodesicDistance
        )
        {
            Debug.Assert(oOverallMetrics != null);
            AssertValid();

            if (oOverallMetrics.MaximumGeodesicDistance.HasValue)
            {
                sMaximumGeodesicDistance = FormatInt32(
                    oOverallMetrics.MaximumGeodesicDistance.Value);

                // The maximum and average are computed together.

                Debug.Assert(oOverallMetrics.AverageGeodesicDistance.HasValue);

                sAverageGeodesicDistance = FormatDouble(
                    oOverallMetrics.AverageGeodesicDistance.Value);
            }
            else
            {
                sMaximumGeodesicDistance = sAverageGeodesicDistance =
                    NotApplicableMessage;
            }
        }
Example #3
0
        SummarizeGraphInternal
        (
            GraphHistory oGraphHistory,
            AutoFillWorkbookResults oAutoFillWorkbookResults,
            OverallMetrics oOverallMetrics,
            String oTopNByMetrics,
            String oTwitterSearchNetworkTopItems
        )
        {
            Debug.Assert(oGraphHistory != null);
            Debug.Assert(oAutoFillWorkbookResults != null);

            StringBuilder oStringBuilder = new StringBuilder();

            AppendGraphHistoryValues(oGraphHistory, oStringBuilder,
                                     GraphHistoryKeys.ImportDescription,
                                     GraphHistoryKeys.GraphDirectedness,
                                     GraphHistoryKeys.GroupingDescription,
                                     GraphHistoryKeys.LayoutAlgorithm
                                     );

            StringUtil.AppendLineAfterEmptyLine(oStringBuilder,
                                                oAutoFillWorkbookResults.ConvertToSummaryString());

            if (oOverallMetrics != null)
            {
                StringUtil.AppendLineAfterEmptyLine(oStringBuilder,
                                                    "Overall Graph Metrics:");

                oStringBuilder.AppendLine(
                    oOverallMetrics.ConvertToSummaryString());
            }

            StringUtil.AppendLineAfterEmptyLine(oStringBuilder, oTopNByMetrics);

            StringUtil.AppendLineAfterEmptyLine(oStringBuilder,
                                                oTwitterSearchNetworkTopItems);

            AppendGraphHistoryValues(oGraphHistory, oStringBuilder,
                                     GraphHistoryKeys.Comments
                                     );

            return(oStringBuilder.ToString());
        }
Example #4
0
        TrySummarizeGraph
        (
            GraphHistory graphHistory,
            AutoFillWorkbookResults autoFillWorkbookResults,
            OverallMetrics overallMetrics,
            String topNByMetrics,
            String twitterSearchNetworkTopItems,
            out String graphSummary
        )
        {
            Debug.Assert(graphHistory != null);
            Debug.Assert(autoFillWorkbookResults != null);

            graphSummary = SummarizeGraphInternal(graphHistory,
                                                  autoFillWorkbookResults, overallMetrics, topNByMetrics,
                                                  twitterSearchNetworkTopItems);

            return(graphSummary.Length > 0);
        }
    protected Boolean TryCalculateGraphMetricsForOneGroup
        (GroupInfo oGroupInfo, out OverallMetrics oOverallMetrics)
    {
        Debug.Assert(oGroupInfo != null);
        Debug.Assert(oGroupInfo.Vertices != null);
        Debug.Assert(oGroupInfo.Vertices.Count > 0);
        
        

        oOverallMetrics = null;

        ICollection<IVertex> oVertices = oGroupInfo.Vertices;

        // Create a new graph from the vertices in the group and the edges that
        // connect them.

        IGraph oNewGraph = SubgraphCalculator.GetSubgraphAsNewGraph(oVertices);

        // Calculate the overall metrics for the new graph using the
        // OverallMetricCalculator class in the Algorithms namespace, which
        // knows nothing about Excel.

        return ( (new OverallMetricCalculator() ).
            TryCalculateGraphMetrics(oNewGraph,
                null,
                out oOverallMetrics) );
    }
    SummarizeGraphInternal
    (
        GraphHistory oGraphHistory,
        AutoFillWorkbookResults oAutoFillWorkbookResults,
        OverallMetrics oOverallMetrics,
        String oTopNByMetrics,
        String oTwitterSearchNetworkTopItems
    )
    {
        Debug.Assert(oGraphHistory != null);
        Debug.Assert(oAutoFillWorkbookResults != null);

        StringBuilder oStringBuilder = new StringBuilder();

        AppendGraphHistoryValues(oGraphHistory, oStringBuilder,
            GraphHistoryKeys.ImportDescription,
            GraphHistoryKeys.GraphDirectedness,
            GraphHistoryKeys.GroupingDescription,
            GraphHistoryKeys.LayoutAlgorithm
            );

        StringUtil.AppendLineAfterEmptyLine( oStringBuilder,
            oAutoFillWorkbookResults.ConvertToSummaryString() );

        if (oOverallMetrics != null)
        {
            StringUtil.AppendLineAfterEmptyLine(oStringBuilder,
                "Overall Graph Metrics:");

            oStringBuilder.AppendLine(
                oOverallMetrics.ConvertToSummaryString() );
        }

        StringUtil.AppendLineAfterEmptyLine(oStringBuilder, oTopNByMetrics);

        StringUtil.AppendLineAfterEmptyLine(oStringBuilder,
            oTwitterSearchNetworkTopItems);

        AppendGraphHistoryValues(oGraphHistory, oStringBuilder,
            GraphHistoryKeys.Comments
            );

        return ( oStringBuilder.ToString() );
    }
    TrySummarizeGraph
    (
        GraphHistory graphHistory,
        AutoFillWorkbookResults autoFillWorkbookResults,
        OverallMetrics overallMetrics,
        String topNByMetrics,
        String twitterSearchNetworkTopItems,
        out String graphSummary
    )
    {
        Debug.Assert(graphHistory != null);
        Debug.Assert(autoFillWorkbookResults != null);

        graphSummary = SummarizeGraphInternal(graphHistory,
            autoFillWorkbookResults, overallMetrics, topNByMetrics,
            twitterSearchNetworkTopItems);

        return ( ShowWarningIfNoGraphSummary(graphSummary) );
    }
Example #8
0
        TryReadMetrics
        (
            Microsoft.Office.Interop.Excel.Workbook workbook,
            out OverallMetrics overallMetrics
        )
        {
            Debug.Assert(workbook != null);
            AssertValid();

            overallMetrics = null;

            Object [,] aoValues;

            // The key is an overall metric name and the value is the one-based row
            // number of the overall metric.

            Dictionary <String, Int32> oValueRowsOneBased =
                new Dictionary <String, Int32>();

            if (!TryGetValues(workbook, out aoValues, out oValueRowsOneBased))
            {
                return(false);
            }

            Int32             iRowOneBased;
            String            sDirectedness;
            GraphDirectedness eDirectedness;

            if (
                !oValueRowsOneBased.TryGetValue(
                    OverallMetricNames.Directedness, out iRowOneBased)
                ||
                !ExcelUtil.TryGetNonEmptyStringFromCell(aoValues, iRowOneBased, 1,
                                                        out sDirectedness)
                )
            {
                return(false);
            }

            try
            {
                eDirectedness = (GraphDirectedness)Enum.Parse(
                    typeof(GraphDirectedness), sDirectedness);
            }
            catch (ArgumentException)
            {
                return(false);
            }

            Int32 iUniqueEdges, iEdgesWithDuplicates, iSelfLoops, iVertices,
                  iConnectedComponents, iSingleVertexConnectedComponents,
                  iMaximumConnectedComponentVertices,
                  iMaximumConnectedComponentEdges;

            Nullable <Double> dGraphDensity, dModularity, dAverageGeodesicDistance,
                              dReciprocatedVertexPairRatio, dReciprocatedEdgeRatio;

            Nullable <Int32> iMaximumGeodesicDistance;

            if (
                !TryGetInt32Value(oValueRowsOneBased, aoValues,
                                  OverallMetricNames.UniqueEdges, out iUniqueEdges)
                ||
                !TryGetInt32Value(oValueRowsOneBased, aoValues,
                                  OverallMetricNames.EdgesWithDuplicates,
                                  out iEdgesWithDuplicates)
                ||
                !TryGetInt32Value(oValueRowsOneBased, aoValues,
                                  OverallMetricNames.SelfLoops, out iSelfLoops)
                ||
                !TryGetInt32Value(oValueRowsOneBased, aoValues,
                                  OverallMetricNames.Vertices, out iVertices)
                ||
                !TryGetNullableDoubleValue(oValueRowsOneBased, aoValues,
                                           OverallMetricNames.GraphDensity, out dGraphDensity)
                ||
                !TryGetNullableDoubleValue(oValueRowsOneBased, aoValues,
                                           OverallMetricNames.Modularity, out dModularity)
                ||
                !TryGetInt32Value(oValueRowsOneBased, aoValues,
                                  OverallMetricNames.ConnectedComponents,
                                  out iConnectedComponents)
                ||
                !TryGetInt32Value(oValueRowsOneBased, aoValues,
                                  OverallMetricNames.SingleVertexConnectedComponents,
                                  out iSingleVertexConnectedComponents)
                ||
                !TryGetInt32Value(oValueRowsOneBased, aoValues,
                                  OverallMetricNames.MaximumConnectedComponentVertices,
                                  out iMaximumConnectedComponentVertices)
                ||
                !TryGetInt32Value(oValueRowsOneBased, aoValues,
                                  OverallMetricNames.MaximumConnectedComponentEdges,
                                  out iMaximumConnectedComponentEdges)
                ||
                !TryGetNullableInt32Value(oValueRowsOneBased, aoValues,
                                          OverallMetricNames.MaximumGeodesicDistance,
                                          out iMaximumGeodesicDistance)
                ||
                !TryGetNullableDoubleValue(oValueRowsOneBased, aoValues,
                                           OverallMetricNames.AverageGeodesicDistance,
                                           out dAverageGeodesicDistance)
                ||
                !TryGetNullableDoubleValue(oValueRowsOneBased, aoValues,
                                           OverallMetricNames.ReciprocatedVertexPairRatio,
                                           out dReciprocatedVertexPairRatio)
                ||
                !TryGetNullableDoubleValue(oValueRowsOneBased, aoValues,
                                           OverallMetricNames.ReciprocatedEdgeRatio,
                                           out dReciprocatedEdgeRatio)
                )
            {
                return(false);
            }

            overallMetrics = new OverallMetrics(eDirectedness, iUniqueEdges,
                                                iEdgesWithDuplicates, iSelfLoops, iVertices, dGraphDensity,
                                                dModularity, iConnectedComponents,
                                                iSingleVertexConnectedComponents,
                                                iMaximumConnectedComponentVertices,
                                                iMaximumConnectedComponentEdges, iMaximumGeodesicDistance,
                                                dAverageGeodesicDistance, dReciprocatedVertexPairRatio,
                                                dReciprocatedEdgeRatio);

            return(true);
        }
    TryCalculateGraphMetricsForOneGroup
    (
        ExcelTemplateGroupInfo oExcelTemplateGroupInfo,
        CalculateGraphMetricsContext oCalculateGraphMetricsContext,
        out OverallMetrics oOverallMetrics
    )
    {
        Debug.Assert(oExcelTemplateGroupInfo != null);
        Debug.Assert(oExcelTemplateGroupInfo.Vertices != null);
        Debug.Assert(oExcelTemplateGroupInfo.Vertices.Count > 0);
        Debug.Assert(oCalculateGraphMetricsContext != null);
        AssertValid();

        oOverallMetrics = null;

        ICollection<IVertex> oVertices = oExcelTemplateGroupInfo.Vertices;

        // Create a new graph from the vertices in the group and the edges that
        // connect them.

        IGraph oNewGraph = SubgraphCalculator.GetSubgraphAsNewGraph(oVertices);

        // Calculate the overall metrics for the new graph using the
        // OverallMetricCalculator class in the Algorithms namespace, which
        // knows nothing about Excel.

        return ( (new Algorithms.OverallMetricCalculator() ).
            TryCalculateGraphMetrics(oNewGraph,
                oCalculateGraphMetricsContext.BackgroundWorker,
                out oOverallMetrics) );
    }
    TryCalculateGraphMetrics
    (
        IGraph graph,
        BackgroundWorker backgroundWorker,
        out OverallMetrics graphMetrics
    )
    {
        Debug.Assert(graph != null);
        AssertValid();

        graphMetrics = null;

        if ( !ReportProgressAndCheckCancellationPending(
            1, 3, backgroundWorker) )
        {
            return (false);
        }

        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;
        Nullable<Double> dModularity;

        if ( !ReportProgressAndCheckCancellationPending(
            2, 3, backgroundWorker) )
        {
            return (false);
        }

        CalculateSnapOverallMetrics(graph, out iMaximumGeodesicDistance,
            out dAverageGeodesicDistance, out dModularity);

        Nullable<Double> dReciprocatedVertexPairRatio, dReciprocatedEdgeRatio;

        if ( !( new OverallReciprocationCalculator() )
            .TryCalculateGraphMetrics(graph, backgroundWorker, 
                out dReciprocatedVertexPairRatio, out dReciprocatedEdgeRatio) )
        {
            return (false);
        }

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

            CalculateGraphDensity(graph, iVertices,
                oDuplicateEdgeDetector.
                    TotalEdgesAfterMergingDuplicatesNoSelfLoops),

            dModularity,
            iConnectedComponents,
            iSingleVertexConnectedComponents,
            iMaximumConnectedComponentVertices,
            iMaximumConnectedComponentEdges,
            iMaximumGeodesicDistance,
            dAverageGeodesicDistance,
            dReciprocatedVertexPairRatio,
            dReciprocatedEdgeRatio
            );

        graphMetrics = oOverallMetrics;

        return (true);
    }
        WriteOverallMetricsToNewWorkbook
        (
            Microsoft.Office.Interop.Excel.Application oApplicationForNewWorkbook,
            IList <OverallMetricsInfo> oOverallMetricsInfos
        )
        {
            Debug.Assert(oApplicationForNewWorkbook != null);
            Debug.Assert(oOverallMetricsInfos != null);
            AssertValid();

            Workbook oNewWorkbook =
                oApplicationForNewWorkbook.Workbooks.Add(Missing.Value);


            Int32 iOverallMetricsInfos = oOverallMetricsInfos.Count;

            // There are 16 overall metrics, plus one extra column for the file
            // name.

            const Int32 Columns = 1 + 16;

            // There is one extra row for the headers.

            Object [,] aoCellValues =
                ExcelUtil.Get2DArray <Object>(1 + iOverallMetricsInfos, Columns);

            String [] asColumnHeaders =
            {
                "File Name",
                OverallMetricNames.Directedness,
                OverallMetricNames.Vertices,
                OverallMetricNames.UniqueEdges,
                OverallMetricNames.EdgesWithDuplicates,
                OverallMetricNames.TotalEdges,
                OverallMetricNames.SelfLoops,
                OverallMetricNames.ReciprocatedVertexPairRatio,
                OverallMetricNames.ReciprocatedEdgeRatio,
                OverallMetricNames.ConnectedComponents,
                OverallMetricNames.SingleVertexConnectedComponents,
                OverallMetricNames.MaximumConnectedComponentVertices,
                OverallMetricNames.MaximumConnectedComponentEdges,
                OverallMetricNames.MaximumGeodesicDistance,
                OverallMetricNames.AverageGeodesicDistance,
                OverallMetricNames.GraphDensity,
                OverallMetricNames.Modularity,
            };

            Debug.Assert(asColumnHeaders.Length == Columns);

            for (Int32 iColumn = 0; iColumn < Columns; iColumn++)
            {
                aoCellValues[1, iColumn + 1] = asColumnHeaders[iColumn];
            }

            for (Int32 i = 0; i < iOverallMetricsInfos; i++)
            {
                OverallMetricsInfo oOverallMetricsInfo = oOverallMetricsInfos[i];

                OverallMetrics oOverallMetrics =
                    oOverallMetricsInfo.OverallMetrics;

                Object [] aoColumnValues =
                {
                    oOverallMetricsInfo.NodeXLWorkbookFileName,
                    oOverallMetrics.Directedness.ToString(),
                    oOverallMetrics.Vertices,
                    oOverallMetrics.UniqueEdges,
                    oOverallMetrics.EdgesWithDuplicates,
                    oOverallMetrics.TotalEdges,
                    oOverallMetrics.SelfLoops,

                    OverallMetricCalculator2.NullableToGraphMetricValue <Double>(
                        oOverallMetrics.ReciprocatedVertexPairRatio),

                    OverallMetricCalculator2.NullableToGraphMetricValue <Double>(
                        oOverallMetrics.ReciprocatedEdgeRatio),

                    oOverallMetrics.ConnectedComponents,
                    oOverallMetrics.SingleVertexConnectedComponents,
                    oOverallMetrics.MaximumConnectedComponentVertices,
                    oOverallMetrics.MaximumConnectedComponentEdges,

                    OverallMetricCalculator2.NullableToGraphMetricValue <Int32>(
                        oOverallMetrics.MaximumGeodesicDistance),

                    OverallMetricCalculator2.NullableToGraphMetricValue <Double>(
                        oOverallMetrics.AverageGeodesicDistance),

                    OverallMetricCalculator2.NullableToGraphMetricValue <Double>(
                        oOverallMetrics.GraphDensity),

                    OverallMetricCalculator2.NullableToGraphMetricValue <Double>(
                        oOverallMetrics.Modularity),
                };

                Debug.Assert(aoColumnValues.Length == Columns);

                for (Int32 iColumn = 0; iColumn < Columns; iColumn++)
                {
                    aoCellValues[i + 2, iColumn + 1] = aoColumnValues[iColumn];
                }
            }

            Worksheet oNewWorksheet = (Worksheet)oNewWorkbook.Worksheets[1];

            // Insert the overall metrics into a table.

            Range oTableRange = ExcelUtil.SetRangeValues(
                (Range)oNewWorksheet.Cells[1, 1], aoCellValues);

            ExcelTableUtil.AddTable(oNewWorksheet, oTableRange, null, null);
        }