Measure and bound time spent in arithmetic sub-solvers

我是研究僧i 提交于 2019-12-12 00:32:05

问题


Q1: Is it possible to query the times Z3 spent in different sub-solvers?

Calling (get-info :all-statistics) gives the overall run time of Z3, but I would like to break it down into individual sub-solvers.

I am particularly interested in the time spent in arithmetic-related sub-solver, more precisely, in those that give rise to the statistics grobner and nonlinear-horner.


Q2: Furthermore, is it possible to put a timeout on sub-solver?

I could imagine something like defining a timeout per check-sat and sub-solver that bounds the time Z3 can spent in that sub-solver. Z3 would repeatedly call n different sub-solvers, and if the time bound of one of them is reached it continues, but only uses the remaining n-1 sub-solvers.

I read the tactics tutorial and got the impression that this might actually be possible by something along the lines of

(repeat
  (par-or
    (try-for <arithmetic-solvers> 500)
    <all-other-solvers>))

but I couldn't figure out which solvers to use.


回答1:


For Q1: No, you'd have to add your own timers on that and I would expect this to be nontrivial as it's not clear what exactly should and shouldn't be counted.

Q2: Yes, you can build your own custom strategies/tactics. Note that par-or means parallel or, i.e., it will try to run the provided tactics in parallel. Not everything we call a "solver" has it's own tactic, so this might require some fiddling. Note that "solver" in this context is not necessarily the same as the Z3 C++ object called "solver". Some "solvers" are also integral parts of the SMT kernel.



来源:https://stackoverflow.com/questions/28067224/measure-and-bound-time-spent-in-arithmetic-sub-solvers

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!