3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-08-18 09:12:16 +00:00

add comments to hnf_cutter

Signed-off-by: Lev Nachmanson <levnach@hotmail.com>
This commit is contained in:
Lev Nachmanson 2020-07-03 10:53:18 -07:00
parent 49e49d6bb6
commit 7a4eed0216

View file

@ -159,24 +159,24 @@ namespace lp {
The algorithm is based on the Simplex algorithm. The solution space The algorithm is based on the Simplex algorithm. The solution space
forms a polyhedron in Q^n . If the solution space is non-empty, the forms a polyhedron in Q^n . If the solution space is non-empty, the
Simplex algorithm returns a solution of Axb . We further assume Simplex algorithm returns a solution of Ax <= b . We further assume
that the returned solution x0 is a vertex of the polyhedron, i. e., that the returned solution x0 is a vertex of the polyhedron, i. e.,
there is a nonsingular square submatrix A and a corresponding there is a nonsingular square submatrix A and a corresponding
vector b , such that Ax0=b . We call Axb the defining vector b , such that Ax0=b . We call Ax <=b the defining
constraints of the vertex. If the returned solution is not on a constraints of the vertex. If the returned solution is not on a
vertex we introduce artificial branches on input variables into A vertex we introduce artificial branches on input variables into A
and use these branches as defining constraints. These branches are and use these branches as defining constraints. These branches are
rarely needed in practise. rarely needed in practise.
The main idea is to bring the constraint system Axbb into a Hermite The main idea is to bring the constraint system Ax<=b into a Hermite
normal form H and to compute the unimodular matrix U with AU=H . The normal form H and to compute the unimodular matrix U with AU=H . The
Hermite normal form is uniquely defined. The constraint system Axb Hermite normal form is uniquely defined. The constraint system Ax<=b
is equivalent to Hyb with y:=(U1)x . Since the solution x0 of is equivalent to Hy <=b with y:=(U1)x . Since the solution x0 of
Ax0=b is not integral, the corresponding vector y0=(U1)x0 is not Ax0=b is not integral, the corresponding vector y0=(U1)x0 is not
integral, either. The cuts from proofs algorithm creates an extended integral, either. The cuts from proofs algorithm creates an extended
branch on one of the components y_i of y , i. e., y_iy0_i or branch on one of the components y_i of y , i. e., y_i <= floor(y0_i) or
y_iy0_i. Further on in the paper there is a lemma showing that y_i>=ceil(y0_i). Further on in the paper there is a lemma showing that
branch y_iy0_i is impossible. branch y_i >= ceil(y0_i) is impossible.
*/ */
lia_move hnf_cutter::create_cut(lar_term& t, mpq& k, explanation* ex, bool & upper lia_move hnf_cutter::create_cut(lar_term& t, mpq& k, explanation* ex, bool & upper
#ifdef Z3DEBUG #ifdef Z3DEBUG