Dissolve (Distributed SAT)
aria.bool.dissolve is a practical implementation of the Dissolve
distributed SAT solving framework. It uses asynchronous dilemma-rule
splits and clause sharing to parallelise SAT solving across workers.
Directory structure
aria/bool/dissolve/
├── dissolve.py # Main Dissolve solver class
├── engine.py # Worker engine logic
├── models.py # DissolveConfig and DissolveResult data classes
├── scheduler.py # Work distribution and scheduling
└── ubtree.py # UBTree-based clause store for subsumption checks
Key classes
Dissolve– top-level solver; callsolve(cnf)to runDissolveConfig– configuration dataclass controlling solver behaviour:k_split_vars– number of variables used in dilemma splitsbudget_strategy–"constant"or"luby"sequencedistribution_strategy–"dilemma"or"portfolio"clause_sharing– enable / disable cross-worker clause exchange
DissolveResult– result container with satisfiability status, model, and runtime
Algorithm overview
Split selection – pick
kvariables and create dilemma-rule sub-problems that partition the search space.Worker engines – each worker runs a PySAT-backed CDCL solver on its sub-problem with a configurable budget (constant or Luby).
Clause sharing – learned clauses are shared across workers via a UBTree-based bucket store that supports subsumption checking.
Vote aggregation – variable-picking heuristics aggregate votes from multiple workers to guide branching decisions.
Programmatic usage
from aria.bool.dissolve import Dissolve, DissolveConfig
cfg = DissolveConfig(
k_split_vars=5,
budget_strategy="luby",
distribution_strategy="dilemma",
)
solver = Dissolve(cfg)
result = solver.solve(cnf_clauses)
if result.is_sat:
print("Model:", result.model)