From c70e9af09db0619d1ab1b418484a5c9d6a59f1c9 Mon Sep 17 00:00:00 2001 From: Nikolaj Bjorner Date: Sat, 4 Apr 2020 12:53:24 -0700 Subject: [PATCH] fix #3734 Signed-off-by: Nikolaj Bjorner --- src/ast/csp_decl_plugin.cpp | 28 ++++++++++++++++++++-------- src/ast/csp_decl_plugin.h | 1 + src/sat/tactic/goal2sat.cpp | 2 +- src/tactic/arith/bound_manager.cpp | 7 +++---- src/tactic/arith/bound_manager.h | 2 +- 5 files changed, 26 insertions(+), 14 deletions(-) diff --git a/src/ast/csp_decl_plugin.cpp b/src/ast/csp_decl_plugin.cpp index 3df47ceda..0e7688969 100644 --- a/src/ast/csp_decl_plugin.cpp +++ b/src/ast/csp_decl_plugin.cpp @@ -22,14 +22,23 @@ Revision History: void csp_decl_plugin::set_manager(ast_manager* m, family_id fid) { decl_plugin::set_manager(m, fid); - m_int_sort = m_manager->mk_sort(m_manager->mk_family_id("arith"), INT_SORT); - m_alist_sort = m_manager->mk_sort(symbol("AList"), sort_info(m_family_id, ALIST_SORT)); - m_job_sort = m_manager->mk_sort(symbol("Job"), sort_info(m_family_id, JOB_SORT)); - m_resource_sort = m_manager->mk_sort(symbol("Resource"), sort_info(m_family_id, RESOURCE_SORT)); - m_manager->inc_ref(m_int_sort); - m_manager->inc_ref(m_resource_sort); - m_manager->inc_ref(m_job_sort); - m_manager->inc_ref(m_alist_sort); + m_int_sort = nullptr; + m_alist_sort = nullptr; + m_job_sort = nullptr; + m_resource_sort = nullptr; +} + +void csp_decl_plugin::init() { + if (!m_int_sort) { + m_int_sort = m_manager->mk_sort(m_manager->mk_family_id("arith"), INT_SORT); + m_alist_sort = m_manager->mk_sort(symbol("AList"), sort_info(m_family_id, ALIST_SORT)); + m_job_sort = m_manager->mk_sort(symbol("Job"), sort_info(m_family_id, JOB_SORT)); + m_resource_sort = m_manager->mk_sort(symbol("Resource"), sort_info(m_family_id, RESOURCE_SORT)); + m_manager->inc_ref(m_int_sort); + m_manager->inc_ref(m_resource_sort); + m_manager->inc_ref(m_job_sort); + m_manager->inc_ref(m_alist_sort); + } } void csp_decl_plugin::finalize() { @@ -40,6 +49,7 @@ void csp_decl_plugin::finalize() { } sort * csp_decl_plugin::mk_sort(decl_kind k, unsigned num_parameters, parameter const * parameters) { + init(); if (num_parameters != 0) { m_manager->raise_exception("no parameters expected with job-shop sort"); } @@ -53,6 +63,7 @@ sort * csp_decl_plugin::mk_sort(decl_kind k, unsigned num_parameters, parameter func_decl * csp_decl_plugin::mk_func_decl( decl_kind k, unsigned num_parameters, parameter const * parameters, unsigned arity, sort * const * domain, sort *) { + init(); symbol name; sort* rng = nullptr; switch (static_cast(k)) { @@ -203,6 +214,7 @@ void csp_decl_plugin::get_sort_names(svector & sort_names, symbol } expr * csp_decl_plugin::get_some_value(sort * s) { + init(); parameter p(0); if (is_sort_of(s, m_family_id, JOB_SORT)) return m_manager->mk_const(mk_func_decl(OP_JS_JOB, 1, &p, 0, nullptr, nullptr)); diff --git a/src/ast/csp_decl_plugin.h b/src/ast/csp_decl_plugin.h index 486aa7f03..fcbe4a443 100644 --- a/src/ast/csp_decl_plugin.h +++ b/src/ast/csp_decl_plugin.h @@ -99,6 +99,7 @@ enum js_optimization_objective { }; class csp_decl_plugin : public decl_plugin { + void init(); public: csp_decl_plugin() {} ~csp_decl_plugin() override {} diff --git a/src/sat/tactic/goal2sat.cpp b/src/sat/tactic/goal2sat.cpp index b461d128b..1662c9bcd 100644 --- a/src/sat/tactic/goal2sat.cpp +++ b/src/sat/tactic/goal2sat.cpp @@ -153,7 +153,7 @@ struct goal2sat::imp { m_map.insert(t, v); l = sat::literal(v, sign); TRACE("sat", tout << "new_var: " << v << ": " << mk_bounded_pp(t, m, 2) << "\n";); - if (ext && !is_uninterp_const(t)) { + if (!is_uninterp_const(t)) { m_interpreted_atoms.push_back(t); } } diff --git a/src/tactic/arith/bound_manager.cpp b/src/tactic/arith/bound_manager.cpp index 66a6652c4..ef8ca3fcb 100644 --- a/src/tactic/arith/bound_manager.cpp +++ b/src/tactic/arith/bound_manager.cpp @@ -22,7 +22,8 @@ Notes: #include "tactic/goal.h" bound_manager::bound_manager(ast_manager & m): - m_util(m) { + m_util(m), + m_bounded_vars(m) { } bound_manager::~bound_manager() { @@ -164,7 +165,6 @@ void bound_manager::insert_upper(expr * v, bool strict, numeral const & n, expr_ m_upper_deps.insert(v, d); if (!m_lowers.contains(v)) { m_bounded_vars.push_back(v); - m().inc_ref(v); } } } @@ -185,7 +185,6 @@ void bound_manager::insert_lower(expr * v, bool strict, numeral const & n, expr_ m_lower_deps.insert(v, d); if (!m_uppers.contains(v)) { m_bounded_vars.push_back(v); - m().inc_ref(v); } } } @@ -253,8 +252,8 @@ void bound_manager::operator()(goal const & g) { } } + void bound_manager::reset() { - m().dec_array_ref(m_bounded_vars.size(), m_bounded_vars.c_ptr()); m_bounded_vars.finalize(); m_lowers.finalize(); m_uppers.finalize(); diff --git a/src/tactic/arith/bound_manager.h b/src/tactic/arith/bound_manager.h index a1ff456ce..378a240d3 100644 --- a/src/tactic/arith/bound_manager.h +++ b/src/tactic/arith/bound_manager.h @@ -34,7 +34,7 @@ private: obj_map m_uppers; obj_map m_lower_deps; obj_map m_upper_deps; - ptr_vector m_bounded_vars; + expr_ref_vector m_bounded_vars; bool is_disjunctive_bound(expr * f, expr_dependency * d); bool is_equality_bound(expr * f, expr_dependency * d); bool is_numeral(expr* v, rational& n, bool& is_int);