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.Degree |
GraphMetrics.InDegree |
GraphMetrics.OutDegree
) )
{
return (true);
}
IVertexCollection oVertices = graph.Vertices;
Int32 iVertices = oVertices.Count;
// The following lists correspond to vertex worksheet columns.
List<GraphMetricValueWithID> oInDegreeGraphMetricValues =
new List<GraphMetricValueWithID>();
List<GraphMetricValueWithID> oOutDegreeGraphMetricValues =
new List<GraphMetricValueWithID>();
List<GraphMetricValueWithID> oDegreeGraphMetricValues =
new List<GraphMetricValueWithID>();
// Create a dictionary to keep track of vertex degrees. The key is the
// IVertex.ID and the value is a zero-based index into the above lists.
Dictionary<Int32, Int32> oVertexIDDictionary =
new Dictionary<Int32, Int32>();
// Calculate the degrees for each vertex using the
// VertexDegreeCalculator class in the Algorithms namespace, which
// knows nothing about Excel.
//
// For simplicity, all degree metrics (in-degree, out-degree, and
// degree) are calculated regardless of whether the graph is directed
// or undirected. After all metrics are calculated,
// FilterGraphMetricColumns() filters out the metrics that don't apply
// to the graph, based on its directedness.
Dictionary<Int32, VertexDegrees> oVertexDegreeDictionary;
if ( !( new Algorithms.VertexDegreeCalculator() ).
TryCalculateGraphMetrics(graph,
calculateGraphMetricsContext.BackgroundWorker,
out oVertexDegreeDictionary) )
{
// The user cancelled.
return (false);
}
Int32 iRowID;
foreach (IVertex oVertex in oVertices)
{
if ( !TryGetRowID(oVertex, out iRowID) )
{
continue;
}
VertexDegrees oVertexDegrees;
if ( !oVertexDegreeDictionary.TryGetValue(oVertex.ID,
out oVertexDegrees) )
{
Debug.Assert(false);
}
oInDegreeGraphMetricValues.Add(new GraphMetricValueWithID(
iRowID, oVertexDegrees.InDegree) );
oOutDegreeGraphMetricValues.Add(new GraphMetricValueWithID(
iRowID, oVertexDegrees.OutDegree) );
oDegreeGraphMetricValues.Add(new GraphMetricValueWithID(
iRowID, oVertexDegrees.Degree) );
Debug.Assert(oInDegreeGraphMetricValues.Count ==
oOutDegreeGraphMetricValues.Count);
oVertexIDDictionary.Add(oVertex.ID,
oInDegreeGraphMetricValues.Count - 1);
}
// Figure out which columns to add.
graphMetricColumns = FilterGraphMetricColumns(graph,
calculateGraphMetricsContext, oInDegreeGraphMetricValues,
oOutDegreeGraphMetricValues, oDegreeGraphMetricValues);
return (true);
}