cadical - Man Page

Simplified SAT solver

Description

usage: cadical [ <option> ... ] [ <input> [ <proof> ] ]

where '<option>' is one of the following common options:

-h

print alternatively only a list of common options

--help

print this complete list of all options

--version

print version

-n

do not print witness (same as '--no-witness')

-v

increase verbosity (see also '--verbose' below)

-q

be quiet (same as '--quiet')

-t <sec>

set wall clock time limit

Or '<option>' is one of the less common options

-L<rounds>

run local search initially (default '0' rounds)

-O<level>

increase limits by '2^<level>' or '10^<level>'

-P<rounds>

initial preprocessing (default '0' rounds)

Note there is no separating space for the options above while the following options require a space after the option name:

-c <limit>

limit the number of conflicts (default unlimited)

-d <limit>

limit the number of decisions (default unlimited)

-o <output>

write simplified CNF in DIMACS format to file

-e <extend>

write reconstruction/extension stack to file

--force | -f

parsing broken DIMACS header and writing proofs

--strict

strict parsing (no white space in header)

-r <sol>

read solution in competition output format to check consistency of learned clauses during testing and debugging

-w <sol>

write result including a potential witness solution in competition format to the given file

--colors

force colored output

--no-colors

disable colored output to terminal

--no-witness

do not print witness (see also '-n' above)

--build

print build configuration

--copyright

print copyright information

There are pre-defined configurations of advanced internal options:

--default

set default advanced internal options

--plain

disable all internal preprocessing options

--sat

set internal options to target satisfiable instances

--unsat

set internal options to target unsatisfiable instances

Or '<option>' is one of the following advanced internal options:

--arena=bool

allocate clauses in arena [true]

--arenacompact=bool

keep clauses compact [true]

--arenasort=bool

sort clauses in arena [true]

--arenatype=1..3

1=clause, 2=var, 3=queue [3]

--backbone=0..2

binary clause backbone [1]

--backboneeffort=0..1e5

binary effort in per mile [20]

--backbonemaxrounds=0..1e5 backbone rounds limit [1e3]

--backbonerounds=0..1e5

backbone rounds limit [100]

--backbonethresh=0..1e9

delay if ticks smaller thresh*clauses [5]

--binary=bool

use binary proof format [true]

--block=bool

blocked clause elimination [false]

--blockmaxclslim=1..2e9

maximum clause size [1e5]

--blockminclslim=2..2e9

minimum clause size [2]

--blockocclim=1..2e9

occurrence limit [1e2]

--bump=bool

bump variables [true]

--bumpreason=bool

bump reason literals too [true]

--bumpreasondepth=1..3

bump reason depth [1]

--bumpreasonlimit=1..2e9

bump reason limit [10]

--bumpreasonrate=1..2e9

bump reason decision rate [100]

--check=bool

enable internal checking [false]

--checkassumptions=bool

check assumptions satisfied [true]

--checkconstraint=bool

check constraint satisfied [true]

--checkfailed=bool

check failed literals form core [true]

--checkfrozen=bool

check all frozen semantics [false]

--checkproof=0..3

1=drat, 2=lrat, 3=both [3]

--checkwitness=bool

check witness internally [true]

--chrono=0..2

chronological backtracking [1]

--chronoalways=bool

force always chronological [false]

--chronolevelim=0..2e9

chronological level limit [1e2]

--chronoreusetrail=bool

reuse trail chronologically [true]

--compact=bool

compact internal variables [true]

--compactint=1..2e9

compacting interval [2e3]

--compactlim=0..1e3

inactive limit per mille [1e2]

--compactmin=1..2e9

minimum inactive limit [1e2]

--condition=bool

globally blocked clause elim [false]

--conditioneffort=1..1e5

relative efficiency per mille [100]

--conditionint=1..2e9

initial conflict interval [1e4]

--conditionmaxeff=0..2e9

maximum condition efficiency [1e7]

--conditionmaxrat=1..2e9

maximum clause variable ratio [100]

--conditionmineff=0..2e9

minimum condition efficiency [0]

--congruence=bool

congruence closure [true]

--congruenceand=bool

extract AND gates [true]

--congruenceandarity=2..5e7 AND gate arity limit [1e6]

--congruencebinaries=bool

extract binary and strengthen ternary clauses [true]

--congruenceite=bool

extract ITE gates [true]

--congruencexor=bool

extract XOR gates [true]

--congruencexorarity=2..31 XOR gate arity limit [4]

--congruencexorcounts=1..5e6 XOR gate round [1]

--cover=bool

covered clause elimination [false]

--covereffort=1..1e5

relative efficiency per mille [4]

--covermaxclslim=1..2e9

maximum clause size [1e5]

--covermaxeff=0..2e9

maximum cover efficiency [1e8]

