bddminisat-sys

Crates.iobddminisat-sys
lib.rsbddminisat-sys
version0.1.0
created_at2025-12-18 08:12:37.591181+00
updated_at2025-12-18 08:12:37.591181+00
descriptionFFI bindings to bdd_minisat_all, a BDD-based AllSAT solver
homepage
repository
max_upload_size
id1991940
size211,256
Takehide Soh (TakehideSoh)

documentation

README

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

Commit count: 0

cargo fmt