private VisualGroupNode createNode(final int i, boolean useAuto) {
        if (useAuto) {
          newGroups[i] = new VisualGroupNodeAutoEdges(vgn);
        } else {

          newGroups[i] =
              new VisualGroupNode(vgn) {
                @Override
                public void createEdges() {
                  ArrayList<Integer> ns = new ArrayList<Integer>(neighbors(i));
                  ns.add(i);
                  for (int j : ns) {
                    // for (int j : neighbors.get(i)) {
                    VisualNode vj = newGroups[j];
                    EdgeCost ec = superEdgeCost(i, j);
                    if (ec.goodness != 0.0) {
                      // adding edges
                      // System.err.println("ec.goodness = " +
                      // ec.goodness);
                      GroupEdgeUtils.makeGroupEdge((VisualGroupNode) newGroups[i], vj, ec.goodness);
                    }
                  }
                }
              }; // anonymous visualgroupnode end
        }
        VisualGroupNode ret = (VisualGroupNode) newGroups[i];
        for (int j : groups.get(i)) {
          sg.getVisualNode(j).setParent(ret);
          // nodes.get(j
        }
        ret.setName("Compressed Group " + ret.getChildren().size());
        return ret;
      }
  public void performGrouping(boolean useAuto) {
    final int n = groups.size();

    class GroupClosure {
      VisualNode[] newGroups = new VisualNode[n];

      private VisualGroupNode createNode(final int i, boolean useAuto) {
        if (useAuto) {
          newGroups[i] = new VisualGroupNodeAutoEdges(vgn);
        } else {

          newGroups[i] =
              new VisualGroupNode(vgn) {
                @Override
                public void createEdges() {
                  ArrayList<Integer> ns = new ArrayList<Integer>(neighbors(i));
                  ns.add(i);
                  for (int j : ns) {
                    // for (int j : neighbors.get(i)) {
                    VisualNode vj = newGroups[j];
                    EdgeCost ec = superEdgeCost(i, j);
                    if (ec.goodness != 0.0) {
                      // adding edges
                      // System.err.println("ec.goodness = " +
                      // ec.goodness);
                      GroupEdgeUtils.makeGroupEdge((VisualGroupNode) newGroups[i], vj, ec.goodness);
                    }
                  }
                }
              }; // anonymous visualgroupnode end
        }
        VisualGroupNode ret = (VisualGroupNode) newGroups[i];
        for (int j : groups.get(i)) {
          sg.getVisualNode(j).setParent(ret);
          // nodes.get(j
        }
        ret.setName("Compressed Group " + ret.getChildren().size());
        return ret;
      }
    }
    try {
      vgn.getGraph().disableObservers();
      GroupClosure cl = new GroupClosure();
      for (int i = 0; i < n; i++) {
        int g = i;
        if (groups.get(g).size() > 1) {
          VisualGroupNode nn = cl.createNode(g, useAuto);
        } else if (groups.get(g).size() == 1) {
          cl.newGroups[i] = sg.getVisualNode(i);
        }
      }
    } finally {
      vgn.getGraph().enableObservers();
    }
  }