mirror of
https://github.com/Z3Prover/z3
synced 2025-04-27 19:05:51 +00:00
remove warnings in scaler and use m_cut_solver_cycle_on_var
Signed-off-by: Lev Nachmanson <levnach@hotmail.com> detect slow propagations Signed-off-by: Lev Nachmanson <levnach@hotmail.com> fiddle with the stop conditions Signed-off-by: Lev Nachmanson <levnach@hotmail.com> get rid of constraint->m_predecessors, fix a bug in push/pop with lemmas Signed-off-by: Lev Nachmanson <levnach@hotmail.com> clean detection of stale lemmas in pop Signed-off-by: Lev Nachmanson <levnach@hotmail.com> add constraints lazily to cut_solver Signed-off-by: Lev Nachmanson <levnach@hotmail.com> refactor some of cut_solver classes into include files Signed-off-by: Lev Nachmanson <levnach@hotmail.com> prepare to index constraint from 0 to to n - 1, where n is the number of constraints Signed-off-by: Lev Nachmanson <levnach@hotmail.com> prepare for constraint priority Signed-off-by: Lev Nachmanson <levnach@hotmail.com> use priorities in active_set Signed-off-by: Lev Nachmanson <levnach@hotmail.com> remove unnecesessary parameters Signed-off-by: Lev Nachmanson <levnach@hotmail.com> speedup bound propagations Signed-off-by: Lev Nachmanson <levnach@hotmail.com> restore tactics Signed-off-by: Lev Nachmanson <levnach@hotmail.com> speedup bound propagation by avoiding some calls to propagate_constraint_only_one_unlim Signed-off-by: Lev Nachmanson <levnach@hotmail.com> fixes by Nikolaj Signed-off-by: Lev Nachmanson <levnach@hotmail.com> fix print lp_core_solver Signed-off-by: Lev Nachmanson <levnach@hotmail.com> work on gomory test, subs terms indices correctly Signed-off-by: Lev Nachmanson <levnach@hotmail.com> correct const_iterator for lar_term Signed-off-by: Lev Nachmanson <levnach@hotmail.com> improve static_matrix with iterators Signed-off-by: Lev Nachmanson <levnach@hotmail.com> make row_strip a struct Signed-off-by: Lev Nachmanson <levnach@hotmail.com> move row_strip outside of static_matrix Signed-off-by: Lev Nachmanson <levnach@hotmail.com> add const_iterator to row_strip Signed-off-by: Lev Nachmanson <levnach@hotmail.com> remove the hierarchy of iterators - use std::iterators Signed-off-by: Lev Nachmanson <levnach@hotmail.com> adding gcd_test stats and taking care of for iterators Signed-off-by: Lev Nachmanson <levnach@hotmail.com> restore qflia_tactic.cpp Signed-off-by: Lev Nachmanson <levnach@hotmail.com> run gcd_test according to settings() Signed-off-by: Lev Nachmanson <levnach@hotmail.com> experiment with picking a narrow or random branch Signed-off-by: Lev Nachmanson <levnach@hotmail.com>
This commit is contained in:
parent
6202b2f2e4
commit
2bb94ed4fe
55 changed files with 1715 additions and 1347 deletions
106
src/util/lp/polynomial.h
Normal file
106
src/util/lp/polynomial.h
Normal file
|
@ -0,0 +1,106 @@
|
|||
/*++
|
||||
Copyright (c) 2017 Microsoft Corporation
|
||||
|
||||
Module Name:
|
||||
|
||||
<name>
|
||||
|
||||
Abstract:
|
||||
|
||||
<abstract>
|
||||
|
||||
Author:
|
||||
Nikolaj Bjorner (nbjorner)
|
||||
Lev Nachmanson (levnach)
|
||||
|
||||
Revision History:
|
||||
|
||||
|
||||
--*/
|
||||
#pragma once
|
||||
namespace lp {
|
||||
struct polynomial {
|
||||
static mpq m_local_zero;
|
||||
// the polynomial evaluates to m_coeffs + m_a
|
||||
vector<monomial> m_coeffs;
|
||||
mpq m_a; // the free coefficient
|
||||
polynomial(const vector<monomial>& p, const mpq & a) : m_coeffs(p), m_a(a) {}
|
||||
polynomial(const vector<monomial>& p) : polynomial(p, zero_of_type<mpq>()) {}
|
||||
polynomial(): m_a(zero_of_type<mpq>()) {}
|
||||
polynomial(const polynomial & p) : m_coeffs(p.m_coeffs), m_a(p.m_a) {}
|
||||
|
||||
const mpq & coeff(var_index j) const {
|
||||
for (const auto & t : m_coeffs) {
|
||||
if (j == t.var()) {
|
||||
return t.coeff();
|
||||
}
|
||||
}
|
||||
return m_local_zero;
|
||||
}
|
||||
|
||||
polynomial & operator+=(const polynomial & p) {
|
||||
m_a += p.m_a;
|
||||
for (const auto & t: p.m_coeffs)
|
||||
*this += monomial(t.coeff(), t.var());
|
||||
return *this;
|
||||
}
|
||||
|
||||
void add(const mpq & c, const polynomial &p) {
|
||||
m_a += p.m_a * c;
|
||||
|
||||
for (const auto & t: p.m_coeffs)
|
||||
*this += monomial(c * t.coeff(), t.var());
|
||||
}
|
||||
|
||||
void clear() {
|
||||
m_coeffs.clear();
|
||||
m_a = zero_of_type<mpq>();
|
||||
}
|
||||
|
||||
bool is_empty() const { return m_coeffs.size() == 0 && numeric_traits<mpq>::is_zero(m_a); }
|
||||
|
||||
unsigned number_of_monomials() const { return m_coeffs.size();}
|
||||
|
||||
void add(const monomial &m ){
|
||||
if (is_zero(m.coeff())) return;
|
||||
for (unsigned k = 0; k < m_coeffs.size(); k++) {
|
||||
auto & l = m_coeffs[k];
|
||||
if (m.var() == l.var()) {
|
||||
l.coeff() += m.coeff();
|
||||
if (l.coeff() == 0)
|
||||
m_coeffs.erase(m_coeffs.begin() + k);
|
||||
return;
|
||||
}
|
||||
}
|
||||
m_coeffs.push_back(m);
|
||||
lp_assert(is_correct());
|
||||
}
|
||||
|
||||
polynomial & operator+=(const monomial &m ){
|
||||
add(m);
|
||||
return *this;
|
||||
}
|
||||
|
||||
polynomial & operator+=(const mpq &c ){
|
||||
m_a += c;
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
bool is_correct() const {
|
||||
std::unordered_set<var_index> s;
|
||||
for (auto & l : m_coeffs) {
|
||||
if (l.coeff() == 0)
|
||||
return false;
|
||||
s.insert(l.var());
|
||||
}
|
||||
return m_coeffs.size() == s.size();
|
||||
}
|
||||
|
||||
bool var_coeff_is_unit(unsigned j) const {
|
||||
const mpq & a = coeff(j);
|
||||
return a == 1 || a == -1;
|
||||
}
|
||||
const vector<monomial> & coeffs() const { return m_coeffs; }
|
||||
};
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue