3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-24 01:25:31 +00:00
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2021-05-03 12:41:14 -07:00
commit dc879dc3fb
74 changed files with 585 additions and 259 deletions

View file

@ -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;

View file

@ -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 {

View file

@ -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;

View file

@ -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);

View file

@ -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;

View file

@ -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
}
}

View file

@ -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();

View file

@ -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));
}

View file

@ -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();
}

View file

@ -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) {

View file

@ -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: