bddminisat-sys
FFI bindings to bdd_minisat_all, a BDD-based AllSAT solver.
Overview
bdd_minisat_all is a SAT solver that enumerates all satisfying assignments and compiles them into an Ordered Binary Decision Diagram (OBDD). It is built on top of MiniSat by Niklas Sorensson and developed by Takahisa Toda.
Features
- AllSAT solving: enumerate all satisfying assignments
- OBDD compilation: solutions are represented as an OBDD
- Efficient caching mechanisms (cutset/separator caching)
- Non-blocking and blocking modes
Usage
Add this to your Cargo.toml:
[dependencies]
bddminisat-sys = "0.1"
Basic Example
use bddminisat_sys::*;
fn main() {
unsafe {
// Create a new solver
let solver = solver_new();
// Set number of variables
solver_setnvars(solver, 3);
// Add clause: (x0 OR x1)
let mut clause = [toLit(0), toLit(1)];
solver_addclause(solver, clause.as_mut_ptr(), clause.as_mut_ptr().add(2));
// Add clause: (NOT x0 OR x2)
let mut clause2 = [lit_neg(toLit(0)), toLit(2)];
solver_addclause(solver, clause2.as_mut_ptr(), clause2.as_mut_ptr().add(2));
// Solve (enumerates all solutions and builds OBDD)
let sat = solver_solve(solver, std::ptr::null_mut(), std::ptr::null_mut());
if sat != 0 {
// Get the OBDD root
let root = (*solver).root;
// Count solutions
let num_solutions = obdd_nsols(solver_nvars(solver), root);
println!("Number of solutions: {}", num_solutions);
}
// Clean up
solver_delete(solver);
}
}
API Reference
Constants
| Name |
Type |
Description |
VAR_UNDEF |
c_int |
Undefined variable (-1) |
LIT_UNDEF |
lit |
Undefined literal (-2) |
L_UNDEF |
lbool |
Undefined boolean (0) |
L_TRUE |
lbool |
True (1) |
L_FALSE |
lbool |
False (-1) |
Literal Operations (Rust inline functions)
| Function |
Signature |
Description |
toLit |
(v: c_int) -> lit |
Convert variable to literal |
lit_neg |
(l: lit) -> lit |
Negate a literal |
lit_var |
(l: lit) -> c_int |
Get variable from literal |
lit_sign |
(l: lit) -> c_int |
Get sign (0=positive, 1=negative) |
Solver API (FFI)
| Function |
Signature |
Description |
solver_new |
() -> *mut solver |
Create a new solver |
solver_delete |
(s: *mut solver) |
Delete a solver |
solver_setnvars |
(s: *mut solver, n: c_int) |
Set number of variables |
solver_nvars |
(s: *mut solver) -> c_int |
Get number of variables |
solver_nclauses |
(s: *mut solver) -> c_int |
Get number of clauses |
solver_nconflicts |
(s: *mut solver) -> c_int |
Get number of conflicts |
solver_addclause |
(s, begin: *mut lit, end: *mut lit) -> c_int |
Add a clause |
solver_simplify |
(s: *mut solver) -> c_int |
Simplify clause database |
solver_solve |
(s, begin: *mut lit, end: *mut lit) -> c_int |
Solve (AllSAT + OBDD) |
totalup_stats |
(s: *mut solver) |
Finalize statistics |
OBDD API (FFI)
| Function |
Signature |
Description |
obdd_node |
(v: c_int, lo: *mut obdd_t, hi: *mut obdd_t) -> *mut obdd_t |
Create OBDD node |
obdd_complete |
(p: *mut obdd_t) -> usize |
Complete OBDD structure |
obdd_size |
(p: *mut obdd_t) -> usize |
Get node count |
obdd_nsols |
(n: c_int, p: *mut obdd_t) -> isize |
Count solutions |
obdd_decompose |
(out: *mut c_void, n: c_int, p: *mut obdd_t) -> usize |
Output all solutions |
obdd_to_dot |
(n: c_int, p: *mut obdd_t, out: *mut c_void) -> c_int |
Output in DOT format |
obdd_nnodes |
() -> usize |
Get total nodes created |
obdd_delete_all |
(p: *mut obdd_t) |
Delete OBDD |
OBDD Helper Functions (Rust inline)
| Function |
Signature |
Description |
obdd_label |
(p: *mut obdd_t) -> c_int |
Get node label (variable) |
obdd_const |
(p: *mut obdd_t) -> bool |
Check if terminal node |
Global Variables
| Variable |
Type |
Description |
eflag |
c_int |
Interrupt flag (for SIGINT) |
top_node |
*mut obdd_t |
True terminal node |
bot_node |
*mut obdd_t |
False terminal node |
Structures
| Structure |
Description |
solver |
Solver instance (all fields public) |
obdd_t |
OBDD node (v, lo, hi, aux, nx) |
stats |
Statistics information |
Optional Features
GMP Support
For counting very large numbers of solutions, enable the gmp feature:
[dependencies]
bddminisat-sys = { version = "0.1", features = ["gmp"] }
This requires the GMP library to be installed on your system.
License
This project is licensed under the MIT License - see the LICENSE file for details.
- MiniSat: Copyright (c) 2005, Niklas Sorensson
- bdd_minisat_all: Copyright (c) 2015, Takahisa Toda
References