I have been working on other projects recently and haven't had the stamina to keep things up to date. I may take up maintainership again in the future.
____ ____ ________ __
\ \/ // _____/____ _/ |_
\ / \____ \\__ \/_ _/
/ \ / \/ __ \_| |
/___/\ /_______ (____ /|_ |
\___\ \/ \/ \|
XSat is a fast floating-point constraint solver. Evaluated on 34 representative SMT Competition benchmarks, XSat provides consistent satisfiability results as MathSat and Z3, and an average of more than 700X performance speedup.
DISCLAIMER: XSat currently does not supports all QF_FP operations. This version supports the arithmetic operations of the QF_FP (Quantifier-Free Floating-Point) theory, including: fp.leq, fp.lt, fp.geq, fp.gt, fp.eq, fp.neg, fp.add, fp.mult, fp.sub and fp.div.
See Fu and Su's CAV'16 paper for the algorithm and implementation details.
- python 2.7
- python packages: python-dev, sympy, numpy, scipy
- Clang (preferred, which allows you to use the
-fbracket-depth
option, see below), or gcc - Z3 (I used its 4.5.0 version for parsing SMT2 files)
Note:
-
To resolve runtime dependencies, you probably need to set environment variables (such as LD_LIBRARY_PATH or PYTHONPATH) or variables defined in
Makefile
. -
The option "-fbracket-depth" is from Clang. Gcc does not have that option. The option is to deal with situations where the generated C file gets many brackets. You can disable that option in Makefile and you should be fine most of the time. Meanwhile, I plan to optimize a bit the algorithm (there is large room!) to avoid generating too many brackets, so hopefully, that option can be safely removed in the future.
Consider a benchmark constraint located at Benchmarks/div3.c.50.smt2
. The first command below compiles the constraint into a C shared object. The second command below invokes an external stochastic optimization backend to solve the constraint.
$ make IN=Benchmarks/div3.c.50.smt2
$ python xsat.py
You can type make helloworld
as a shortcut.
Note: the second command above can be supplemented with a range of options. Use "--help" to get the list of command line options. In particular, the "--debug" option is set on by default, meaning that you will see verbose output. To get only the satisfiability result, supplement the second command with "--bench" option.
Note: The docker is provided for your convenience, but code maintenance is only on the source.
First, get the image and start the container:
docker pull martinvelez/xsat
docker run -it martinvelez/xsat:latest bash
Then, run XSat from the source.
$ python test_benchmarks.py
This command tests XSat on a suite of the 34 benchmarks used in the paper, table 1. To test only a subset of these benchmarks, use python test_benchmarks.py --quick <n>
where n
is a positive integer. With n = 10, the command tests the 10th, 20th and 30th benchmark of the suite.
$ time python test_benchmarks.py
(1) Working on Benchmarks/div2.c.30.smt2
Compiling ...
Solving ...
==> sat [Expected]
(2) Working on Benchmarks/mult1.c.30.smt2
Compiling ...
Solving ...
==> sat [Expected]
...
...
(28) Working on Benchmarks/test_v5_r10_vr10_c1_s21502.smt2
Compiling ...
Solving ...
==> unsat [Expected]
(29) Working on Benchmarks/sin2.c.10.smt2
Compiling ...
Solving ...
==> sat [Expected]
(30) Working on Benchmarks/div2.c.50.smt2
Compiling ...
Solving ...
==> sat [Expected]
(31) Working on Benchmarks/mult1.c.50.smt2
Compiling ...
Solving ...
==> sat [Expected]
(32) Working on Benchmarks/div3.c.50.smt2
Compiling ...
Solving ...
==> sat [Expected]
(33) Working on Benchmarks/mult2.c.50.smt2
Compiling ...
Solving ...
==> sat [Expected]
(34) Working on Benchmarks/div.c.50.smt2
Compiling ...
Solving ...
==> sat [Expected]
real 1m53.170s
user 4m55.804s
sys 0m24.029s
I recently found that XSat sometimes gave incorrect results for sin2.c.10.smt2
(#29 above). It can be a new bug, or week parameter settings (e.g. insufficient iteration numbers), but I do not have time to investigate on this at this moment.