Class BDDFactory

  • Direct Known Subclasses:
    BDDFactoryIntImpl

    public abstract class BDDFactory
    extends Object
    Interface for the creation and manipulation of BDDs.
    See Also:
    BDD
    • Constructor Detail

      • BDDFactory

        protected BDDFactory()
        Construct a new BDDFactory.
    • Method Detail

      • init

        public static BDDFactory init​(int nodenum,
                                      int cachesize)
        Initializes a BDD factory with the given initial node table size and operation cache size. Uses the "java" factory.
        Parameters:
        nodenum - initial node table size
        cachesize - operation cache size
        Returns:
        BDD factory object
      • init

        public static BDDFactory init​(String bddpackage,
                                      int nodenum,
                                      int cachesize)
        Initializes a BDD factory of the given type with the given initial node table size and operation cache size. The type is a string that can be "j", "java", "test", "typed", or a name of a class that has an init() method that returns a BDDFactory. If it fails, it falls back to the "java" factory.
        Parameters:
        bddpackage - BDD package string identifier
        nodenum - initial node table size
        cachesize - operation cache size
        Returns:
        BDD factory object
      • isZDD

        public boolean isZDD()
        Returns true if this is a ZDD factory, false otherwise.
        Returns:
        true if this is a ZDD factory, false otherwise
      • zero

        public abstract BDD zero()
        Get the constant false BDD.

        Compare to bdd_false.

        Returns:
        constant false BDD
      • one

        public abstract BDD one()
        Get the constant true BDD.

        Compare to bdd_true.

        Returns:
        constant true BDD
      • universe

        public BDD universe()
        Get the constant universe BDD. (The universe BDD differs from the one BDD in ZDD mode.)

        Compare to bdd_true.

        Returns:
        constant universe BDD
      • emptySet

        public BDDVarSet emptySet()
        Get an empty BDDVarSet.

        Compare to bdd_true.

        Returns:
        empty BDDVarSet
      • buildCube

        public BDD buildCube​(int value,
                             List<BDD> variables)
        Build a cube from an array of variables.

        Compare to bdd_buildcube.

        Parameters:
        value - bitset
        variables - BDDs for variables
        Returns:
        cube
      • buildCube

        public BDD buildCube​(int value,
                             int[] variables)
        Build a cube from an array of variables.

        Compare to bdd_ibuildcube.

        Parameters:
        value - bitset
        variables - variables indices
        Returns:
        cube
      • makeSet

        public BDDVarSet makeSet​(int[] varset)
        Builds a BDD variable set from an integer array. The integer array varset holds the variable numbers. The BDD variable set is represented by a conjunction of all the variables in their positive form.

        Compare to bdd_makeset.

        Parameters:
        varset - variable array
        Returns:
        BDD variable set
      • initialize

        protected abstract void initialize​(int nodenum,
                                           int cachesize)
        Compare to bdd_init.
        Parameters:
        nodenum - the initial number of BDD nodes
        cachesize - the size of caches used by the BDD operators
      • isInitialized

        public abstract boolean isInitialized()
        Returns true if this BDD factory is initialized, false otherwise.

        Compare to bdd_isrunning.

        Returns:
        true if this BDD factory is initialized
      • reset

        public void reset()
        Reset the BDD factory to its initial state. Everything is reallocated from scratch. This is like calling done() followed by initialize().
      • done

        public abstract void done()
        This function frees all memory used by the BDD package and resets the package to its uninitialized state. The BDD package is no longer usable after this call.

        Compare to bdd_done.

      • setError

        public abstract void setError​(int code)
        Sets the error condition. This will cause the BDD package to throw an exception at the next garbage collection.
        Parameters:
        code - the error code to set
      • clearError

        public abstract void clearError()
        Clears any outstanding error condition.
      • setMaxNodeNum

        public abstract int setMaxNodeNum​(int size)
        Set the maximum available number of BDD nodes.

        Compare to bdd_setmaxnodenum.

        Parameters:
        size - maximum number of nodes
        Returns:
        old value
      • setMinFreeNodes

        public abstract double setMinFreeNodes​(double x)
        Set minimum percentage of nodes to be reclaimed after a garbage collection. If this percentage is not reclaimed, the node table will be grown. The range of x is 0..1. The default is .20.

        Compare to bdd_setminfreenodes.

        Parameters:
        x - number from 0 to 1
        Returns:
        old value
      • setMaxIncrease

        public abstract int setMaxIncrease​(int x)
        Set maximum number of nodes by which to increase node table after a garbage collection.

        Compare to bdd_setmaxincrease.

        Parameters:
        x - maximum number of nodes by which to increase node table
        Returns:
        old value
      • setIncreaseFactor

        public abstract double setIncreaseFactor​(double x)
        Set factor by which to increase node table after a garbage collection. The amount of growth is still limited by setMaxIncrease().
        Parameters:
        x - factor by which to increase node table after GC
        Returns:
        old value
      • setCacheRatio

        public abstract double setCacheRatio​(double x)
        Sets the cache ratio for the operator caches. When the node table grows, operator caches will also grow to maintain the ratio.

        Compare to bdd_setcacheratio.

        Parameters:
        x - cache ratio
        Returns:
        old cache ratio
      • setNodeTableSize

        public abstract int setNodeTableSize​(int n)
        Sets the node table size.
        Parameters:
        n - new size of table
        Returns:
        old size of table
      • setCacheSize

        public abstract int setCacheSize​(int n)
        Sets cache size.
        Parameters:
        n - new cache size
        Returns:
        old cache size
      • varNum

        public abstract int varNum()
        Returns the number of defined variables.

        Compare to bdd_varnum.

        Returns:
        number of defined variables
      • setVarNum

        public abstract int setVarNum​(int num)
        Set the number of used BDD variables. It can be called more than one time, but only to increase the number of variables.

        Compare to bdd_setvarnum.

        Parameters:
        num - new number of BDD variables
        Returns:
        old number of BDD variables
      • extVarNum

        public int extVarNum​(int num)
        Add extra BDD variables. Extends the current number of allocated BDD variables with num extra variables.

        Compare to bdd_extvarnum.

        Parameters:
        num - number of BDD variables to add
        Returns:
        old number of BDD variables
      • ithVar

        public abstract BDD ithVar​(int var)
        Returns a BDD representing the I'th variable. (One node with the children true and false.) The requested variable must be in the (zero-indexed) range defined by setVarNum.

        Compare to bdd_ithvar.

        Parameters:
        var - the variable number
        Returns:
        the I'th variable on success, otherwise the constant false BDD
      • nithVar

        public abstract BDD nithVar​(int var)
        Returns a BDD representing the negation of the I'th variable. (One node with the children false and true.) The requested variable must be in the (zero-indexed) range defined by setVarNum.

        Compare to bdd_nithvar.

        Parameters:
        var - the variable number
        Returns:
        the negated I'th variable on success, otherwise the constant false BDD
      • printAll

        public abstract void printAll()
        Prints all used entries in the node table.

        Compare to bdd_printall.

      • printTable

        public abstract void printTable​(BDD b)
        Prints the node table entries used by a BDD.

        Compare to bdd_printtable.

        Parameters:
        b - BDD
      • load

        public BDD load​(String filename)
                 throws IOException
        Loads a BDD from a file.

        Compare to bdd_load.

        Parameters:
        filename - filename
        Returns:
        BDD
        Throws:
        IOException - In case of an I/O error.
      • load

        public BDD load​(BufferedReader ifile)
                 throws IOException
        Loads a BDD from the given input.

        Compare to bdd_load.

        Parameters:
        ifile - reader
        Returns:
        BDD
        Throws:
        IOException - In case of an I/O error.
      • load

        public BDD load​(BufferedReader ifile,
                        int[] translate)
                 throws IOException
        Loads a BDD from the given input, translating BDD variables according to the given map.

        Compare to bdd_load.

        Parameters:
        ifile - reader
        translate - variable translation map
        Returns:
        BDD
        Throws:
        IOException - In case of an I/O error.
      • readNext

        protected String readNext​(BufferedReader ifile)
                           throws IOException
        Read the next token from the file.
        Parameters:
        ifile - reader
        Returns:
        next string token
        Throws:
        IOException - In case of an I/O error.
      • loadhash_get

        protected BDD loadhash_get​(BDDFactory.LoadHash[] lh_table,
                                   int lh_nodenum,
                                   int key)
        Gets a BDD from the load hash table.
        Parameters:
        lh_table - load hash table
        lh_nodenum - node number
        key - key
        Returns:
        BDD
      • save

        public void save​(String filename,
                         BDD var)
                  throws IOException
        Saves a BDD to a file.

        Compare to bdd_save.

        Parameters:
        filename - filename
        var - BDD
        Throws:
        IOException - In case of an I/O error.
      • save

        public void save​(BufferedWriter out,
                         BDD r)
                  throws IOException
        Saves a BDD to an output writer.

        Compare to bdd_save.

        Parameters:
        out - writer
        r - BDD
        Throws:
        IOException - In case of an I/O error.
      • save_rec

        protected int save_rec​(BufferedWriter out,
                               BitSet visited,
                               BDD root)
                        throws IOException
        Helper function for save().
        Parameters:
        out - writer
        visited - visited nodes bitset
        root - root BDD
        Returns:
        bitset index
        Throws:
        IOException - In case of an I/O error.
      • level2Var

        public abstract int level2Var​(int level)
        Convert from a BDD level to a BDD variable.

        Compare to bdd_level2var.

        Parameters:
        level - BDD level
        Returns:
        BDD variable
      • var2Level

        public abstract int var2Level​(int var)
        Convert from a BDD variable to a BDD level.

        Compare to bdd_var2level.

        Parameters:
        var - BDD variable
        Returns:
        BDD level
      • reorder

        public abstract void reorder​(BDDFactory.ReorderMethod m)
        Reorder the BDD with the given method.

        Compare to bdd_reorder.

        Parameters:
        m - reorder method
      • autoReorder

        public abstract void autoReorder​(BDDFactory.ReorderMethod method)
        Enables automatic reordering. If method is REORDER_NONE then automatic reordering is disabled.

        Compare to bdd_autoreorder.

        Parameters:
        method - reorder method
      • autoReorder

        public abstract void autoReorder​(BDDFactory.ReorderMethod method,
                                         int max)
        Enables automatic reordering with the given (maximum) number of reorderings. If method is REORDER_NONE then automatic reordering is disabled.

        Compare to bdd_autoreorder_times.

        Parameters:
        method - reorder method
        max - maximum number of reorderings
      • getReorderMethod

        public abstract BDDFactory.ReorderMethod getReorderMethod()
        Returns the current reorder method as defined by autoReorder.

        Compare to bdd_getreorder_method.

        Returns:
        ReorderMethod
      • getReorderTimes

        public abstract int getReorderTimes()
        Returns the number of allowed reorderings left. This value can be defined by autoReorder.

        Compare to bdd_getreorder_times.

        Returns:
        number of allowed reorderings left
      • disableReorder

        public abstract void disableReorder()
        Disable automatic reordering until enableReorder is called. Reordering is enabled by default as soon as any variable blocks have been defined.

        Compare to bdd_disable_reorder.

      • enableReorder

        public abstract void enableReorder()
        Enable automatic reordering after a call to disableReorder.

        Compare to bdd_enable_reorder.

      • reorderVerbose

        public abstract int reorderVerbose​(int v)
        Enables verbose information about reordering. A value of zero means no information, one means some information and greater than one means lots of information.
        Parameters:
        v - the new verbose level
        Returns:
        the old verbose level
      • setVarOrder

        public abstract void setVarOrder​(int[] neworder)
        This function sets the current variable order to be the one defined by neworder. The variable parameter neworder is interpreted as a sequence of variable indices and the new variable order is exactly this sequence. The array must contain all the variables defined so far. If, for instance the current number of variables is 3 and neworder contains [1; 0; 2] then the new variable order is v1 < v0 < v2.

        Note that this operation must walk through the node table many times, and therefore it is much more efficient to call this when the node table is small.

        Parameters:
        neworder - new variable order
      • getVarOrder

        public int[] getVarOrder()
        Gets the current variable order.
        Returns:
        variable order
      • makePair

        public abstract BDDPairing makePair()
        Make a new BDDPairing object.

        Compare to bdd_newpair.

        Returns:
        BDD pairing
      • makePair

        public BDDPairing makePair​(int oldvar,
                                   int newvar)
        Make a new pairing that maps from one variable to another.
        Parameters:
        oldvar - old variable
        newvar - new variable
        Returns:
        BDD pairing
      • makePair

        public BDDPairing makePair​(int oldvar,
                                   BDD newvar)
        Make a new pairing that maps from one variable to another BDD.
        Parameters:
        oldvar - old variable
        newvar - new BDD
        Returns:
        BDD pairing
      • makePair

        public BDDPairing makePair​(BDDDomain oldvar,
                                   BDDDomain newvar)
        Make a new pairing that maps from one BDD domain to another.
        Parameters:
        oldvar - old BDD domain
        newvar - new BDD domain
        Returns:
        BDD pairing
      • swapVar

        public abstract void swapVar​(int v1,
                                     int v2)
        Swap two variables.

        Compare to bdd_swapvar.

        Parameters:
        v1 - first variable
        v2 - second variable
      • addVarBlock

        public void addVarBlock​(BDDVarSet var,
                                boolean fixed)
        Adds a new variable block for reordering.

        Creates a new variable block with the variables in the variable set var. The variables in var must be contiguous.

        The fixed parameter sets the block to be fixed (no reordering of its child blocks is allowed) or free.

        Compare to bdd_addvarblock.

        Parameters:
        var - variable
        fixed - fixed or free
      • addVarBlock

        public abstract void addVarBlock​(int first,
                                         int last,
                                         boolean fixed)
        Adds a new variable block for reordering.

        Creates a new variable block with the variables numbered first through last, inclusive.

        The fixed parameter sets the block to be fixed (no reordering of its child blocks is allowed) or free.

        Compare to bdd_intaddvarblock.

        Parameters:
        first - first variable number
        last - last variable number
        fixed - fixed or free
      • varBlockAll

        public abstract void varBlockAll()
        Add a variable block for all variables.

        Adds a variable block for all BDD variables declared so far. Each block contains one variable only. More variable blocks can be added later with the use of addVarBlock -- in this case the tree of variable blocks will have the blocks of single variables as the leafs.

        Compare to bdd_varblockall.

      • clearVarBlocks

        public abstract void clearVarBlocks()
        Clears all the variable blocks that have been defined by calls to addVarBlock.

        Compare to bdd_clrvarblocks.

      • printOrder

        public abstract void printOrder()
        Prints an indented list of the variable blocks.

        Compare to bdd_printorder.

      • nodeCount

        public abstract int nodeCount​(Collection<BDD> r)
        Counts the number of shared nodes in a collection of BDDs. Counts all distinct nodes that are used in the BDDs -- if a node is used in more than one BDD then it only counts once.

        Compare to bdd_anodecount.

        Parameters:
        r - collection of BDDs
        Returns:
        number of shared nodes
      • getNodeTableSize

        public abstract int getNodeTableSize()
        Get the number of allocated nodes. This includes both dead and active nodes.

        Compare to bdd_getallocnum.

        Returns:
        number of allocated nodes
      • getNodeNum

        public abstract int getNodeNum()
        Get the number of active nodes in use. Note that dead nodes that have not been reclaimed yet by a garbage collection are counted as active.

        Compare to bdd_getnodenum.

        Returns:
        number of active nodes in use
      • getCacheSize

        public abstract int getCacheSize()
        Get the current size of the cache, in entries.
        Returns:
        size of cache
      • reorderGain

        public abstract int reorderGain()
        Calculate the gain in size after a reordering. The value returned is (100*(A-B))/A, where A is previous number of used nodes and B is current number of used nodes.

        Compare to bdd_reorder_gain.

        Returns:
        gain in size after a reordering
      • printStat

        public abstract void printStat()
        Print cache statistics.

        Compare to bdd_printstat.

      • getGCStats

        public BDDFactory.GCStats getGCStats()
        Return the current GC statistics for this BDD factory.
        Returns:
        GC statistics
      • getReorderStats

        public BDDFactory.ReorderStats getReorderStats()
        Return the current reordering statistics for this BDD factory.
        Returns:
        reorder statistics
      • getCacheStats

        public BDDFactory.CacheStats getCacheStats()
        Return the current cache statistics for this BDD factory.
        Returns:
        cache statistics
      • getMaxUsedBddNodesStats

        public BDDFactory.MaxUsedBddNodesStats getMaxUsedBddNodesStats()
        Return the current maximum used BDD nodes statistics for this BDD factory.
        Returns:
        maximum used BDD nodes statistics
      • getContinuousStats

        public BDDFactory.ContinuousStats getContinuousStats()
        Return the current continuous statistics for this BDD factory.
        Returns:
        continuous statistics
      • createDomain

        protected BDDDomain createDomain​(int a,
                                         BigInteger b)
        Implementors must implement this factory method to create BDDDomain objects of the correct type.
        Parameters:
        a - index of this domain
        b - size of this domain
        Returns:
        BDD domain
      • extDomain

        public BDDDomain extDomain​(long domainSize)
        Creates a new finite domain block of the given size. Allocates log 2 (|domainSize|) BDD variables for the domain.
        Parameters:
        domainSize - domainSize
        Returns:
        BDD domain
      • extDomain

        public BDDDomain[] extDomain​(int[] dom)
        Extends the set of finite domain blocks with domains of the given sizes. Each entry in domainSizes is the size of a new finite domain which later on can be used for finite state machine traversal and other operations on finite domains. Each domain allocates log 2 (|domainSizes[i]|) BDD variables to be used later. The ordering is interleaved for the domains defined in each call to extDomain. This means that assuming domain D0 needs 2 BDD variables x1 and x2 , and another domain D1 needs 4 BDD variables y1, y2, y3 and y4, then the order then will be x1, y1, x2, y2, y3, y4. The new domains are returned in order. The BDD variables needed to encode the domain are created for the purpose and do not interfere with the BDD variables already in use.

        Compare to fdd_extdomain.

        Parameters:
        dom - domain sizes
        Returns:
        BDD domains
      • extDomain

        public BDDDomain[] extDomain​(long[] dom)
      • overlapDomain

        public BDDDomain overlapDomain​(BDDDomain d1,
                                       BDDDomain d2)
        This function takes two finite domain blocks and merges them into a new one, such that the new one is encoded using both sets of BDD variables.

        Compare to fdd_overlapdomain.

        Parameters:
        d1 - first domain
        d2 - second domain
        Returns:
        BDD domain
      • makeSet

        public BDDVarSet makeSet​(BDDDomain[] v)
        Returns a BDD defining all the variable sets used to define the variable blocks in the given array.

        Compare to fdd_makeset.

        Parameters:
        v - variable block array
        Returns:
        BDD variable set
      • clearAllDomains

        public void clearAllDomains()
        Clear all allocated finite domain blocks that were defined by extDomain() or overlapDomain().

        Compare to fdd_clearall.

      • numberOfDomains

        public int numberOfDomains()
        Returns the number of finite domain blocks defined by calls to extDomain().

        Compare to fdd_domainnum.

        Returns:
        number of finite domain blocks
      • getDomain

        public BDDDomain getDomain​(int i)
        Returns the ith finite domain block, as defined by calls to extDomain().
        Parameters:
        i - index
        Returns:
        finite domain block
      • makeVarOrdering

        public int[] makeVarOrdering​(boolean reverseLocal,
                                     String ordering)
        Creates a variable ordering from a string. The resulting order can be passed into setVarOrder(). Example: in the order "A_BxC_DxExF", the bits for A are first, followed by the bits for B and C interleaved, followed by the bits for D, E, and F interleaved.

        Obviously, domain names cannot contain the 'x' or '_' characters.

        Parameters:
        reverseLocal - whether to reverse the bits of each domain
        ordering - string representation of ordering
        Returns:
        int[] of ordering
        See Also:
        setVarOrder(int[])
      • createBitVector

        protected BDDBitVector createBitVector​(int a)
        Implementors must implement this factory method to create BDDBitVector objects of the correct type.
        Parameters:
        a - bit number
        Returns:
        BDD bit vector
      • buildVector

        public BDDBitVector buildVector​(int bitnum,
                                        boolean b)
        Build a bit vector that is constant true or constant false.

        Compare to bvec_true, bvec_false.

        Parameters:
        bitnum - bit number
        b - bit value
        Returns:
        BDD bit vector
      • constantVector

        public BDDBitVector constantVector​(int bitnum,
                                           long val)
        Build a bit vector that corresponds to a constant value.

        Compare to bvec_con.

        Parameters:
        bitnum - bit number
        val - bit value
        Returns:
        BDD bit vector
      • buildVector

        public BDDBitVector buildVector​(int bitnum,
                                        int offset,
                                        int step)
        Build a bit vector using variables offset, offset+step, offset+2*step, ... , offset+(bitnum-1)*step.

        Compare to bvec_var.

        Parameters:
        bitnum - bit number
        offset - offset
        step - step
        Returns:
        BDD bit vector
      • buildVector

        public BDDBitVector buildVector​(BDDDomain d)
        Build a bit vector using variables from the given BDD domain.

        Compare to bvec_varfdd.

        Parameters:
        d - BDD domain
        Returns:
        BDD bit vector
      • buildVector

        public BDDBitVector buildVector​(int[] var)
        Build a bit vector using the given variables.

        compare to bvec_varvec.

        Parameters:
        var - variables
        Returns:
        BDD bit vector
      • registerGCCallback

        public void registerGCCallback​(Object o,
                                       Method m)
        Register a callback that is called when garbage collection is about to occur.
        Parameters:
        o - base object
        m - method
      • unregisterGCCallback

        public void unregisterGCCallback​(Object o,
                                         Method m)
        Unregister a garbage collection callback that was previously registered.
        Parameters:
        o - base object
        m - method
      • registerReorderCallback

        public void registerReorderCallback​(Object o,
                                            Method m)
        Register a callback that is called when reordering is about to occur.
        Parameters:
        o - base object
        m - method
      • unregisterReorderCallback

        public void unregisterReorderCallback​(Object o,
                                              Method m)
        Unregister a reorder callback that was previously registered.
        Parameters:
        o - base object
        m - method
      • registerResizeCallback

        public void registerResizeCallback​(Object o,
                                           Method m)
        Register a callback that is called when node table resizing is about to occur.
        Parameters:
        o - base object
        m - method
      • unregisterResizeCallback

        public void unregisterResizeCallback​(Object o,
                                             Method m)
        Unregister a reorder callback that was previously registered.
        Parameters:
        o - base object
        m - method
      • bdd_default_gbchandler

        protected static void bdd_default_gbchandler​(boolean pre,
                                                     BDDFactory.GCStats s)
      • resize_handler

        protected void resize_handler​(int oldsize,
                                      int newsize)
      • bdd_default_reshandler

        protected static void bdd_default_reshandler​(int oldsize,
                                                     int newsize)
      • unregisterCallback

        protected boolean unregisterCallback​(List<Object[]> callbacks,
                                             Object o,
                                             Method m)