Пример #1
0
 public BDD buildAdd(BDDDomain that, long value)
 {
     if (this.varNum() != that.varNum())
     {
         throw new BDDException();
     }
     return(buildAdd(that, this.varNum(), value));
 }
Пример #2
0
        public BDD buildAdd(BDDDomain that, int bits, long value)
        {
            if (bits > this.varNum() ||
                bits > that.varNum())
            {
                throw new BDDException("Number of bits requested (" + bits + ") is larger than domain sizes " + this.varNum() + "," + that.varNum());
            }

            BDDFactory bdd = getFactory();

            if (value == 0L)
            {
                BDD result = bdd.one();
                int n;
                for (n = 0; n < bits; n++)
                {
                    BDD b = bdd.ithVar(this.ivar[n]);
                    b.biimpWith(bdd.ithVar(that.ivar[n]));
                    result.andWith(b);
                }
                for (; n < Math.Max(this.varNum(), that.varNum()); n++)
                {
                    BDD b = (n < this.varNum()) ? bdd.nithVar(this.ivar[n]) : bdd.one();
                    b.andWith((n < that.varNum()) ? bdd.nithVar(that.ivar[n]) : bdd.one());
                    result.andWith(b);
                }
                return(result);
            }

            int[] vars = new int[bits];
            System.arraycopy(this.ivar, 0, vars, 0, vars.Length);
            BDDBitVector y = bdd.buildVector(vars);
            BDDBitVector v = bdd.constantVector(bits, value);
            BDDBitVector z = y.add(v);

            int[] thatvars = new int[bits];
            System.arraycopy(that.ivar, 0, thatvars, 0, thatvars.Length);
            BDDBitVector x      = bdd.buildVector(thatvars);
            BDD          result = bdd.one();
            int          n;

            for (n = 0; n < x.size(); n++)
            {
                BDD b = x.bitvec[n].biimp(z.bitvec[n]);
                result.andWith(b);
            }
            for (; n < Math.Max(this.varNum(), that.varNum()); n++)
            {
                BDD b = (n < this.varNum()) ? bdd.nithVar(this.ivar[n]) : bdd.one();
                b.andWith((n < that.varNum()) ? bdd.nithVar(that.ivar[n]) : bdd.one());
                result.andWith(b);
            }
            x.free(); y.free(); z.free(); v.free();
            return(result);
        }
Пример #3
0
        /**
         * Builds a BDD which is true for all the possible assignments to the
         * variable blocks that makes the blocks equal.
         *
         * Compare to fdd_equals/fdd_equ.
         *
         * @param that
         * @return BDD
         */
        public BDD buildEquals(BDDDomain that)
        {
            if (!this.size().equals(that.size()))
            {
                throw new BDDException("Size of " + this + " != size of that " + that + "( " + this.size() + " vs " + that.size() + ")");
            }

            BDDFactory factory = getFactory();
            BDD        e       = factory.one();

            int[] this_ivar = this.vars();
            int[] that_ivar = that.vars();

            for (int n = 0; n < this.varNum(); n++)
            {
                BDD a = factory.ithVar(this_ivar[n]);
                BDD b = factory.ithVar(that_ivar[n]);
                a.biimpWith(b);
                e.andWith(a);
            }

            return(e);
        }
Пример #4
0
 /**
  * Defines each variable in the finite domain block p1 to be paired with the
  * corresponding variable in p2.
  *
  * Compare to fdd_setpair.
  */
 public void set(BDDDomain p1, BDDDomain p2)
 {
     int[] ivar1 = p1.vars();
     int[] ivar2 = p2.vars();
     this.set(ivar1, ivar2);
 }