static bool swap3d_ghosted(Mesh* mesh) { auto comm = mesh->comm(); auto edges_are_cands = mesh->get_array<I8>(EDGE, "candidate"); mesh->remove_tag(EDGE, "candidate"); auto cands2edges = collect_marked(edges_are_cands); if (has_fixed_momentum_velocity(mesh)) { auto keep_cands = filter_swap_momentum_velocity(mesh, cands2edges); filter_swap(keep_cands, &cands2edges); } auto cand_quals = Reals(); auto cand_configs = Read<I8>(); swap3d_qualities(mesh, cands2edges, &cand_quals, &cand_configs); auto edge_configs = map_onto(cand_configs, cands2edges, mesh->nedges(), I8(-1), 1); auto keep_cands = filter_swap_improve(mesh, cands2edges, cand_quals); filter_swap(keep_cands, &cands2edges, &cand_quals); if (comm->reduce_and(cands2edges.size() == 0)) return false; edges_are_cands = mark_image(cands2edges, mesh->nedges()); auto edge_quals = map_onto(cand_quals, cands2edges, mesh->nedges(), -1.0, 1); auto edges_are_keys = find_indset(mesh, EDGE, edge_quals, edges_are_cands); Graph edges2cav_elems; edges2cav_elems = mesh->ask_up(EDGE, mesh->dim()); mesh->add_tag(EDGE, "key", 1, OMEGA_H_DONT_TRANSFER, OMEGA_H_DONT_OUTPUT, edges_are_keys); mesh->add_tag(EDGE, "config", 1, OMEGA_H_DONT_TRANSFER, OMEGA_H_DONT_OUTPUT, edge_configs); auto keys2edges = collect_marked(edges_are_keys); set_owners_by_indset(mesh, EDGE, keys2edges, edges2cav_elems); return true; }
void expr_context_simplifier::reduce_rec(app * a, expr_ref & result) { if (m_manager.get_basic_family_id() == a->get_family_id()) { switch(a->get_decl_kind()) { case OP_AND: reduce_and(a->get_num_args(), a->get_args(), result); return; case OP_OR: reduce_or(a->get_num_args(), a->get_args(), result); return; case OP_IFF: { expr_ref tmp1(m_manager), tmp2(m_manager); reduce_rec(a->get_arg(0), tmp1); reduce_rec(a->get_arg(1), tmp2); m_simp.mk_iff(tmp1.get(), tmp2.get(), result); return; } case OP_XOR: { expr_ref tmp1(m_manager), tmp2(m_manager); reduce_rec(a->get_arg(0), tmp1); reduce_rec(a->get_arg(1), tmp2); m_simp.mk_xor(tmp1.get(), tmp2.get(), result); return; } case OP_NOT: { expr_ref tmp(m_manager); reduce_rec(a->get_arg(0), tmp); m_simp.mk_not(tmp.get(), result); return; } case OP_IMPLIES: { app_ref tmp(m_manager); tmp = m_manager.mk_not(a->get_arg(0)); expr* args[2] = { tmp.get(), a->get_arg(1) }; reduce_or(2, args, result); return; } case OP_ITE: { expr_ref tmp(m_manager), tmp1(m_manager), tmp2(m_manager); reduce_rec(a->get_arg(0), tmp); if (is_true(tmp.get())) { reduce_rec(a->get_arg(1), result); } else if (is_false(tmp.get())) { reduce_rec(a->get_arg(2), result); } else { unsigned trail_size = m_trail.size(); insert_context(tmp.get(), true); reduce_rec(a->get_arg(1), tmp1); clean_trail(trail_size); insert_context(tmp.get(), false); reduce_rec(a->get_arg(2), tmp2); clean_trail(trail_size); m_simp.mk_ite(tmp.get(), tmp1.get(), tmp2.get(), result); } return; } default: break; } } expr_ref_vector args(m_manager); for (unsigned i = 0; i < a->get_num_args(); ++i) { expr_ref tmp(m_manager); reduce_rec(a->get_arg(i), tmp); args.push_back(tmp.get()); } result = m_manager.mk_app(a->get_decl(), args.size(), args.c_ptr()); }