mirror of
https://github.com/Z3Prover/z3
synced 2025-04-28 11:25:51 +00:00
cleanup nla_solver
Signed-off-by: Lev <levnach@hotmail.com>
This commit is contained in:
parent
ccd978e43b
commit
6ce6922c5a
5 changed files with 241 additions and 166 deletions
|
@ -18,14 +18,18 @@
|
|||
|
||||
|
||||
--*/
|
||||
#include "util/rational.h"
|
||||
#include "util/lp/monomial.h"
|
||||
|
||||
namespace nla {
|
||||
|
||||
class factorization_factory;
|
||||
typedef unsigned lpvar;
|
||||
|
||||
class factorization {
|
||||
svector<lpvar> m_vars;
|
||||
rational m_sign;
|
||||
std::function<void (expl_set&)> m_explain;
|
||||
public:
|
||||
void explain(expl_set& s) const { m_explain(s); }
|
||||
bool is_empty() const { return m_vars.empty(); }
|
||||
svector<lpvar> & vars() { return m_vars; }
|
||||
const svector<lpvar> & vars() const { return m_vars; }
|
||||
|
@ -35,6 +39,68 @@ public:
|
|||
size_t size() const { return m_vars.size(); }
|
||||
const lpvar* begin() const { return m_vars.begin(); }
|
||||
const lpvar* end() const { return m_vars.end(); }
|
||||
factorization(std::function<void (expl_set&)> explain) : m_explain(explain) {}
|
||||
};
|
||||
|
||||
struct const_iterator {
|
||||
// fields
|
||||
svector<bool> m_mask;
|
||||
const factorization_factory * m_ff;
|
||||
bool m_full_factorization_returned;
|
||||
|
||||
//typedefs
|
||||
typedef const_iterator self_type;
|
||||
typedef factorization value_type;
|
||||
typedef const factorization reference;
|
||||
typedef int difference_type;
|
||||
typedef std::forward_iterator_tag iterator_category;
|
||||
|
||||
void init_vars_by_the_mask(unsigned_vector & k_vars, unsigned_vector & j_vars) const;
|
||||
|
||||
bool get_factors(unsigned& k, unsigned& j, rational& sign) const;
|
||||
|
||||
reference operator*() const;
|
||||
void advance_mask();
|
||||
|
||||
self_type operator++();
|
||||
self_type operator++(int);
|
||||
|
||||
const_iterator(const svector<bool>& mask, const factorization_factory *f);
|
||||
|
||||
bool operator==(const self_type &other) const;
|
||||
bool operator!=(const self_type &other) const;
|
||||
|
||||
factorization create_binary_factorization(lpvar j, lpvar k, rational const& sign) const;
|
||||
|
||||
factorization create_full_factorization() const;
|
||||
};
|
||||
|
||||
struct factorization_factory {
|
||||
// returns true if found
|
||||
virtual bool find_monomial_of_vars(const svector<lpvar>& vars, monomial& m, rational & sign) const = 0;
|
||||
unsigned m_i_mon;
|
||||
const monomial& m_mon;
|
||||
monomial_coeff m_cmon;
|
||||
|
||||
factorization_factory(unsigned i_mon, const monomial& mon, const monomial_coeff& cmon) :
|
||||
m_i_mon(i_mon),
|
||||
m_mon(mon),
|
||||
m_cmon(cmon) {
|
||||
}
|
||||
|
||||
const_iterator begin() const {
|
||||
// we keep the last element always in the first factor to avoid
|
||||
// repeating a pair twice
|
||||
svector<bool> mask(m_mon.vars().size() - 1, false);
|
||||
return const_iterator(mask, this);
|
||||
}
|
||||
|
||||
const_iterator end() const {
|
||||
svector<bool> mask(m_mon.vars().size() - 1, true);
|
||||
auto it = const_iterator(mask, this);
|
||||
it.m_full_factorization_returned = true;
|
||||
return it;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue