mirror of
				https://github.com/Z3Prover/z3
				synced 2025-10-31 11:42:28 +00:00 
			
		
		
		
	Cleanup
This commit is contained in:
		
							parent
							
								
									1a5231fbf2
								
							
						
					
					
						commit
						2ef27064c7
					
				
					 4 changed files with 64 additions and 80 deletions
				
			
		|  | @ -30,9 +30,9 @@ static const unsigned unassigned_col = UINT32_MAX; | |||
| 
 | ||||
| ///returns popcnt
 | ||||
| unsigned PackedRow::find_watchVar( | ||||
|     sat::literal_vector& tmp_clause, | ||||
|     literal_vector& tmp_clause, | ||||
|     const unsigned_vector& col_to_var, | ||||
|     char_vector &var_has_resp_row, | ||||
|     bool_vector &var_has_resp_row, | ||||
|     unsigned& non_resp_var) { | ||||
|     unsigned popcnt = 0; | ||||
|     non_resp_var = UINT_MAX; | ||||
|  | @ -98,7 +98,7 @@ void PackedRow::get_reason( | |||
| 
 | ||||
| gret PackedRow::propGause( | ||||
|     const unsigned_vector& col_to_var, | ||||
|     char_vector &var_has_resp_row, | ||||
|     bool_vector &var_has_resp_row, | ||||
|     unsigned& new_resp_var, | ||||
|     PackedRow& tmp_col, | ||||
|     PackedRow& tmp_col2, | ||||
|  | @ -273,16 +273,13 @@ void EGaussian::fill_matrix() { | |||
|     } | ||||
|     mat.resize(num_rows, num_cols); // initial gaussian matrix
 | ||||
| 
 | ||||
|     bdd_matrix.clear(); | ||||
|     for (unsigned row = 0; row < num_rows; row++) { | ||||
|         const xor_clause& c = m_xorclauses[row]; | ||||
|         mat[row].set(c, var_to_col, num_cols); | ||||
|         char_vector line; | ||||
|         line.resize(num_rows, 0); | ||||
|         line[row] = 1; | ||||
|         bdd_matrix.push_back(line); | ||||
|     } | ||||
|     SASSERT(bdd_matrix.size() == num_rows); | ||||
| 
 | ||||
|     // reset
 | ||||
|     var_has_resp_row.clear(); | ||||
|  | @ -294,7 +291,7 @@ void EGaussian::fill_matrix() { | |||
|     //reset satisfied_xor state
 | ||||
|     SASSERT(m_solver.m_num_scopes == 0); | ||||
|     satisfied_xors.clear(); | ||||
|     satisfied_xors.resize(num_rows, 0); | ||||
|     satisfied_xors.resize(num_rows, false); | ||||
| } | ||||
| 
 | ||||
| void EGaussian::delete_gauss_watch_this_matrix() { | ||||
|  | @ -346,7 +343,6 @@ bool EGaussian::full_init(bool& created) { | |||
|             case gret::prop: | ||||
|                 SASSERT(m_solver.m_num_scopes == 0); | ||||
|                 m_solver.s().propagate(false); // TODO: Can we really do this here?
 | ||||
|                 // m_solver.ok = m_solver.propagate<false>().isNull();
 | ||||
|                 if (inconsistent()) { | ||||
|                     TRACE("xor", tout << "eliminate & adjust matrix during init lead to UNSAT\n";); | ||||
|                     return false; | ||||
|  | @ -394,42 +390,38 @@ bool EGaussian::full_init(bool& created) { | |||
| } | ||||
| 
 | ||||
| void EGaussian::eliminate() { | ||||
|     PackedMatrix::iterator end_row_it = mat.begin() + num_rows; | ||||
|     PackedMatrix::iterator rowI = mat.begin(); | ||||
|     // TODO: Why twice? gauss_jordan_elim
 | ||||
|     const unsigned end_row = num_rows; | ||||
|     unsigned rowI = 0; | ||||
|     unsigned row_i = 0; | ||||
|     unsigned col = 0; | ||||
| 
 | ||||
|     // Gauss-Jordan Elimination
 | ||||
|     while (row_i != num_rows && col != num_cols) { | ||||
|         PackedMatrix::iterator row_with_1_in_col = rowI; | ||||
|         unsigned row_with_1_in_col = rowI; | ||||
|         unsigned row_with_1_in_col_n = row_i; | ||||
| 
 | ||||
|         //Find first "1" in column.
 | ||||
|         for (; row_with_1_in_col != end_row_it; ++row_with_1_in_col, row_with_1_in_col_n++) { | ||||
|             if ((*row_with_1_in_col)[col])  | ||||
|         // Find first "1" in column.
 | ||||
|         for (; row_with_1_in_col < end_row; ++row_with_1_in_col, row_with_1_in_col_n++) { | ||||
|             if (mat[row_with_1_in_col][col]) | ||||
|                 break;             | ||||
|         } | ||||
| 
 | ||||
|         //We have found a "1" in this column
 | ||||
|         if (row_with_1_in_col != end_row_it) { | ||||
|             var_has_resp_row[col_to_var[col]] = 1; | ||||
|         // We have found a "1" in this column
 | ||||
|         if (row_with_1_in_col < end_row) { | ||||
|             var_has_resp_row[col_to_var[col]] = true; | ||||
| 
 | ||||
|             // swap row row_with_1_in_col and rowIt
 | ||||
|             if (row_with_1_in_col != rowI) { | ||||
|                 (*rowI).swapBoth(*row_with_1_in_col); | ||||
|                 std::swap(bdd_matrix[row_i], bdd_matrix[row_with_1_in_col_n]); | ||||
|             } | ||||
|             if (row_with_1_in_col != rowI) | ||||
|                 mat[rowI].swapBoth(mat[row_with_1_in_col]); | ||||
| 
 | ||||
|             // XOR into *all* rows that have a "1" in column COL
 | ||||
|             // Since we XOR into *all*, this is Gauss-Jordan (and not just Gauss)
 | ||||
|             unsigned k = 0; | ||||
|             for (PackedMatrix::iterator k_row = mat.begin() | ||||
|                 ; k_row != end_row_it | ||||
|                 ; ++k_row, k++ | ||||
|             ) { | ||||
|             for (unsigned k_row = 0; k_row < end_row; ++k_row, k++) { | ||||
|                 // xor rows K and I
 | ||||
|                 if (k_row != rowI && (*k_row)[col]) { | ||||
|                     (*k_row).xor_in(*rowI); | ||||
|                 if (k_row != rowI && mat[k_row][col]) { | ||||
|                     mat[k_row].xor_in(mat[rowI]); | ||||
|                 } | ||||
|             } | ||||
|             row_i++; | ||||
|  | @ -439,7 +431,7 @@ void EGaussian::eliminate() { | |||
|     } | ||||
| } | ||||
| 
 | ||||
| sat::literal_vector* EGaussian::get_reason(const unsigned row, int& out_ID) { | ||||
| literal_vector* EGaussian::get_reason(const unsigned row, int& out_ID) { | ||||
|     if (!xor_reasons[row].m_must_recalc) { | ||||
|         out_ID = xor_reasons[row].m_ID; | ||||
|         return &(xor_reasons[row].m_reason); | ||||
|  | @ -447,7 +439,7 @@ sat::literal_vector* EGaussian::get_reason(const unsigned row, int& out_ID) { | |||
| 
 | ||||
|     // Clean up previous one
 | ||||
|      | ||||
|     svector<literal>& to_fill = xor_reasons[row].m_reason; | ||||
|     literal_vector& to_fill = xor_reasons[row].m_reason; | ||||
|     to_fill.clear(); | ||||
| 
 | ||||
|     mat[row].get_reason( | ||||
|  | @ -493,7 +485,7 @@ gret EGaussian::init_adjust_matrix() { | |||
|                 } | ||||
|                 TRACE("xor", tout << "-> empty on row: " << row_i;); | ||||
|                 TRACE("xor", tout << "-> Satisfied XORs set for row: " << row_i;); | ||||
|                 satisfied_xors[row_i] = 1; | ||||
|                 satisfied_xors[row_i] = true; | ||||
|                 break; | ||||
| 
 | ||||
|             //Unit (i.e. toplevel unit)
 | ||||
|  | @ -508,13 +500,13 @@ gret EGaussian::init_adjust_matrix() { | |||
| 
 | ||||
|                 TRACE("xor", tout << "-> UNIT during adjust: " << tmp_clause[0];); | ||||
|                 TRACE("xor", tout << "-> Satisfied XORs set for row: " << row_i;); | ||||
|                 satisfied_xors[row_i] = 1; | ||||
|                 satisfied_xors[row_i] = true; | ||||
|                 SASSERT(check_row_satisfied(row_i)); | ||||
| 
 | ||||
|                 //adjusting
 | ||||
|                 row.setZero(); // reset this row all zero
 | ||||
|                 row_to_var_non_resp.push_back(UINT32_MAX); | ||||
|                 var_has_resp_row[tmp_clause[0].var()] = 0; | ||||
|                 var_has_resp_row[tmp_clause[0].var()] = false; | ||||
|                 return gret::prop; | ||||
|             } | ||||
| 
 | ||||
|  | @ -535,7 +527,7 @@ gret EGaussian::init_adjust_matrix() { | |||
|                 row.setZero(); | ||||
| 
 | ||||
|                 row_to_var_non_resp.push_back(UINT32_MAX); // delete non-basic value in this row
 | ||||
|                 var_has_resp_row[tmp_clause[0].var()] = 0; // delete basic value in this row
 | ||||
|                 var_has_resp_row[tmp_clause[0].var()] = false; // delete basic value in this row
 | ||||
|                 break; | ||||
|             } | ||||
| 
 | ||||
|  | @ -579,7 +571,7 @@ void EGaussian::delete_gausswatch(const unsigned row_n) { | |||
| 
 | ||||
| unsigned EGaussian::get_max_level(const gauss_data& gqd, const unsigned row_n) { | ||||
|     int ID; | ||||
|     auto cl = get_reason(row_n, ID); | ||||
|     literal_vector* cl = get_reason(row_n, ID); | ||||
|     unsigned nMaxLevel = gqd.currLevel; | ||||
|     unsigned nMaxInd = 1; | ||||
| 
 | ||||
|  | @ -634,8 +626,8 @@ bool EGaussian::find_truths( | |||
|         //var has a responsible row, so THIS row must be it!
 | ||||
|         //since if a var has a responsible row, only ONE row can have a 1 there
 | ||||
|         was_resp_var = true; | ||||
|         var_has_resp_row[row_to_var_non_resp[row_n]] = 1; | ||||
|         var_has_resp_row[var] = 0; | ||||
|         var_has_resp_row[row_to_var_non_resp[row_n]] = true; | ||||
|         var_has_resp_row[var] = false; | ||||
|     } | ||||
| 
 | ||||
|     unsigned new_resp_var; | ||||
|  | @ -663,8 +655,8 @@ bool EGaussian::find_truths( | |||
|             TRACE("xor", tout << "--> conflict";); | ||||
|              | ||||
|             if (was_resp_var) { // recover
 | ||||
|                 var_has_resp_row[row_to_var_non_resp[row_n]] = 0; | ||||
|                 var_has_resp_row[var] = 1; | ||||
|                 var_has_resp_row[row_to_var_non_resp[row_n]] = false; | ||||
|                 var_has_resp_row[var] = true; | ||||
|             } | ||||
| 
 | ||||
|             return false; | ||||
|  | @ -684,12 +676,12 @@ bool EGaussian::find_truths( | |||
|             gqd.status = gauss_res::prop; | ||||
| 
 | ||||
|             if (was_resp_var) { // recover
 | ||||
|                 var_has_resp_row[row_to_var_non_resp[row_n]] = 0; | ||||
|                 var_has_resp_row[var] = 1; | ||||
|                 var_has_resp_row[row_to_var_non_resp[row_n]] = false; | ||||
|                 var_has_resp_row[var] = true; | ||||
|             } | ||||
| 
 | ||||
|             TRACE("xor", tout << "--> Satisfied XORs set for row: " << row_n;); | ||||
|             satisfied_xors[row_n] = 1; | ||||
|             satisfied_xors[row_n] = true; | ||||
|             SASSERT(check_row_satisfied(row_n)); | ||||
|             return true; | ||||
|         } | ||||
|  | @ -719,8 +711,8 @@ bool EGaussian::find_truths( | |||
|                 //so elimination will be needed
 | ||||
| 
 | ||||
|                 //clear old one, add new resp
 | ||||
|                 var_has_resp_row[row_to_var_non_resp[row_n]] = 0; | ||||
|                 var_has_resp_row[new_resp_var] = 1; | ||||
|                 var_has_resp_row[row_to_var_non_resp[row_n]] = false; | ||||
|                 var_has_resp_row[new_resp_var] = true; | ||||
| 
 | ||||
|                 // store the eliminate variable & row
 | ||||
|                 gqd.new_resp_var = new_resp_var; | ||||
|  | @ -742,12 +734,12 @@ bool EGaussian::find_truths( | |||
|             find_truth_ret_satisfied++; | ||||
|             ws[j++] = ws[i]; | ||||
|             if (was_resp_var) { // recover
 | ||||
|                 var_has_resp_row[row_to_var_non_resp[row_n]] = 0; | ||||
|                 var_has_resp_row[var] = 1; | ||||
|                 var_has_resp_row[row_to_var_non_resp[row_n]] = false; | ||||
|                 var_has_resp_row[var] = true; | ||||
|             } | ||||
| 
 | ||||
|             TRACE("xor", tout << "--> Satisfied XORs set for row: " << row_n;); | ||||
|             satisfied_xors[row_n] = 1; | ||||
|             satisfied_xors[row_n] = true; | ||||
|             SASSERT(check_row_satisfied(row_n)); | ||||
|             return true; | ||||
| 
 | ||||
|  | @ -843,7 +835,7 @@ void EGaussian::eliminate_col(unsigned p, gauss_data& gqd) { | |||
|                 << " is being watched on var: " << orig_non_resp_var + 1 | ||||
|                 << " i.e. it must contain '1' for this var's column";); | ||||
| 
 | ||||
|             SASSERT(satisfied_xors[row_i] == 0); | ||||
|             SASSERT(!satisfied_xors[row_i]); | ||||
|             (*rowI).xor_in(*(mat.begin() + new_resp_row_n)); | ||||
| 
 | ||||
|             elim_xored_rows++; | ||||
|  | @ -919,7 +911,7 @@ void EGaussian::eliminate_col(unsigned p, gauss_data& gqd) { | |||
|                         gqd.status = gauss_res::prop; | ||||
| 
 | ||||
|                         TRACE("xor", tout << "---> Satisfied XORs set for row: " << row_i;); | ||||
|                         satisfied_xors[row_i] = 1; | ||||
|                         satisfied_xors[row_i] = true; | ||||
|                         SASSERT(check_row_satisfied(row_i)); | ||||
|                         break; | ||||
|                     } | ||||
|  | @ -946,7 +938,7 @@ void EGaussian::eliminate_col(unsigned p, gauss_data& gqd) { | |||
|                         row_to_var_non_resp[row_i] = p; | ||||
| 
 | ||||
|                         TRACE("xor", tout << "---> Satisfied XORs set for row: " << row_i;); | ||||
|                         satisfied_xors[row_i] = 1; | ||||
|                         satisfied_xors[row_i] = true; | ||||
|                         SASSERT(check_row_satisfied(row_i)); | ||||
|                         break; | ||||
|                     default: | ||||
|  | @ -1092,4 +1084,4 @@ bool EGaussian::must_disable(gauss_data& gqd) { | |||
| void EGaussian::move_back_xor_clauses() { | ||||
|     for (const auto& x: m_xorclauses)  | ||||
|         m_solver.m_xorclauses.push_back(std::move(x));     | ||||
| } | ||||
| } | ||||
|  |  | |||
|  | @ -356,8 +356,8 @@ namespace xr { | |||
|             int64_t* __restrict mp1 = mp - 1; | ||||
|             int64_t* __restrict mp2 = b.mp - 1; | ||||
|      | ||||
|             unsigned i = size+1; | ||||
|             while(i != 0) { | ||||
|             unsigned i = size + 1; | ||||
|             while (i != 0) { | ||||
|                 std::swap(*mp1, *mp2); | ||||
|                 mp1++; | ||||
|                 mp2++; | ||||
|  | @ -391,13 +391,13 @@ namespace xr { | |||
|         unsigned find_watchVar( | ||||
|             sat::literal_vector& tmp_clause, | ||||
|             const unsigned_vector& col_to_var, | ||||
|             char_vector &var_has_resp_row, | ||||
|             bool_vector &var_has_resp_row, | ||||
|             unsigned& non_resp_var); | ||||
|      | ||||
|         // using find nonbasic value after watch list is enter
 | ||||
|         gret propGause( | ||||
|             const unsigned_vector& col_to_var, | ||||
|             char_vector &var_has_resp_row, | ||||
|             bool_vector &var_has_resp_row, | ||||
|             unsigned& new_resp_var, | ||||
|             PackedRow& tmp_col, | ||||
|             PackedRow& tmp_col2, | ||||
|  | @ -559,7 +559,7 @@ namespace xr { | |||
|             gauss_data& gqd | ||||
|         ); | ||||
|      | ||||
|         sat::literal_vector* get_reason(const unsigned row, int& out_ID); | ||||
|         literal_vector* get_reason(const unsigned row, int& out_ID); | ||||
|      | ||||
|         // when basic variable is touched , eliminate one col
 | ||||
|         void eliminate_col( | ||||
|  | @ -635,23 +635,22 @@ namespace xr { | |||
|         bool cancelled_since_val_update = true; | ||||
|         unsigned last_val_update = 0; | ||||
|      | ||||
|         //Is the clause at this ROW satisfied already?
 | ||||
|         //satisfied_xors[row] tells me that
 | ||||
|         // TODO: Are characters enough?
 | ||||
|         char_vector satisfied_xors; | ||||
|         // Is the clause at this ROW satisfied already?
 | ||||
|         // satisfied_xors[row] tells me that
 | ||||
|         // TODO: Maybe compress further
 | ||||
|         bool_vector satisfied_xors; | ||||
|      | ||||
|         // Someone is responsible for this column if TRUE
 | ||||
|         ///we always WATCH this variable
 | ||||
|         char_vector var_has_resp_row; | ||||
|         // we always WATCH this variable
 | ||||
|         bool_vector var_has_resp_row; | ||||
|      | ||||
|         ///row_to_var_non_resp[ROW] gives VAR it's NOT responsible for
 | ||||
|         ///we always WATCH this variable
 | ||||
|         // row_to_var_non_resp[ROW] gives VAR it's NOT responsible for
 | ||||
|         // we always WATCH this variable
 | ||||
|         unsigned_vector row_to_var_non_resp; | ||||
|      | ||||
|      | ||||
|         PackedMatrix mat; | ||||
|         svector<char_vector> bdd_matrix; // TODO: we will probably not need it
 | ||||
|         unsigned_vector  var_to_col; ///var->col mapping. Index with VAR
 | ||||
|         unsigned_vector var_to_col; ///var->col mapping. Index with VAR
 | ||||
|         unsigned_vector col_to_var; ///col->var mapping. Index with COL
 | ||||
|         unsigned num_rows = 0; | ||||
|         unsigned num_cols = 0; | ||||
|  | @ -670,7 +669,7 @@ namespace xr { | |||
|      | ||||
|     inline void EGaussian::canceling() { | ||||
|         cancelled_since_val_update = true; | ||||
|         memset(satisfied_xors.data(), 0, satisfied_xors.size()); | ||||
|         memset(satisfied_xors.data(), false, satisfied_xors.size()); | ||||
|     } | ||||
|      | ||||
|     inline double EGaussian::get_density() { | ||||
|  | @ -690,4 +689,4 @@ namespace xr { | |||
|     inline bool EGaussian::is_initialized() const { | ||||
|         return initialized; | ||||
|     } | ||||
| } | ||||
| } | ||||
|  |  | |||
|  | @ -28,7 +28,7 @@ namespace xr { | |||
|     class xor_matrix_finder { | ||||
|          | ||||
|         struct matrix_shape { | ||||
|             matrix_shape(uint32_t matrix_num) : m_num(matrix_num) {} | ||||
|             matrix_shape(unsigned matrix_num) : m_num(matrix_num) {} | ||||
|          | ||||
|             matrix_shape() {} | ||||
|          | ||||
|  | @ -39,12 +39,12 @@ namespace xr { | |||
|             double m_density = 0; | ||||
|          | ||||
|             uint64_t tot_size() const { | ||||
|                 return (uint64_t)m_rows*(uint64_t)m_cols; | ||||
|                 return (uint64_t)m_rows * (uint64_t)m_cols; | ||||
|             } | ||||
|         }; | ||||
| 
 | ||||
|         struct sorter { | ||||
|             bool operator () (const matrix_shape& left, const matrix_shape& right) { | ||||
|             bool operator()(const matrix_shape& left, const matrix_shape& right) { | ||||
|                 return left.m_sum_xor_sizes < right.m_sum_xor_sizes; | ||||
|             } | ||||
|         }; | ||||
|  |  | |||
|  | @ -336,11 +336,6 @@ namespace xr { | |||
|             case 0: | ||||
|                 if (x.m_rhs) | ||||
|                     s().set_conflict(); | ||||
|                 /*TODO: Implement
 | ||||
|                 if (inconsistent()) { | ||||
|                     SASSERT(m_solver.unsat_cl_ID == 0); | ||||
|                     m_solver.unsat_cl_ID = solver->clauseID; | ||||
|                 }*/ | ||||
|                 return false; | ||||
|             case 1: { | ||||
|                 s().assign_scoped(sat::literal(x[0], !x.m_rhs)); | ||||
|  | @ -589,10 +584,8 @@ namespace xr { | |||
|         for (unsigned i = 0; i < 2 * s().num_vars(); i++) { | ||||
|             const auto& ws = s().get_wlist(i); | ||||
|             for (const auto& w: ws) { | ||||
|                 if (w.is_binary_clause()/* TODO: Does redundancy information exist in Z3? Can we use learned instead of "!w.red()"?*/ && !w.is_learned()) { | ||||
|                     bool_var v = w.get_literal().var(); | ||||
|                     s().mark_visited(v); | ||||
|                 } | ||||
|                 if (w.is_binary_clause()/* TODO: Does redundancy information exist in Z3? Can we use learned instead of "!w.red()"?*/ && !w.is_learned()) | ||||
|                     s().mark_visited(w.get_literal().var()); | ||||
|             } | ||||
|         } | ||||
|      | ||||
|  | @ -601,7 +594,7 @@ namespace xr { | |||
|             if (cl->red() || cl->used_in_xor()) { | ||||
|                 continue; | ||||
|             }*/ | ||||
|             // TODO: maybe again instead
 | ||||
|             // TODO: maybe again this instead
 | ||||
|             if (cl->is_learned()) | ||||
|                 continue; | ||||
|             for (literal l: *cl) | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue