code: @Override
      public List<SubsetMove> getAllMoves(SubsetSolution solution) {
          // create empty list to store generated moves
          List<SubsetMove> moves = new ArrayList<>();
          // get set of candidate IDs for removal (fixed IDs are discarded)
          Set<Integer> delCandidates = getRemoveCandidates(solution);
          // compute number of deletions
          int curNumDel = numDeletions(delCandidates, solution);
          if(curNumDel == 0){
              // impossible: return empty set
              return moves;
          }
          // create all moves that remove curNumDel items
          Set<Integer> del;
          SubsetIterator<Integer> itDel = new SubsetIterator<>(delCandidates, curNumDel);
          while(itDel.hasNext()){
              del = itDel.next();
              // create and add move
              moves.add(new GeneralSubsetMove(Collections.emptySet(), del));
          }
          // return all moves
          return moves;
      }
docs: <p>
  Generates the list of all possible moves that perform \(k\) deletions, where \(k\) is the fixed number
  specified at construction. Note: taking into account the current number of selected items, the imposed
  minimum subset size (if set) and the fixed IDs (if any) may result in fewer deletions (as many as possible).
  </p>
  <p>
  May return an empty list if no moves can be generated.
  </p>
  
  @param solution solution for which all possible multi deletion moves are generated
  @return list of all multi deletion moves, may be empty