ReadEdges
(
Microsoft.Office.Interop.Excel.Worksheet oSourceWorksheet,
Int32 iFirstEdgeWeightRowOneBased,
Int32 iFirstEdgeWeightColumnOneBased,
IGraph oGraph,
IVertex [] aoOrderedVertices
)
{
Debug.Assert(oSourceWorksheet != null);
Debug.Assert(iFirstEdgeWeightRowOneBased >= 1);
Debug.Assert(iFirstEdgeWeightColumnOneBased >= 1);
Debug.Assert(oGraph != null);
Debug.Assert(aoOrderedVertices != null);
Debug.Assert(oGraph.Vertices.Count == aoOrderedVertices.Length);
Boolean bGraphIsDirected =
(oGraph.Directedness == GraphDirectedness.Directed);
Int32 iVertices = aoOrderedVertices.Length;
IEdgeCollection oEdges = oGraph.Edges;
for (Int32 i = 0; i < iVertices; i++)
{
Int32 iRowOneBased = iFirstEdgeWeightRowOneBased + i;
Object [,] oRowOfEdgeWeightValues = ExcelUtil.GetValuesInRow(
oSourceWorksheet, iRowOneBased, iFirstEdgeWeightColumnOneBased,
iVertices);
// In a directed graph, look at the whole row. In an undirected
// graph, look only at the cell on the diagonal and the cells to
// the right.
for (Int32 j = (bGraphIsDirected ? 0 : i); j < iVertices; j++)
{
Double dEdgeWeight = 0;
Int32 iColumnOneBased = iFirstEdgeWeightColumnOneBased + j;
if ( !ExcelUtil.TryGetDoubleFromCell(oRowOfEdgeWeightValues, 1,
j + 1, out dEdgeWeight) )
{
OnInvalidSourceWorkbook( String.Format(
"The edge weight in {0} must be a number."
,
ExcelUtil.GetCellAddress(oSourceWorksheet,
iRowOneBased, iColumnOneBased)
),
oSourceWorksheet, iRowOneBased, iColumnOneBased
);
}
if (dEdgeWeight != 0)
{
IEdge oEdge = oEdges.Add(aoOrderedVertices[i],
aoOrderedVertices[j], bGraphIsDirected);
oEdge.SetValue(ReservedMetadataKeys.EdgeWeight,
dEdgeWeight);
}
}
}
}