Given a problem that is encoded using Z3 reals, which of the statistics generated by Z3 /smt2 /st
can be useful in judging whether a reaction engine has problems / does a lot of work?
In my case, I have two basically equivalent coding problems, like using reals. However, the "small" difference in coding is of great importance at runtime, namely, that coding A takes 2: 30 minutes and coding B 13min. Z3 statistics show that conflicts
and quant-instantiations
are mostly equivalent, but others are not, for example, grobner
, pivots
and nonlinear-horner
.
Two different statistics are available as gist .
EDIT (to respond to Leo's comment):
The SMT2 encoding generated by both versions is ~ 30k lines, and statements that use reals are scattered throughout the code. The main difference is that coding B uses many constants with undefined constants in the range from 0.0
to 1.0
, which are limited by inequalities, for example. 0.0 < r1 < 1.0
or 0.0 < r3 < 0.75 - r1 - r2
, while when coding A, many of these undefined constants were replaced by fixed real values from the same range, for example, 0.1
or 0.75 - 0.01
. Both encodings use nonlinear real arithmetic, for example. r1 * (1.0 - r2)
.
A few random examples of the two encodings are available as gist . All arising variables are undefined actions, as described above.
PS: Does it introduce aliases for fixed real values, for example,
(define-sort $Perms () Real) (declare-const $Perms.$Full $Perms) (declare-const $Perms.$None $Perms) (assert (= $Perms.Zero 0.0)) (assert (= $Perms.Write 1.0))
Do significant penalties apply?