source code here !!!


here's a one line patch that may be needed to compile on some systems
(BSD based ones?). i was sort-of aware of this, but chose to ignore
the issue. the relevant compiliation errors are pretty obvious. one of
these days, i'll fix this permanently in the release ...

*** Chaff2.C.orig Sat Jun 16 23:46:04 2001
--- Chaff2.C Wed Jul 17 19:41:04 2002
*** 2,7 ****
--- 2,8 ----
  // See the file LICENSE for details.   #include"Solver.H"
+ #include<sys/time.h>

if you're brave, here's a binary dev snapshot that includes support for
custom decision orderings. you can a static ordering by  providing a 
weights file with the odering you want. i hope this build works ... tell me
otherwise :)

several people have asked about what some of the parameters mean, with
respect to controling memory usage and such. here's a snipet from a email
i sent out about this -- it should give you some ideas:

if you send me the instnaces, i can play with them. otherwise, the only
parameter that directly affects the database growth is the
addPostfixOnly=n with refers to the number of literals that must be
unassigned before an added clause is deleted. i think the default is 200,
you can also try 150, 100, or even smaller, depending on the instance. you
can try:


which is a different config that has this parameter set to 100, and
restarts less frequently, and adds more randomness. NOTE: this is now the 
same lime.smj as in the current tarball. so if you have the current 
tarball, you already have this configuration.

changing the frequency of restarts (restartPeriod and
restartPeriodIncrement) and the relevance parameter (addPostfixOnly) are
probably the two parameters worth messing with -- you can also change the
clearPeriod and clearPeriodIncrement, which effects how often the decision
statistics are right-shifted by clearShiftAmt. all the xxxPeriod
parameters are in units of (# of decisions).

also, randomnessAtRestart and baseRandomness control the amount of
randomness in the decision heuristic. baseRandomness = n means that a
variable with up to the n'th highest score may be chosen at each deicison.
randomnessAtRestart = n increases baseRandomness by n transiently (for n
decisions) at each restrart.

email me

solaris binary
linux binary

also, here's a staticly linked version of the linux binary (only the 
executable). if you get shared library errors running the Chaff2 
executable from the above linux package, grab this replacement exec:

static Chaff2 exec (for spelt3 distrib only)
you still need the above full distribution for the samples, config 
files, scripts, and documentation (haha).

 the README is (way) out of date, here's a supplement:

sample files:

p cnf 4 1
1 2 3 4 0

1 1 -1 1
4 2 -4 2
3 3 -3 3
2 4 -2 4

the .w file is a list of pairs <[-]variable, weight>, noting that a varaible
and it's negation are considerend seperatly. the decision heuristic will
choose the varaible (or negation) with the highest score. ties are broken
randomly. In the example above, the ordering would be { 2, 3, 4, 1 } with
the polarity of the decison chosen randomly, since the weight of x and -x
are the same for each var.

the default configuration file is cherry.smj, edit it as follows to do a
static ordering.

enable weights by setting:
useWeightsFile = 1

the name of the weights file is given by:
weightsFile = %1$s%2$s.w

also, if you want the ordering to be static, you would disable the internal
heurisitic with this parameter. other wise, don't change this.
maxLitsInClaseForConfDriven = 0

further, the weights generated by the internal heuristic are fairly small
(say always less than 10000) so if you specify very high initial weights,
you can 'partially' override the internal heuristic, for example, if you

1 10000 -1 10000
4 10000 -4 10000
3 20000 -3 20000
2 20000 -2 20000

if would divide the vars into two 'pools'. if the interal heuristic is
diabled, then chaff would choose randomly from the 20000 pool, or if no
20000 var was unassigned, choose randomly from the 10000 pool. however, if
the internal heuristic is *not* disabled, then the internal heuristic would
break the 'tie' since if would (dynamically) add to the scores of the

note that i've never seen a purely static ordering the performs well on
large instances.

email me as questions arise,


PS, note on filenames:

... in the configuartion file, there are two special varaibles %1$s and 
that chaff will substitue with the path and base name (respectivly) of 
cnf file being processed, so if you specify:

BlahFile = %1$s%2$s.blah
OtherFile = %2$s.baz
AnotherFile = myspecificfile.thunk
then run Chaff like:

