TryCalculateGraphMetrics
(
IGraph graph,
CalculateGraphMetricsContext calculateGraphMetricsContext,
out GraphMetricColumn [] graphMetricColumns
)
{
Debug.Assert(graph != null);
Debug.Assert(calculateGraphMetricsContext != null);
AssertValid();
graphMetricColumns = new GraphMetricColumn[0];
if ( !calculateGraphMetricsContext.ShouldCalculateGraphMetrics(
GraphMetrics.BrandesFastCentralities) )
{
return (true);
}
// Calculate the centralities for each vertex using the
// BrandesFastCalculator class in the Algorithms namespace, which knows
// nothing about Excel.
Dictionary<Int32, Algorithms.BrandesVertexCentralities>
oVertexCentralitiesDictionary;
if ( !( new Algorithms.BrandesFastCentralityCalculator() ).
TryCalculateGraphMetrics(graph,
calculateGraphMetricsContext.BackgroundWorker,
out oVertexCentralitiesDictionary) )
{
// The user cancelled.
return (false);
}
// Transfer the centralities to arrays of GraphMetricValue objects.
List<GraphMetricValueWithID> oBetweennessCentralityValues =
new List<GraphMetricValueWithID>();
List<GraphMetricValueWithID> oClosenessCentralityValues =
new List<GraphMetricValueWithID>();
foreach (IVertex oVertex in graph.Vertices)
{
// Try to get the row ID stored in the worksheet.
Int32 iRowID;
if ( TryGetRowID(oVertex, out iRowID) )
{
Algorithms.BrandesVertexCentralities oVertexCentralities =
oVertexCentralitiesDictionary[oVertex.ID];
oBetweennessCentralityValues.Add(
new GraphMetricValueWithID(iRowID,
oVertexCentralities.BetweennessCentrality
) );
oClosenessCentralityValues.Add(
new GraphMetricValueWithID(iRowID,
oVertexCentralities.ClosenessCentrality
) );
}
}
graphMetricColumns = new GraphMetricColumn [] {
new GraphMetricColumnWithID( WorksheetNames.Vertices,
TableNames.Vertices,
VertexTableColumnNames.BetweennessCentrality,
ExcelTableUtil.AutoColumnWidth,
NumericFormat, CellStyleNames.GraphMetricGood,
oBetweennessCentralityValues.ToArray()
),
new GraphMetricColumnWithID( WorksheetNames.Vertices,
TableNames.Vertices,
VertexTableColumnNames.ClosenessCentrality,
ExcelTableUtil.AutoColumnWidth,
NumericFormat, CellStyleNames.GraphMetricGood,
oClosenessCentralityValues.ToArray()
)
};
return (true);
}