fix(library/blast/simplifier): caches for each relation
This commit is contained in:
parent
a304f6a9df
commit
0ad41173bb
1 changed files with 21 additions and 7 deletions
|
@ -21,6 +21,7 @@ Author: Daniel Selsam
|
||||||
#include "util/pair.h"
|
#include "util/pair.h"
|
||||||
#include "util/sexpr/option_declarations.h"
|
#include "util/sexpr/option_declarations.h"
|
||||||
#include <array>
|
#include <array>
|
||||||
|
#include <map>
|
||||||
#include <iostream> // TODO just for occasional debugging
|
#include <iostream> // TODO just for occasional debugging
|
||||||
|
|
||||||
#ifndef LEAN_DEFAULT_SIMPLIFY_MAX_STEPS
|
#ifndef LEAN_DEFAULT_SIMPLIFY_MAX_STEPS
|
||||||
|
@ -112,10 +113,11 @@ class simplifier {
|
||||||
bool m_trace{get_simplify_trace()};
|
bool m_trace{get_simplify_trace()};
|
||||||
|
|
||||||
/* Cache */
|
/* Cache */
|
||||||
expr_bi_struct_map<result> m_simplify_cache{};
|
typedef expr_bi_struct_map<result> simplify_cache;
|
||||||
|
std::map<name,simplify_cache,name_quick_cmp> m_simplify_cache;
|
||||||
|
|
||||||
/* Masks for building applications */
|
optional<result> cache_lookup(expr const & e);
|
||||||
std::array<bool,6> eq_rec_all_mask{{true,true,true,true,true,true}};
|
void cache_save(expr const & e, result const & r);
|
||||||
|
|
||||||
/* Basic helpers */
|
/* Basic helpers */
|
||||||
bool using_eq() { return m_rel == get_eq_name(); }
|
bool using_eq() { return m_rel == get_eq_name(); }
|
||||||
|
@ -164,6 +166,19 @@ public:
|
||||||
simplifier::simplifier(branch const & b, name const & rel):
|
simplifier::simplifier(branch const & b, name const & rel):
|
||||||
m_app_builder(*m_tmp_tctx), m_branch(b), m_rel(rel) { }
|
m_app_builder(*m_tmp_tctx), m_branch(b), m_rel(rel) { }
|
||||||
|
|
||||||
|
/* Cache */
|
||||||
|
optional<result> simplifier::cache_lookup(expr const & e) {
|
||||||
|
simplify_cache & cache = m_simplify_cache[m_rel];
|
||||||
|
auto it = cache.find(e);
|
||||||
|
if (it != cache.end()) return optional<result>(it->second);
|
||||||
|
return optional<result>();
|
||||||
|
}
|
||||||
|
void simplifier::cache_save(expr const & e, result const & r) {
|
||||||
|
simplify_cache & cache = m_simplify_cache[m_rel];
|
||||||
|
cache.insert(mk_pair(e,r));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Results */
|
/* Results */
|
||||||
|
|
||||||
result simplifier::lift_from_eq(expr const & x, result const & r) {
|
result simplifier::lift_from_eq(expr const & x, result const & r) {
|
||||||
|
@ -215,7 +230,6 @@ result simplifier::finalize(result const & r) {
|
||||||
throw blast_exception("failed on [refl] matching",r.get_new());
|
throw blast_exception("failed on [refl] matching",r.get_new());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Simplification */
|
/* Simplification */
|
||||||
|
|
||||||
result simplifier::simplify(expr const & e) {
|
result simplifier::simplify(expr const & e) {
|
||||||
|
@ -230,9 +244,9 @@ result simplifier::simplify(expr const & e) {
|
||||||
throw blast_exception("simplifier failed, maximum number of steps exceeded", e);
|
throw blast_exception("simplifier failed, maximum number of steps exceeded", e);
|
||||||
|
|
||||||
if (m_memoize) {
|
if (m_memoize) {
|
||||||
auto it = m_simplify_cache.find(e);
|
if (auto it = cache_lookup(e)) return *it;
|
||||||
if (it != m_simplify_cache.end()) return it->second;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
result r(e);
|
result r(e);
|
||||||
|
|
||||||
if (m_top_down) r = join(r, rewrite(whnf(r.get_new())));
|
if (m_top_down) r = join(r, rewrite(whnf(r.get_new())));
|
||||||
|
@ -278,7 +292,7 @@ result simplifier::simplify(expr const & e) {
|
||||||
|
|
||||||
if (m_exhaustive && r.get_new() != e) r = join(r,simplify(r.get_new()));
|
if (m_exhaustive && r.get_new() != e) r = join(r,simplify(r.get_new()));
|
||||||
|
|
||||||
if (m_memoize) m_simplify_cache.insert(mk_pair(e, r));
|
if (m_memoize) cache_save(e,r);
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue