mirror of
https://github.com/Z3Prover/z3
synced 2025-04-13 12:28:44 +00:00
Merge branch 'master' of https://github.com/Z3Prover/z3
This commit is contained in:
commit
cb29c07f06
|
@ -20,6 +20,7 @@ Revision History:
|
|||
#include"ast.h"
|
||||
#include"ref.h"
|
||||
#include"expr_replacer.h"
|
||||
#include"ast_translation.h"
|
||||
|
||||
/** \brief
|
||||
Information about how a formula is being converted into
|
||||
|
@ -35,7 +36,6 @@ class ackr_info {
|
|||
public:
|
||||
ackr_info(ast_manager& m)
|
||||
: m_m(m)
|
||||
, m_consts(m)
|
||||
, m_er(mk_default_expr_replacer(m))
|
||||
, m_subst(m_m)
|
||||
, m_ref_count(0)
|
||||
|
@ -43,16 +43,20 @@ class ackr_info {
|
|||
{}
|
||||
|
||||
virtual ~ackr_info() {
|
||||
m_consts.reset();
|
||||
for (t2ct::iterator i = m_t2c.begin(); i != m_t2c.end(); ++i) {
|
||||
m_m.dec_ref(i->m_key);
|
||||
m_m.dec_ref(i->m_value);
|
||||
}
|
||||
}
|
||||
|
||||
inline void set_abstr(app* term, app* c) {
|
||||
SASSERT(!m_sealed);
|
||||
SASSERT(c);
|
||||
SASSERT(c && term);
|
||||
m_t2c.insert(term,c);
|
||||
m_c2t.insert(c->get_decl(),term);
|
||||
m_subst.insert(term, c);
|
||||
m_consts.push_back(c);
|
||||
m_m.inc_ref(term);
|
||||
m_m.inc_ref(c);
|
||||
}
|
||||
|
||||
inline void abstract(expr * e, expr_ref& res) {
|
||||
|
@ -77,6 +81,17 @@ class ackr_info {
|
|||
m_er->set_substitution(&m_subst);
|
||||
}
|
||||
|
||||
virtual ackr_info * translate(ast_translation & translator) {
|
||||
ackr_info * const retv = alloc(ackr_info, translator.to());
|
||||
for (t2ct::iterator i = m_t2c.begin(); i != m_t2c.end(); ++i) {
|
||||
app * const k = translator(i->m_key);
|
||||
app * const v = translator(i->m_value);
|
||||
retv->set_abstr(k, v);
|
||||
}
|
||||
if (m_sealed) retv->seal();
|
||||
return retv;
|
||||
}
|
||||
|
||||
//
|
||||
// Reference counting
|
||||
//
|
||||
|
@ -94,7 +109,6 @@ class ackr_info {
|
|||
|
||||
t2ct m_t2c; // terms to constants
|
||||
c2tt m_c2t; // constants to terms (inversion of m_t2c)
|
||||
expr_ref_vector m_consts; // the constants introduced during abstraction
|
||||
|
||||
// replacer and substitution used to compute abstractions
|
||||
scoped_ptr<expr_replacer> m_er;
|
||||
|
|
|
@ -53,7 +53,16 @@ public:
|
|||
|
||||
//void display(std::ostream & out);
|
||||
|
||||
virtual model_converter * translate(ast_translation & translator) {NOT_IMPLEMENTED_YET();}
|
||||
virtual model_converter * translate(ast_translation & translator) {
|
||||
ackr_info_ref retv_info = info->translate(translator);
|
||||
if (fixed_model) {
|
||||
model_ref retv_mod_ref = abstr_model->translate(translator);
|
||||
return alloc(ackr_model_converter, translator.to(), retv_info, retv_mod_ref);
|
||||
}
|
||||
else {
|
||||
return alloc(ackr_model_converter, translator.to(), retv_info);
|
||||
}
|
||||
}
|
||||
protected:
|
||||
ast_manager& m;
|
||||
const ackr_info_ref info;
|
||||
|
|
|
@ -292,6 +292,19 @@ class AstRef(Z3PPObject):
|
|||
def __hash__(self):
|
||||
return self.hash()
|
||||
|
||||
def __nonzero__(self):
|
||||
return self.__bool__()
|
||||
|
||||
def __bool__(self):
|
||||
if is_true(self):
|
||||
return True
|
||||
elif is_false(self):
|
||||
return False
|
||||
elif is_eq(self) and self.num_args() == 2:
|
||||
return self.arg(0).eq(self.arg(1))
|
||||
else:
|
||||
raise Z3Exception("Symbolic expressions cannot be cast to concrete Boolean values.")
|
||||
|
||||
def sexpr(self):
|
||||
"""Return an string representing the AST node in s-expression notation.
|
||||
|
||||
|
|
|
@ -446,6 +446,7 @@ void grobner::merge_monomials(ptr_vector<monomial> & monomials) {
|
|||
SASSERT(&m_del_monomials != &monomials);
|
||||
ptr_vector<monomial>& to_delete = m_del_monomials;
|
||||
to_delete.reset();
|
||||
m_manager.limit().inc(sz);
|
||||
for (unsigned i = 1; i < sz; ++i) {
|
||||
monomial * m1 = monomials[j];
|
||||
monomial * m2 = monomials[i];
|
||||
|
|
|
@ -111,7 +111,7 @@ namespace datalog {
|
|||
bool rule_modified = false;
|
||||
for (unsigned i = 0; i < sz; i++) {
|
||||
app * tail = r->get_tail(i);
|
||||
if (is_candidate(tail)) {
|
||||
if (is_candidate(tail) && !r->is_neg_tail(i)) {
|
||||
TRACE("mk_filter_rules", tout << "is_candidate: " << mk_pp(tail, m) << "\n";);
|
||||
var_idx_set non_local_vars = rm.collect_rule_vars_ex(r, tail);
|
||||
func_decl * filter_decl = mk_filter_decl(tail, non_local_vars);
|
||||
|
|
187
src/tactic/core/collect_statistics_tactic.cpp
Normal file
187
src/tactic/core/collect_statistics_tactic.cpp
Normal file
|
@ -0,0 +1,187 @@
|
|||
/*++
|
||||
Copyright (c) 2016 Microsoft Corporation
|
||||
|
||||
Module Name:
|
||||
|
||||
collect_statistics_tactic.cpp
|
||||
|
||||
Abstract:
|
||||
|
||||
A tactic for collection of various statistics.
|
||||
|
||||
Author:
|
||||
|
||||
Mikolas Janota (mikjan) 2016-06-03
|
||||
Christoph (cwinter) 2016-06-03
|
||||
|
||||
Notes:
|
||||
|
||||
--*/
|
||||
#include<string>
|
||||
#include<map>
|
||||
|
||||
#include"ast.h"
|
||||
#include"params.h"
|
||||
#include"arith_decl_plugin.h"
|
||||
#include"array_decl_plugin.h"
|
||||
#include"bv_decl_plugin.h"
|
||||
#include"datatype_decl_plugin.h"
|
||||
#include"fpa_decl_plugin.h"
|
||||
#include"tactical.h"
|
||||
#include"stats.h"
|
||||
|
||||
#include"collect_statistics_tactic.h"
|
||||
|
||||
class collect_statistics_tactic : public tactic {
|
||||
ast_manager & m;
|
||||
params_ref m_params;
|
||||
basic_decl_plugin m_basic_pi;
|
||||
arith_decl_plugin m_arith_pi;
|
||||
array_decl_plugin m_array_pi;
|
||||
bv_decl_plugin m_bv_pi;
|
||||
datatype_decl_plugin m_datatype_pi;
|
||||
fpa_decl_plugin m_fpa_pi;
|
||||
|
||||
typedef std::map<std::string, unsigned long> stats_type;
|
||||
stats_type m_stats;
|
||||
|
||||
public:
|
||||
collect_statistics_tactic(ast_manager & m, params_ref const & p) :
|
||||
m(m),
|
||||
m_params(p) {
|
||||
}
|
||||
|
||||
virtual ~collect_statistics_tactic() {}
|
||||
|
||||
virtual tactic * translate(ast_manager & m_) {
|
||||
return alloc(collect_statistics_tactic, m_, m_params);
|
||||
}
|
||||
|
||||
virtual void updt_params(params_ref const & p) {
|
||||
m_params = p;
|
||||
}
|
||||
|
||||
virtual void collect_param_descrs(param_descrs & r) {}
|
||||
|
||||
virtual void operator()(goal_ref const & g, goal_ref_buffer & result,
|
||||
model_converter_ref & mc, proof_converter_ref & pc,
|
||||
expr_dependency_ref & core) {
|
||||
mc = 0;
|
||||
tactic_report report("collect-statistics", *g);
|
||||
|
||||
collect_proc cp(m, m_stats);
|
||||
expr_mark visited;
|
||||
const unsigned sz = g->size();
|
||||
for (unsigned i = 0; i < sz; i++)
|
||||
for_each_expr(cp, visited, g->form(i));
|
||||
|
||||
std::cout << "(" << std::endl;
|
||||
stats_type::iterator it = m_stats.begin();
|
||||
stats_type::iterator end = m_stats.end();
|
||||
for (; it != end; it++)
|
||||
std::cout << " :" << it->first << " " << it->second << std::endl;
|
||||
std::cout << ")" << std::endl;
|
||||
|
||||
g->inc_depth();
|
||||
result.push_back(g.get());
|
||||
}
|
||||
|
||||
virtual void cleanup() {}
|
||||
|
||||
virtual void collect_statistics(statistics & st) const {
|
||||
}
|
||||
|
||||
virtual void reset_statistics() { reset(); }
|
||||
virtual void reset() { cleanup(); }
|
||||
|
||||
protected:
|
||||
class collect_proc {
|
||||
public:
|
||||
ast_manager & m;
|
||||
stats_type & m_stats;
|
||||
obj_hashtable<sort> m_seen_sorts;
|
||||
obj_hashtable<func_decl> m_seen_func_decls;
|
||||
|
||||
collect_proc(ast_manager & m, stats_type & s) : m(m), m_stats(s) {}
|
||||
|
||||
void operator()(var * v) {
|
||||
m_stats["bound-variables"]++;
|
||||
this->operator()(v->get_sort());
|
||||
}
|
||||
|
||||
void operator()(quantifier * q) {
|
||||
m_stats["quantifiers"]++;
|
||||
SASSERT(is_app(q->get_expr()));
|
||||
app * body = to_app(q->get_expr());
|
||||
this->operator()(body);
|
||||
}
|
||||
|
||||
void operator()(app * n) {
|
||||
m_stats["function-applications"]++;
|
||||
this->operator()(n->get_decl());
|
||||
}
|
||||
|
||||
void operator()(sort * s) {
|
||||
if (m.is_uninterp(s)) {
|
||||
if (!m_seen_sorts.contains(s)) {
|
||||
m_stats["uninterpreted-sorts"]++;
|
||||
m_seen_sorts.insert(s);
|
||||
}
|
||||
m_stats["uninterpreted-sort-occurrences"]++;
|
||||
}
|
||||
else {
|
||||
params_ref prms;
|
||||
prms.set_bool("pp.single_line", true);
|
||||
std::stringstream ss;
|
||||
ss << "(declare-sort " << mk_ismt2_pp(s, m, prms) << ")";
|
||||
m_stats[ss.str()]++;
|
||||
|
||||
if (s->get_info()->get_num_parameters() > 0) {
|
||||
std::stringstream ssname;
|
||||
ssname << "(declare-sort (_ " << s->get_name() << " *))";
|
||||
m_stats[ssname.str()]++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void operator()(func_decl * f) {
|
||||
for (unsigned i = 0; i < f->get_arity(); i++)
|
||||
this->operator()(f->get_domain()[i]);
|
||||
this->operator()(f->get_range());
|
||||
|
||||
if (f->get_family_id() == null_family_id) {
|
||||
if (!m_seen_func_decls.contains(f)) {
|
||||
if (f->get_arity() == 0)
|
||||
m_stats["uninterpreted-constants"]++;
|
||||
else
|
||||
m_stats["uninterpreted-functions"]++;
|
||||
m_seen_func_decls.insert(f);
|
||||
}
|
||||
|
||||
if (f->get_arity() > 0)
|
||||
m_stats["uninterpreted-function-occurrences"]++;
|
||||
}
|
||||
else {
|
||||
params_ref prms;
|
||||
prms.set_bool("pp.single_line", true);
|
||||
std::stringstream ss;
|
||||
ss << mk_ismt2_pp(f, m, prms);
|
||||
m_stats[ss.str()]++;
|
||||
|
||||
std::stringstream ssfname;
|
||||
if (f->get_num_parameters() > 0)
|
||||
ssfname << "(declare-fun (_ " << f->get_name() << " *) *)";
|
||||
else
|
||||
ssfname << "(declare-fun " << f->get_name() << " *)";
|
||||
m_stats[ssfname.str()]++;
|
||||
}
|
||||
|
||||
m_stats["function-applications"]++;
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
tactic * mk_collect_statistics_tactic(ast_manager & m, params_ref const & p) {
|
||||
return clean(alloc(collect_statistics_tactic, m, p));
|
||||
}
|
33
src/tactic/core/collect_statistics_tactic.h
Normal file
33
src/tactic/core/collect_statistics_tactic.h
Normal file
|
@ -0,0 +1,33 @@
|
|||
/*++
|
||||
Copyright (c) 2016 Microsoft Corporation
|
||||
|
||||
Module Name:
|
||||
|
||||
collect_statistics_tactic.h
|
||||
|
||||
Abstract:
|
||||
|
||||
A tactic for collection of various statistics.
|
||||
|
||||
Author:
|
||||
|
||||
Mikolas Janota (mikjan) 2016-06-03
|
||||
Christoph (cwinter) 2016-06-03
|
||||
|
||||
Notes:
|
||||
|
||||
--*/
|
||||
#ifndef COLLECT_STATISTICS_H_
|
||||
#define COLLECT_STATISTICS_H_
|
||||
|
||||
#include"params.h"
|
||||
class ast_manager;
|
||||
class tactic;
|
||||
|
||||
tactic * mk_collect_statistics_tactic(ast_manager & m, params_ref const & p = params_ref());
|
||||
/*
|
||||
ADD_TACTIC("collect-statistics", "Collects various statistics.", "mk_collect_statistics_tactic(m, p)")
|
||||
*/
|
||||
|
||||
|
||||
#endif
|
Loading…
Reference in a new issue