/*
  * Does not recalculate if greedySplits are already cached.
  */
 private void findGreedySplits() {
   if (greedySplits != null) return;
   sortSplits();
   int nGreedySplits = idg.getIdCount() - 3;
   greedySplits = new Vector<Split>(nGreedySplits);
   greedySplitIndex = new Vector<Integer>(nGreedySplits);
   for (int i = 0; i < sortedSplits.size() && greedySplits.size() < nGreedySplits; i++) {
     String splitStr = sortedSplits.elementAt(i);
     Split split = splits.get(splitStr);
     if (split.compatible(greedySplits)) {
       greedySplits.add(split);
       greedySplitIndex.add(i);
     }
   }
 }
  static void markNode(IdGroup idGroup, Node node, boolean[] split) {
    if (node.isLeaf()) {
      String name = node.getIdentifier().getName();
      int index = idGroup.whichIdNumber(name);

      if (index < 0) {
        throw new IllegalArgumentException("INCOMPATIBLE IDENTIFIER (" + name + ")");
      }

      split[index] = true;
    } else {
      for (int i = 0; i < node.getChildCount(); i++) {
        markNode(idGroup, node.getChild(i), split);
      }
    }
  }
 @Override
 public int whichIdNumber(String name) {
   return idg.whichIdNumber(name);
 }
 @Override
 public void setIdentifier(int i, Identifier id) {
   idg.setIdentifier(i, id);
 };
 @Override
 public Identifier getIdentifier(int i) {
   return idg.getIdentifier(i);
 }
 /*
  * Methods to implement IdGroup, which just pass through to 'idg' member
  */
 @Override
 public int getIdCount() {
   return idg.getIdCount();
 }