code: @Override
  	public void propagate(int evtmask) throws ContradictionException {
  		if (waitFirstSol && model.getSolver().getSolutionCount() == 0) {
  			return;//the UB does not allow to prune
  		}
  		// initialisation
  		mandatoryArcsList.clear();
  		ISet nei;
  		totalPenalities = 0;
  		for (int i = 0; i < n; i++) {
  			totalPenalities += penalities[i] * maxDegree[i];
  			nei = gV.getMandNeighOf(i);
  			for (int j : nei) {
  				if (i < j) {
  					mandatoryArcsList.add(i * n + j);
  				}
  			}
  			nei = g.getNeighOf(i);
  			for (int j : nei) {
  				if (i < j) {
  					costs[j][i] = costs[i][j] = originalCosts[i][j] + penalities[i] + penalities[j];
  					if (costs[i][j] < 0) {
  						throw new UnsupportedOperationException();
  					}
  				}
  			}
  		}
  		lagrangianRelaxation();
  	}
docs: ***********************************************************************************