docs: public void process(List<ChessboardCorner> corners ) {
  		this.corners = corners;
  
  		// reset internal data structures
  		vertexes.reset();
  		edges.reset();
  		clusters.reset();
  
  		// Create a vertex for each corner
  		for (int idx = 0; idx < corners.size(); idx++) {
  			Vertex v = vertexes.grow();
  			v.reset();
  			v.index = idx;
  		}
  
  		// Initialize nearest-neighbor search.
  		nn.setPoints(corners,true);
  
  		// Connect corners to each other based on relative distance on orientation
  		for (int i = 0; i < corners.size(); i++) {
  			findVertexNeighbors(vertexes.get(i),corners);
  		}
  
  		// If more than one vertex's are near each other, pick one and remove the others
  		handleAmbiguousVertexes(corners);
  //		printDualGraph();
  
  		// Prune connections which are not mutual
  		for (int i = 0; i < vertexes.size; i++) {
  			Vertex v = vertexes.get(i);
  			v.pruneNonMutal(EdgeType.PARALLEL);
  			v.pruneNonMutal(EdgeType.PERPENDICULAR);
  		}
  //		printDualGraph();
  
  		// Select the final 2 to 4 connections from perpendicular set
  		// each pair of adjacent perpendicular edge needs to have a matching parallel edge between them
  		// Use each perpendicular edge as a seed and select the best one
  		for (int idx = 0; idx < vertexes.size(); idx++) {
  			selectConnections(vertexes.get(idx));
  		}
  //		printConnectionGraph();
  
  		// Connects must be mutual to be accepted. Keep track of vertexes which were modified
  		dirtyVertexes.clear();
  		for (int i = 0; i < vertexes.size; i++) {
  			Vertex v = vertexes.get(i);
  			int before = v.connections.size();
  			v.pruneNonMutal(EdgeType.CONNECTION);
  			if( before != v.connections.size() ) {
  				dirtyVertexes.add(v);
  				v.marked = true;
  			}
  		}
  
  //		printConnectionGraph();
  		// attempt to recover from poorly made decisions in the past from the greedy algorithm
  		repairVertexes();
  
  		// Prune non-mutual edges again. Only need to consider dirty edges since it makes sure that the new
  		// set of connections is a super set of the old
  		for (int i = 0; i < dirtyVertexes.size(); i++) {
  			dirtyVertexes.get(i).pruneNonMutal(EdgeType.CONNECTION);
  			dirtyVertexes.get(i).marked = false;
  		}
  
  		// Final clean up to return just valid grids
  		disconnectInvalidVertices();
  
  		// Name says it all
  		convertToOutput(corners);
  	}