测量和限制在算术子求解器中花费的时间
Measure and bound time spent in arithmetic sub-solvers
Q1:是否可以查询Z3在不同子求解器中花费的时间?
调用 (get-info :all-statistics)
给出了 Z3 的总体 运行 时间,但我想将其分解为单独的子求解器。
我对花在与算术相关的子求解器上的时间特别感兴趣,更准确地说,是那些产生统计数据 grobner
和 nonlinear-horner
的子求解器。
Q2:此外,是否可以在子求解器上设置超时?
我可以想象像为每个 check-sat 和子求解器定义超时这样的事情,它限制了 Z3 可以在该子求解器中花费的时间。 Z3 会重复调用 n 个不同的子求解器,如果达到其中一个的时间限制,它会继续,但只使用剩余的 n-1 子求解器。
我阅读了战术教程,感觉这可能实际上可以通过
的方式实现
(repeat
(par-or
(try-for <arithmetic-solvers> 500)
<all-other-solvers>))
但我不知道要使用哪个求解器。
对于问题 1:不,您必须在上面添加自己的计时器,我希望这不是微不足道的,因为不清楚究竟应该计算什么,不应该计算什么。
Q2:是的,您可以构建自己的自定义 strategies/tactics。请注意,par-or 表示 parallel 或者,即它将尝试 运行 并行提供的策略。
并非所有我们称之为 "solver" 的东西都有它自己的策略,所以这可能需要一些小技巧。请注意,此上下文中的 "solver" 不一定与名为 "solver" 的 Z3 C++ 对象相同。有些"solvers"也是SMT内核的组成部分。
Q1:是否可以查询Z3在不同子求解器中花费的时间?
调用 (get-info :all-statistics)
给出了 Z3 的总体 运行 时间,但我想将其分解为单独的子求解器。
我对花在与算术相关的子求解器上的时间特别感兴趣,更准确地说,是那些产生统计数据 grobner
和 nonlinear-horner
的子求解器。
Q2:此外,是否可以在子求解器上设置超时?
我可以想象像为每个 check-sat 和子求解器定义超时这样的事情,它限制了 Z3 可以在该子求解器中花费的时间。 Z3 会重复调用 n 个不同的子求解器,如果达到其中一个的时间限制,它会继续,但只使用剩余的 n-1 子求解器。
我阅读了战术教程,感觉这可能实际上可以通过
的方式实现(repeat
(par-or
(try-for <arithmetic-solvers> 500)
<all-other-solvers>))
但我不知道要使用哪个求解器。
对于问题 1:不,您必须在上面添加自己的计时器,我希望这不是微不足道的,因为不清楚究竟应该计算什么,不应该计算什么。
Q2:是的,您可以构建自己的自定义 strategies/tactics。请注意,par-or 表示 parallel 或者,即它将尝试 运行 并行提供的策略。 并非所有我们称之为 "solver" 的东西都有它自己的策略,所以这可能需要一些小技巧。请注意,此上下文中的 "solver" 不一定与名为 "solver" 的 Z3 C++ 对象相同。有些"solvers"也是SMT内核的组成部分。