my name wei-fan. tried use z3py check satisfiability of particular formula shown follows:
from z3 import * import time import sys import signal unit_timeout = 300 # ==== time out exception class , handler ==== class z3timeoutexception(exception): def __int__ (self, value = "z3 timeout"): self.value = value def __str__ (self): return repr(self.value) def z3timeouthandler (signum, frame): raise z3timeoutexception # ==== helper killing z3 when timing out ==== def timedz3check(z3solver): signal.alarm(unit_timeout) z3ret = z3solver.check() signal.alarm(0) return z3ret signal.signal(signal.sigalrm, z3timeouthandler) # ==== declaration of constants , free variables ==== lbound = q("-89999998976", 1) ubound = q("89999998976", 1) aff39 = real('aff39') rnvar = real('rnvar') models_8_12 = real('models_8_12') weights_0_4 = real('weights_0_4') weights_4_8 = real('weights_4_8') weightedabscissas_8_12 = real('weightedabscissas_8_12') weights_8_12 = real('weights_8_12') models_4_8 = real('models_4_8') models_0_4 = real('models_0_4') weightedabscissas_4_8 = real('weightedabscissas_4_8') weightedabscissas_0_4 = real('weightedabscissas_0_4') aff25 = real('aff25') aff0 = real('aff0') aff30 = real('aff30') aff14 = real('aff14') aff19 = real('aff19') aff1 = real('aff1') aff8 = real('aff8') aff29 = real('aff29') aff18 = real('aff18') aff7 = real('aff7') aff38 = real('aff38') aff15 = real('aff15') aff16 = real('aff16') aff2 = real('aff2') aff3 = real('aff3') aff26 = real('aff26') aff27 = real('aff27') aff4 = real('aff4') aff12 = real('aff12') aff6 = real('aff6') aff13 = real('aff13') aff37 = real('aff37') aff17 = real('aff17') aff22 = real('aff22') aff23 = real('aff23') aff20 = real('aff20') aff21 = real('aff21') aff24 = real('aff24') aff36 = real('aff36') aff28 = real('aff28') aff33 = real('aff33') aff34 = real('aff34') aff31 = real('aff31') aff32 = real('aff32') aff35 = real('aff35') aff11 = real('aff11') aff5 = real('aff5') aff10 = real('aff10') aff9 = real('aff9') const0 = real('const0') const1 = real('const1') const2 = real('const2') objvar = real('objvar') # ==== creation of solver ==== usolver = tactic('qfnra').solver() # ==== add constraints ==== usolver.add(rnvar == aff39) usolver.add(q("-16777217", "16777216") <= models_8_12) usolver.add(models_8_12 <= q("16777217", "16777216")) usolver.add(q("21990231", "2199023255552") <= weights_0_4) usolver.add(weights_0_4 <= q("16777217", "16777216")) usolver.add(q("21990231", "2199023255552") <= weights_4_8) usolver.add(weights_4_8 <= q("16777217", "16777216")) usolver.add(q("21990231", "2199023255552") <= weightedabscissas_8_12) usolver.add(weightedabscissas_8_12 <= q("16777217", "16777216")) usolver.add(q("21990231", "2199023255552") <= weights_8_12) usolver.add(weights_8_12 <= q("16777217", "16777216")) usolver.add(q("-16777217", "16777216") <= models_4_8) usolver.add(models_4_8 <= q("16777217", "16777216")) usolver.add(q("-16777217", "16777216") <= models_0_4) usolver.add(models_0_4 <= q("16777217", "16777216")) usolver.add(q("21990231", "2199023255552") <= weightedabscissas_4_8) usolver.add(weightedabscissas_4_8 <= q("16777217", "16777216")) usolver.add(q("21990231", "2199023255552") <= weightedabscissas_0_4) usolver.add(weightedabscissas_0_4 <= q("16777217", "16777216")) usolver.add(aff25 != aff0) usolver.add(aff30 != aff0) usolver.add(aff14 != aff0) usolver.add(aff19 != aff0) usolver.add(aff1 != aff0) usolver.add(aff8 != aff0) usolver.add(aff29 != aff0) usolver.add(aff18 != aff0) usolver.add(aff7 != aff0) usolver.add(or(((aff0 + aff38)-(aff0 + aff38)*1/16777216) >= aff39, ((aff0 + aff38)+ (aff0 + aff38)*1/16777216) >= aff39)) usolver.add(or(((aff0 + aff38)-(aff0 + aff38)*1/16777216) <= aff39, ((aff0 + aff38)+ (aff0 + aff38)*1/16777216) <= aff39)) usolver.add(or(((aff0 - aff15)-(aff0 - aff15)*1/16777216) >= aff16, ((aff0 - aff15)+(aff0 - aff15)*1/16777216) >= aff16)) usolver.add(or(((aff0 - aff15)-(aff0 - aff15)*1/16777216) <= aff16, ((aff0 - aff15)+(aff0 - aff15)*1/16777216) <= aff16)) usolver.add(or(((aff0 - aff2)-(aff0 - aff2)*1/16777216) >= aff3, ((aff0 - aff2)+(aff0 - aff2)*1/16777216) >= aff3)) usolver.add(or(((aff0 - aff2)-(aff0 - aff2)*1/16777216) <= aff3, ((aff0 - aff2)+(aff0 - aff2)*1/16777216) <= aff3)) usolver.add(or(((aff0 - aff26)-(aff0 - aff26)*1/16777216) >= aff27, ((aff0 - aff26)+(aff0 - aff26)*1/16777216) >= aff27)) usolver.add(or(((aff0 - aff26)-(aff0 - aff26)*1/16777216) <= aff27, ((aff0 - aff26)+(aff0 - aff26)*1/16777216) <= aff27)) usolver.add(or(((aff1 * aff3)-(aff1 * aff3)*1/16777216) >= aff4, ((aff1 * aff3)+(aff1 * aff3)*1/16777216) >= aff4)) usolver.add(or(((aff1 * aff3)-(aff1 * aff3)*1/16777216) <= aff4, ((aff1 * aff3)+(aff1 * aff3)*1/16777216) <= aff4)) usolver.add(or(((aff12 * aff6)-(aff12 * aff6)*1/16777216) >= aff13, ((aff12 * aff6)+(aff12 * aff6)*1/16777216) >= aff13)) usolver.add(or(((aff12 * aff6)-(aff12 * aff6)*1/16777216) <= aff13, ((aff12 * aff6)+(aff12 * aff6)*1/16777216) <= aff13)) usolver.add(or(((aff13 + aff37)-(aff13 + aff37)*1/16777216) >= aff38, ((aff13 + aff37)+(aff13 + aff37)*1/16777216) >= aff38)) usolver.add(or(((aff13 + aff37)-(aff13 + aff37)*1/16777216) <= aff38, ((aff13 + aff37)+(aff13 + aff37)*1/16777216) <= aff38)) usolver.add(or(((aff14 * aff16)-(aff14 * aff16)*1/16777216) >= aff17, ((aff14 * aff16)+(aff14 * aff16)*1/16777216) >= aff17)) usolver.add(or(((aff14 * aff16)-(aff14 * aff16)*1/16777216) <= aff17, ((aff14 * aff16)+(aff14 * aff16)*1/16777216) <= aff17)) usolver.add(or(((aff17 * aff22)-(aff17 * aff22)*1/16777216) >= aff23, ((aff17 * aff22)+(aff17 * aff22)*1/16777216) >= aff23)) usolver.add(or(((aff17 * aff22)-(aff17 * aff22)*1/16777216) <= aff23, ((aff17 * aff22)+(aff17 * aff22)*1/16777216) <= aff23)) usolver.add(or(((aff18 / aff14)-(aff18 / aff14)*1/16777216) >= aff19, ((aff18 / aff14)+(aff18 / aff14)*1/16777216) >= aff19)) usolver.add(or(((aff18 / aff14)-(aff18 / aff14)*1/16777216) <= aff19, ((aff18 / aff14)+(aff18 / aff14)*1/16777216) <= aff19)) usolver.add(or(((aff20 * aff19)-(aff20 * aff19)*1/16777216) >= aff21, ((aff20 * aff19)+(aff20 * aff19)*1/16777216) >= aff21)) usolver.add(or(((aff20 * aff19)-(aff20 * aff19)*1/16777216) <= aff21, ((aff20 * aff19)+(aff20 * aff19)*1/16777216) <= aff21)) usolver.add(or(((aff23 * aff6)-(aff23 * aff6)*1/16777216) >= aff24, ((aff23 * aff6)+(aff23 * aff6)*1/16777216) >= aff24)) usolver.add(or(((aff23 * aff6)-(aff23 * aff6)*1/16777216) <= aff24, ((aff23 * aff6)+(aff23 * aff6)*1/16777216) <= aff24)) usolver.add(or(((aff24 + aff36)-(aff24 + aff36)*1/16777216) >= aff37, ((aff24 + aff36)+(aff24 + aff36)*1/16777216) >= aff37)) usolver.add(or(((aff24 + aff36)-(aff24 + aff36)*1/16777216) <= aff37, ((aff24 + aff36)+(aff24 + aff36)*1/16777216) <= aff37)) usolver.add(or(((aff25 * aff27)-(aff25 * aff27)*1/16777216) >= aff28, ((aff25 * aff27)+(aff25 * aff27)*1/16777216) >= aff28)) usolver.add(or(((aff25 * aff27)-(aff25 * aff27)*1/16777216) <= aff28, ((aff25 * aff27)+(aff25 * aff27)*1/16777216) <= aff28)) usolver.add(or(((aff28 * aff33)-(aff28 * aff33)*1/16777216) >= aff34, ((aff28 * aff33)+(aff28 * aff33)*1/16777216) >= aff34)) usolver.add(or(((aff28 * aff33)-(aff28 * aff33)*1/16777216) <= aff34, ((aff28 * aff33)+(aff28 * aff33)*1/16777216) <= aff34)) usolver.add(or(((aff29 / aff25)-(aff29 / aff25)*1/16777216) >= aff30, ((aff29 / aff25)+(aff29 / aff25)*1/16777216) >= aff30)) usolver.add(or(((aff29 / aff25)-(aff29 / aff25)*1/16777216) <= aff30, ((aff29 / aff25)+(aff29 / aff25)*1/16777216) <= aff30)) usolver.add(or(((aff31 * aff30)-(aff31 * aff30)*1/16777216) >= aff32, ((aff31 * aff30)+(aff31 * aff30)*1/16777216) >= aff32)) usolver.add(or(((aff31 * aff30)-(aff31 * aff30)*1/16777216) <= aff32, ((aff31 * aff30)+(aff31 * aff30)*1/16777216) <= aff32)) usolver.add(or(((aff34 * aff6)-(aff34 * aff6)*1/16777216) >= aff35, ((aff34 * aff6)+(aff34 * aff6)*1/16777216) >= aff35)) usolver.add(or(((aff34 * aff6)-(aff34 * aff6)*1/16777216) <= aff35, ((aff34 * aff6)+(aff34 * aff6)*1/16777216) <= aff35)) usolver.add(or(((aff35 + aff0)-(aff35 + aff0)*1/16777216) >= aff36, ((aff35 + aff0)+(aff35 + aff0)*1/16777216) >= aff36)) usolver.add(or(((aff35 + aff0)-(aff35 + aff0)*1/16777216) <= aff36, ((aff35 + aff0)+(aff35 + aff0)*1/16777216) <= aff36)) usolver.add(or(((aff4 * aff11)-(aff4 * aff11)*1/16777216) >= aff12, ((aff4 * aff11)+(aff4 * aff11)*1/16777216) >= aff12)) usolver.add(or(((aff4 * aff11)-(aff4 * aff11)*1/16777216) <= aff12, ((aff4 * aff11)+(aff4 * aff11)*1/16777216) <= aff12)) usolver.add(or(((aff5 * aff10)-(aff5 * aff10)*1/16777216) >= aff11, ((aff5 * aff10)+(aff5 * aff10)*1/16777216) >= aff11)) usolver.add(or(((aff5 * aff10)-(aff5 * aff10)*1/16777216) <= aff11, ((aff5 * aff10)+(aff5 * aff10)*1/16777216) <= aff11)) usolver.add(or(((aff5 * aff21)-(aff5 * aff21)*1/16777216) >= aff22, ((aff5 * aff21)+(aff5 * aff21)*1/16777216) >= aff22)) usolver.add(or(((aff5 * aff21)-(aff5 * aff21)*1/16777216) <= aff22, ((aff5 * aff21)+(aff5 * aff21)*1/16777216) <= aff22)) usolver.add(or(((aff5 * aff32)-(aff5 * aff32)*1/16777216) >= aff33, ((aff5 * aff32)+(aff5 * aff32)*1/16777216) >= aff33)) usolver.add(or(((aff5 * aff32)-(aff5 * aff32)*1/16777216) <= aff33, ((aff5 * aff32)+(aff5 * aff32)*1/16777216) <= aff33)) usolver.add(or(((aff6 * aff19)-(aff6 * aff19)*1/16777216) >= aff20, ((aff6 * aff19)+(aff6 * aff19)*1/16777216) >= aff20)) usolver.add(or(((aff6 * aff19)-(aff6 * aff19)*1/16777216) <= aff20, ((aff6 * aff19)+(aff6 * aff19)*1/16777216) <= aff20)) usolver.add(or(((aff6 * aff30)-(aff6 * aff30)*1/16777216) >= aff31, ((aff6 * aff30)+(aff6 * aff30)*1/16777216) >= aff31)) usolver.add(or(((aff6 * aff30)-(aff6 * aff30)*1/16777216) <= aff31, ((aff6 * aff30)+(aff6 * aff30)*1/16777216) <= aff31)) usolver.add(or(((aff6 * aff8)-(aff6 * aff8)*1/16777216) >= aff9, ((aff6 * aff8)+(aff6 * aff8)*1/16777216) >= aff9)) usolver.add(or(((aff6 * aff8)-(aff6 * aff8)*1/16777216) <= aff9, ((aff6 * aff8)+(aff6 * aff8)*1/16777216) <= aff9)) usolver.add(or(((aff7 / aff1)-(aff7 / aff1)*1/16777216) >= aff8, ((aff7 / aff1)+(aff7 / aff1)*1/16777216) >= aff8)) usolver.add(or(((aff7 / aff1)-(aff7 / aff1)*1/16777216) <= aff8, ((aff7 / aff1)+(aff7 / aff1)*1/16777216) <= aff8)) usolver.add(or(((aff9 * aff8)-(aff9 * aff8)*1/16777216) >= aff10, ((aff9 * aff8)+(aff9 * aff8)*1/16777216) >= aff10)) usolver.add(or(((aff9 * aff8)-(aff9 * aff8)*1/16777216) <= aff10, ((aff9 * aff8)+(aff9 * aff8)*1/16777216) <= aff10)) usolver.add(or(((const0)-(const0)*1/16777216) >= aff0, ((const0)+(const0)*1/16777216) >= aff0)) usolver.add(or(((const0)-(const0)*1/16777216) <= aff0, ((const0)+(const0)*1/16777216) <= aff0)) usolver.add(or(((const1)-(const1)*1/16777216) >= aff5, ((const1)+(const1)*1/16777216) >= aff5)) usolver.add(or(((const1)-(const1)*1/16777216) <= aff5, ((const1)+(const1)*1/16777216) <= aff5)) usolver.add(or(((const2)-(const2)*1/16777216) >= aff6, ((const2)+(const2)*1/16777216) >= aff6)) usolver.add(or(((const2)-(const2)*1/16777216) <= aff6, ((const2)+(const2)*1/16777216) <= aff6)) usolver.add(or(((models_0_4)-(models_0_4)*1/16777216) >= aff26, ((models_0_4)+(models_0_4)*1/16777216) >= aff26)) usolver.add(or(((models_0_4)-(models_0_4)*1/16777216) <= aff26, ((models_0_4)+(models_0_4)*1/16777216) <= aff26)) usolver.add(or(((models_4_8)-(models_4_8)*1/16777216) >= aff15, ((models_4_8)+(models_4_8)*1/16777216) >= aff15)) usolver.add(or(((models_4_8)-(models_4_8)*1/16777216) <= aff15, ((models_4_8)+(models_4_8)*1/16777216) <= aff15)) usolver.add(or(((models_8_12)-(models_8_12)*1/16777216) >= aff2, ((models_8_12)+(models_8_12)*1/16777216) >= aff2)) usolver.add(or(((models_8_12)-(models_8_12)*1/16777216) <= aff2, ((models_8_12)+(models_8_12)*1/16777216) <= aff2)) usolver.add(or(((weightedabscissas_0_4)-(weightedabscissas_0_4)*1/16777216) >= aff29, ((weightedabscissas_0_4)+(weightedabscissas_0_4)*1/16777216) >= aff29)) usolver.add(or(((weightedabscissas_0_4)-(weightedabscissas_0_4)*1/16777216) <= aff29, ((weightedabscissas_0_4)+(weightedabscissas_0_4)*1/16777216) <= aff29)) usolver.add(or(((weightedabscissas_4_8)-(weightedabscissas_4_8)*1/16777216) >= aff18, ((weightedabscissas_4_8)+(weightedabscissas_4_8)*1/16777216) >= aff18)) usolver.add(or(((weightedabscissas_4_8)-(weightedabscissas_4_8)*1/16777216) <= aff18, ((weightedabscissas_4_8)+(weightedabscissas_4_8)*1/16777216) <= aff18)) usolver.add(or(((weightedabscissas_8_12)-(weightedabscissas_8_12)*1/16777216) >= aff7, ((weightedabscissas_8_12)+(weightedabscissas_8_12)*1/16777216) >= aff7)) usolver.add(or(((weightedabscissas_8_12)-(weightedabscissas_8_12)*1/16777216) <= aff7, ((weightedabscissas_8_12)+(weightedabscissas_8_12)*1/16777216) <= aff7)) usolver.add(or(((weights_0_4)-(weights_0_4)*1/16777216) >= aff25, ((weights_0_4)+(weights_0_4)*1/16777216) >= aff25)) usolver.add(or(((weights_0_4)-(weights_0_4)*1/16777216) <= aff25, ((weights_0_4)+(weights_0_4)*1/16777216) <= aff25)) usolver.add(or(((weights_4_8)-(weights_4_8)*1/16777216) >= aff14, ((weights_4_8)+(weights_4_8)*1/16777216) >= aff14)) usolver.add(or(((weights_4_8)-(weights_4_8)*1/16777216) <= aff14, ((weights_4_8)+(weights_4_8)*1/16777216) <= aff14)) usolver.add(or(((weights_8_12)-(weights_8_12)*1/16777216) >= aff1, ((weights_8_12)+(weights_8_12)*1/16777216) >= aff1)) usolver.add(or(((weights_8_12)-(weights_8_12)*1/16777216) <= aff1, ((weights_8_12)+(weights_8_12)*1/16777216) <= aff1)) usolver.add(and(q("-25165825", "8388608") <= const1, const1 <= q("-25165823", "8388608"))) usolver.add(and(0 <= const0, const0 <= 0)) usolver.add(and(q("16777215", "16777216") <= const2, const2 <= q("16777217", "16777216"))) usolver.add(objvar == (rnvar)) # ==== add additional constraints ==== upper = simplify(ubound - (ubound - lbound) * q(1, 64)) usolver.add(objvar > upper) # ==== start z3py check satisfiability ==== timedz3check(usolver)
i used z3py 4.1 check satisfiability. took long time (3+ hours) didn't return result (sat or unsat) main questions are:
- is there trick or flag of z3py apply accelerate satisfiability check?
- the function (timedz3check) didn't terminate z3py on assigned time limit (300 seconds). there "standard" way of setting timeout z3py?
any suggestions appreciated.
regards, wei-fan
it seems problem beyond capabilities of current nonlinear real arithmetic solver (nlsat) used in z3. plan have better solvers fragment in future. regarding timeouts, can set timeout using following command after create usolver
.
usolver.set('timeout', 1000)
the timeout in milliseconds. btw, timer may not work on version 4.1, fixed problems timers in platforms (e.g., osx). please update z3 latest version if not work.
Comments
Post a Comment