Chaff2 ../bar/foo2.cnf

then it will try to open:

../bar/foo2.cnf.blah   (to use as the BlahFile)
foo2.cnf.baz             (to use as the OtherFile)
myspecificfile.thunk   (to use as the AnotherFile)

This works exactly for config parameters that expect a filename.


gererall outline:

1) chaff finds a solution (if any) -- this solition S is a *full* 
(chaff can only find full assignments during search).
2) chaff unassigns as many variables in the solution as it can, such that
all clauses still have at least one satisfying assignment. the heuristic
used is greedy -- a single pass is made through the varaibles, and each is
unassigened if possible, (in order, monotonically).
2a) if a set of primary variables is specified, PV, then only variables in
this set are considered for unassignment.

3) a clause representing the soltuion is added to the database, and search
3a) if PV is specified, any varaibles in the solution not in set PV are
discarded from the added clause. i.e. two solutions that differ only in
assignements to non-PV vars are 'uninteresting' and are all pruned

4) the process continues until the instance is unsat (or ressources/max
solutions are exceeded).

the inputs files are as follows:

mmoskewcz@freedom:~/work/s2temp> cat ss.cnf
p cnf 7 9
1 -2 3 0
-1 -3 0
2 -3 0
-1 2 6 0
1 -6 0
-2 -6 0
3 6 -7 0
-3 7 0
-6 7 0

mmoskewcz@freedom:~/work/s2temp> cat ss.cnf.primary
1 1
-1 1
2 1
-2 1
7 1
-7 1

and the configuration file is as follows (there are only a couple of 
from the default, to enable solution enumeration and such):


  includeLoadTime = 0
  abortTime  = 0
  printCommandLineParams = 11
  printResourceUsage = 11
  printNewlineAtEnd = 0

  printInfoMessages = 11
  printStats = 11
  printDecisions = 0

  restartPeriod = 2000
  restartPeriodInc = 200
  randomnessAtRestart = 3

  addPostfixOnly = 200

  minimizeSolutions = 0 # archaic and unused option

  findMultipleSolutions = 1
  solutionsFile = %2$s.sols
  limitSolutionsToN = 0

  markSpecialVars = 1
  specialVarsFile = %1$s%2$s.primary


  printInfoMessages = 1

  baseRandomness = 0

  maxLitsInClaseForConfDriven = 10000  # ie. consider all clases
  breakTiesRandomly = 1
  useLazyErase = 1

  clearPeriod =  2000
  firstClear = 2000
  clearPeriodIncrement = 10
  clearShiftAmt = 3

  useWeightsFile = 0
  weightsFile = %1$s%2$s.w
  decayWeights = 0


  printInfoMessages = 11
  printStats = 11

  cleanupPeriod = 30000

run the code:

mmoskewcz@freedom:~/work/s2temp> ./Chaff2 ss.cnf
 cnf path: ""
 cnf base: "ss.cnf"
using solutions output file: "ss.cnf.sols"
Using config file: cherry.smj
Using log file: chaff.log
Using CNF file: ss.cnf
Each '*' from ClaseMem is 30000 Decisions ---
Using special vars file: "ss.cnf.primary"
Beginning solve()
All clases read/checked/added to db.

Unsatisfiable instance. Not sat. No solution.
Begin Solver::outputStats() ...
  addedClases: 5
  conflicts: 6
  tooBigToAddClases: 0
  totalDupes: 0
  implLoops: 0
  numImpls: 0
  numDecs: 21
... Solver::outputStats() ends.
Begin ClaseMem::outputStats() ...
  Initial clases: 9
  Initial lits: 21
  Initial lits/clase: 2.33333
  Initial max lits in a clase: 3
  final clases: 16
  final lits: 41
  final lits/clase: 2.5625
  Final max lits in a clase: 3
  deleted clases: 0
  deleted lits: 0
  deleted lits/clase: nan
  net clases: 16
  net lits: 41
  net lits/clase: 2.5625
  clases touched: 0
  total skips:    0
  impl skips:     0
... ClaseMem::outputStats() ends.
UserTimeForSearch: 0
TotalUserTime: 0
MaxMemUsedMB: 0

and finally, the output

mmoskewcz@freedom:~/work/s2temp> cat ss.cnf.sols