splr 0.17.0

A modern CDCL SAT solver in Rust
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
## 0.17.0, 2023-01-30

- (Breaking change) `Certificate::try_from` returns `Ok` values even if a given vector
  contains empty clauses. All expressions corresponding to valid CNFs should be
  converted to `Certificate` successfully. On the other hand, `Solver::try_from` still
  returns `SolverError::EmptyClause`. (#191, #196, #197)
- Add a new feature 'reward_annealing' (#187)
- Fix misc wrong calculations on Luby series and stage-cycle-segment model (#194)
- Fix build errors without feature 'trial_saving' or 'rephase' (#202, #205)
- clause reduction uses revised parameters matching a Luby series based parameter shifting
  model (#195)
- add feature 'two_mode_reduction'

## 0.16.3, 2022-09-16

- Fix another bug on `add_var` and `add_assignment` (#183)
- Re-organize cnf module

## 0.16.2, 2022-09-07

- (Breaking change) methods to read a file take `std::path::Path` instead of `&str`
- Re-implement feature 'incremental_solver' correctly
- Define feature 'no_clause_elimination' instead of 'clause_elimination', which is activated
  by feature 'incremental_solver' automatically

## 0.15.0, 2022-05-15

- Add `solver::StageManager`, which defines stages, cycles, and segments based on Luby series.
  - At the end of each stage, solver runs the following:
    - clause reduction
    - trail-saving reconfiguration
  - At the end of each cycle, solver runs the following:
    - clause vivification
    - var re-phasing
  - At the end of each segment, solver runs the following:
    - clause subsumption and var elimination
    - var activity rescaling
    - restart threshold reconfiguration
  - drop `solver::restart::GeometricStabilizer` and `solver::restart::ProgressLuby`
- `Restarter` was renamed to `RestartManager` and stored in `State` as `State::restart`.
- Glucose-like restart blocking scheme was substituted with a simple dynamics model.
- Drop feature 'Luby_stabilization'. It became essential.
- Drop feature 'Luby_restart'.
- Drop feature 'strategy_adaptation'

## 0.14.0, 2021-11-01

- Rust 2021 edition
- `ConflictContext` uses `AssignReason`
- add feature 'suppress_reason_chain' that suppresses reason sequences consisting of binary clauses
- split `Flag` to `FlagClause` and `FlagVar` to reduce memory footprint
- select vivification targets based on LBD shrinking rate and they are protected from clause reduction
- introduce `BinaryLinkDB` and `BinaryLinkList`
  - Splr becomes deterministic (or monotonous) solver again
  - (ClauseDBIF) rename `bi_clause_map` to `binary_links`
  - remove 'hashed_watch_cache'
  - remove `reregister_watch_cache`
  - remove `restore_detached_watch_cache`
  - remove `WatchCacheHash`
- fix panic by clause vivification on UNSAT problems
- `Lit` uses `NonZeroU32` instead of `u32`.

## 0.13.0, 2021-10-11

- implement trail saving as an alternative of chrono-BT with following extensions:
  - reason refinement based on LBD values
  - heap operation optimization
- dump UNSAT certificate less frequently

## 0.12.0, 2021-09-25

- reduce memory footprint
- disable chrono-BT by default: it still generates wrong UNSAT certificates.
- revise LRB var rewarding
  - LRB tick is changed to the length from assignment to unassignment
- revise clause rewarding
  - clause activity is calculated based on its LBD and var activities
- dynamic control of restart interval

## 0.11.0, 2021-08-17

- clause reduction and Luby stabilization share the trigger condition.
- remove feature "clause_reduction"; this is essential.
- reorganize restart stabilization
- revise clause vivifier, removing non-essential tweaks
- add an experimental feature "adjust_restart_parameters"

## 0.10.0, 2021-07-10

### Fix critical bugs
- fix bugs on chronoBT implementation, which have affected Splr from version 0.3.1 to 0.7.0.
   - `AssignStack::q_head` had a wrong index after backtrack if chronoBT was used.
   - Non-chronoBT was broken if the number of the highest literal in conflicting clauses is one.
- fix a bug which has been rarely occurred by eliminator.
   - `AssignIF::propagate` skipped clause-level satisfiability checking,
     if its `blocker` held an eliminated var, which was never falsified.
   - `ClauseDB::strengthen_by_elimination` didn't turn `LEARNT` off
     when a clause became binary.

### Incompatible API changes from 0.7.0
By introducing new data types, Splr-0.10 checks the status after calling destructive
functions more rigidly.

- introduce a new data `RefClause` for clause-level state transition
- `AssignReason` has 4 states
- define assign::property
- append AssignIF::dump_cnf
- define cdb::property
- ClauseDB exports reference iterators on watch_caches instead of mutable references to them
- ClauseDB exports new transform functions that encapsulate internal state transitions
- ClauseDB and Clause export only immutable references to literals in clauses.
- ClauseDB exports a new method set on a new certificate saver.
- append ClauseDB::strengthen_by_vivification
- remove ClauseDB::count
- remove ClauseDB::countf
- rename ClauseDB::detach to ClauseDB::remove_clause
- remove ClauseDB::garbage_collect
- rename ClauseDB::minimize_with_biclauses to minimize_with_bi_clauses
- remove ClauseDB::new_clause_sandbox
- remove ClauseDB::registered_biclause
- rename ClauseDB::strengthen to ClauseDB::strengthen_by_elimination
- remove ClauseDB::touch_var
- remove EliminateIF::add_cid_occur
- remove EliminateIF::remove_cid_occur
- remove EliminateIF::stop
- screen Eliminator's fields
- define processor::property
- define restart::property
- append SatSolverIF::save_certification
- append SatSolverIF::dump_cnf

### other changes

- ClauseId uses NonZeroU32 instead of u32.
- define feature 'trace_equivalency' for debugging
- define (but incomplete) feature 'support_user_assumption'
- activate feature 'clause_vivification' by default
- activate feature 'rephase' by default, which selects the best phases and its variants
- delete features 'var-boosting' and 'best_phases_reuse'
- rename feature 'ema_calibration' to 'EMA_calibration'
- remove comment lines from UNSAT certification files, which default name is changed to 'proof.drat'.
- var reward decay rate has a static value
- dump all stats data into answer files
- slim down */mod.rs
- all vars have a non-zero initial activity

## 0.7.0, 2021-03-14

- answer filenames start with "ans_" instead of ".ans_" by default.
- reorganize trait
  - replace {Export, ExportBox} with {PropertyDereference, PropertyReference}
  - remove: ClauseManipulationIF, EliminatorStatIF
  - export: Ema, Ema2, EmaIF, PropertyDereference, PropertyReference
  - make private: assign::VarOrderIF, processor::VarOrderIF
- reorganize features:
  - add:
    - best_phases_tracking
    - best_phases_reuse
    - clause_elimination
    - clause_reduction
    - clause_vivification
    - LR_rewarding
    - Luby_stabilization
    - reason_side_rewarding
    - var_staging
  - drop:
    - explore_timestamp
    - extra_var_reward
    - luby_blocking
    - moving_var_reward_rate (switching to stage-based reward decay increment)
    - progress_ACC
    - progress_MLD
    - pure_stabilization
  - rename feature use_luby to Luby_restart
- clause simplifier and clause vivifier are called at the ends of stages
- Learning Rate based var rewarding uses a non-linear weight function.
- Since Luby stabilization has long cycles, cycle-based tasks were organized. "Stage" is defined based on Luby-stabilization level. Updated terminology:
   - _Luby stabilization_ is a scheme that defines duration of stabilization modes based on Luby series.
   - Luby stabilization stage, or _stage_ is a span that shares a Luby value.
   - _cycle_ is a span between two highest values in Luby series.
   - _var boosting_ is to promote specific vars during a stage.
   - _boosted vars_ or _staged vars_ are the vars promoted by var boosting.
   - _rephrase_ is to promote specific literals during a stage.

## 0.6.3, 2021-02-12

- `Solver` and other structs implement `Clone`
- `VarRewardIF` was merged into `ActivityIF`. `ClauseDB` implements it.
- Learning-rate-based var rewarding uses the number of conflicts instead of the number of BCPs, which was not intended.
- switch to a one-restarting-after-blocking-N-restarts stabilizer
- switch to stabilization-mode-driven clause reduction, vivification, and simplification
- disable re-phasing and vivification by default
- recycle `Watch` data
- handle '--no-color' and '--quiet' correctly
- add command-line option: '--journal'

## 0.6.2, 2021-01-20

- update LBD correctly
- check CNF header correctly
- add command line option: --rse

## 0.6.1, 2021-01-16

- fix compilation errors on configurations with feature 'incremental_solver'
- fix a typo in README.md

## 0.6.0, 2021-01-16

- reorganize with redefined terminology
   - _stabilizing_ to stop restart periodically (extension of static restart blocking)
   - _staging_ to restrict search space by adding extra var activity
   - _rephasing_ to reuse a good assignment set (so it means 'rephasing to good phases').
- delete dependencies on 'libc' and 'structopt'
- make Splr deterministic or *monotonous*, by removing timer based decision makers. Monotonous means that if a solver solves a problem within T timeout, it solves the problem within any timeout longer than T.
- Solver::restart provides both of `restart` and `stabilize`
- fix a bug in chronoBT, that occurred if a conflicting clause has just a single literal at the conflicting level.
- revise command line option parser to handle the last option better
- stabilization span and restart blocking levels are controlled with Luby sequence
- add an extra reward to vars involved in best phase
- make the learning rate of var rewarding constant
- change the definition of restart blocker and its default threshold
- add or modify command line options: --srd, --srv, --vbd, --vbr
- change the definitions or the default values: --rat, --rlt
- delete command line options: --rct, --rms, --rmt, --vri, --vrm, --vro

#### Verification

- all the certifications of [UUF250]https://github.com/shnarazk/SAT-bench/tree/master/3-SAT/UUF250 were correct and verified with [Grad]https://www21.in.tum.de/~lammich/grat/.
- [SAT Race 2019]http://sat-race-2019.ciirc.cvut.cz, [Benchmarks]http://satcompetition.org/sr2019benchmarks.zip -- splr-0.6.0 RC() solved with a 300 sec (soft) timeout:
  - 45 (20201226), 42 (eab832c), and 38 (0.6.0) satisfiable problems: all the solutions were correct.
  - 6 (20201226), 4 (eab832c), and 4 (0.6.0) unsatisfiable problems: all the certifications were verified with [Grad]https://www21.in.tum.de/~lammich/grat/.

![Benchmark result(2021-01-16)](https://user-images.githubusercontent.com/997855/104808677-24d97080-582b-11eb-85af-d01fd161bafd.png)

![Benchmark result(2020-12-27)](https://user-images.githubusercontent.com/997855/103163156-9f6f2b80-483d-11eb-90d3-29d076792c13.png)

## 0.5.0, 2020-08-30

- massive changes on the default parameters about restart
  - restart condition was revised as a multi-armed bandid problem
  - add some new criteria which are not documented yet
- compute LBD of permanent clauses correctly
- implement clause vivification
- add `ClauseDB::bin_watcher`
- delete `Watch::binary`
- `ClauseDB::new_clause` takes `&mut Vec<Lit>` instead of `&mut [Lit]`
- substitute copying literals with `std::mem::swap` in `ClauseDB::new_clause`
- stop sorting literals in `ClauseDB::new_clause`
- fix the certification symbol used by removing clauses
- fix a wrong initial value for `Config::rst_lbd_thr` which should be larger than 1.0
- revise the timeout for pre-processor

#### Verification

- all the certifications of [UUF250]https://github.com/shnarazk/SAT-bench/tree/master/3-SAT/UUF250 were correct and verified with [Grad]https://www21.in.tum.de/~lammich/grat/.
- [SAT Race 2019]http://sat-race-2019.ciirc.cvut.cz, [Benchmarks]http://satcompetition.org/sr2019benchmarks.zip -- splr-0.5.0(3e68efc) solved with a 500 sec (soft) timeout:
  - 67 satisfiable problems: all the solutions were correct.
  - 7 unsatisfiable problems: all the certifications were verified with [Grad]https://www21.in.tum.de/~lammich/grat/.

![](https://user-images.githubusercontent.com/997855/91648473-42d44d80-eaa3-11ea-83d8-5a52e02621d0.png)

## 0.4.1, 2020-05-28

- the installation command is changed to `cargo install splr --features cli`
- add feature "incremental_solver" providing `SatSolverIF::{add_assign, add_var, reset}` and `Solver::iter` and delete some old features
- `cargo build --lib` doesn't depend on 'libc', 'structopt' and 'time' anymore; Splr can be compiled to WASM
- `--quiet` option stops progress report completely
- a tiny modification on var selection heuristics
- squash git history on the master branch

#### Verification

- [SAT Race 2019]http://sat-race-2019.ciirc.cvut.cz, [Benchmarks]http://satcompetition.org/sr2019benchmarks.zip, splr-0.4.1(be30d17, 7064c9) solved with a 400 sec (soft) timeout:
  - 48 satisfiable problems: all the solutions were correct.
  - 7 unsatisfiable problems: all were verified with [Grad]https://www21.in.tum.de/~lammich/grat/.

![](https://user-images.githubusercontent.com/997855/82614843-c14b6480-9c03-11ea-9fe9-1a4d367d7290.png)

## 0.4.0, 2020-05-06

- change a lot of options' meanings and mnemonics
- adapt to the output format defined in chapter 5 of [SAT competition 2011 rules]http://www.satcompetition.org/2011/rules.pdf
- remove code about 'deep search' completely, superseded with stabilizing mode
- implement a simple re-phase mechanism
- implement `TryFrom<Vec<Vec<i32>>> for {Certificate, Solver}` for on-memory solving
- add features for development: boundary_check, EVSIDS, trace_analysis, no_IO
- better modularity and abstraction via traits and sub-modules
- catch a rare crash case in `conflict_analyze`
- `propagate` skips up to the last position; `propagate` skips up to the last position
- change the activation timings of simplification
- stop *too* dynamic var decay control
- activate `JUST_USED` for clause reduction
- stats data are stored in each module

#### Verification

- [SAT Race 2019]http://sat-race-2019.ciirc.cvut.cz, [Benchmarks]http://satcompetition.org/sr2019benchmarks.zip, splr-0.4.0(e0461bd) solved with a 300 sec (soft) timeout:
  - 43 satisfiable problems: all the solutions were correct.
  - 4 unsatisfiable problems: all were verified with [Grad]https://www21.in.tum.de/~lammich/grat/.

![](https://user-images.githubusercontent.com/997855/81140412-32eca700-8fa4-11ea-9067-8369fba31c6b.png)

## 0.3.2, 2020-03-20

- control var activity decay rate based on the number of hot vars
- set var activity parameters for each search strategy correctly
- move `Clause::simplify` to `Eliminator` and make `Eliminator::eliminate` private
- make `Var` smaller
- define `DecisionLevel`
- generate a result file even if splr failed to solve
- define `restarter` as the sixth module of `Solver`
- add `--quiet` mode to show only the last stats

## 0.3.1, 2020-02-22

- adopt Chronological Backtrack; A. Nadel and V. Ryvchin: Chronological Backtracking, *Theory and Applications of Satisfiability Testing - SAT 2018*, pp.111–121, 2018.
- dmcr enables colorized output
- update options
  - add --chronoBT
  - delete --without-deep-search
  - rename --without-adaptive-strategy to --no-adaptive-strategy
- stop using deep-search mode
- revise validation framework: ClauseDBIF::validate, VarDBIF::status
- add SolverError::{NullLearnt, SolverBug}
- implement IntoIterator for {AssignStack, Clause}

#### Verification

- [SAT Race 2019]http://sat-race-2019.ciirc.cvut.cz, [Benchmarks]http://satcompetition.org/sr2019benchmarks.zip, splr-0.3.1 solved with a 200 sec (soft) timeout:
  - 35 satisfiable problems: all the solutions were correct.
  - 4 unsatisfiable problems:
    - 3 were verified with Grad.
    - Verifying gto_p60c238-sc2018.cnf was timed out due to the size of the drat file (1.3 GB).

## 0.3.0, 2020-02-10

- remove src/traits.rs and revise traits:
  - ActivityIF
  - EliminatorIF
  - EmaIF
  - LBDIF
  - LitIF
  - PropagatorIF
  - StateIF
  - VarDBIF
  - VarRewardIF
  - VarSelectionIF
- adopt learning rate based branch with with reason side rewarding
- better decay parameters
- better tests in src/\*.rs
- drop adaptive_restart
- add more ProgressEvaluators
- implement Index and IndexMut traits for several structs
- AssignStack::propagate normalizes flipped binary clauses to reduce computational cost in conflict analysis
- make deep_search sporadic
- revise output format; the last line contains only satisfiability and filename
- use another parameter set for giant problems
- set the default value of timeout to 10000 instead of 0

## 0.2.1, 2019-12-17

- redefine `ClauseId` as a struct

## 0.2.0, 2019-11-29

- redefine `Lit` as a struct with some standard traits

## 0.1.5, 2019-10-29

- adopt a modified CHB instead of EVSIDS
- introduce [big bang initialization]https://medium.com/backjump-technologies/big-bang-initialization-of-variable-activity-in-a-sat-solver-ada154f56fb0 for variable activity
- The literal encoding uses even integers for positive literals
- `Lbool` was changed to `Option<bool>`

## 0.1.4, 2019-09-12

- fix wrong computations about `State::{c_lvl, b_lvl}`, `Clause::activity`
- add '--stat' option to dump a history of internal state
- add new structs for better modularity: `ProgressEvaluator`, `RestartExecutor`, `VarDB`

## 0.1.3, 2019-05-07

- a tiny pack of updates on restart parameters and command line options

## 0.1.2, 2019-03-07

- various changes on heuristic adaptation, restart, and clause/variable elimination modules
- use CPU time if available
- More command line options were added.

## 0.1.1, 2019-02-23

- `splr --certify` generates DRAT, certificates of unsatisfiability.
- Clause id was changed from u64 to u32.
- The answer file format was slightly modified.
- Some command line options were changed.

## 0.1.0, 2019-02-14

- Answers were verified with Glucose and Lingeling.

#### Verification

- The first 100 problems from
  [SATLIB]https://www.cs.ubc.ca/~hoos/SATLIB/benchm.html,
  [250 variables uniform random satisfiable 3-SAT]https://www.cs.ubc.ca/~hoos/SATLIB/Benchmarks/SAT/RND3SAT/uf250-1065.tar.gz
  : all the solutions were correct.
- The first 100 problems from
  [SATLIB]https://www.cs.ubc.ca/~hoos/SATLIB/benchm.html,
  [250 variables uniform random unsatisfiable 3-SAT]https://www.cs.ubc.ca/~hoos/SATLIB/Benchmarks/SAT/RND3SAT/uuf250-1065.tar.gz
  : all the solutions were correct and verified with [drat-trim]http://www.cs.utexas.edu/~marijn/drat-trim/.
- [SAT Competition 2017]https://baldur.iti.kit.edu/sat-competition-2017/index.php?cat=tracks,
  [Main track]https://baldur.iti.kit.edu/sat-competition-2017/benchmarks/Main.zip
  : with a 2000 sec timeout, splr-0.1.0 solved:
  - 72 satisfiable problems: all the solutions were correct.
  - 51 unsatisfiable problems: [Lingeling]http://fmv.jku.at/lingeling/ or Glucose completely returns the same result. And,
    - 37 certificates generated by splr-0.1.1 were verified with drat-trim.
    - The remaining 14 certificates weren't able to be verified due to [timeout]https://gitlab.com/satisfiability01/splr/issues/74#note_142021555 by drat-trim.

## Technology Preview 13

- all clauses are stored into a single ClauseDB
- In-processing eliminator
- dynamic fitting of restart parameters

## Technology Preview 12

- `Solver` were divided into 6 sub modules
- resolved a performance regression
- switched to EVSIDS instead of ACID
- Glucose-style Watch structure