mirror of
https://github.com/Z3Prover/z3
synced 2025-04-23 17:15:31 +00:00
Sls (#7439)
* 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>
This commit is contained in:
parent
ecdfab81a6
commit
91dc02d862
120 changed files with 11172 additions and 4148 deletions
|
@ -25,23 +25,25 @@ Revision History:
|
|||
|
||||
#include "util/z3_exception.h"
|
||||
#include "util/rational.h"
|
||||
#include "util/mpn.h"
|
||||
|
||||
|
||||
class overflow_exception : public z3_exception {
|
||||
char const* msg() const override { return "checked_int64 overflow/underflow"; }
|
||||
};
|
||||
|
||||
template<bool CHECK>
|
||||
class checked_int64 {
|
||||
int64_t m_value;
|
||||
typedef checked_int64 ci;
|
||||
|
||||
rational r64(int64_t i) { return rational(i, rational::i64()); }
|
||||
rational r64(int64_t i) const { return rational(i, rational::i64()); }
|
||||
|
||||
public:
|
||||
|
||||
checked_int64(): m_value(0) {}
|
||||
checked_int64(int64_t v): m_value(v) {}
|
||||
|
||||
class overflow_exception : public z3_exception {
|
||||
char const * msg() const override { return "checked_int64 overflow/underflow";}
|
||||
};
|
||||
|
||||
bool is_zero() const { return m_value == 0; }
|
||||
bool is_pos() const { return m_value > 0; }
|
||||
bool is_neg() const { return m_value < 0; }
|
||||
|
@ -56,6 +58,7 @@ public:
|
|||
static checked_int64 minus_one() { return ci(-1);}
|
||||
|
||||
int64_t get_int64() const { return m_value; }
|
||||
rational to_rational() const { return r64(m_value); }
|
||||
|
||||
checked_int64 abs() const {
|
||||
if (m_value >= 0) {
|
||||
|
@ -118,8 +121,10 @@ public:
|
|||
uint64_t x = static_cast<uint64_t>(m_value);
|
||||
uint64_t y = static_cast<uint64_t>(other.m_value);
|
||||
int64_t r = static_cast<int64_t>(x + y);
|
||||
if (m_value > 0 && other.m_value > 0 && r <= 0) throw overflow_exception();
|
||||
if (m_value < 0 && other.m_value < 0 && r >= 0) throw overflow_exception();
|
||||
if (m_value > 0 && other.m_value > 0 && r <= 0)
|
||||
throw overflow_exception();
|
||||
if (m_value < 0 && other.m_value < 0 && r >= 0)
|
||||
throw overflow_exception();
|
||||
m_value = r;
|
||||
}
|
||||
else {
|
||||
|
@ -133,8 +138,10 @@ public:
|
|||
uint64_t x = static_cast<uint64_t>(m_value);
|
||||
uint64_t y = static_cast<uint64_t>(other.m_value);
|
||||
int64_t r = static_cast<int64_t>(x - y);
|
||||
if (m_value > 0 && other.m_value < 0 && r <= 0) throw overflow_exception();
|
||||
if (m_value < 0 && other.m_value > 0 && r >= 0) throw overflow_exception();
|
||||
if (m_value > 0 && other.m_value < 0 && r <= 0)
|
||||
throw overflow_exception();
|
||||
if (m_value < 0 && other.m_value > 0 && r >= 0)
|
||||
throw overflow_exception();
|
||||
m_value = r;
|
||||
}
|
||||
else {
|
||||
|
@ -148,13 +155,23 @@ public:
|
|||
if (INT_MIN < m_value && m_value <= INT_MAX && INT_MIN < other.m_value && other.m_value <= INT_MAX) {
|
||||
m_value *= other.m_value;
|
||||
}
|
||||
// TBD: could be tuned by using known techniques or 128-bit arithmetic.
|
||||
else if (m_value == 0 || other.m_value == 0 || m_value == 1 || other.m_value == 1) {
|
||||
m_value *= other.m_value;
|
||||
}
|
||||
else if (m_value == INT64_MIN || other.m_value == INT64_MIN)
|
||||
throw overflow_exception();
|
||||
else {
|
||||
rational r(r64(m_value) * r64(other.m_value));
|
||||
if (!r.is_int64()) {
|
||||
uint64_t x = m_value < 0 ? -m_value : m_value;
|
||||
uint64_t y = other.m_value < 0 ? -other.m_value : other.m_value;
|
||||
uint64_t r = x * y;
|
||||
if ((y != 0 && r / y != x) || r > INT64_MAX)
|
||||
throw overflow_exception();
|
||||
}
|
||||
m_value = r.get_int64();
|
||||
int64_t old_value = m_value;
|
||||
m_value = r;
|
||||
if (old_value < 0 && other.m_value > 0)
|
||||
m_value = -m_value;
|
||||
else if (old_value > 0 && other.m_value < 0)
|
||||
m_value = -m_value;
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
@ -163,6 +180,16 @@ public:
|
|||
return *this;
|
||||
}
|
||||
|
||||
checked_int64& operator/=(checked_int64 const& other) {
|
||||
m_value /= other.m_value;
|
||||
return *this;
|
||||
}
|
||||
|
||||
checked_int64& operator%=(checked_int64 const& other) {
|
||||
m_value %= other.m_value;
|
||||
return *this;
|
||||
}
|
||||
|
||||
friend inline checked_int64 abs(checked_int64 const& i) {
|
||||
return i.abs();
|
||||
}
|
||||
|
@ -174,21 +201,42 @@ inline bool operator!=(checked_int64<CHECK> const & i1, checked_int64<CHECK> con
|
|||
return !operator==(i1, i2);
|
||||
}
|
||||
|
||||
template<bool CHECK>
|
||||
inline bool operator!=(checked_int64<CHECK> const& i1, int64_t const& i2) {
|
||||
return !operator==(i1, i2);
|
||||
}
|
||||
|
||||
template<bool CHECK>
|
||||
inline bool operator>(checked_int64<CHECK> const & i1, checked_int64<CHECK> const & i2) {
|
||||
return operator<(i2, i1);
|
||||
}
|
||||
|
||||
template<bool CHECK>
|
||||
inline bool operator>(checked_int64<CHECK> const& i1, int64_t i2) {
|
||||
return operator<(i2, i1);
|
||||
}
|
||||
|
||||
template<bool CHECK>
|
||||
inline bool operator<=(checked_int64<CHECK> const & i1, checked_int64<CHECK> const & i2) {
|
||||
return !operator>(i1, i2);
|
||||
}
|
||||
|
||||
template<bool CHECK>
|
||||
inline bool operator<=(checked_int64<CHECK> const& i1, int64_t const& i2) {
|
||||
return !operator>(i1, i2);
|
||||
}
|
||||
|
||||
template<bool CHECK>
|
||||
inline bool operator>=(checked_int64<CHECK> const & i1, checked_int64<CHECK> const & i2) {
|
||||
return !operator<(i1, i2);
|
||||
}
|
||||
|
||||
|
||||
template<bool CHECK>
|
||||
inline bool operator>=(checked_int64<CHECK> const& i1, int64_t const& i2) {
|
||||
return !operator<(i1, i2);
|
||||
}
|
||||
|
||||
template<bool CHECK>
|
||||
inline checked_int64<CHECK> operator-(checked_int64<CHECK> const& i) {
|
||||
checked_int64<CHECK> result(i);
|
||||
|
@ -202,6 +250,14 @@ inline checked_int64<CHECK> operator+(checked_int64<CHECK> const& a, checked_int
|
|||
return result;
|
||||
}
|
||||
|
||||
template<bool CHECK>
|
||||
inline checked_int64<CHECK> operator+(checked_int64<CHECK> const& a, int64_t const& b) {
|
||||
checked_int64<CHECK> result(a);
|
||||
checked_int64<CHECK> _b(b);
|
||||
result += _b;
|
||||
return result;
|
||||
}
|
||||
|
||||
template<bool CHECK>
|
||||
inline checked_int64<CHECK> operator-(checked_int64<CHECK> const& a, checked_int64<CHECK> const& b) {
|
||||
checked_int64<CHECK> result(a);
|
||||
|
@ -209,9 +265,103 @@ inline checked_int64<CHECK> operator-(checked_int64<CHECK> const& a, checked_int
|
|||
return result;
|
||||
}
|
||||
|
||||
template<bool CHECK>
|
||||
inline checked_int64<CHECK> operator-(checked_int64<CHECK> const& a, int64_t const& b) {
|
||||
checked_int64<CHECK> result(a);
|
||||
checked_int64<CHECK> _b(b);
|
||||
result -= _b;
|
||||
return result;
|
||||
}
|
||||
|
||||
template<bool CHECK>
|
||||
inline checked_int64<CHECK> operator*(checked_int64<CHECK> const& a, checked_int64<CHECK> const& b) {
|
||||
checked_int64<CHECK> result(a);
|
||||
result *= b;
|
||||
return result;
|
||||
}
|
||||
|
||||
template<bool CHECK>
|
||||
inline checked_int64<CHECK> operator*(int64_t const& a, checked_int64<CHECK> const& b) {
|
||||
checked_int64<CHECK> result(a);
|
||||
result *= b;
|
||||
return result;
|
||||
}
|
||||
|
||||
template<bool CHECK>
|
||||
inline checked_int64<CHECK> operator*(checked_int64<CHECK> const& a, int64_t const& b) {
|
||||
checked_int64<CHECK> result(a);
|
||||
checked_int64<CHECK> _b(b);
|
||||
result *= _b;
|
||||
return result;
|
||||
}
|
||||
|
||||
template<bool CHECK>
|
||||
inline checked_int64<CHECK> div(checked_int64<CHECK> const& a, checked_int64<CHECK> const& b) {
|
||||
checked_int64<CHECK> result(a);
|
||||
result /= b;
|
||||
return result;
|
||||
}
|
||||
|
||||
template<bool CHECK>
|
||||
inline checked_int64<CHECK> operator/(checked_int64<CHECK> const& a, checked_int64<CHECK> const& b) {
|
||||
checked_int64<CHECK> result(a);
|
||||
result /= b;
|
||||
return result;
|
||||
}
|
||||
|
||||
template<bool CHECK>
|
||||
inline checked_int64<CHECK> mod(checked_int64<CHECK> const& a, checked_int64<CHECK> const& b) {
|
||||
checked_int64<CHECK> result(a);
|
||||
result %= b;
|
||||
if (result < 0) {
|
||||
if (b > 0)
|
||||
result += b;
|
||||
else
|
||||
result -= b;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
template<bool CHECK>
|
||||
inline bool divides(checked_int64<CHECK> const& a, checked_int64<CHECK> const& b) {
|
||||
return mod(b, a) == 0;
|
||||
}
|
||||
|
||||
template <bool CHECK>
|
||||
inline checked_int64<CHECK> gcd(checked_int64<CHECK> const& a, checked_int64<CHECK> const& b) {
|
||||
checked_int64<CHECK> _a = abs(a);
|
||||
checked_int64<CHECK> _b = abs(b);
|
||||
if (_a == 0)
|
||||
return _b;
|
||||
while (_b != 0) {
|
||||
checked_int64<CHECK> r = mod(_a, _b);
|
||||
_a = _b;
|
||||
_b = r;
|
||||
}
|
||||
return _a;
|
||||
}
|
||||
|
||||
// Compute the extended GCD such that ax + by = gcd(a,b)
|
||||
template <bool CHECK>
|
||||
inline checked_int64<CHECK> gcd(checked_int64<CHECK> const& a, checked_int64<CHECK> const& b,
|
||||
checked_int64<CHECK>& x, checked_int64<CHECK>& y) {
|
||||
checked_int64<CHECK> _a = a;
|
||||
checked_int64<CHECK> _b = b;
|
||||
x = 0;
|
||||
y = 0;
|
||||
checked_int64<CHECK> lastx = 1;
|
||||
checked_int64<CHECK> lasty = 0;
|
||||
while (_b != 0) {
|
||||
checked_int64<CHECK> q = div(_a, _b);
|
||||
checked_int64<CHECK> r = mod(_a, _b);
|
||||
_a = _b;
|
||||
_b = r;
|
||||
checked_int64<CHECK> temp = x;
|
||||
x = lastx - q * x;
|
||||
lastx = temp;
|
||||
temp = y;
|
||||
y = lasty - q * y;
|
||||
lasty = temp;
|
||||
}
|
||||
return _a;
|
||||
}
|
|
@ -615,6 +615,7 @@ void mpz_manager<SYNCH>::div_gcd(mpz const& a, mpz const& b, mpz & c) {
|
|||
template<bool SYNCH>
|
||||
void mpz_manager<SYNCH>::div(mpz const & a, mpz const & b, mpz & c) {
|
||||
STRACE("mpz", tout << "[mpz-ext] div(" << to_string(a) << ", " << to_string(b) << ") == ";);
|
||||
SASSERT(!is_zero(b));
|
||||
if (is_one(b)) {
|
||||
set(c, a);
|
||||
}
|
||||
|
|
|
@ -92,6 +92,19 @@ void reslimit::pop_child() {
|
|||
m_children.pop_back();
|
||||
}
|
||||
|
||||
void reslimit::pop_child(reslimit* r) {
|
||||
lock_guard lock(*g_rlimit_mux);
|
||||
for (unsigned i = 0; i < m_children.size(); ++i) {
|
||||
if (m_children[i] == r) {
|
||||
m_count += r->m_count;
|
||||
r->m_count = 0;
|
||||
m_children.erase(m_children.begin() + i);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void reslimit::cancel() {
|
||||
lock_guard lock(*g_rlimit_mux);
|
||||
set_cancel(m_cancel+1);
|
||||
|
|
|
@ -45,6 +45,7 @@ public:
|
|||
void pop();
|
||||
void push_child(reslimit* r);
|
||||
void pop_child();
|
||||
void pop_child(reslimit* r);
|
||||
|
||||
bool inc();
|
||||
bool inc(unsigned offset);
|
||||
|
|
41
src/util/sat_sls.h
Normal file
41
src/util/sat_sls.h
Normal file
|
@ -0,0 +1,41 @@
|
|||
/*++
|
||||
Copyright (c) 2011 Microsoft Corporation
|
||||
|
||||
Module Name:
|
||||
|
||||
sat_sls.h
|
||||
|
||||
Abstract:
|
||||
|
||||
Base types for SLS.
|
||||
|
||||
Author:
|
||||
|
||||
Nikolaj Bjorner (nbjorner) 2024-06027
|
||||
|
||||
--*/
|
||||
#pragma once
|
||||
|
||||
#include "util/sat_literal.h"
|
||||
|
||||
namespace sat {
|
||||
|
||||
struct clause_info {
|
||||
clause_info(unsigned n, literal const* lits, double init_weight): m_weight(init_weight), m_clause(n, lits) {}
|
||||
double m_weight; // weight of clause
|
||||
unsigned m_trues = 0; // set of literals that are true
|
||||
unsigned m_num_trues = 0; // size of true set
|
||||
literal_vector m_clause;
|
||||
literal const* begin() const { return m_clause.begin(); }
|
||||
literal const* end() const { return m_clause.end(); }
|
||||
bool is_true() const { return m_num_trues > 0; }
|
||||
void add(literal lit) { ++m_num_trues; m_trues += lit.index(); }
|
||||
void del(literal lit) { SASSERT(m_num_trues > 0); --m_num_trues; m_trues -= lit.index(); }
|
||||
};
|
||||
|
||||
inline std::ostream& operator<<(std::ostream& out, clause_info const& ci) {
|
||||
return out << ci.m_clause << " w: " << ci.m_weight << " nt: " << ci.m_num_trues;
|
||||
}
|
||||
};
|
||||
|
||||
|
|
@ -326,6 +326,16 @@ void force_ptr_array_size(T & v, unsigned sz) {
|
|||
}
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
class ptr_iterator {
|
||||
T const* b;
|
||||
T const* e;
|
||||
public:
|
||||
ptr_iterator(T const* b, T const* e): b(b), e(e) {}
|
||||
T const* begin() const { return b; }
|
||||
T const* end() const { return e; }
|
||||
};
|
||||
|
||||
class random_gen {
|
||||
unsigned m_data;
|
||||
public:
|
||||
|
|
|
@ -723,6 +723,10 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
vector(std::initializer_list<T> const& l) {
|
||||
for (auto const& t : l)
|
||||
push_back(t);
|
||||
}
|
||||
|
||||
~vector() {
|
||||
destroy();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue