001package org.clafer.choco.constraint;
002
003import org.clafer.choco.constraint.propagator.PropSetEqual;
004import org.clafer.choco.constraint.propagator.PropSetNotEqual;
005import solver.constraints.Constraint;
006import solver.constraints.Propagator;
007import solver.constraints.binary.PropEqualX_Y;
008import solver.variables.IntVar;
009import solver.variables.SetVar;
010import solver.variables.Variable;
011
012/**
013 *
014 * @author jimmy
015 */
016public class SetEquality extends Constraint<Variable, Propagator<Variable>> {
017
018    private final SetVar left, right;
019    private final IntVar leftCard, rightCard;
020    private final boolean equal;
021
022    public SetEquality(SetVar left, IntVar leftCard, boolean equal, SetVar right, IntVar rightCard) {
023        super(new SetVar[]{left, right}, left.getSolver());
024        this.left = left;
025        this.leftCard = leftCard;
026        this.equal = equal;
027        this.right = right;
028        this.rightCard = rightCard;
029        @SuppressWarnings("unchecked")
030        Propagator<Variable>[] props = 
031                equal
032                ? new Propagator[]{new PropSetEqual(left, right), new PropEqualX_Y(leftCard, rightCard)}
033                : new Propagator[]{new PropSetNotEqual(left, right)};
034        setPropagators(props);
035    }
036
037    @Override
038    public Constraint makeOpposite() {
039        return new SetEquality(left, leftCard, !equal, right, rightCard);
040    }
041}