code: private void split(Map<Invariant, SortedSet<Integer>> invariants, Partition partition) {
          int nonEmptyInvariants = invariants.keySet().size();
          if (nonEmptyInvariants > 1) {
              List<Invariant> invariantKeys = 
                      new ArrayList<Invariant>(invariants.keySet());
              partition.removeCell(currentBlockIndex);
              int k = currentBlockIndex;
              if (splitOrder == SplitOrder.REVERSE) {
                  Collections.sort(invariantKeys);
              } else {
                  Collections.sort(invariantKeys, Collections.reverseOrder());
              }
              for (Invariant h : invariantKeys) {
                  SortedSet<Integer> setH = invariants.get(h);
                  partition.insertCell(k, setH);
                  blocksToRefine.add(setH);
                  k++;
  
              }
              // skip over the newly added blocks
              currentBlockIndex += nonEmptyInvariants - 1;
          }
      }
docs: Split the current block using the invariants calculated in getInvariants.
  
  @param invariants a map of neighbor counts to elements
  @param partition the partition that is being refined