public void makeStep() {
		if(Utils.DEBUG) {
			curAli.checkCons();
			if(curDist != distCalc.dist(curAli))
				throw new Error("Inconsistency in distance calculation");
			if(curPi != logPi(curDist))
				throw new Error("Inconsistency in likelihood calculation: "+logPi(curDist));
		}

		int type = Utils.generator.nextInt(3);
		switch (type) {
		case 0:
			slideChar(); break;
		case 1:
			breakCol(); break;
		default:
			joinCol();
		}

		// save distance distribution info
		Integer cnt = distCnts.get(curDist);
		cnt = cnt == null ? 1 : cnt+1;
		distCnts.put(curDist, cnt);
		
		if(Utils.DEBUG) {
			curAli.checkCons();
			if(curDist != distCalc.dist(curAli))
				throw new Error("Inconsistency in distance calculation");
			if(curPi != logPi(curDist))
				throw new Error("Inconsistency in likelihood calculation: "+logPi(curDist));
		}
	}