A high-performance Julia package for solving Boolean satisfiability problems using tensor network contraction and optimal branching strategies.
- Tensor Network Representation: Efficiently represents Boolean satisfiability problems as tensor networks
- Optimal Branching: Uses advanced branching strategies to minimize search space
- Multiple Problem Types: Supports CNF, circuit, and factoring problems
- High Performance: Optimized for speed with efficient propagation and contraction algorithms
- Flexible Interface: Easy-to-use API for various constraint satisfaction problems
using Pkg
Pkg.add("BooleanInference")using BooleanInference
using GenericTensorNetworks: ∧, ∨, ¬
# Define a CNF formula
@bools a b c d e f g
cnf = ∧(∨(a, b, ¬d, ¬e), ∨(¬a, d, e, ¬f), ∨(f, g), ∨(¬b, c), ∨(¬a))
# Solve and get assignments
sat = Satisfiability(cnf; use_constraints=true)
satisfiable, assignments, depth = solve_sat_with_assignments(sat)
println("Satisfiable: ", satisfiable)
println("Assignments: ", assignments)# Factor a semiprime number
a, b = solve_factoring(5, 5, 31*29)
println("Factors: $a × $b = $(a*b)")# Solve circuit satisfiability
circuit = @circuit begin
c = x ∧ y
end
push!(circuit.exprs, Assignment([:c], BooleanExpr(true)))
tnproblem = setup_from_circuit(circuit)
result, depth = solve(tnproblem, BranchingStrategy(), NoReducer())TNProblem: Main problem representationTNStatic: Static problem structureDomainMask: Variable domain representation
TNContractionSolver: Tensor network contraction-based solverLeastOccurrenceSelector: Variable selection strategyNumUnfixedVars: Measurement strategy
solve(): Main solving functionsetup_from_cnf(): Setup from CNF formulassetup_from_circuit(): Setup from circuit descriptionssolve_factoring(): Solve integer factoring problems
using OptimalBranchingCore: BranchingStrategy
# Configure custom solver
bsconfig = BranchingStrategy(
table_solver=TNContractionSolver(),
selector=LeastOccurrenceSelector(2, 10),
measure=NumUnfixedVars()
)
# Solve with custom configuration
result, depth = solve(problem, bsconfig, NoReducer())The package includes comprehensive benchmarking tools:
using BooleanInferenceBenchmarks
# Compare different solvers
configs = [(10,10), (12,12), (14,14)]
results = run_solver_comparison(FactoringProblem, configs)
print_solver_comparison_summary(results)