在选择到path case之后,仍然需要decide literal,但是这个时候的decide是伪decide (任何一种选择不会产生path)。 z3原生产生子句后,会回退到decide层面的trail,然后尝试选择其他literal,这一点在cls-lvl可以避免。 问题是cls-lvl要回退到哪一层?
One-Level Path:
Two-Level Path:
当前process的clauses只还有一个变量(max var),并且组成的satisfying interval为空集,直接返回unsat
目前做法:
在found decision之后,回退到block状态,然后继续尝试其他选择,以生成完整的多path下的lemma
undo_until_block()
这里主要有四种分类
- 布尔冲突
- 之前有decide
- 之前没有decide
- 算术冲突
- 存在semantic decision
- 不存在semantic decision (完全由arithmetic value造成)
此时应该对应四种算法,假定我们目前和z3一样,尝试回退到decision level,然后选择其他路径(虽然这在cls-lvl的做法中是不被提倡的)
- 布尔冲突
- 之前有decide: 回退到decision level,然后尝试process clause
- 之前没有decide?
- 算术冲突
- 存在semantic decision,此时的lemma应该含有一个decision literal,回退到decision level,然后process lemma,为了得到decision literal否定的赋值
- 不存在semantic decision,回退到stage,然后根据新的lemma从新计算clause-infeasible,继续path case和full case的分支
当新的lemma生成之后,分两种情况
- 之前是path case,用clause infeasible去计算和lemma的不可行区域union
- path case,赋值并继续search
- full case,重新process并回到resolve
- 之前是full case
重新process并回到resolve
var order: [x, y]
[x -> 4.5, !(x + 1 > 0), empty lemma]
2024.5.13
开启了clause decision之后一些instance有退步,寻找原因 (poly/cpr1)。
2024.5.14 一种可能是resolve花费了太长的时间,把resolve变成之前的之后,cpr1可以做到秒解。
2024.5.14 先不要尝试用原来的resolve,还是使用updated version,一个问题是resolve里面学习子句之后,process的顺序问题 (又或者说每次block case之后都涉及到的process顺序问题)。
比如 v3 = 2 or v3 = -2 v3 > 0 lemma: v3 != 2 or 4v4 >= 9 这个时候我们发现是block(考虑lemma和之前的clause infeasible),会优先decide v3 = 2 sort watched clauses by literals of max var occurance
2024.5.15 测试一下conflict、decision和stage的个数,可以间接反应我们的算法的效率。 以及时间散点图。
/pub/data/wangzh/smt_benchmark/QF_NRA/hycomp/simple_ballistics_reach.01.seq_lazy_linear_enc_global_3.smt2 (cpr3) 这个例子origin用了0.2s,updated解不出来,而且只有6个arith和4个bool。
能不能考虑改进缓存机制
- infeasible set的缓存 (second var) 5.16: 修复了bug,为search过程中的new atom register
- reprocess的时候缓存(比如,不需要再重新loop一遍所有的literal)
Version | Description |
---|---|
5.13 | simplest version no bug |
5.14 | disable cache, use original resolve |
5.16 | infeasible cache, resolve updated |
- | - |
2024.5.17 调查一下decision的情况,为什么会出现退步。 一种猜想是由于witness导致的,我们能否不根据整体的feasible set来select witness,而是选择一个最靠前的路径?
现在的问题是如何通过clause infeasile来获取所有的feasible path。
example1: x >= 0 / x <= -1.4 x <= 0 / x >= 1.4 clause feasible: (-oo, -1.4] U [1.4, +oo)
example2: x <= 0 / x >= 43.64 x >= 6.64 / x >= 21.14 clause feasible: [43.64, +oo)
Theorem 0. Each witness in the clause's feasible set corresponds to a feasible path.
Theorem 1. if literal's feasible set intersects empty with clause's feasible set, then the literal is unsat. (x<=0 in Ex.2>)
Theorem 2. if literal's feasible set is a subset of clause's feasible set, then the literal is sat.
Try version using disabled witness path, but select witness from updt_infeasible set.