cd DPLL-parallel
make dpll-parallel [FV=v]
v is either 0 or 1, meaning verbose output for debugging
default: v = 0
For cims crunchy machines, first run module load gcc-9.2 before running the program.
input file INPUT.cnf, with 2^pow threads, and with an optional benchmark file BENCHMARK.csv to output the execution
time
./dpll-parallel -p ${pow} INPUT.cnf [BENCHMARK.csv]
OR
to run with all input in input/ or input_large/, you can run the following shell scripts:
./run.sh [-p pow] [-v]
./run_large.sh [-p pow] [-v]
When running the shell scripts, the output is redirected to output_parallel_p${pow}/TEST.txt and the correctness is
automatically checked by python script: check_sat.py, which only checks the correctness if the cnf is satisfiable, and
outputs no solution if the program doesn't find a solution.
pow and v are defined the same as before
Pseudo code for our Parallel Solver and additional information are in DPLL-parallel/README.md
cd DPLL-squential
make dpll-sequential [FV=v]
./dpll-sequential INPUT.cnf
this generates an output file in /sequential_output
DPLL output (sequential and parallel solvers) is in the form of:
if
xis true,xis printed
ifyis false,-yis printed
ifzcan be either true or false,\zis printed
OR if the solver determines that the input is unsatisfiable:
NO SOLUTION
Run a single correctness check separately with inputfile INPUT.cnf and outputfile OUTPUT.txt:
python3 tests/check_sat.py -i INPUT.cnf -o OUTPUT.txt
This checks that the output file (in the format above) is a satisfactory solution to the input file which contains the initial clauses in Conjunctive Normal Form (CNF). If the input is unsatisfiable, the output file is expected to contain "NO SOLUTION"
We have a python test suite which can verify that all of the output generated by the parallel and sequential solvers is
correct, given all of the input in the input directory. Run all of the tests like this:
python3 tests/test_correctness_of_outputs.py
Note: This does not run the solvers, it just checks the output that has already been generated
To run all of the inputs in benchmarks/inputs through plinegling, lingeling, our DPLL parallel solver and our DPLL sequential solver, run:
python3 benchmarks/benchmarks.py `< executables.txt`
Additional information on how the benchmark script works and what it does in benchmarks/README.md
/benchmarks- scripts for downloading plingeling and lingeling modern solvers (for comparison)
/inputsample inputs which include satisfiable and unsatisfiable cnf examples of varying sizesbenchmarks.pywhich runs each solver on all inputs in/input- plots which show the results of our benchmarks and are showcased in our paper
- benchmark result files
/DPLL-paralleldpll-parallel-main.cppcontains the code for the parallel solverREADME.mdcontains the pseudo code and description of the parallel solver- run scripts for running the solver on various inputs and taking timing measurements
/DPLL-squentialdpll.cppcontains the code for the sequential dpll algorithm and helper functionsinputReader.cppcontains helper functions which deal with reading the inputmain.cppruns the sequential algorithm on all files in local input directory or in a specific file if given
/testscheck_sat.pytakes an input and an output file and checks that the output is correcttest_correctness_of_outputs.pylooks through input and output directories and checks that the outputs are all correct- assumes the following directories exist and have files in them: /input, /sequential_output, /output_parallel_p0, /output_parallel_p1, /output_parallel_p2 /output_parallel_p3, and /output_parallel_p4
/utilsdpll.cppandinputReader.cpp: versions of thedpllandinputReaderprograms in/DPLL-squentialwhich are specialized for the parallel solver
- various input and output directories