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}