code: @Override
      public void registerVisitedSolution(SubsetSolution visitedSolution, Move<? super SubsetSolution> appliedMove) {
          // don't do anything if move is null
          if(appliedMove != null){
              // check move type
              if(appliedMove instanceof SubsetMove){
                  // cast
                  SubsetMove sMove = (SubsetMove) appliedMove;
                  // store involved IDs
                  memory.addAll(sMove.getAddedIDs());
                  memory.addAll(sMove.getDeletedIDs());
              } else {
                  // wrong move type
                  throw new IncompatibleTabuMemoryException("ID based subset tabu memory can only be used in combination with "
                                                          + "neighbourhoods that generate moves of type SubsetMove. Received: "
                                                          + appliedMove.getClass().getName());
              }
          }
      }
docs: Registers an applied subset move by storing all involved IDs (added or deleted) in the tabu memory. It is required
  that the given move is of type {@link SubsetMove}, else an {@link IncompatibleTabuMemoryException} will be thrown.
  The argument <code>visitedSolution</code> is ignored, as the applied move contains all necessary information, and
  may be <code>null</code>. If <code>appliedMove</code> is <code>null</code>, calling this method does not have any
  effect.
  
  @param visitedSolution newly visited solution (not used here, allowed be <code>null</code>)
  @param appliedMove applied move of which all involved IDs are stored in the tabu memory
  @throws IncompatibleTabuMemoryException if the given move is not of type {@link SubsetMove}