--coverminclslim=2..2e9

minimum clause size [2]

--covermineff=0..2e9

minimum cover efficiency [0]

--decompose=bool

decompose BIG in SCCs and ELS [true]

--decomposerounds=1..16

number of decompose rounds [2]

--deduplicate=bool

remove duplicated binaries [true]

--eagersubsume=bool

subsume recently learned [true]

--eagersubsumelim=1..1e3

limit on subsumed candidates [20]

--elim=bool

bounded variable elimination [true]

--elimands=bool

find AND gates [true]

--elimbackward=bool

eager backward subsumption [true]

--elimboundmax=-1..2e6

maximum elimination bound [16]

--elimboundmin=-1..2e6

minimum elimination bound [0]

--elimclslim=2..2e9

resolvent size limit [1e2]

--elimdef=bool

mine definitions with kitten [false]

--elimdefcores=1..100

number of unsat cores [1]

--elimdefticks=0..2e9

kitten ticks limit [2e5]

--elimeffort=1..1e5

relative efficiency per mille [1e3]

--elimequivs=bool

find equivalence gates [true]

--elimint=1..2e9

elimination interval [2e3]

--elimites=bool

find if-then-else gates [true]

--elimlimited=bool

limit resolutions [true]

--elimmaxeff=0..2e9

maximum elimination efficiency [2e9]

--elimmineff=0..2e9

minimum elimination efficiency [1e7]

--elimocclim=0..2e9

occurrence limit [1e2]

--elimprod=0..1e4

elim score product weight [1]

--elimrounds=1..512

usual number of rounds [2]

--elimsubst=bool

elimination by substitution [true]

--elimsum=0..1e4

elimination score sum weight [1]

--elimxorlim=2..27

maximum XOR size [5]

--elimxors=bool

find XOR gates [true]

--emadecisions=1..2e9

window decision rate [1e5]

--emagluefast=1..2e9

window fast glue [33]

--emaglueslow=1..2e9

window slow glue [1e5]

--emajump=1..2e9

window back-jump level [1e5]

--emalevel=1..2e9

window back-track level [1e5]

--emasize=1..2e9

window learned clause size [1e5]

--ematrailfast=1..2e9

window fast trail [1e2]

--ematrailslow=1..2e9

window slow trail [1e5]

--exteagerreasons=bool

eagerly ask for all reasons (0: only when needed) [true]

--exteagerrecalc=bool

after eagerly asking for reasons recalculate all levels (0: trust the external tool) [true]

--externallrat=bool

external lrat [false]

--factor=bool

bounded variable addition [false]

--factorcandrounds=0..2e9

candidates reduction rounds [2]

--factordelay=0..12

delay bounded variable addition between eliminations [4]

--factoreffort=0..1e6

relative effort per mille [50]

--factoriniticks=1..1e6

initial effort in millions [300]

--factorsize=2..2e9

clause size limit [5]

--factorthresh=0..100

delay if ticks smaller thresh*clauses [7]

--factorunbump=bool

extension variable with lowest importance [1: as in kissat] [true]

--fastelim=bool

fast BVE during preprocessing [true]

--fastelimbound=1..1e3

fast BVE bound during preprocessing [8]

--fastelimclslim=2..2e9

fast BVE resolvent size limit [1e2]

--fastelimocclim=1..2e9

fast BVE occurence limit during preprocessing [100]

--fastelimrounds=1..512

number of fastelim rounds [4]

--flush=bool

flush redundant clauses [false]

--flushfactor=1..1e3

interval increase [3]

--flushint=1..2e9

initial limit [1e5]

--forcephase=bool

always use initial phase [false]

--frat=0..2

1=frat(lrat), 2=frat(drat) [0]

--idrup=bool

incremental proof format [false]

--ilb=0..2

ILB (incremental lazy backtrack) (0: no, 1: assumptions only, 2: everything) [0]

--incdecay=0..4

decay clauses when doing incremental clauses [1]

--incdecayint=1..2e9

decay interval when doing incremental clauses [1e6]

--inprobeint=1..2e9

inprobing interval [100]

--inprobing=bool

enable probe inprocessing [true]

--inprocessing=bool

enable general inprocessing [true]

--instantiate=bool

variable instantiation [false]

--instantiateclslim=2..2e9 minimum clause size [3]

--instantiateocclim=1..2e9 maximum occurrence limit [1]

--instantiateonce=bool

instantiate each clause once [true]

--lidrup=bool

linear incremental proof format [false]

--lrat=bool

use LRAT proof format [false]

--lucky=bool

lucky phases [true]

--luckyassumptions=bool

lucky phases with assumptions [true]

--luckyearly=bool

lucky phases before preprocessing [true]

--luckylate=bool

lucky phases after preprocessing [true]

--minimize=bool

minimize learned clauses [true]

