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 addition (fixed IDs are discarded)
          Set<Integer> addCandidates = getAddCandidates(solution);
          // compute number of additions
          int curNumAdd = numAdditions(addCandidates, solution);
          if(curNumAdd == 0){
              // impossible: return empty set
              return moves;
          }
          // create all moves that add curNumAdd items
          Set<Integer> add;
          SubsetIterator<Integer> itAdd = new SubsetIterator<>(addCandidates, curNumAdd);
          while(itAdd.hasNext()){
              add = itAdd.next();
              // create and add move
              moves.add(new GeneralSubsetMove(add, Collections.emptySet()));
          }
          // return all moves
          return moves;
      }
docs: <p>
  Generates the list of all possible moves that perform \(k\) additions, where \(k\) is the fixed number
  specified at construction. Note: taking into account the current number of unselected items, the imposed
  maximum subset size (if set) and the fixed IDs (if any) may result in fewer additions (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 addition moves are generated
  @return list of all multi addition moves, may be empty