/** * This returns an enumeration of all Darts in Graph G in a canonical order starting with * firstDart. The order is canonical in the sense that it only depends on the oriented isomorphism * class of G (and firstDart). That is, if there is an oriented iso G <-> G' sending firstDart <-> * firstDart', then that bijection will send getDarts <-> getDarts'. * * <p>This enumeration is useful in finding explicit bijections of isomorphic graphs. */ public static Dart[] getDarts(Dart firstDart, Graph G) { /** * Description of algorithm: Return all the couples around V0=firstDart.V, then all couples * around V1, .... The order for couples around firstDart.V is counterclockwise starting with * firstDart.F. clockwise around V1,... So we need to order the vertices V0,V1,... and pick the * first face to use at each vertex and the rest is determined. Order on V0,... = first * encountered. Order on faces at vertex = first encountered. */ distinctFIFO vQueue = new distinctFIFO(); util.ConditionGetter fQueue = new util.ConditionGetter(); fQueue.add(firstDart.getF()); vQueue.put(firstDart.getV()); Collection coups = new ArrayList(); int coupsIndex = 0; Vertex V; while ((V = (Vertex) vQueue.remove()) != null) { Face F = (Face) fQueue.get(new incidence(V)); for (int i = 0; i < V.size(); i++) { Face Fx = V.next(F, i); coups.add(new Dart(V, Fx)); vQueue.put(Fx.next(V, 1)); fQueue.add(Fx); } } return (Dart[]) coups.toArray(new Dart[coups.size()]); }
public void testDart() { String S = Formatter.testString; // see formatterString.gif Graph G = Graph.getInstance(new Formatter(S)); Vertex V = null; int coupleCount = 0; for (Enumeration E = G.vertexEnumeration(); E.hasMoreElements(); /*--*/ ) { Vertex W = (Vertex) E.nextElement(); coupleCount += W.size(); if (W.size() == 3) V = W; } jassert(V.size() == 3); Face F = V.getAny(); while (F.size() != 5) F = V.next(F, 1); jassert(F.size() == 5); Dart C = new Dart(V, F); Dart[] list = Dart.getDarts(C, G); // compute the expected number of return values; jassert(list.length == coupleCount); jassert(list[0].getV() == C.getV()); jassert(list[0].getF() == C.getF()); // check integrity of each couple. for (int i = 0; i < list.length; i++) { V = list[i].getV(); F = list[i].getF(); jassert(V.next(F, 0) == F); jassert(F.next(V, 0) == V); } // check that all couples are distinct. Hashtable table = new Hashtable(); // { V-> set of F } for (Enumeration E = G.vertexEnumeration(); E.hasMoreElements(); /*--*/ ) { V = (Vertex) E.nextElement(); table.put(V, new HashSet()); } for (int i = 0; i < list.length; i++) { V = list[i].getV(); F = list[i].getF(); HashSet H = (HashSet) table.get(V); jassert(!H.contains(F)); H.add(F); } }