--minimizedepth=0..1e3

minimization depth [1e3]

--minimizeticks=bool

increment ticks in minimization [true]

--otfs=bool

on-the-fly self subsumption [true]

--phase=bool

initial phase [true]

--preprocessinit=0..2e9

initial preprocessing base limit [2e6]

--preprocesslight=bool

lightweight preprocessing [true]

--probe=bool

failed literal probing [true]

--probeeffort=1..1e5

relative efficiency per mille [8]

--probehbr=bool

learn hyper binary clauses [true]

--probethresh=0..100

delay if ticks smaller thresh*clauses [0]

--profile=0..4

profiling level [2]

--quiet=bool

disable all messages [false]

--radixsortlim=0..2e9

radix sort limit [32]

--randec=bool

random decisions [false]

--randecfocused=bool

random decisions in focused mode [true]

--randecinit=2..2e9

inital random decision interval [1e3]

--randecint=0..2e9

random conflict length [500]

--randeclength=1..1e9

length random decisions phases [10]

--randecstable=bool

random decisions in stable mode [false]

--realtime=bool

real instead of process time [false]

--recomputetier=bool

recompute tiers [true]

--reduce=bool

reduce useless clauses [true]

--reduceinit=1..1e6

initial interval [300]

--reduceint=2..1e6

reduce interval [25]

--reduceopt=0..2

0=prct,1=sqrt,2=max [1]

--reducetarget=10..1e2

reduce fraction in percent [75]

--reducetier1glue=1..2e9

glue of kept learned clauses [2]

--reducetier2glue=1..2e9

glue of tier two clauses [6]

--reluctant=bool

stable reluctant doubling restarts [true]

--reluctantint=0..2e9

reluctant doubling period [1024]

--reluctantmax=0..2e9

maximum reluctant doubling period [1048576]

--rephase=0..2

enable resetting phase (0=no,1=always,2=stable-only) [1]

--rephaseint=1..2e9

rephase interval [1e3]

--report=bool

enable reporting [false]

--reportall=bool

report even if not successful [false]

--reportsolve=bool

use solving not process time [false]

--restart=bool

enable restarts [true]

--restartint=1..2e9

restart interval [2]

--restartmarginfocused=0..25 focused slow fast margin in percent [10]

--restartmarginstable=0..25 stable slow fast margin in percent [25]

--restartreusetrail=bool

enable trail reuse [true]

--restoreall=0..2

restore all clauses (2=really) [0]

--restoreflush=bool

remove satisfied clauses [false]

--reverse=bool

reverse variable ordering [false]

--score=bool

use EVSIDS scores [true]

--scorefactor=500..1e3

score factor per mille [950]

--seed=0..2e9

random seed [0]

--shrink=0..3

shrink conflict clause (1=binary-only,2=minimize-on-pulling,3=full) [3]

--shrinkreap=bool

use a reap for shrinking [true]

--shuffle=bool

shuffle variables [false]

--shufflequeue=bool

shuffle variable queue [true]

--shufflerandom=bool

not reverse but random [false]

--shufflescores=bool

shuffle variable scores [true]

--stabilize=bool

enable stabilizing phases [true]

--stabilizeinit=1..2e9

stabilizing interval [1e3]

--stabilizeonly=bool

only stabilizing phases [false]

--stats=bool

print all statistics at the end of the run [false]

--stubbornIOfocused=bool

force phases to I/O in focused mode every once in a while (requires rephase==2) [false]

--subsume=bool

enable clause subsumption [true]

--subsumebinlim=0..2e9

watch list length limit [1e4]

--subsumeclslim=0..2e9

clause length limit [1e2]

--subsumeeffort=1..1e5

relative efficiency per mille [1e3]

--subsumelimited=bool

limit subsumption checks [true]

--subsumemaxeff=0..2e9

maximum subsuming efficiency [1e8]

--subsumemineff=0..2e9

minimum subsuming efficiency [0]

--subsumeocclim=0..2e9

watch list length limit [1e2]

--subsumestr=bool

subsume strengthen [true]

--sweep=bool

enable SAT sweeping [true]

--sweepclauses=0..2e9

environment clauses [1024]

--sweepcomplete=bool

run SAT sweeping to completion [false]

--sweepcountbinary=bool

count binaries to environment [true]

--sweepdepth=0..2e9

environment depth [2]

--sweepeffort=0..1e4

relative effort in ticks per mille [1e2]

--sweepfliprounds=0..2e9

flipping rounds [1]

--sweepmaxclauses=2..2e9

maximum environment clauses [3e5]

--sweepmaxdepth=1..2e9

maximum environment depth [3]

--sweepmaxvars=2..2e9

maximum environment variables [8192]

--sweeprand=bool

randomize sweeping environment [false]

--sweepthresh=0..100

