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; } }
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(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) ); }
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); }