mirror of
https://github.com/Z3Prover/z3
synced 2025-06-16 10:56:16 +00:00
Merge pull request #1 from Z3Prover/master
This commit is contained in:
commit
034e72572f
3 changed files with 115 additions and 12 deletions
|
@ -111,16 +111,6 @@ void static_features::flush_cache() {
|
||||||
m_expr2formula_depth.reset();
|
m_expr2formula_depth.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
bool static_features::is_non_linear(expr * e) const {
|
|
||||||
if (!is_arith_expr(e))
|
|
||||||
return false;
|
|
||||||
if (is_numeral(e))
|
|
||||||
return true;
|
|
||||||
if (m_autil.is_add(e))
|
|
||||||
return true; // the non
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bool static_features::is_diff_term(expr const * e, rational & r) const {
|
bool static_features::is_diff_term(expr const * e, rational & r) const {
|
||||||
// lhs can be 'x' or '(+ k x)'
|
// lhs can be 'x' or '(+ k x)'
|
||||||
|
@ -301,10 +291,12 @@ void static_features::update_core(expr * e) {
|
||||||
m_num_interpreted_constants++;
|
m_num_interpreted_constants++;
|
||||||
}
|
}
|
||||||
if (fid == m_afid) {
|
if (fid == m_afid) {
|
||||||
|
// std::cout << mk_pp(e, m_manager) << "\n";
|
||||||
switch (to_app(e)->get_decl_kind()) {
|
switch (to_app(e)->get_decl_kind()) {
|
||||||
case OP_MUL:
|
case OP_MUL:
|
||||||
if (!is_numeral(to_app(e)->get_arg(0)))
|
if (!is_numeral(to_app(e)->get_arg(0)) || to_app(e)->get_num_args() > 2) {
|
||||||
m_num_non_linear++;
|
m_num_non_linear++;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case OP_DIV:
|
case OP_DIV:
|
||||||
case OP_IDIV:
|
case OP_IDIV:
|
||||||
|
|
|
@ -978,7 +978,7 @@ namespace smt {
|
||||||
if (st.num_theories() == 2 && st.has_uf() && is_arith(st)) {
|
if (st.num_theories() == 2 && st.has_uf() && is_arith(st)) {
|
||||||
if (!st.m_has_real)
|
if (!st.m_has_real)
|
||||||
setup_QF_UFLIA(st);
|
setup_QF_UFLIA(st);
|
||||||
else if (!st.m_has_int)
|
else if (!st.m_has_int && st.m_num_non_linear == 0)
|
||||||
setup_QF_UFLRA();
|
setup_QF_UFLRA();
|
||||||
else
|
else
|
||||||
setup_unknown();
|
setup_unknown();
|
||||||
|
|
111
src/util/obj_ref_hashtable.h
Normal file
111
src/util/obj_ref_hashtable.h
Normal file
|
@ -0,0 +1,111 @@
|
||||||
|
/*++
|
||||||
|
Copyright (c) 2017 Microsoft Corporation
|
||||||
|
|
||||||
|
Module Name:
|
||||||
|
|
||||||
|
obj_ref_hashtable.h
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
|
||||||
|
corresponding obj_map with reference count managment.
|
||||||
|
|
||||||
|
Author:
|
||||||
|
|
||||||
|
Nikolaj Bjorner (nbjorner) 2017-12-8
|
||||||
|
|
||||||
|
Revision History:
|
||||||
|
|
||||||
|
--*/
|
||||||
|
#ifndef OBJ_REF_HASHTABLE_H_
|
||||||
|
#define OBJ_REF_HASHTABLE_H_
|
||||||
|
|
||||||
|
#include "util/obj_hashtable.h"
|
||||||
|
|
||||||
|
template<typename M, typename Key, typename Value>
|
||||||
|
class obj_ref_map {
|
||||||
|
M& m;
|
||||||
|
obj_map<Key, Value> m_table;
|
||||||
|
public:
|
||||||
|
obj_ref_map(M& m):m(m) {}
|
||||||
|
|
||||||
|
~obj_ref_map() { reset(); }
|
||||||
|
|
||||||
|
void reset() {
|
||||||
|
for (auto& kv : m_table) {
|
||||||
|
m.dec_ref(kv.m_key);
|
||||||
|
}
|
||||||
|
m_table.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
void finalize() {
|
||||||
|
reset();
|
||||||
|
m_table.finalize();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool empty() const { return m_table.empty(); }
|
||||||
|
|
||||||
|
unsigned size() const { return m_table.size(); }
|
||||||
|
|
||||||
|
unsigned capacity() const { return m_table.capacity(); }
|
||||||
|
|
||||||
|
iterator begin() const { return m_table.begin(); }
|
||||||
|
|
||||||
|
iterator end() const { return m_table.end(); }
|
||||||
|
|
||||||
|
void insert(Key * const k, Value const & v) {
|
||||||
|
if (!m_table.contains(k)) m.inc_ref(k);
|
||||||
|
m_table.insert(k, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
void insert(Key * const k, Value && v) {
|
||||||
|
if (!m_table.contains(k)) m.inc_ref(k);
|
||||||
|
m_table.insert(k, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
key_data const & insert_if_not_there(Key * k, Value const & v) {
|
||||||
|
if (!m_table.contains(k)) m.inc_ref(k);
|
||||||
|
return m_table.insert_if_not_there(k, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
obj_map_entry * insert_if_not_there2(Key * k, Value const & v) {
|
||||||
|
if (!m_table.contains(k)) m.inc_ref(k);
|
||||||
|
return m_table.insert_if_not_there2(k, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
obj_map_entry * find_core(Key * k) const { return m_table.find_core(k); }
|
||||||
|
|
||||||
|
bool find(Key * const k, Value & v) const { return m_table.find(k, v); }
|
||||||
|
|
||||||
|
value const & find(key * k) const { return m_table.find(k); }
|
||||||
|
|
||||||
|
value & find(key * k) { return m_table.find(k); }
|
||||||
|
|
||||||
|
value const & operator[](key * k) const { return find(k); }
|
||||||
|
|
||||||
|
value & operator[](key * k) { return find(k); }
|
||||||
|
|
||||||
|
iterator find_iterator(Key * k) const { return m_table.find_iterator(k); }
|
||||||
|
|
||||||
|
bool contains(Key * k) const { return m_table.contains(k); }
|
||||||
|
|
||||||
|
void remove(Key * k) {
|
||||||
|
if (m_table.contains(k)) {
|
||||||
|
m_table.remove(k);
|
||||||
|
m.dec_ref(k);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void erase(Key * k) { remove(k); }
|
||||||
|
|
||||||
|
unsigned long long get_num_collision() const { return m_table.get_num_collision(); }
|
||||||
|
|
||||||
|
void swap(obj_ref_map & other) {
|
||||||
|
m_table.swap(other.m_table);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* OBJ_REF_HASHTABLE_H_ */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue