Class PropScalarMixed

  • All Implemented Interfaces:
    Comparable<Propagator>, ICause, Identity

    public class PropScalarMixed
    extends Propagator<Variable>
    A propagator for SUM(x_i*c_i) = b
    Based on "Bounds Consistency Techniques for Long Linear Constraint"
    W. Harvey and J. Schimpf

    Since:
    18/03/11
    Author:
    Charles Prud'homme
    • Field Detail

      • l

        protected final int l
        Number of variables
      • b

        protected final double b
        Bound to respect
      • I

        protected final double[] I
        Variability of each variable (ie domain amplitude)
      • maxI

        protected double maxI
        Stores the maximal variability
      • sumLB

        protected double sumLB
        SUm of lower bounds
      • sumUB

        protected double sumUB
        Sum of upper bounds
      • o

        protected final Operator o
        The operator among EQ, LE, GE and NE
    • Constructor Detail

      • PropScalarMixed

        public PropScalarMixed​(Variable[] variables,
                               double[] coeffs,
                               Operator o,
                               double b)
        Create a scalar product: SCALAR(x_i*c_i) o b
        Parameters:
        variables - list of variables
        coeffs - list of coefficients
        o - operator
        b - bound to respect.
    • Method Detail

      • getPropagationConditions

        public int getPropagationConditions​(int vIdx)
        Description copied from class: Propagator
        Returns the specific mask indicating the variable events on which this Propagator object can react.
        A mask is a bitwise OR operations over IEventType this can react on. For example, consider a propagator that can deduce filtering based on the lower bound of the integer variable X. Then, for this variable, the mask should be equal to :
             int mask = IntEventType.INCLOW.getMask() | IntEventType.INSTANTIATE.getMask();
         
        or, in a more convenient way:
             int mask = IntEvtType.combine(IntEventType.INCLOW,IntEventType.INSTANTIATE);
         
        That indicates the following behavior:
        1. if X is instantiated, this propagator will be executed,
        2. if the lower bound of X is modified, this propagator will be executed,
        3. if the lower bound of X is removed, the event is promoted from REMOVE to INCLOW and this propagator will NOT be executed,
        4. otherwise, this propagator will NOT be executed
        Some combinations are valid. For example, a propagator which reacts on REMOVE and INSTANTIATE should also declare INCLOW and DECUPP as conditions. Indeed INCLOW (resp. DECUPP), for efficiency purpose, removing the lower bound (resp. upper bound) of an integer variable will automatically be promoted into INCLOW (resp. DECUPP). So, ignoring INCLOW and/or DECUPP in that case may result in a lack of filtering. The same goes with events of other variable types, but most of the time, there are only few combinations. Reacts to any kind of event by default. Alternatively, this method can return IntEventType.VOID which states that this propagator should not be aware of modifications applied to the variable in position vIdx.
        Overrides:
        getPropagationConditions in class Propagator<Variable>
        Parameters:
        vIdx - index of the variable within the propagator
        Returns:
        an int composed of REMOVE and/or INSTANTIATE and/or DECUPP and/or INCLOW
      • propagate

        public void propagate​(int evtmask)
                       throws ContradictionException
        Description copied from class: Propagator
        Call the main filtering algorithm to apply to the Domain of the Variable objects. It considers the current state of this objects to remove some values from domains and/or instantiate some variables. Calling this method is done from 2 (and only 2) steps:
        - at the initial propagation step,
        - when involved in a reified constraint.
        It should initialized the internal data structure and apply filtering algorithm from scratch.
        Specified by:
        propagate in class Propagator<Variable>
        Parameters:
        evtmask - type of propagation event this must consider.
        Throws:
        ContradictionException - when a contradiction occurs, like domain wipe out or other incoherencies.
      • prepare

        protected void prepare()
      • isEntailed

        public ESat isEntailed()
        Description copied from class: Propagator
        Check wether this is entailed according to the current state of its internal structure. At least, should check the satisfaction of this (when all is instantiated).
        Specified by:
        isEntailed in class Propagator<Variable>
        Returns:
        ESat.TRUE if entailed, ESat.FALSE if not entailed, ESat.UNDEFINED if unknown
      • check

        protected ESat check​(double sumLB,
                             double sumUB)
        Whether the current state of the scalar product is entailed
        Parameters:
        sumLB - sum of lower bounds
        sumUB - sum of upper bounds
        Returns:
        the entailment check