Views
No views yet
┌─────────────────────────┐
│ 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 │
└─────────────────────────┘1# Boolean algebra → finite-field arithmetic:
2# NOT x = 1 - x
3# x OR y = x + y - x*y
4# x AND y = x * y
5
6# Clause satisfaction (differentiable):
7# C_sat = 1 - ∏(1 - literal_i)
8
9# N candidate assignments optimized in parallel via Adam:
10logits = torch.randn(N, n_vars, requires_grad=True)
11optimizer = torch.optim.Adam([logits], lr=0.5)
12
13# One matmul evaluates ALL candidates on ALL clauses simultaneously1pip install torch numpy python-sat
2git clone https://huggingface.co/ashen-navigator/neurosat-solver
3cd neurosat-solver
4pip install -e .1from neurosat_solver import HybridSATSolver, generate_random_3sat
2
3# Generate a random 3-SAT instance
4formula = generate_random_3sat(n_vars=100, clause_ratio=4.26)
5
6# Solve with the hybrid neural solver
7solver = HybridSATSolver()
8result = solver.solve(formula, timeout=60.0)
9
10print(f"Satisfiable: {result['satisfiable']}")
11if result['satisfiable']:
12 print(f"Verified: {formula.verify_assignment(result['assignment'])}")1from neurosat_solver import HybridSATSolver
2
3dimacs = """
4p cnf 3 3
51 -2 3 0
6-1 2 -3 0
71 2 3 0
8"""
9
10solver = HybridSATSolver()
11result = solver.solve(dimacs)1from neurosat_solver import DifferentiableSATSolver, SolverConfig
2
3# GPU solver only (no CDCL fallback)
4config = SolverConfig(
5 n_candidates=1024, # Parallel candidates
6 learning_rate=0.5, # Aggressive learning rate
7 max_iterations=2000, # Max optimization steps
8 n_restarts=5, # Random restart rounds
9)
10gpu_solver = DifferentiableSATSolver(config)
11result = gpu_solver.solve(formula, timeout=30.0)1from neurosat_solver.train_gnn import train_gnn_guide
2
3guide = train_gnn_guide(
4 n_instances=5000,
5 min_vars=10,
6 max_vars=100,
7 hidden_dim=128,
8 n_mp_layers=6,
9 n_epochs_pretrain=40,
10 n_epochs_finetune=20,
11 save_path="gnn_guide.pt",
12)
13
14# Use with hybrid solver
15solver = HybridSATSolver(gnn_guide=guide)
16result = solver.solve(formula)| 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 |
| 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 |
1config = SolverConfig(
2 device="cuda", # Use GPU
3 n_candidates=4096, # More candidates = more parallelism
4 dtype="float16", # Half precision for faster matmul
5)
6solver = DifferentiableSATSolver(config)