code: private boolean refine(int row) {
          int marking = -(row + 1);
          boolean changed;
          do {
              changed = false;
              // for every feasible mapping verify if it is still valid
              for (int n = row + 1; n < matrix.nRows; n++) {
                  for (int m = 0; m < matrix.mCols; m++) {
  
                      if (matrix.get(n, m) && !verify(n, m)) {
  
                          // remove the now invalid mapping
                          matrix.mark(n, m, marking);
                          changed = true;
  
                          // no more mappings for n in the feasibility matrix
                          if (!hasCandidate(n)) return false;
                      }
                  }
              }
          } while (changed);
          return true;
      }
docs: Refines the compatibility removing any mappings which have now become
  invalid (since the last mapping). The matrix is refined from the row
  after the current {@code row} - all previous rows are fixed. If when
  refined we find a query vertex has no more candidates left in the target
  we can never reach a feasible matching and refinement is aborted (false
  is returned).
  
  @param row refine from here
  @return match is still feasible