我是否在 Linux 的 C++ 接口中正确使用 z3:timeout?
Am I using z3 :timeout correctly with C++ interface for Linux?
我正在尝试使用 C++ 接口让 z3 解算器在这个示例中的 0.1 秒后超时(分解两个素数的 32 位乘积)。它适用于 Windows (VC++ 2013),但不适用于 Linux (CentOS 6.5),求解器在大约 2.5 秒内运行完成(调试构建)。 This post 表示命令行超时仅在 2012 年的 Windows 上支持 z3 v3.2,但这应该在下一个版本中修复 - 我们使用的是 z3 v4.4 , 根据 RELEASE_NOTES。我是否正确使用了 C++ 接口的超时功能,或者 Linux 不支持此功能?
(注意:此代码示例使用来自 的 concat 定义。TEST、EXPECT_EQ 和 EXPECT_TRUE 宏是 gtest 测试宏,应该是不言自明的。 )
TEST(Z3Basic, Factorize32BitWithTimeout) {
try {
context c;
solver s(c);
expr x = c.bv_const("x", 16);
expr y = c.bv_const("y", 16);
expr prod = c.bv_val(0xc4f7d27bll, 32);
expr pad = c.bv_val(0, 16);
params p(c);
p.set(":timeout", 100u);
s.set(p);
expr conjecture = prod == concat(pad, x) * concat(pad, y);
s.add(conjecture);
check_result r = s.check();
EXPECT_EQ(unknown, r);
if (r == sat)
std::cout << s.get_model() << "\n";
}
catch (exception ex) {
EXPECT_TRUE(false) << "Exception thrown: " << ex << "\n";
}
}
在 Windows 调试时,这会在大约 210 毫秒内运行整个测试,并通过未知的 return 代码。在 Linux,它运行到完成并失败:
[ RUN ] Z3Basic.Factorize32BitWithTimeout
/home/dave_local/Projects/trunk/CoreApp/z3Interface/UnitTests/TestZ3.cpp:492: Failure
Value of: r
Actual: sat
Expected: unknown
(define-fun y () (_ BitVec 16)
#xd279)
(define-fun x () (_ BitVec 16)
#xef93)
[ FAILED ] Z3Basic.Factorize32BitWithTimeout (2565 ms)
任何suggestions/information?
通过API超时肯定是支持的。也许 Linux 盒子上的 100 毫秒太多了?你能试试更小的超时时间吗?
如果仍然失败,您能否提交一份错误报告以及一个简短的、独立的、可重现的测试用例?谢谢!
我正在尝试使用 C++ 接口让 z3 解算器在这个示例中的 0.1 秒后超时(分解两个素数的 32 位乘积)。它适用于 Windows (VC++ 2013),但不适用于 Linux (CentOS 6.5),求解器在大约 2.5 秒内运行完成(调试构建)。 This post 表示命令行超时仅在 2012 年的 Windows 上支持 z3 v3.2,但这应该在下一个版本中修复 - 我们使用的是 z3 v4.4 , 根据 RELEASE_NOTES。我是否正确使用了 C++ 接口的超时功能,或者 Linux 不支持此功能?
(注意:此代码示例使用来自
TEST(Z3Basic, Factorize32BitWithTimeout) {
try {
context c;
solver s(c);
expr x = c.bv_const("x", 16);
expr y = c.bv_const("y", 16);
expr prod = c.bv_val(0xc4f7d27bll, 32);
expr pad = c.bv_val(0, 16);
params p(c);
p.set(":timeout", 100u);
s.set(p);
expr conjecture = prod == concat(pad, x) * concat(pad, y);
s.add(conjecture);
check_result r = s.check();
EXPECT_EQ(unknown, r);
if (r == sat)
std::cout << s.get_model() << "\n";
}
catch (exception ex) {
EXPECT_TRUE(false) << "Exception thrown: " << ex << "\n";
}
}
在 Windows 调试时,这会在大约 210 毫秒内运行整个测试,并通过未知的 return 代码。在 Linux,它运行到完成并失败:
[ RUN ] Z3Basic.Factorize32BitWithTimeout
/home/dave_local/Projects/trunk/CoreApp/z3Interface/UnitTests/TestZ3.cpp:492: Failure
Value of: r
Actual: sat
Expected: unknown
(define-fun y () (_ BitVec 16)
#xd279)
(define-fun x () (_ BitVec 16)
#xef93)
[ FAILED ] Z3Basic.Factorize32BitWithTimeout (2565 ms)
任何suggestions/information?
通过API超时肯定是支持的。也许 Linux 盒子上的 100 毫秒太多了?你能试试更小的超时时间吗?
如果仍然失败,您能否提交一份错误报告以及一个简短的、独立的、可重现的测试用例?谢谢!