GaloisSAT: Differentiable Boolean Satisfiability Solving via Finite Field Algebra
Paper β’ 2603.28796 β’ Published
YAML Metadata Warning:empty or missing yaml metadata in repo card
Check out the documentation for more information.
A fast, GPU-accelerated SAT solver guided by neural networks, combining three paradigms:
βββββββββββββββββββββββββββ
β Input: CNF Formula β
β (DIMACS format) β
ββββββββββββ¬βββββββββββββββ
β
ββββββββββββΌβββββββββββββββ
β Phase 1: GNN Guidance β
β (if model available) β
β β’ Variable phases β
β β’ Activity scores β
β β’ ~1-2s inference β
ββββββββββββ¬βββββββββββββββ
β
ββββββββββββΌβββββββββββββββ
β Phase 2: GPU Solver β
β β’ N parallel candidates β
β β’ Adam + finite-field β
β β’ Sparse matmul on GPU β
β β’ Extract partial soln β
ββββββββββββ¬βββββββββββββββ
β
ββββββββββββΌβββββββββββββββ
β Phase 3: CDCL Solver β
β β’ CaDiCaL backend β
β β’ Warm-started with β
β GPU partial + GNN β
β phase predictions β
β β’ Complete & correct β
ββββββββββββ¬βββββββββββββββ
β
ββββββββββββΌβββββββββββββββ
β Output: SAT/UNSAT β
β + satisfying assignment β
βββββββββββββββββββββββββββ
Based on GaloisSAT (8.4Γ speedup over Kissat) and TurboSAT (27Γ over CaDiCaL):
# Boolean algebra β finite-field arithmetic:
# NOT x = 1 - x
# x OR y = x + y - x*y
# x AND y = x * y
# Clause satisfaction (differentiable):
# C_sat = 1 - β(1 - literal_i)
# N candidate assignments optimized in parallel via Adam:
logits = torch.randn(N, n_vars, requires_grad=True)
optimizer = torch.optim.Adam([logits], lr=0.5)
# One matmul evaluates ALL candidates on ALL clauses simultaneously
pip install torch numpy python-sat
git clone https://huggingface.co/ashen-navigator/neurosat-solver
cd neurosat-solver
pip install -e .
from neurosat_solver import HybridSATSolver, generate_random_3sat
# Generate a random 3-SAT instance
formula = generate_random_3sat(n_vars=100, clause_ratio=4.26)
# Solve with the hybrid neural solver
solver = HybridSATSolver()
result = solver.solve(formula, timeout=60.0)
print(f"Satisfiable: {result['satisfiable']}")
if result['satisfiable']:
print(f"Verified: {formula.verify_assignment(result['assignment'])}")
from neurosat_solver import HybridSATSolver
dimacs = """
p cnf 3 3
1 -2 3 0
-1 2 -3 0
1 2 3 0
"""
solver = HybridSATSolver()
result = solver.solve(dimacs)
from neurosat_solver import DifferentiableSATSolver, SolverConfig
# GPU solver only (no CDCL fallback)
config = SolverConfig(
n_candidates=1024, # Parallel candidates
learning_rate=0.5, # Aggressive learning rate
max_iterations=2000, # Max optimization steps
n_restarts=5, # Random restart rounds
)
gpu_solver = DifferentiableSATSolver(config)
result = gpu_solver.solve(formula, timeout=30.0)
from neurosat_solver.train_gnn import train_gnn_guide
guide = train_gnn_guide(
n_instances=5000,
min_vars=10,
max_vars=100,
hidden_dim=128,
n_mp_layers=6,
n_epochs_pretrain=40,
n_epochs_finetune=20,
save_path="gnn_guide.pt",
)
# Use with hybrid solver
solver = HybridSATSolver(gnn_guide=guide)
result = solver.solve(formula)
On CPU (benchmarked on random 3-SAT instances):
| Size (vars) | Mean Time | Solved |
|---|---|---|
| 10 | 0.02s | 3/3 |
| 20 | 0.08s | 3/3 |
| 50 | 0.81s | 3/3 |
| 100 | 14.3s | 3/3 |
On GPU, the differentiable solver provides massive speedup via parallel candidate evaluation. The sparse clause-literal matmul scales efficiently to problems with millions of variables (see TurboSAT: 27Γ speedup on 1M+ variable problems).
| Component | File | Description |
|---|---|---|
CNFFormula |
cnf_parser.py |
CNF representation, DIMACS parser, generators |
DifferentiableSATSolver |
gpu_solver.py |
GPU differentiable optimization engine |
SATGraphNet |
gnn_guide.py |
GNN for variable phase/activity prediction |
CDCLSolver |
cdcl_solver.py |
CaDiCaL-backed CDCL with neural warm-start |
HybridSATSolver |
hybrid_solver.py |
Full pipeline combining all components |
The GNN operates on a bipartite variable-clause graph:
When a CUDA GPU is available, the differentiable solver automatically uses it:
config = SolverConfig(
device="cuda", # Use GPU
n_candidates=4096, # More candidates = more parallelism
dtype="float16", # Half precision for faster matmul
)
solver = DifferentiableSATSolver(config)
Key GPU optimizations:
Apache 2.0