3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-07-31 16:33:18 +00:00

adding way to print matrix as part of display method

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2022-12-07 11:23:56 -08:00
parent 850d35b95b
commit ae09c6ed9d
3 changed files with 46 additions and 25 deletions

View file

@ -358,16 +358,33 @@ bool EGaussian::full_init(bool& created) {
return !inconsistent(); return !inconsistent();
} }
static void print_matrix(ostream& out, PackedMatrix& mat) { std::ostream& PackedMatrix::display_dense(std::ostream& out) const {
for (unsigned rowIdx = 0; rowIdx < mat.num_rows(); rowIdx++) { for (unsigned rowIdx = 0; rowIdx < num_rows(); rowIdx++) {
const PackedRow& row = mat[rowIdx]; const PackedRow& row = (*this)[rowIdx];
for(int i = 0; i < row.get_size() * 64; i++) { for(int i = 0; i < row.get_size() * 64; i++)
out << (int)row[i]; out << (int)row[i];
}
out << " -- rhs: " << row.rhs() << " -- row: " << rowIdx << "\n"; out << " -- rhs: " << row.rhs() << " -- row: " << rowIdx << "\n";
} }
return out;
} }
std::ostream& PackedMatrix::display_sparse(std::ostream& out) const {
for (auto const& row : *this) {
bool first = true;
for (int i = 0; i < row.get_size() * 64; ++i) {
if (row[i]) {
if (first && row.rhs())
out << -i-1 << " ";
else
out << i+1 << " ";
first = false;
}
}
}
return out;
}
// Applies Gaussian-Jordan elimination (search level). This function does not add conflicts/propagate/... Just reduces the matrix // Applies Gaussian-Jordan elimination (search level). This function does not add conflicts/propagate/... Just reduces the matrix
void EGaussian::eliminate() { void EGaussian::eliminate() {
SASSERT(m_solver.s().at_search_lvl()); SASSERT(m_solver.s().at_search_lvl());
@ -376,10 +393,9 @@ void EGaussian::eliminate() {
unsigned row_i = 0; unsigned row_i = 0;
unsigned col = 0; unsigned col = 0;
print_matrix(std::cout, m_mat); m_mat.display_dense(std::cout) << std::endl;
std::cout << std::endl; TRACE("xor", m_mat.display_dense(tout) << "\n");
TRACE("xor", print_matrix(tout, m_mat));
// Gauss-Jordan Elimination // Gauss-Jordan Elimination
while (row_i != m_num_rows && col != m_num_cols) { while (row_i != m_num_rows && col != m_num_cols) {
unsigned row_with_1_in_col = row_i; unsigned row_with_1_in_col = row_i;
@ -409,9 +425,8 @@ void EGaussian::eliminate() {
row_i++; row_i++;
} }
col++; col++;
TRACE("xor", print_matrix(tout, m_mat)); TRACE("xor", m_mat.display_dense(tout) << "\n");
print_matrix(std::cout, m_mat); m_mat.display_dense(std::cout) << "\n";
std::cout << std::endl;
} }
std::cout << "-------------" << std::endl; std::cout << "-------------" << std::endl;
} }
@ -811,10 +826,10 @@ void EGaussian::eliminate_column(unsigned p, gauss_data& gqd) {
unsigned row_i = 0; unsigned row_i = 0;
elim_called++; elim_called++;
print_matrix(std::cout, m_mat);
std::cout << std::endl; m_mat.display_dense(std::cout) << "\n";
TRACE("xor", print_matrix(tout, m_mat)); TRACE("xor", m_mat.display_dense(tout) << "\n");
while (row_i < row_size) { while (row_i < row_size) {
//Row has a '1' in eliminating column, and it's not the row responsible //Row has a '1' in eliminating column, and it's not the row responsible
@ -945,10 +960,9 @@ void EGaussian::eliminate_column(unsigned p, gauss_data& gqd) {
} }
} }
row_i++; row_i++;
print_matrix(std::cout, m_mat); m_mat.display_dense(std::cout) << "\n";
std::cout << std::endl; TRACE("xor", m_mat.display_dense(tout) << "\n");
TRACE("xor", print_matrix(tout, m_mat));
} }
} }
@ -1082,3 +1096,5 @@ void EGaussian::move_back_xor_clauses() {
for (const auto& x: m_xorclauses) for (const auto& x: m_xorclauses)
m_solver.m_xorclauses.push_back(std::move(x)); m_solver.m_xorclauses.push_back(std::move(x));
} }

View file

@ -530,11 +530,11 @@ namespace xr {
} }
}; };
iterator begin() { iterator begin() const {
return iterator(mp, numCols); return iterator(mp, numCols);
} }
iterator end() { iterator end() const {
return iterator(mp + numRows * (numCols + 1), numCols); return iterator(mp + numRows * (numCols + 1), numCols);
} }
@ -545,6 +545,10 @@ namespace xr {
unsigned num_cols() const { unsigned num_cols() const {
return numCols; return numCols;
} }
std::ostream& display_dense(std::ostream& out) const;
std::ostream& display_sparse(std::ostream& out) const;
private: private:
@ -609,6 +613,8 @@ namespace xr {
} }
out << std::endl; out << std::endl;
} }
std::ostream& display(std::ostream& out) const { return m_mat.display_sparse(out); }
private: private:
xr::solver& m_solver; // original sat solver xr::solver& m_solver; // original sat solver

View file

@ -310,9 +310,8 @@ namespace xr {
} }
std::ostream& solver::display(std::ostream& out) const { std::ostream& solver::display(std::ostream& out) const {
out << "xor clauses: " << m_xorclauses.size() << "\n"; for (auto* mat : m_gmatrices)
for (auto const& x : m_xorclauses) mat->display(out);
out << x << "\n";
return out; return out;
} }