private void AddNode(int layer, DAG.Node parentNode, int vertexIndex, List <DAG.Arc> layerArcs, List <DAG.Arc> usedArcs, List <DAG.Node> nextLayer) { // look up the mapping or create a new mapping for the vertex index int mappedVertexIndex; if (vertexMapping.ContainsKey(vertexIndex)) { mappedVertexIndex = vertexMapping[vertexIndex]; } else { vertexMapping[vertexIndex] = vertexCount; mappedVertexIndex = vertexCount; vertexCount++; } // find an existing node if there is one var arc = new DAG.Arc(parentNode.vertexIndex, mappedVertexIndex); if (usedArcs.Contains(arc)) { return; } DAG.Node existingNode = null; foreach (var otherNode in nextLayer) { if (otherNode.vertexIndex == mappedVertexIndex) { existingNode = otherNode; break; } } // if there isn't, make a new node and add it to the layer if (existingNode == null) { existingNode = dag.MakeNode(mappedVertexIndex, layer); nextLayer.Add(existingNode); } // add the edge label to the node's edge label list int originalParentIndex = GetOriginalVertexIndex(parentNode.vertexIndex); string edgeLabel = GetEdgeLabel(originalParentIndex, vertexIndex); int edgeColor = ConvertEdgeLabelToColor(edgeLabel); existingNode.AddEdgeColor(parentNode.vertexIndex, edgeColor); parentNode.AddEdgeColor(mappedVertexIndex, edgeColor); dag.AddRelation(existingNode, parentNode); layerArcs.Add(arc); }