delay if ticks smaller thresh*clauses [5]

--sweepvars=0..2e9

environment variables [256]

--target=0..2

target phases (1=stable only) [1]

--terminateint=0..1e4

termination check interval [10]

--ternary=bool

hyper ternary resolution [true]

--ternaryeffort=1..1e5

relative efficiency per mille [8]

--ternarymaxadd=0..1e4

max clauses added in percent [1e3]

--ternaryocclim=1..2e9

ternary occurrence limit [1e2]

--ternaryrounds=1..16

maximum ternary rounds [2]

--ternarythresh=0..100

delay if ticks smaller thresh*clauses [6]

--tier1limit=0..100

limit of tier1 usage in percentage [50]

--tier1minglue=0..100

lowest tier1 limit [0]

--tier2limit=0..100

limit of tier2 usage in percentage [90]

--tier2minglue=0..100

lowest tier2 limit [0]

--transred=bool

transitive reduction of BIG [true]

--transredeffort=1..1e5

relative efficiency per mille [1e2]

--transredmaxeff=0..2e9

maximum efficiency [1e8]

--transredmineff=0..2e9

minimum efficiency [0]

--verbose=0..3

more verbose messages [0]

--veripb=0..4

odd=check-deletions, >2 drat [0]

--vivify=bool

vivification [true]

--vivifycalctier=bool

recalculate tier limits [false]

--vivifydemote=bool

demote irredundant or delete directly [false]

--vivifyeffort=0..1e5

overall efficiency per mille [50]

--vivifyflush=bool

flush subsumed before vivification rounds [true]

--vivifyinst=bool

instantiate last literal when vivify [true]

--vivifyirred=bool

vivification of irredundant clauses [true]

--vivifyirredeff=1..100

irredundant efficiency per mille [3]

--vivifyonce=0..2

vivify once: 1=red, 2=red+irr [0]

--vivifyretry=0..5

re-vivify clause if vivify was successful [0]

--vivifyschedmax=10..2e9

maximum schedule size [5e3]

--vivifythresh=0..100

delay if ticks smaller thresh*clauses [20]

--vivifytier1=bool

vivification tier1 [true]

--vivifytier1eff=0..100

relative tier1 effort [4]

--vivifytier2=bool

vivification tier2 [true]

--vivifytier2eff=1..100

relative tier2 effort [2]

--vivifytier3=bool

vivification tier3 [true]

--vivifytier3eff=1..100

relative tier3 effort [1]

--walk=bool

enable random walks [true]

--walkeffort=1..1e5

relative efficiency per mille [80]

--walkfullocc=bool

use Kissat's full occurrences instead of the single watched [false]

--walkmaxeff=0..2e9

maximum efficiency (in 1e3 ticks) [1e7]

--walkmineff=0..1e7

minimum efficiency [0]

--walknonstable=bool

walk in non-stabilizing phase [true]

--walkredundant=bool

walk redundant clauses too [false]

--warmup=bool

warmup before walk using propagation [true]

The internal options have their default value printed in brackets after their description.  They can also be used in the form '--<name>' which is equivalent to '--<name>=1' and in the form '--no-<name>' which is equivalent to '--<name>=0'.  One can also use 'true' instead of '1', 'false' instead of '0', as well as numbers with positive exponent such as '1e3' instead of '1000'.

Alternatively option values can also be specified in the header of the DIMACS file, e.g., 'c --elim=false', or through environment variables, such as 'CADICAL_ELIM=false'.  The embedded options in the DIMACS file have highest priority, followed by command line options and then values specified through environment variables.

The input is read from '<input>' assumed to be in DIMACS format. Incremental 'p inccnf' files are supported too with cubes at the end. If '<proof>' is given then a DRAT proof is written to that file.

If '<input>' is missing then the solver reads from '<stdin>', also if '-' is used as input path name '<input>'.  Similarly,

For incremental files each cube is solved in turn. The solver stops at the first satisfied cube if there is one and uses that one for the witness to print.  Conflict and decision limits are applied to each individual cube solving call while '-P', '-L' and '-t' remain global.  Only if all cubes were unsatisfiable the solver prints the standard unsatisfiable solution line ('s UNSATISFIABLE').

By default the proof is stored in the binary DRAT format unless the option '--no-binary' is specified or the proof is written to '<stdout>' and '<stdout>' is connected to a terminal.

The input is assumed to be compressed if it is given explicitly and has a '.gz', '.bz2', '.xz' or '.7z' suffix.  The same applies to the output file.  In order to use compression and decompression the corresponding utilities 'gzip', 'bzip', 'xz', and '7z' (depending on the format) are required and need to be installed on the system. The solver checks file type signatures though and falls back to non-compressed file reading if the signature does not match.

Info

December 2025 cadical 2.2.0