Skip to content

Commit 01cf042

Browse files
fix #7404, relates to #7400.
1 parent d047b86 commit 01cf042

File tree

6 files changed

+55
-10
lines changed

6 files changed

+55
-10
lines changed

src/tactic/core/simplify_tactic.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ void simplify_tactic::operator()(goal_ref const & in,
9898
(*m_imp)(*(in.get()));
9999
in->inc_depth();
100100
result.push_back(in.get());
101+
m_clean = false;
101102
}
102103
catch (rewriter_exception & ex) {
103104
throw tactic_exception(ex.msg());
@@ -106,10 +107,13 @@ void simplify_tactic::operator()(goal_ref const & in,
106107

107108

108109
void simplify_tactic::cleanup() {
110+
if (m_clean)
111+
return;
109112
ast_manager & m = m_imp->m();
110113
params_ref p = std::move(m_params);
111114
m_imp->~imp();
112115
new (m_imp) imp(m, p);
116+
m_clean = true;
113117
}
114118

115119
void simplify_tactic::collect_statistics(statistics& st) const {

src/tactic/core/simplify_tactic.h

+1
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ There are several options to control its behavior.
6969
#include "tactic/tactical.h"
7070

7171
class simplify_tactic : public tactic {
72+
bool m_clean = true;
7273
struct imp;
7374
imp * m_imp;
7475
params_ref m_params;

src/tactic/smtlogics/qfnra_tactic.cpp

+12-7
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ tactic * mk_qfnra_very_small_solver(ast_manager& m, params_ref const& p) {
8989
p_i.set_bool("shuffle_vars", true);
9090
// if ((i & 1) == 0)
9191
// p_i.set_bool("randomize", false);
92-
ts.push_back(try_for(mk_qfnra_nlsat_tactic(m, p_i), 3 * 1000));
92+
ts.push_back(mk_lazy_tactic(m, p_i, [&](ast_manager& m, params_ref const& p) { return try_for(mk_qfnra_nlsat_tactic(m, p_i), 3 * 1000); }));
9393
}
9494
{
9595
ts.push_back(mk_qfnra_nlsat_tactic(m, p));
@@ -147,7 +147,7 @@ tactic * mk_qfnra_small_solver(ast_manager& m, params_ref const& p) {
147147
p_i.set_bool("shuffle_vars", true);
148148
// if ((i & 1) == 0)
149149
// p_i.set_bool("randomize", false);
150-
ts.push_back(try_for(mk_qfnra_nlsat_tactic(m, p_i), 5 * 1000));
150+
ts.push_back(mk_lazy_tactic(m, p_i, [&](ast_manager& m, params_ref const& p) { return try_for(mk_qfnra_nlsat_tactic(m, p_i), 5 * 1000); }));
151151
}
152152
{
153153
ts.push_back(mk_qfnra_nlsat_tactic(m, p));
@@ -308,15 +308,20 @@ const double SMALL_THRESHOLD = 80.0;
308308
const double MIDDLE_THRESHOLD = 300.0;
309309
const double LARGE_THRESHOLD = 600.0;
310310
tactic * mk_qfnra_mixed_solver(ast_manager& m, params_ref const& p) {
311+
auto very_small_t = mk_lazy_tactic(m, p, [&](ast_manager& m, params_ref const& p) {return mk_qfnra_very_small_solver(m, p); });
312+
auto small_t = mk_lazy_tactic(m, p, [&](ast_manager& m, params_ref const& p) {return mk_qfnra_small_solver(m, p); });
313+
auto middle_t = mk_lazy_tactic(m, p, [&](ast_manager& m, params_ref const& p) {return mk_qfnra_middle_solver(m, p); });
314+
auto large_t = mk_lazy_tactic(m, p, [&](ast_manager& m, params_ref const& p) {return mk_qfnra_large_solver(m, p); });
315+
auto very_large_t = mk_lazy_tactic(m, p, [&](ast_manager& m, params_ref const& p) {return mk_qfnra_very_large_solver(m, p); });
311316
return cond(mk_lt(mk_memory_probe(), mk_const_probe(VERY_SMALL_THRESHOLD)),
312-
mk_qfnra_very_small_solver(m, p),
317+
very_small_t,
313318
cond(mk_lt(mk_memory_probe(), mk_const_probe(SMALL_THRESHOLD)),
314-
mk_qfnra_small_solver(m, p),
319+
small_t,
315320
cond(mk_lt(mk_memory_probe(), mk_const_probe(MIDDLE_THRESHOLD)),
316-
mk_qfnra_middle_solver(m, p),
321+
middle_t,
317322
cond(mk_lt(mk_memory_probe(), mk_const_probe(LARGE_THRESHOLD)),
318-
mk_qfnra_large_solver(m, p),
319-
mk_qfnra_very_large_solver(m, p)
323+
large_t,
324+
very_large_t
320325
)
321326
)
322327
)

src/tactic/tactic.cpp

+26
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,32 @@ tactic * mk_skip_tactic() {
9595
return alloc(skip_tactic);
9696
}
9797

98+
class lazy_tactic : public tactic {
99+
ast_manager& m;
100+
params_ref p;
101+
std::function<tactic* (ast_manager& m, params_ref const& p)> m_mk_tactic;
102+
tactic* m_tactic = nullptr;
103+
void ensure_tactic() { if (!m_tactic) m_tactic = m_mk_tactic(m, p); }
104+
public:
105+
lazy_tactic(ast_manager& m, params_ref const& p, std::function<tactic* (ast_manager&, params_ref const&)> mk_tactic) : m(m), p(p), m_mk_tactic(mk_tactic) {}
106+
~lazy_tactic() override { dealloc(m_tactic); }
107+
void operator()(goal_ref const& in, goal_ref_buffer& result) override {
108+
ensure_tactic();
109+
(*m_tactic)(in, result);
110+
}
111+
void cleanup() override { if (m_tactic) m_tactic->cleanup(); }
112+
char const* name() const override { return "lazy tactic"; }
113+
void collect_statistics(statistics& st) const override { if (m_tactic) m_tactic->collect_statistics(st); }
114+
void user_propagate_initialize_value(expr* var, expr* value) override { if (m_tactic) m_tactic->user_propagate_initialize_value(var, value); }
115+
tactic* translate(ast_manager& m) override { ensure_tactic(); return m_tactic->translate(m); }
116+
void reset() override { if (m_tactic) m_tactic->reset(); }
117+
};
118+
119+
120+
tactic* mk_lazy_tactic(ast_manager& m, params_ref const& p, std::function<tactic*(ast_manager& m, params_ref const& p)> mkt) {
121+
return alloc(lazy_tactic, m, p, mkt);
122+
}
123+
98124
class fail_tactic : public tactic {
99125
public:
100126
void operator()(goal_ref const & in, goal_ref_buffer & result) override {

src/tactic/tactic.h

+1
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ class skip_tactic : public tactic {
135135
tactic * mk_skip_tactic();
136136
tactic * mk_fail_tactic();
137137
tactic * mk_fail_if_undecided_tactic();
138+
tactic* mk_lazy_tactic(ast_manager& m, params_ref const& p, std::function<tactic*(ast_manager& m, params_ref const& p)>);
138139

139140
/*
140141
ADD_TACTIC("skip", "do nothing tactic.", "mk_skip_tactic()")

src/tactic/tactical.cpp

+11-3
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ class binary_tactical : public tactic {
3030
protected:
3131
tactic_ref m_t1;
3232
tactic_ref m_t2;
33+
bool m_clean = true;
3334

3435
public:
3536

@@ -61,8 +62,11 @@ class binary_tactical : public tactic {
6162
}
6263

6364
void cleanup() override {
65+
if (m_clean)
66+
return;
6467
m_t1->cleanup();
6568
m_t2->cleanup();
69+
m_clean = true;
6670
}
6771

6872
void reset() override {
@@ -103,7 +107,8 @@ class and_then_tactical : public binary_tactical {
103107

104108
char const* name() const override { return "and_then"; }
105109

106-
void operator()(goal_ref const & in, goal_ref_buffer& result) override {
110+
void operator()(goal_ref const & in, goal_ref_buffer& result) override {
111+
m_clean = false;
107112

108113
bool proofs_enabled = in->proofs_enabled();
109114
bool cores_enabled = in->unsat_core_enabled();
@@ -872,6 +877,7 @@ tactic * par_and_then(unsigned num, tactic * const * ts) {
872877
class unary_tactical : public tactic {
873878
protected:
874879
tactic_ref m_t;
880+
bool m_clean = true;
875881

876882

877883
public:
@@ -880,11 +886,12 @@ class unary_tactical : public tactic {
880886
SASSERT(t);
881887
}
882888

883-
void operator()(goal_ref const & in, goal_ref_buffer& result) override {
889+
void operator()(goal_ref const & in, goal_ref_buffer& result) override {
890+
m_clean = false;
884891
m_t->operator()(in, result);
885892
}
886893

887-
void cleanup(void) override { m_t->cleanup(); }
894+
void cleanup(void) override { if (!m_clean) m_t->cleanup(); m_clean = true; }
888895
void collect_statistics(statistics & st) const override { m_t->collect_statistics(st); }
889896
void reset_statistics() override { m_t->reset_statistics(); }
890897
void updt_params(params_ref const & p) override { m_t->updt_params(p); }
@@ -1158,6 +1165,7 @@ class cond_tactical : public binary_tactical {
11581165
char const* name() const override { return "cond"; }
11591166

11601167
void operator()(goal_ref const & in, goal_ref_buffer & result) override {
1168+
m_clean = false;
11611169
if (m_p->operator()(*(in.get())).is_true())
11621170
m_t1->operator()(in, result);
11631171
else

0 commit comments

Comments
 (0)