Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/renatogeh/bdd.jl
Binary Decision Diagrams package for Julia.
https://github.com/renatogeh/bdd.jl
Last synced: 23 days ago
JSON representation
Binary Decision Diagrams package for Julia.
- Host: GitHub
- URL: https://github.com/renatogeh/bdd.jl
- Owner: RenatoGeh
- License: gpl-3.0
- Created: 2020-06-04T05:57:26.000Z (over 4 years ago)
- Default Branch: master
- Last Pushed: 2023-03-10T14:34:46.000Z (over 1 year ago)
- Last Synced: 2024-10-10T02:15:49.984Z (27 days ago)
- Language: Julia
- Homepage:
- Size: 220 KB
- Stars: 1
- Watchers: 3
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
[![Build Status](https://travis-ci.com/RenatoGeh/BDD.jl.svg?branch=master)](https://travis-ci.com/RenatoGeh/BDD.jl)
[![codecov](https://codecov.io/gh/RenatoGeh/BDD.jl/branch/master/graph/badge.svg)](https://codecov.io/gh/RenatoGeh/BDD.jl)
[![](https://img.shields.io/badge/docs-stable-blue.svg)](https://renatogeh.github.io/BDD.jl/stable)
[![](https://img.shields.io/badge/docs-dev-blue.svg)](https://renatogeh.github.io/BDD.jl/dev)BinaryDecisionDiagrams.jl (BDD.jl)
======BDD.jl is a Julia library for manipulating Binary Decision Diagrams (BDDs).
It started as a partial port of `pyddlib` (see https://github.com/thiagopbueno/pyddlib/) but now
has many more features compared to the original package, such as- Iterating over all possible worlds;
- Functions for easily constructing conjunctions and disjunctions;
- BDD iterators and collection functions;
- Full support for equivalent formulae as keys in a dictionary;
- Shannon's decomposition;
- Variable elimination (aka the `forget` operation);
- Marginalization of a formula given some binary operator (generalization of `forget`);
- Functions for identifying a BDD's scope and verifying a variable's membership;
- Extracting conjunctions as bit arrays;
- Constructors for cardinality constraint formulae (at least, at most and exactly);
- Thread safe;
- I/O functions for saving and loading BDDs;
- Convert BDDs to CNF and DNF file formats;
- Print BDD as a CNF or DNF.The following are references used in this package and the original library.
[1] Bryant, Randal E. **Graph-based algorithms for boolean function
manipulation**. Computers, IEEE Transactions on 100, no. 8 (1986):
677-691.[2] Brace, Karl S., Richard L. Rudell, and Randal E. Bryant. **Efficient
implementation of a BDD package**. In Proceedings of the 27th ACM/IEEE
design automation conference, pp. 40-45. ACM, 1991.Install
-------It is required to have Julia installed.
This package is available on the Julia General Registries.
```bash
$ julia -e 'using Pkg; Pkg.add("BinaryDecisionDiagrams")'
```Alternatively, you may add this repository manualy and receive nightly updates.
```bash
$ julia -e 'using Pkg; Pkg.add("https://github.com/RenatoGeh/BDD.jl")'
```Testing
-------```bash
$ julia -e 'using Pkg; Pkg.test("BinaryDecisionDiagrams")'
```Usage
-----You create BDDs from constants and variables by composing boolean
functions with logical operations AND (∧), OR (∨), XOR (⊻) and
negation (¬).See `test/runtests.jl` for a comprehensive collection of examples on each feature. It is highly
recommended you check the [docs](https://renatogeh.github.io/BDD.jl/stable), since the snippet
below does not cover all features.```julia
using BinaryDecisionDiagramsprintln("== True ==")
println(⊤)
println("== False ==")
println(⊥)x1 = variable(1)
x2 = variable(2)
x3 = variable(3)
println("=== x1 ===")
println(x1)println("=== ¬x1 ===")
println(¬x1)println("=== x1 ∧ x2 ===")
println(x1 ∧ x2)println("=== x1 ∨ x2 ===")
println(x1 ∨ x2)println("=== x1 ⊻ x2 ===")
println(x1 ⊻ x2)bdd1 = ¬x1 ∨ (x2 ∧ ¬x3)
if bdd1 ∧ ⊤ == bdd1
println("True is the neutral element for AND operation")
endbdd2 = ¬(¬x2) ∧ ¬(x1 ∨ x3)
if bdd2 ∨ zero == bdd2
println("False is the neutral element for OR operation")
endbdd3 = x1 ∧ ¬x1
if is_⊥(bdd3)
println("You can check contradiction with is_⊥")
endbdd4 = x1 ∨ ¬x1
if is_⊤(bdd4):
println("You can check tautology with is_⊤")
endbdd5 = ¬(x1 ∨ ¬(x2 ∧ ¬x3))
if is_⊥(bdd5 ⊻ bdd5)
println("You can check equivalence with XOR")
endif (x1 ∧ x2) == (x2 ∧ x1)
println("Commutative law works for boolean functions")
endif x1 ∧ (x2 ∧ x3) == (x1 ∧ x2) ∧ x3
println("Associative law works for boolean functions")
endif (x1 ∧ (x2 ∨ x3)) == ((x1 ∧ x2) ∨ (x1 ∧ x3))
println("Distributivity law works: AND distributes over OR")
endif (x1 ∨ (x2 ∧ x3)) == ((x1 ∨ x2) ∧ (x1 ∨ x3))
println("Distributivity law works: OR distributes over AND")
endbdd6 = ¬(x1 ∧ ¬(¬x2 ∨ x3))
valuation1 = Dict{Int, Bool}(1 => true, 2 => true, 3 => false)if is_⊥(bdd6|valuation1)
println("You can evaluate the function either with | or function restrict!")
endvaluation2 = Dict{Int, Bool}(1 => True)
if bdd6|valuation2 == ¬x2 ∨ x3:
println("You can also partially evaluate the function with restrict")
end
```LICENSE
-------See https://github.com/thiagopbueno/pyddlib/ for the original license.
A copy is added to this repository.