code: @Override
  	public void propagate(int evtmask) throws ContradictionException {
  		// trivial case
  		k.updateLowerBound(0, this);
  		if (g.getPotentialNodes().size() == 0) {
  			k.instantiateTo(0, this);
  			return;
  		}
  		if (k.getUB() == 0) {
  			for (int i : g.getPotentialNodes()) {
  				g.removeNode(i, this);
  			}
  			return;
  		}
  
  		// bound computation
  		int min = minCC();
  		int max = maxCC();
  		k.updateLowerBound(min, this);
  		k.updateUpperBound(max, this);
  
  		// A bit of pruning (removes unreachable nodes)
  		if (k.getUB() == min && min != max) {
  			int ccs = envCCFinder.getNbSCC();
  			boolean pot = true;
  			for (int cc = 0; cc < ccs; cc++) {
  				for (int i = envCCFinder.getSCCFirstNode(cc); i >= 0 && pot; i = envCCFinder.getNextNode(i)) {
  					if (g.getMandatoryNodes().contains(i)) {
  						pot = false;
  					}
  				}
  				if (pot) {
  					for (int i = envCCFinder.getSCCFirstNode(cc); i >= 0; i = envCCFinder.getNextNode(i)) {
  						g.removeNode(i, this);
  					}
  				}
  			}
  		}
  	}
docs: ***********************************************************************************