code: public void postAssignItem(int item, int bin) throws
              ContradictionException {
          if (!candidate.get(bin).get(item)) {
              return;
          }
          candidate.get(bin).clear(item);
  
          for (int d = 0; d < prop.nbDims; d++) {
              knapsack(bin, d);
  
              // The bin is full. We get rid of every candidate and set the bin load.
              if (prop.loads[d][bin].getUB() == prop.assignedLoad[d][bin].get()) {
                  filterFullDim(bin, d);
                  if (candidate.get(bin).isEmpty()) {
                      for (int d2 = 0; d2 < prop.nbDims; d2++) {
                          prop.potentialLoad[d2][bin].set(prop.assignedLoad[d2][bin].get());
                          prop.filterLoadSup(d2, bin, prop.potentialLoad[d2][bin].get());
                      }
                      return;
                  }
                  return;
              }
          }
      }
docs: update the candidate list of a bin when an item is assigned
  then apply the full bin filter if sup(binLoad) is reached
  this function may be recursive
  
  @param item the assigned item
  @param bin  the bin
  @throws ContradictionException