EqualToIntVar.java
/* Copyright 2015 Laurent COCAULT
* Licensed to Laurent COCAULT under one or more contributor license agreements.
* See the NOTICE file distributed with this work for additional information
* regarding copyright ownership. Laurent COCAULT licenses this file to You
* under the Apache License, Version 2.0 (the "License"); you may not use this
* file except in compliance with the License. You may obtain a copy of the
* License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.csp.constraint.model.integer;
/**
* Constraint specifying that one specific integer variable is equal to another
* variable augmented by a constant delta.
*/
public class EqualToIntVar extends BinaryIntConstraint {
/**
* Constructor of the constraint "LEFT = RIGHT + DELTA".
* @param left
* Left part of the comparison
* @param right
* Right part of the comparison
* @param delta
* Delta added to the right part
*/
public EqualToIntVar(final IntVar left, final IntVar right,
final IntValue delta) {
super(left.getName() + "=" + right.getName() + "+" + delta, left,
right, delta);
}
/**
* {@inheritDoc}
*/
@Override
public void propagate() {
// Propagate on the left part
IntValue newMin = IntValue.sum(getRight().getMinValue(), getDelta());
IntValue newMax = IntValue.sum(getRight().getMaxValue(), getDelta());
final boolean leftChanged = getLeft().reduceWithMinValue(newMin) ||
getLeft().reduceWithMaxValue(newMax);
// Propagate on the right part
newMin = IntValue.diff(getLeft().getMinValue(), getDelta());
newMax = IntValue.diff(getLeft().getMaxValue(), getDelta());
final boolean rightChanged = getRight().reduceWithMinValue(newMin) ||
getRight().reduceWithMaxValue(newMax);
// Update the list of changed variables
if (leftChanged) {
addRecentChangedVariable(getLeft());
}
if (rightChanged) {
addRecentChangedVariable(getRight());
}
}
/**
* Get the left argument of the constraint.
* @return First argument
*/
protected IntVar getLeft() {
return (IntVar) getFirstVariable();
}
/**
* Get the right argument of the constraint.
* @return Second argument
*/
protected IntVar getRight() {
return (IntVar) getSecondVariable();
}
}