Skip to main content

Library for folding (or reducing) over a Reduced Ordered Binary Decision Diagram.

Project description

Fold-BDD

Library for folding (or reducing) over a Reduced Ordered Binary Decision Diagram.

Build Status codecov PyPI version License: MIT

Table of Contents

Installation

If you just need to use fold_bdd, you can just run:

$ pip install fold-bdd

For developers, note that this project uses the poetry python package/dependency management tool. Please familarize yourself with it and then run:

$ poetry install

Usage

The fold-bdd library supports two types of folds:

  1. Folding over the DAG of a BDD starting at the root and then recursively merging the low and high branches until the True/False leaves. This is simply a compressed variant of a post-order traversal.

  2. Folding over a path in the DAG, starting at the root and moving the the corresponding leaf (left fold).

In both cases, local context such as the levels of the parent and child nodes are passed in.

As input, each of these take in a bdd, from the dd library and function for accumulating or merging.

The following example illustrates how to use fold_bdd to count the number of solutions to a predicate using post_order and evaluate a path using fold_path.

Create ROBDD

# Create BDD.
from dd.cudd import BDD

manager = BDD()
manager.declare('x', 'y')
manager.reorder({'x': 1, 'y': 0})
manger.configure(reordering=False)

bexpr = manager.add_expr('x | y')

Post-Order Examples

from fold_bdd import post_order

Count Number of Nodes in BDD

def merge1(ctx, low=None, high=None):
    return 1 if low is None else low + high

def dag_size(bexpr):
    return post_order(bexpr, merge1)

assert bexpr.dag_size == dag_size(bexpr)

Count Number of Solutions to bexpr.

def merge2(ctx, low, high):
    if ctx.is_leaf:
        return ctx.skipped_paths if ctx.node_val else 0
    return (low + high) * ctx.skipped_paths

def count_solutions(bexpr):
    return post_order(bexpr, merge2)

assert count_solutions(bexpr) == 3

Fold Path Examples

Count nodes along path.

def merge(ctx, val, acc):
    return acc + 1

def count_nodes(bexpr, vals):
    return fold_path(merge, bexpr, vals, initial=0)

assert count_nodes(bexpr, (False, False)) == 3
assert count_nodes(bexpr, (True, False)) == 2

Count paths corresponding to BDD path

def merge(ctx, val, acc):
    return acc * ctx.skipped_paths

def count_paths(bexpr, vals):
    return fold_path(merge, bexpr, vals, initial=1)

assert count_paths(bexpr, (False, True)) == 1
assert count_paths(bexpr, (True, False)) == 2

Context Object Attributes

The Context object contains exposes attributes

  • node: Hashable # Reference to Node in ROBDD.
  • node_val: Union[str, bool] # Node name or leaf value.
  • negated: bool # Is the edge to prev node negated.
  • max_lvl: int # How many decision variables are there.
  • curr_lvl: int # Which decision is this.
  • prev_lvl: Optional[int] # Which decision was the parent. None if root.
  • low_lvl: Optional[int] # Which decision does the False edge point to. None if leaf.
  • high_lvl: Optional[int] # Which decision does the True edge point to. None if leaf.
  • is_leaf: bool # Is the current node a leaf.
  • skipped: int # How many decisions were skipped on edge to this node.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fold-bdd-0.2.2.tar.gz (5.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

fold_bdd-0.2.2-py3-none-any.whl (5.6 kB view details)

Uploaded Python 3

File details

Details for the file fold-bdd-0.2.2.tar.gz.

File metadata

  • Download URL: fold-bdd-0.2.2.tar.gz
  • Upload date:
  • Size: 5.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/0.12.17 CPython/3.7.3 Linux/5.0.0-32-generic

File hashes

Hashes for fold-bdd-0.2.2.tar.gz
Algorithm Hash digest
SHA256 e817235754fcb120e88848e420e30f497231aefc14fba2d8f7df328174404cc4
MD5 509e80efab7b385f3b7760164183a985
BLAKE2b-256 665b575a5232694a0cf4636dd7fc698dd45855cacda0f55e53c860e8faa8ebb6

See more details on using hashes here.

File details

Details for the file fold_bdd-0.2.2-py3-none-any.whl.

File metadata

  • Download URL: fold_bdd-0.2.2-py3-none-any.whl
  • Upload date:
  • Size: 5.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/0.12.17 CPython/3.7.3 Linux/5.0.0-32-generic

File hashes

Hashes for fold_bdd-0.2.2-py3-none-any.whl
Algorithm Hash digest
SHA256 f60be18ba05a7b468d8a65c8032303a30a0664f9f58ed78d157385402e892e3f
MD5 03849dc1ba35484981dc6fde655a116f
BLAKE2b-256 7435a32908bfdc63c530b196559d0759e110f562efd8f6ae445c4834277934a9

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page