C++ 使用C++;美国石油学会
我在尝试使用Z3优化器解决图形分区问题时遇到了一个问题。具体而言,以下代码无法生成令人满意的模型:C++ 使用C++;美国石油学会,c++,optimization,z3,C++,Optimization,Z3,我在尝试使用Z3优化器解决图形分区问题时遇到了一个问题。具体而言,以下代码无法生成令人满意的模型: namespace z3 { expr ite(context& con, expr cond, expr then_, expr else_) { return to_expr(con, Z3_mk_ite(con, cond, then_, else_));; } } bool smtPart(void) { // Graph setup
namespace z3 {
expr ite(context& con, expr cond, expr then_, expr else_) {
return to_expr(con, Z3_mk_ite(con, cond, then_, else_));;
}
}
bool smtPart(void) {
// Graph setup
vector<int32_t> nodes = {{ 4, 2, 1, 1 }};
vector<tuple<node_pos_t, node_pos_t, int32_t>> edges;
GraphType graph(nodes, edges);
// Z3 setup
z3::context con;
z3::optimize opt(con);
string n_str = "n", sub_p_str = "_p";
// Re-usable constants
z3::expr zero = con.int_val(0);
// Create the sort representing the different partitions.
const char* part_sort_names[2] = { "P0", "P1" };
z3::func_decl_vector part_consts(con), part_preds(con);
z3::sort part_sort =
con.enumeration_sort("PartID",
2,
part_sort_names,
part_consts,
part_preds);
// Create the constants that represent partition choices.
vector<z3::expr> part_vars;
part_vars.reserve(graph.numNodes());
z3::expr p0_acc = zero,
p1_acc = zero;
typename GraphType::NodeData total_weight = typename GraphType::NodeData();
for (const auto& node : graph.nodes()) {
total_weight += node.data;
ostringstream name;
name << n_str << node.id << sub_p_str;
z3::expr nchoice = con.constant(name.str().c_str(), part_sort);
part_vars.push_back(nchoice);
p0_acc = p0_acc + z3::ite(con,
nchoice == part_consts[0](),
con.int_val(node.data),
zero);
p1_acc = p1_acc + z3::ite(con,
nchoice == part_consts[1](),
con.int_val(node.data),
zero);
}
z3::expr imbalance = con.int_const("imbalance");
opt.add(imbalance ==
z3::ite(con,
p0_acc > p1_acc,
p0_acc - p1_acc,
p1_acc - p0_acc));
z3::expr imbalance_limit = con.real_val(total_weight, 100);
opt.add(imbalance <= imbalance_limit);
z3::expr edge_cut = zero;
for(const auto& edge : graph.edges()) {
edge_cut = edge_cut +
z3::ite(con,
(part_vars[edge.node0().pos()] ==
part_vars[edge.node1().pos()]),
zero,
con.int_val(edge.data));
}
opt.minimize(edge_cut);
opt.minimize(imbalance);
z3::check_result opt_result = opt.check();
if (opt_result == z3::check_result::sat) {
auto mod = opt.get_model();
size_t node_id = 0;
for (z3::expr& npv : part_vars) {
cout << "Node " << node_id++ << ": " << mod.eval(npv) << endl;
}
return true;
} else if (opt_result == z3::check_result::unsat) {
cerr << "Constraints are unsatisfiable." << endl;
return false;
} else {
cerr << "Result is unknown." << endl;
return false;
}
}
名称空间z3{
expr ite(上下文和con、expr cond、expr then、expr else){
返回expr(con,Z3_mk_ite(con,cond,then,else);;
}
}
布尔smtPart(无效){
//图形设置
向量节点={4,2,1,1};
矢量边;
图形类型图形(节点、边);
//Z3设置
z3::上下文con;
z3::优化opt(con);
字符串n_str=“n”,sub_p_str=“\u p”;
//可重复使用常数
z3::expr zero=con.int_val(0);
//创建表示不同分区的排序。
常量字符*部分排序名称[2]={“P0”,“P1”};
z3::函数向量部分常数(con),部分preds(con);
z3::排序部分\排序=
con.枚举\u排序(“PartID”,
2.
第(1)部分(1)分类(2)名称,,
第四部分:,
第(二)部分;;
//创建表示分区选择的常量。
向量部分变量;
部分变量保留(图numNodes());
z3::expr p0_acc=零,
p1_acc=零;
typename GraphType::NodeData total_weight=typename GraphType::NodeData();
for(const auto&node:graph.nodes()){
总重量+=节点数据;
ostringstream名称;
name您是否可以使用opt.to_string()转储状态(就在check()之前)来重现结果?这将创建一个使用优化命令在SMT-LIB2中格式化的字符串。这样就更容易交换基准测试。您应该看到,如果您注释掉优化命令,它会报告优化命令未满足要求,并报告sat
如果您能够产生一个bug,那么在GitHub.com/z3prover/z3.git上发布一个问题,并附带一个repo
如果没有,您可以在创建Z3上下文和记录不可重新命名的日志文件之前使用Z3_open_log。这样可以(但不是那么容易)挖掘不健全的错误。您是否可以使用opt.to_string()转储状态(就在check()之前)来重现结果?这将创建一个使用优化命令在SMT-LIB2中格式化的字符串。这样就更容易交换基准测试。您应该看到,如果您注释掉优化命令,它会报告优化命令未满足要求,并报告sat
如果您能够产生一个bug,那么在GitHub.com/z3prover/z3.git上发布一个问题,并附带一个repo
如果没有,您可以在创建Z3上下文并记录可重新命名的日志文件之前使用Z3_open_log以这种方式挖掘不健康的bug。事实证明,这是Z3中的一个bug。我在GitHub上创建了一个漏洞,之后他们用补丁进行了响应。我现在正在编译和测试修复程序,但我希望它能工作
编辑:YPUP,这个补丁修复了命令行工具和C++ API的问题。
< P>,这是Z3中的一个bug。我创建了一个Github,并且他们用补丁来回应。我现在正在编译和测试修复,但我希望它能工作。< /P>
<>编辑:YP,这个补丁为命令行工具和C++ API解决了这个问题。编译代码时遇到了麻烦。你使用的指令包括什么?命名空间?什么编译器和链接标志?我只想让这个代码被读取,而不是编译。这是一个更大的项目的一部分,它定义了一堆S。这里使用的凝灰岩。感谢您花时间研究这个问题,但事实证明这是一个bug。有关更多详细信息,请参阅下面的答案。好的,在Z3中找到bug做得很好。我在编译代码时遇到了问题。您使用的是什么#include指令?什么名称空间?什么编译器和链接器标志?我只打算将此代码转换为be read,未编译。这是一个更大的项目的一部分,该项目定义了这里使用的一系列内容。感谢您花时间研究此问题,但结果证明这是一个错误。请参阅下面的答案了解更多详细信息。好的,在Z3中查找错误的工作做得很好。感谢您提供有关打印出opt
的信息。我尝试了通过Z3命令行工具生成不同的逻辑,但这并不能解决任何问题。不过,我也能够在命令行中重现相同的行为,现在已经向GitHub页面提交了一个问题。感谢您提供有关打印出opt
的信息。我尝试通过Z3命令行工具指定不同的逻辑,但确实解决了问题我没有解决任何问题。不过,我也能够在命令行中重现相同的行为,现在已向GitHub页面提交了一个问题。