Search code examples
timeoutz3groebner-basis

Measure and bound time spent in arithmetic sub-solvers


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.


Solution

  • 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.