mirror of
https://github.com/Z3Prover/z3
synced 2025-04-24 01:25:31 +00:00
merge
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
commit
dc879dc3fb
74 changed files with 585 additions and 259 deletions
|
@ -70,6 +70,10 @@ public:
|
|||
m_set(s.m_set) {
|
||||
}
|
||||
|
||||
void set(R s) { m_set = s; }
|
||||
|
||||
R get() const { return m_set; }
|
||||
|
||||
void insert(T const & e) {
|
||||
m_set |= e2s(e);
|
||||
}
|
||||
|
@ -162,7 +166,7 @@ class approx_set : public u_approx_set {
|
|||
public:
|
||||
approx_set():u_approx_set() {}
|
||||
approx_set(unsigned e):u_approx_set(e) {}
|
||||
|
||||
|
||||
class iterator {
|
||||
unsigned long long m_set;
|
||||
unsigned m_val;
|
||||
|
|
|
@ -139,7 +139,7 @@ public:
|
|||
if (empty()) {
|
||||
return;
|
||||
}
|
||||
memset(m_value2indices.begin(), 0, sizeof(int) * m_value2indices.size());
|
||||
memset(m_value2indices.data(), 0, sizeof(int) * m_value2indices.size());
|
||||
m_values.reset();
|
||||
m_values.push_back(-1);
|
||||
CASSERT("heap", check_invariant());
|
||||
|
@ -244,11 +244,11 @@ public:
|
|||
}
|
||||
|
||||
iterator begin() {
|
||||
return m_values.begin() + 1;
|
||||
return m_values.data() + 1;
|
||||
}
|
||||
|
||||
iterator end() {
|
||||
return m_values.end();
|
||||
return m_values.data() + m_values.size();
|
||||
}
|
||||
|
||||
const_iterator begin() const {
|
||||
|
|
|
@ -112,7 +112,7 @@ class mpff_manager {
|
|||
|
||||
unsigned m_precision; //!< Number of words in the significand. Must be an even number.
|
||||
unsigned m_precision_bits; //!< Number of bits in the significand. Must be 32*m_precision.
|
||||
unsigned_vector m_significands; //!< Array containing all significands.
|
||||
mutable unsigned_vector m_significands; //!< Array containing all significands.
|
||||
unsigned m_capacity; //!< Number of significands that can be stored in m_significands.
|
||||
bool m_to_plus_inf; //!< If True, then round to plus infinity, otherwise to minus infinity
|
||||
id_gen m_id_gen;
|
||||
|
|
|
@ -258,7 +258,7 @@ void mpfx_manager::set_core(mpfx & n, mpz_manager<SYNCH> & m, mpz const & v) {
|
|||
m_tmp_digits.reset();
|
||||
allocate_if_needed(n);
|
||||
n.m_sign = m.decompose(v, m_tmp_digits);
|
||||
unsigned sz = m_tmp_digits.size();
|
||||
auto sz = m_tmp_digits.size();
|
||||
if (sz > m_int_part_sz)
|
||||
throw overflow_exception();
|
||||
unsigned * w = words(n);
|
||||
|
@ -299,7 +299,7 @@ void mpfx_manager::set_core(mpfx & n, mpq_manager<SYNCH> & m, mpq const & v) {
|
|||
}
|
||||
m_tmp_digits.reset();
|
||||
m.decompose(tmp, m_tmp_digits);
|
||||
unsigned sz = m_tmp_digits.size();
|
||||
auto sz = m_tmp_digits.size();
|
||||
if (sz > m_total_sz)
|
||||
throw overflow_exception();
|
||||
unsigned * w = words(n);
|
||||
|
|
|
@ -81,11 +81,11 @@ class mpfx_manager {
|
|||
unsigned m_int_part_sz;
|
||||
unsigned m_frac_part_sz;
|
||||
unsigned m_total_sz; //!< == m_int_part_sz + m_frac_part_sz
|
||||
unsigned_vector m_words; //!< Array containing all words
|
||||
mutable unsigned_vector m_words; //!< Array containing all words
|
||||
unsigned m_capacity; //!< Number of mpfx numerals that can be stored in m_words.
|
||||
bool m_to_plus_inf; //!< If True, then round to plus infinity, otherwise to minus infinity
|
||||
id_gen m_id_gen;
|
||||
unsigned_vector m_buffer0, m_buffer1, m_buffer2;
|
||||
mutable unsigned_vector m_buffer0, m_buffer1, m_buffer2;
|
||||
unsigned_vector m_tmp_digits;
|
||||
mpfx m_one;
|
||||
mpn_manager m_mpn_manager;
|
||||
|
|
|
@ -52,10 +52,14 @@ Revision History:
|
|||
// This is needed for _tzcnt_u32 and friends.
|
||||
#include <immintrin.h>
|
||||
#define _trailing_zeros32(X) _tzcnt_u32(X)
|
||||
#endif
|
||||
|
||||
#if defined(__GNUC__)
|
||||
#elif defined(__GNUC__)
|
||||
#define _trailing_zeros32(X) __builtin_ctz(X)
|
||||
#else
|
||||
static uint32_t _trailing_zeros32(uint32_t x) {
|
||||
uint32_t r = 0;
|
||||
for (; 0 == (x & 1) && r < 32; ++r, x >>= 1);
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if (defined(__LP64__) || defined(_WIN64)) && !defined(_M_ARM) && !defined(_M_ARM64)
|
||||
|
@ -65,23 +69,11 @@ Revision History:
|
|||
#define _trailing_zeros64(X) _tzcnt_u64(X)
|
||||
#endif
|
||||
#else
|
||||
inline uint64_t _trailing_zeros64(uint64_t x) {
|
||||
static uint64_t _trailing_zeros64(uint64_t x) {
|
||||
uint64_t r = 0;
|
||||
for (; 0 == (x & 1) && r < 64; ++r, x >>= 1);
|
||||
return r;
|
||||
}
|
||||
|
||||
#if defined(_WINDOWS) && !defined(_M_ARM) && !defined(_M_ARM64)
|
||||
// _trailing_zeros32 already defined using intrinsics
|
||||
#elif defined(__GNUC__)
|
||||
// _trailing_zeros32 already defined using intrinsics
|
||||
#else
|
||||
inline uint32_t _trailing_zeros32(uint32_t x) {
|
||||
uint32_t r = 0;
|
||||
for (; 0 == (x & 1) && r < 32; ++r, x >>= 1);
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
unsigned trailing_zeros(uint32_t x) {
|
||||
|
@ -1723,8 +1715,8 @@ void mpz_manager<SYNCH>::display(std::ostream & out, mpz const & a) const {
|
|||
// GMP version
|
||||
size_t sz = mpz_sizeinbase(*a.m_ptr, 10) + 2;
|
||||
sbuffer<char, 1024> buffer(sz, 0);
|
||||
mpz_get_str(buffer.c_ptr(), 10, *a.m_ptr);
|
||||
out << buffer.c_ptr();
|
||||
mpz_get_str(buffer.data(), 10, *a.m_ptr);
|
||||
out << buffer.data();
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
@ -1783,11 +1775,11 @@ void mpz_manager<SYNCH>::display_hex(std::ostream & out, mpz const & a, unsigned
|
|||
unsigned requiredLength = num_bits / 4;
|
||||
unsigned padding = requiredLength > sz ? requiredLength - sz : 0;
|
||||
sbuffer<char, 1024> buffer(sz, 0);
|
||||
mpz_get_str(buffer.c_ptr(), 16, *(a.m_ptr));
|
||||
mpz_get_str(buffer.data(), 16, *(a.m_ptr));
|
||||
for (unsigned i = 0; i < padding; ++i) {
|
||||
out << "0";
|
||||
}
|
||||
out << buffer.c_ptr() + (sz > requiredLength ? sz - requiredLength : 0);
|
||||
out << buffer.data() + (sz > requiredLength ? sz - requiredLength : 0);
|
||||
#endif
|
||||
}
|
||||
out.copyfmt(fmt);
|
||||
|
@ -1837,11 +1829,11 @@ void mpz_manager<SYNCH>::display_bin(std::ostream & out, mpz const & a, unsigned
|
|||
size_t sz = mpz_sizeinbase(*(a.m_ptr), 2);
|
||||
unsigned padding = num_bits > sz ? num_bits - sz : 0;
|
||||
sbuffer<char, 1024> buffer(sz, 0);
|
||||
mpz_get_str(buffer.c_ptr(), 2, *(a.m_ptr));
|
||||
mpz_get_str(buffer.data(), 2, *(a.m_ptr));
|
||||
for (unsigned i = 0; i < padding; ++i) {
|
||||
out << "0";
|
||||
}
|
||||
out << buffer.c_ptr() + (sz > num_bits ? sz - num_bits : 0);
|
||||
out << buffer.data() + (sz > num_bits ? sz - num_bits : 0);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
|
|
@ -58,28 +58,28 @@ public:
|
|||
ref_vector_core(ref_vector_core &&) noexcept = default;
|
||||
|
||||
~ref_vector_core() {
|
||||
dec_range_ref(m_nodes.begin(), m_nodes.end());
|
||||
dec_range_ref(m_nodes.data(), m_nodes.data() + m_nodes.size());
|
||||
}
|
||||
|
||||
void reset() {
|
||||
dec_range_ref(m_nodes.begin(), m_nodes.end());
|
||||
dec_range_ref(m_nodes.data(), m_nodes.data() + m_nodes.size());
|
||||
m_nodes.reset();
|
||||
}
|
||||
|
||||
void finalize() {
|
||||
dec_range_ref(m_nodes.begin(), m_nodes.end());
|
||||
dec_range_ref(m_nodes.data(), m_nodes.data() + m_nodes.size());
|
||||
m_nodes.finalize();
|
||||
}
|
||||
|
||||
void resize(unsigned sz) {
|
||||
if (sz < m_nodes.size())
|
||||
dec_range_ref(m_nodes.begin() + sz, m_nodes.end());
|
||||
dec_range_ref(m_nodes.data() + sz, m_nodes.data() + m_nodes.size());
|
||||
m_nodes.resize(sz);
|
||||
}
|
||||
|
||||
void resize(unsigned sz, T * d) {
|
||||
if (sz < m_nodes.size()) {
|
||||
dec_range_ref(m_nodes.begin() + sz, m_nodes.end());
|
||||
dec_range_ref(m_nodes.data() + sz, m_nodes.data() + m_nodes.size());
|
||||
m_nodes.shrink(sz);
|
||||
}
|
||||
else {
|
||||
|
@ -130,11 +130,11 @@ public:
|
|||
|
||||
T * get(unsigned idx, T * d) const { return m_nodes.get(idx, d); }
|
||||
|
||||
T * const * data() const { return m_nodes.begin(); }
|
||||
T * const * data() const { return m_nodes.data(); }
|
||||
|
||||
typedef T* const* iterator;
|
||||
|
||||
T ** data() { return m_nodes.begin(); }
|
||||
T ** data() { return m_nodes.data(); }
|
||||
|
||||
unsigned hash() const {
|
||||
unsigned sz = size();
|
||||
|
|
|
@ -39,7 +39,7 @@ public:
|
|||
}
|
||||
|
||||
void reset() {
|
||||
unsigned sz = this->size();
|
||||
auto sz = this->size();
|
||||
for (unsigned i = 0; i < sz; i++) {
|
||||
m().del(this->operator[](i));
|
||||
}
|
||||
|
|
|
@ -80,7 +80,7 @@ public:
|
|||
|
||||
// Insert in the this object the elements in the set source.
|
||||
uint_set & operator |=(const uint_set & source) {
|
||||
unsigned source_size = source.size();
|
||||
auto source_size = source.size();
|
||||
if (source_size > size()) {
|
||||
resize(source_size + 1);
|
||||
}
|
||||
|
@ -91,7 +91,7 @@ public:
|
|||
}
|
||||
|
||||
uint_set& operator &=(const uint_set& source) {
|
||||
unsigned source_size = source.size();
|
||||
auto source_size = source.size();
|
||||
if (source_size < size()) {
|
||||
resize(source_size);
|
||||
}
|
||||
|
@ -102,7 +102,7 @@ public:
|
|||
}
|
||||
|
||||
bool operator==(const uint_set & source) const {
|
||||
unsigned min_size = size();
|
||||
auto min_size = size();
|
||||
if (source.size() < min_size) {
|
||||
min_size = source.size();
|
||||
}
|
||||
|
@ -111,12 +111,12 @@ public:
|
|||
return false;
|
||||
}
|
||||
}
|
||||
for (unsigned i = min_size; i < size(); ++i) {
|
||||
for (auto i = min_size; i < size(); ++i) {
|
||||
if ((*this)[i]) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
for (unsigned i = min_size; i < source.size(); ++i) {
|
||||
for (auto i = min_size; i < source.size(); ++i) {
|
||||
if (source[i]) {
|
||||
return false;
|
||||
}
|
||||
|
@ -131,7 +131,7 @@ public:
|
|||
|
||||
// Return true if the this set is a subset of source.
|
||||
bool subset_of(const uint_set & source) const {
|
||||
unsigned min_size = size();
|
||||
auto min_size = size();
|
||||
if (source.size() < min_size) {
|
||||
min_size = source.size();
|
||||
}
|
||||
|
@ -140,7 +140,7 @@ public:
|
|||
return false;
|
||||
}
|
||||
}
|
||||
for (unsigned i = min_size; i < size(); ++i) {
|
||||
for (auto i = min_size; i < size(); ++i) {
|
||||
if ((*this)[i]) {
|
||||
return false;
|
||||
}
|
||||
|
@ -252,7 +252,7 @@ public:
|
|||
void remove(unsigned v) {
|
||||
if (contains(v)) {
|
||||
m_in_set[v] = false;
|
||||
unsigned i = m_set.size();
|
||||
auto i = m_set.size();
|
||||
for (; i > 0 && m_set[--i] != v; )
|
||||
;
|
||||
SASSERT(m_set[i] == v);
|
||||
|
@ -282,7 +282,7 @@ public:
|
|||
iterator end() const { return m_set.end(); }
|
||||
// void reset() { m_set.reset(); m_in_set.reset(); }
|
||||
void reset() {
|
||||
unsigned sz = m_set.size();
|
||||
auto sz = m_set.size();
|
||||
for (unsigned i = 0; i < sz; ++i) m_in_set[m_set[i]] = false;
|
||||
m_set.reset();
|
||||
}
|
||||
|
|
|
@ -134,6 +134,14 @@ public:
|
|||
CASSERT("union_find", check_invariant());
|
||||
}
|
||||
|
||||
void set_root(unsigned v, unsigned root) {
|
||||
TRACE("union_find", tout << "merging " << v << " " << root << "\n";);
|
||||
SASSERT(v != root);
|
||||
m_find[v] = root;
|
||||
m_size[root] += m_size[v];
|
||||
std::swap(m_next[root], m_next[v]);
|
||||
}
|
||||
|
||||
// dissolve equivalence class of v
|
||||
// this method cannot be used with backtracking.
|
||||
void dissolve(unsigned v) {
|
||||
|
|
|
@ -40,6 +40,125 @@ Revision History:
|
|||
#pragma warning(disable:4127)
|
||||
#endif
|
||||
|
||||
|
||||
#if 0
|
||||
|
||||
// portability guide to std::vector.
|
||||
// memory allocator should be based on memory_allocator<T>
|
||||
//
|
||||
// template<typename T>
|
||||
// struct memory_allocator {
|
||||
// typedef T value_type;
|
||||
// etc (interface seems to change between C++17, 20 versions)
|
||||
// };
|
||||
//
|
||||
|
||||
// Note:
|
||||
// polynomial.h contains declaration
|
||||
// typedef svector<numeral> numeral_vector;
|
||||
// it is crucial that it uses svector and not vector. The destructors on elements of the numeral vector are handled outside.
|
||||
// Numeral gets instantiated by mpz and mpz does not support copy constructors.
|
||||
// porting svector to vector is therefore blocked on the semantics of svector being
|
||||
// copy-constructor free.
|
||||
//
|
||||
|
||||
#include <vector>
|
||||
|
||||
template<typename T, bool CallDestructors=true, typename SZ = unsigned>
|
||||
class vector : public std::vector<T> {
|
||||
public:
|
||||
typedef T data_t;
|
||||
typedef typename std::vector<T>::iterator iterator;
|
||||
|
||||
vector() {}
|
||||
vector(SZ s) {
|
||||
// TODO resize(s, T());
|
||||
}
|
||||
vector(SZ s, T const& e) {
|
||||
// TODO resize(s, e);
|
||||
}
|
||||
|
||||
vector(SZ s, T const* e) {
|
||||
// TODO
|
||||
}
|
||||
|
||||
void reset() { clear(); }
|
||||
void finalize() { clear(); }
|
||||
void reserve(SZ s, T const & d) {
|
||||
if (s > size())
|
||||
resize(s, d);
|
||||
}
|
||||
void reserve(SZ s) {
|
||||
|
||||
}
|
||||
|
||||
void setx(SZ idx, T const & elem, T const & d) {
|
||||
if (idx >= size())
|
||||
resize(idx+1, d);
|
||||
(*this)[idx] = elem;
|
||||
}
|
||||
|
||||
T const & get(SZ idx, T const & d) const {
|
||||
if (idx >= size()) {
|
||||
return d;
|
||||
}
|
||||
return (*this)[idx];
|
||||
}
|
||||
|
||||
void insert(T const & elem) {
|
||||
push_back(elem);
|
||||
}
|
||||
|
||||
void erase(iterator pos) {
|
||||
// TODO
|
||||
}
|
||||
|
||||
void erase(T const& e) {
|
||||
// TODO
|
||||
}
|
||||
void fill(T const & elem) {
|
||||
for (auto& e : *this)
|
||||
e = elem;
|
||||
}
|
||||
|
||||
void fill(unsigned sz, T const & elem) {
|
||||
resize(sz);
|
||||
fill(elem);
|
||||
}
|
||||
|
||||
void shrink(SZ s) {
|
||||
resize(s);
|
||||
}
|
||||
void reverse() {
|
||||
SZ sz = size();
|
||||
for (SZ i = 0; i < sz/2; ++i) {
|
||||
std::swap((*this)[i], (*this)[sz-i-1]);
|
||||
}
|
||||
}
|
||||
|
||||
void append(vector<T, CallDestructors> const & other) {
|
||||
for(SZ i = 0; i < other.size(); ++i) {
|
||||
push_back(other[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void append(unsigned n, T const* elems) {
|
||||
// TODO
|
||||
}
|
||||
|
||||
bool contains(T const & elem) const {
|
||||
for (auto const& e : *this)
|
||||
if (e == elem)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
#else
|
||||
|
||||
template<typename T, bool CallDestructors=true, typename SZ = unsigned>
|
||||
class vector {
|
||||
#define SIZE_IDX -1
|
||||
|
@ -602,6 +721,8 @@ public:
|
|||
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
template<typename T>
|
||||
class ptr_vector : public vector<T *, false> {
|
||||
public:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue