mirror of
https://github.com/Z3Prover/z3
synced 2025-12-09 13:23:23 +00:00
* reorg sls * sls * na * split into base and plugin * move sat_params to params directory, add op_def repair options * move sat_ddfw to sls, initiate sls-bv-plugin * porting bv-sls * adding basic plugin * na Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * add sls-sms solver * bv updates * updated dependencies Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * updated dependencies Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * use portable ptr-initializer Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * move definitions to cpp Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * use template<> syntax Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fix compiler errors for gcc Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * Bump docker/build-push-action from 6.0.0 to 6.1.0 (#7265) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 6.0.0 to 6.1.0. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/v6.0.0...v6.1.0) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * set clean shutdown for local search and re-enable local search when it parallelizes with PB solver Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * Bump docker/build-push-action from 6.1.0 to 6.2.0 (#7269) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 6.1.0 to 6.2.0. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/v6.1.0...v6.2.0) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Fix a comment for Z3_solver_from_string (#7271) Z3_solver_from_string accepts a string buffer with solver assertions, not a string buffer with filename. * trigger the build with a comment change Signed-off-by: Lev Nachmanson <levnach@hotmail.com> * remove macro distinction #7270 * fix #7268 * kludge to address #7232, probably superseeded by planned revision to setup/pypi Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * add new ema invariant (#7288) * Bump docker/build-push-action from 6.2.0 to 6.3.0 (#7280) Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 6.2.0 to 6.3.0. - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/v6.2.0...v6.3.0) --- updated-dependencies: - dependency-name: docker/build-push-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * merge Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fix unit test build Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * remove shared attribute Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * remove stale files Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fix build of unit test Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fixes and rename sls-cc to sls-euf-plugin Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * na Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * testing / debugging arithmetic * updates to repair logic, mainly arithmetic * fixes to sls * evolve sls arith * bugfixes in sls-arith * fix typo Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * bug fixes * Update sls_test.cpp * fixes * fixes Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fix build Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * refactor basic plugin and clause generation Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fixes to ite and other Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * updates * update Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fix division by 0 Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * disable fail restart Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * disable tabu when using reset moves Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * update sls_test Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * add factoring Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fixes to semantics Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * re-add tabu override Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * generalize factoring Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fix bug Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * remove restart Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * disable tabu in fallback modes Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * localize impact of factoring Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * delay factoring Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * flatten products Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * perform lookahead update + nested mul Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * disable nested mul Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * disable nested mul, use non-lookahead Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * make reset updates recursive Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * include linear moves Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * include 5% reset probability Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * separate linear update Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * separate linear update remove 20% threshold Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * remove linear opt Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * enable multiplier expansion, enable linear move Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * use unit coefficients for muls Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * disable non-tabu version of find_nl_moves Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * remove coefficient from multiplication definition Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * reorg monomials Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * add smt params to path Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * avoid negative reward Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * use reward as proxy for score Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * use reward as proxy for score Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * use exponential decay with breaks Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * use std::pow Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fixes to bv Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fixes to fixed Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fixup repairs Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * reserve for multiplication Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fixing repair Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * include bounds checks in set random * na * fixes to mul Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fix mul inverse Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fixes to handling signed operators Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * logging and fixes Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * gcm Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * peli Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * Add .env to gitignore to prevent environment files from being tracked * Add m_num_pelis counter to stats in sls_context * Remove m_num_pelis member from stats struct in sls_context * Enhance bv_sls_eval with improved repair and logging, refine is_bv_predicate in sls_bv_plugin * Remove verbose logging in register_term function of sls_basic_plugin and fix formatting in sls_context * Rename source files for consistency in `src/ast/sls` directory * Refactor bv_sls files to sls_bv with namespace and class name adjustments * Remove typename from member declarations in bv_fixed class * fixing conca Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * Add initial implementation of bit-vector SLS evaluation module in bv_sls_eval.cpp * Remove bv_sls_eval.cpp as part of code cleanup and refactoring * Refactor alignment of member variables in bv_plugin of sls namespace * Rename SLS engine related files to reflect their specific use for bit-vectors * Refactor SLS engine and evaluator components for bit-vector specifics and adjust memory manager alignment * Enhance bv_eval with use_current, lookahead strategies, and randomization improvements in SLS module * Refactor verbose logging and fix logic in range adjustment functions in sls bv modules * Remove commented verbose output in sls_bv_plugin.cpp during repair process * Add early return after setting fixed subterms in sls_bv_fixed.cpp * Remove redundant return statement in sls_bv_fixed.cpp * fixes to new value propagation Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * Refactor sls bv evaluation and fix logic checks for bit operations * Add array plugin support and update bv_eval in ast_sls module * Add array, model value, and user sort plugins to SLS module with enhancements in array propagation logic * Refactor array_plugin in sls to improve handling of select expressions with multiple arguments * Enhance array plugin with early termination and propagation verification, and improve euf and user sort plugins with propagation adjustments and debugging enhancements * Add support for handling 'distinct' expressions in SLS context and user sort plugin * Remove model value and user sort plugins from SLS theory * replace user plugin by euf plugin Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * remove extra file Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * Refactor handling of term registration and enhance distinct handling in sls_euf_plugin * Add TODO list for enhancements in sls_euf_plugin.cpp * add incremental mode * updated package * fix sls build Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * break sls build Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fix build * break build again * fix build Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fixes Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fixing incremental Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * avoid units Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fixup handling of disequality propagation Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fx Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * recover shift-weight loop Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * alternate Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * throttle save model Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * allow for alternating Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fix test for new signature of flip Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * bug fixes Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * restore use of value_hash Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fixes Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * adding dt plugin Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * adt Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * dt updates Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * added cycle detection Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * updated sls-datatype Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * Refactor context management, improve datatype handling, and enhance logging in sls plugins. * axiomatize dt Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * add missing factory plugins to model Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fixup finite domain search Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fixup finite domain search Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fixes Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * redo dfs Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fixing model construction for underspecified operators Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fixes to occurs check Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fixup interpretation building Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * saturate worklist Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * delay distinct axiom Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * adding model-based sls for datatatypes * update the interface in sls_solver to transfer phase between SAT and SLS * add value transfer option Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * rename aux functions * Track shared variables using a unit set * debugging parallel integration * fix dirty flag setting * update log level * add plugin to smt_context, factor out sls_smt_plugin functionality. * bug fixes * fixes * use common infrastructure for sls-smt * fix build Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fix build Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * remove declaration of context Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * add virtual destructor Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * build warnings Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * reorder inclusion order to define smt_context before theory_sls Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * change namespace for single threaded Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * check delayed eqs before nla Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * use independent completion flag for sls to avoid conflating with genuine cancelation * validate sls-arith lemmas Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * bugfixes Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * add intblast to legacy SMT solver * fixup model generation for theory_intblast Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * na Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * mk_value needs to accept more cases where integer expression doesn't evalate Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * use th-axioms to track origins of assertions Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * add missing operator handling for bitwise operators Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * add missing operator handling for bitwise operators Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * normalizing inequality Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * add virtual destructor Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * rework elim_unconstrained * fix non-termination Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * use glue as computed without adjustment * update model generation to fix model bug Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fixes to model construction * remove package and package lock Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * fix build warning Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> * use original gai Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> --------- Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com> Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: Lev Nachmanson <levnach@hotmail.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Sergey Bronnikov <estetus@gmail.com> Co-authored-by: Lev Nachmanson <levnach@hotmail.com> Co-authored-by: LiviaSun <33578456+ChuyueSun@users.noreply.github.com>
350 lines
11 KiB
C++
350 lines
11 KiB
C++
/*++
|
|
Copyright (c) 2024 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
sls_bv_valuation.h
|
|
|
|
Abstract:
|
|
|
|
A Stochastic Local Search (SLS) engine
|
|
|
|
Author:
|
|
|
|
Nikolaj Bjorner (nbjorner) 2024-02-07
|
|
|
|
--*/
|
|
#pragma once
|
|
|
|
#include "util/lbool.h"
|
|
#include "util/params.h"
|
|
#include "util/scoped_ptr_vector.h"
|
|
#include "util/uint_set.h"
|
|
#include "util/mpz.h"
|
|
#include "util/rational.h"
|
|
|
|
namespace sls {
|
|
|
|
class bvect : public svector<digit_t> {
|
|
public:
|
|
unsigned bw = 0;
|
|
unsigned nw = 0;
|
|
unsigned mask = 0;
|
|
|
|
bvect() = default;
|
|
bvect(unsigned sz) : svector(sz, (unsigned)0) {}
|
|
void set_bw(unsigned bw);
|
|
|
|
void copy_to(unsigned nw, bvect & dst) const {
|
|
SASSERT(nw <= this->size());
|
|
for (unsigned i = 0; i < nw; ++i)
|
|
dst[i] = (*this)[i];
|
|
}
|
|
|
|
void set(unsigned bit_idx, bool val) {
|
|
auto _val = static_cast<digit_t>(0 - static_cast<digit_t>(val));
|
|
get_bit_word(bit_idx) ^= (_val ^ get_bit_word(bit_idx)) & get_pos_mask(bit_idx);
|
|
}
|
|
|
|
bool get(unsigned bit_idx) const {
|
|
return (get_bit_word(bit_idx) & get_pos_mask(bit_idx)) != 0;
|
|
}
|
|
|
|
unsigned parity() const {
|
|
SASSERT(bw > 0);
|
|
for (unsigned i = 0; i < nw; ++i)
|
|
if ((*this)[i] != 0)
|
|
return (8 * sizeof(digit_t) * i) + trailing_zeros((*this)[i]);
|
|
return bw;
|
|
}
|
|
|
|
void set_zero() {
|
|
for (unsigned i = 0; i < nw; ++i)
|
|
(*this)[i] = 0;
|
|
}
|
|
|
|
bvect& set_shift_right(bvect const& a, bvect const& b);
|
|
bvect& set_shift_right(bvect const& a, unsigned shift);
|
|
bvect& set_shift_left(bvect const& a, bvect const& b);
|
|
|
|
rational get_value(unsigned nw) const;
|
|
|
|
unsigned to_nat(unsigned max_n) const;
|
|
|
|
|
|
friend bool operator==(bvect const& a, bvect const& b);
|
|
friend bool operator<(bvect const& a, bvect const& b);
|
|
friend bool operator>(bvect const& a, bvect const& b);
|
|
friend bool operator<=(bvect const& a, bvect const& b);
|
|
friend bool operator>=(bvect const& a, bvect const& b);
|
|
friend bool operator<=(digit_t a, bvect const& b);
|
|
friend bool operator<=(bvect const& a, digit_t b);
|
|
friend std::ostream& operator<<(std::ostream& out, bvect const& v);
|
|
|
|
private:
|
|
|
|
static digit_t get_pos_mask(unsigned bit_idx) {
|
|
return (digit_t)1 << (digit_t)(bit_idx % (8 * sizeof(digit_t)));
|
|
}
|
|
|
|
digit_t get_bit_word(unsigned bit_idx) const {
|
|
return (*this)[bit_idx / (8 * sizeof(digit_t))];
|
|
}
|
|
|
|
digit_t& get_bit_word(unsigned bit_idx) {
|
|
return (*this)[bit_idx / (8 * sizeof(digit_t))];
|
|
}
|
|
};
|
|
|
|
bool operator==(bvect const& a, bvect const& b);
|
|
bool operator<(bvect const& a, bvect const& b);
|
|
bool operator<=(bvect const& a, bvect const& b);
|
|
bool operator>=(bvect const& a, bvect const& b);
|
|
bool operator>(bvect const& a, bvect const& b);
|
|
inline bool operator!=(bvect const& a, bvect const& b) { return !(a == b); }
|
|
std::ostream& operator<<(std::ostream& out, bvect const& v);
|
|
|
|
class bv_valuation {
|
|
protected:
|
|
bvect m_bits;
|
|
bvect m_lo, m_hi; // range assignment to bit-vector, as wrap-around interval
|
|
bvect m_tmp;
|
|
unsigned m_signed_prefix = 0;
|
|
|
|
unsigned mask;
|
|
|
|
void repair_sign_bits(bvect& dst) const;
|
|
|
|
|
|
public:
|
|
unsigned bw; // bit-width
|
|
unsigned nw; // num words
|
|
bvect fixed; // bit assignment and don't care bit
|
|
bvect eval; // current evaluation
|
|
|
|
|
|
bv_valuation(unsigned bw);
|
|
|
|
void set_bw(unsigned bw);
|
|
void set_signed(unsigned prefix) { m_signed_prefix = prefix; }
|
|
|
|
unsigned num_bytes() const { return (bw + 7) / 8; }
|
|
|
|
digit_t bits(unsigned i) const { return m_bits[i]; }
|
|
bvect const& bits() const { return m_bits; }
|
|
bvect const& tmp_bits(bool use_current) const { return use_current ? m_bits : m_tmp; }
|
|
bool commit_eval();
|
|
bool is_fixed() const { for (unsigned i = bw; i-- > 0; ) if (!fixed.get(i)) return false; return true; }
|
|
|
|
bool get_bit(unsigned i) const { return m_bits.get(i); }
|
|
bool try_set_bit(unsigned i, bool b) {
|
|
SASSERT(in_range(m_bits));
|
|
if (fixed.get(i) && get_bit(i) != b)
|
|
return false;
|
|
m_bits.set(i, b);
|
|
eval.set(i, b);
|
|
if (in_range(m_bits))
|
|
return true;
|
|
m_bits.set(i, !b);
|
|
eval.set(i, !b);
|
|
return false;
|
|
}
|
|
|
|
void set_value(bvect& bits, rational const& r);
|
|
|
|
rational get_value() const { return m_bits.get_value(nw); }
|
|
rational get_eval() const { return eval.get_value(nw); }
|
|
rational lo() const { return m_lo.get_value(nw); }
|
|
rational hi() const { return m_hi.get_value(nw); }
|
|
|
|
unsigned diff_index(bvect const& a) const;
|
|
void inf_feasible(bvect& a) const;
|
|
void sup_feasible(bvect& a) const;
|
|
|
|
void get(bvect& dst) const;
|
|
void add_range(rational lo, rational hi);
|
|
bool has_range() const { return m_lo != m_hi; }
|
|
void tighten_range();
|
|
|
|
void save_value() { m_bits.copy_to(nw, m_tmp); }
|
|
void restore_value() { m_tmp.copy_to(nw, m_bits); }
|
|
|
|
void clear_overflow_bits(bvect& bits) const {
|
|
SASSERT(nw > 0);
|
|
bits[nw - 1] &= mask;
|
|
SASSERT(!has_overflow(bits));
|
|
}
|
|
|
|
bool in_range(bvect const& bits) const;
|
|
bool can_set(bvect const& bits) const;
|
|
|
|
bool eq(bv_valuation const& other) const { return eq(other.m_bits); }
|
|
bool eq(bvect const& other) const { return other == m_bits; }
|
|
|
|
bool is_zero() const { return is_zero(m_bits); }
|
|
bool is_zero(bvect const& a) const {
|
|
for (unsigned i = 0; i < nw - 1; ++i)
|
|
if (a[i] != 0)
|
|
return false;
|
|
return (a[nw - 1] & mask) == 0;
|
|
}
|
|
|
|
bool is_ones() const { return is_ones(m_bits); }
|
|
|
|
bool is_ones(bvect const& a) const {
|
|
SASSERT(!has_overflow(a));
|
|
for (unsigned i = 0; i + 1 < nw; ++i)
|
|
if (0 != ~a[i])
|
|
return false;
|
|
return 0 == (mask & ~a[nw - 1]);
|
|
}
|
|
|
|
bool is_one() const { return is_one(m_bits); }
|
|
bool is_one(bvect const& a) const {
|
|
SASSERT(!has_overflow(a));
|
|
for (unsigned i = 1; i < nw; ++i)
|
|
if (0 != a[i])
|
|
return false;
|
|
return 1 == a[0];
|
|
}
|
|
|
|
bool sign() const { return m_bits.get(bw - 1); }
|
|
|
|
bool has_overflow(bvect const& bits) const { return 0 != (bits[nw - 1] & ~mask); }
|
|
|
|
unsigned parity(bvect const& bits) const { return bits.parity(); }
|
|
|
|
void min_feasible(bvect& out) const;
|
|
void max_feasible(bvect& out) const;
|
|
|
|
// most significant bit or bw if src = 0
|
|
unsigned msb(bvect const& src) const;
|
|
|
|
unsigned clz(bvect const& src) const;
|
|
|
|
bool is_power_of2(bvect const& src) const;
|
|
|
|
// retrieve largest number at or below (above) src which is feasible
|
|
// with respect to fixed, lo, hi.
|
|
bool get_at_most(bvect const& src, bvect& dst) const;
|
|
bool get_at_least(bvect const& src, bvect& dst) const;
|
|
|
|
bool set_random_at_most(bvect const& src, random_gen& r);
|
|
bool set_random_at_least(bvect const& src, random_gen& r);
|
|
bool set_random_in_range(bvect const& lo, bvect const& hi, random_gen& r);
|
|
|
|
bool set_repair(bool try_down, bvect& dst);
|
|
void set_random_above(bvect& dst, random_gen& r);
|
|
void set_random_below(bvect& dst, random_gen& r);
|
|
bool set_random(random_gen& r);
|
|
void round_down(bvect& dst, std::function<bool(bvect const&)> const& is_feasible);
|
|
void round_up(bvect& dst, std::function<bool(bvect const&)> const& is_feasible);
|
|
|
|
|
|
static digit_t random_bits(random_gen& r);
|
|
void get_variant(bvect& dst, random_gen& r) const;
|
|
|
|
|
|
bool try_set(bvect const& src) {
|
|
if (!can_set(src))
|
|
return false;
|
|
set(src);
|
|
return true;
|
|
}
|
|
|
|
void set(bvect const& src) {
|
|
for (unsigned i = nw; i-- > 0; )
|
|
eval[i] = src[i];
|
|
clear_overflow_bits(eval);
|
|
}
|
|
|
|
void set_zero(bvect& out) const {
|
|
for (unsigned i = 0; i < nw; ++i)
|
|
out[i] = 0;
|
|
}
|
|
|
|
void set_one(bvect& out) const {
|
|
for (unsigned i = 1; i < nw; ++i)
|
|
out[i] = 0;
|
|
out[0] = 1;
|
|
}
|
|
|
|
void set_zero() {
|
|
set_zero(eval);
|
|
}
|
|
|
|
void sub1(bvect& out) const {
|
|
for (unsigned i = 0; i < bw; ++i) {
|
|
if (out.get(i)) {
|
|
out.set(i, false);
|
|
return;
|
|
}
|
|
else
|
|
out.set(i, true);
|
|
}
|
|
}
|
|
|
|
void add1(bvect& out) const {
|
|
for (unsigned i = 0; i < bw; ++i) {
|
|
if (!out.get(i)) {
|
|
out.set(i, true);
|
|
return;
|
|
}
|
|
else
|
|
out.set(i, false);
|
|
}
|
|
}
|
|
|
|
void set_sub(bvect& out, bvect const& a, bvect const& b) const;
|
|
bool set_add(bvect& out, bvect const& a, bvect const& b) const;
|
|
bool set_mul(bvect& out, bvect const& a, bvect const& b, bool check_overflow = true) const;
|
|
void shift_right(bvect& out, unsigned shift) const;
|
|
|
|
void set_range(bvect& dst, unsigned lo, unsigned hi, bool b) {
|
|
for (unsigned i = lo; i < hi; ++i)
|
|
dst.set(i, b);
|
|
}
|
|
|
|
bool try_set_range(bvect& dst, unsigned lo, unsigned hi, bool b) {
|
|
for (unsigned i = lo; i < hi; ++i)
|
|
if (fixed.get(i) && get_bit(i) != b)
|
|
return false;
|
|
for (unsigned i = lo; i < hi; ++i)
|
|
dst.set(i, b);
|
|
return true;
|
|
}
|
|
|
|
void set(bvect& dst, unsigned v) const {
|
|
dst[0] = v;
|
|
for (unsigned i = 1; i < nw; ++i)
|
|
dst[i] = 0;
|
|
}
|
|
|
|
void set(bvect& dst, bvect const& src) const {
|
|
for (unsigned i = 0; i < nw; ++i)
|
|
dst[i] = src[i];
|
|
}
|
|
|
|
unsigned to_nat(unsigned max_n) const;
|
|
|
|
std::ostream& display(std::ostream& out) const {
|
|
out << m_bits;
|
|
out << " ev: " << eval;
|
|
if (!is_zero(fixed)) {
|
|
out << " fix:";
|
|
out << fixed;
|
|
}
|
|
if (m_lo != m_hi)
|
|
out << " [" << m_lo << ", " << m_hi << "[";
|
|
return out;
|
|
}
|
|
|
|
bool well_formed() const {
|
|
return !has_overflow(m_bits) && (!has_range() || in_range(m_bits));
|
|
}
|
|
|
|
};
|
|
|
|
inline std::ostream& operator<<(std::ostream& out, bv_valuation const& v) { return v.display(out); }
|
|
|
|
}
|