- Most important heuristic, as it can steer the entire solver ## Types - Static heuristics (pre-computed once) - Ex.: Natural Order - Dynamic heuristics - Ex.: Dynamic Largest Individual Sum (DLIS) (chose most common variable + phase) - Expensive, needs (full) scanning of (all) clauses - Second order dynamic heuristics - Ex.: VSIDS, ESIDS - Less expensive, good measurement # Look-ahead - Instead of scanning static clause counts (DLIS) or scores (VSIDS), actually try each candidate variable - For a candidate $x$: tentatively assign $x$ and separately $\overline x$, run full [propagation (BCP)](Solvers#Boolean Constraint Propagation (BCP)) for each, and measure the effect (# clauses reduced/simplified, # new units) - If one polarity's propagation conflicts -> failed literal -> the other polarity is forced (same primitive as [Variable instantiation](Preprocessing_Inprocessing#Variable instantiation)/[Vivification](Preprocessing_Inprocessing#Vivification / Distillation)) - Pick the variable (and often the polarity) that maximizes the combined look-ahead effect of both branches (e.g. product/sum of the two reduction counts, as in march/kcnfs) - Very informative but expensive (full propagation per candidate, both polarities) -> basis of dedicated look-ahead solvers, rather than per-decision use inside CDCL # Cut heuristic - Find a variables that 'cuts' the CNF into parts without overlapping variables - Solve parts separately (for all assignments of the cut) - Divide & Conquer approach # Horn Form ## Definition - A clause is positive if it contains at least 1 positive literal, otherwise it's negative - A Horn clause is a clause with at most one positive literal - A CNF is in Horn Form if all clauses are Horn clauses ## Facts - If all clauses in a Horn Form CNF are positive there is a minimal satisfying assignment - This assignment can be found using BCP - The minimal satisfying assignment of the positive part of a Horn Form CNF IFF it is SAT - I.e. if not it is UNSAT ## Usefulness/ Heuristic - DP can transform a non Horn from CNF into one by **choosing variables** from clauses with more than one positive literal (non horn clauses) and doing resolution on them. - [BCP](SAT_in_general#Special Case Unit Resolution) runs through a HORN CNF in polynomial time # Variable State Independent Decaying Sum (VSIDS) - Count occurrence of variables in conflict clauses - Priority Queue is updated, and VSIDS is taken from it - Decay/ re-score values after i conflicts (Chaff: $f = 1/2, i = 256$) - multiply all by some $f < 1$ - Emphasizes literals contributing to recent conflicts #### Additional idea: - Use VSIDS only as secondary heuristic, primarily try to satisfy must recently added clauses ## Normalized VSIDS (NVSIDS) - Keep the score between $[0, 1]$ - Pick $f = 0.95$ and calculate score like this: `new_score = old_score * f + in_conflict? (1 - f) : 0` - You can defer the re-scoring to later, i.e. only update variables in conflict and then re-score all later on to save time - Can also Bump resolved literals on conflict level, not just learned lits (good for heuristic?!) ## Exponential VSIDS (EVSIDS) - Bump by exponential value $g^i = \frac{1}{f}^i$ - `new_score = old_score + (1/f)^i` - EVSIDS is just NVSIDS but without scaling $$\frac{f^{-n}}{1-f} \cdot \text{NVSIDS}$$ # Decision heuristic Summary table - Old score: s - decay $0 < f < 1$ | STRATEGY | Bumped | not-bumped | | | -------- | ------------------- | ----------- | -------------------------------------- | | STATIC | $s$ | $s$ | | | INC | $s + 1$ | $s$ | | | SUM | $s + i$ | $s$ | | | VSIDS | $s / 2 + 1$ | $s / 2$ | Only half every so often (every 256) | | NVSIDS | $f \cdot s + (1-f)$ | $f \cdot s$ | | | EVSIDS | $s + f^{-i}$ | $s$ | | | AVG | $(s+i)/2$ | $s$ | average conflict-index decision scheme | | VMTF | $i$ | $s$ | Variable Move to Front | - Turns out AVG (moving average) and EVSIDS are very good ## Variable Move to Front - Cheap to implement, aggressive