001package org.clafer.choco.constraint.propagator;
002
003import org.clafer.common.Util;
004import solver.constraints.Propagator;
005import solver.constraints.PropagatorPriority;
006import solver.exception.ContradictionException;
007import solver.variables.BoolVar;
008import solver.variables.EventType;
009import util.ESat;
010
011/**
012 *
013 * @author jimmy
014 */
015public class PropAnd extends Propagator<BoolVar> {
016
017    public PropAnd(BoolVar[] vars) {
018        super(vars, PropagatorPriority.UNARY, true);
019    }
020
021    @Override
022    public int getPropagationConditions(int vIdx) {
023        return EventType.INSTANTIATE.mask;
024    }
025
026    @Override
027    public void propagate(int evtmask) throws ContradictionException {
028        for (BoolVar var : vars) {
029            var.setToTrue(aCause);
030        }
031    }
032
033    @Override
034    public void propagate(int idxVarInProp, int mask) throws ContradictionException {
035        propagate(mask);
036    }
037
038    @Override
039    public ESat isEntailed() {
040        boolean allInstantiated = true;
041        for (BoolVar var : vars) {
042            if (var.instantiated()) {
043                if (var.getValue() == 0) {
044                    return ESat.FALSE;
045                }
046            } else {
047                allInstantiated = false;
048            }
049        }
050        return allInstantiated ? ESat.TRUE : ESat.UNDEFINED;
051    }
052
053    @Override
054    public String toString() {
055        return Util.intercalate(" && ", vars);
056    }
057}