mirror of
				https://github.com/Z3Prover/z3
				synced 2025-10-30 19:22:28 +00:00 
			
		
		
		
	bug fixes
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
		
							parent
							
								
									1589e7dafa
								
							
						
					
					
						commit
						f41769cdcf
					
				
					 3 changed files with 42 additions and 20 deletions
				
			
		|  | @ -6181,9 +6181,11 @@ namespace polynomial { | |||
|                     } | ||||
|                     return false; | ||||
|                 } | ||||
|                 if (!m_manager.ge(a1, a2)) | ||||
|                     return false; | ||||
|                 ++i, ++j;                | ||||
|                 if (m_manager.eq(a1, a2) || (m1->is_square() && m_manager.ge(a1, a2))) { | ||||
|                     ++i, ++j; | ||||
|                     continue; | ||||
|                 } | ||||
|                 return false;                | ||||
|             } | ||||
|             return i == sz1 && j == sz2;            | ||||
|         } | ||||
|  |  | |||
|  | @ -343,10 +343,10 @@ namespace nlsat { | |||
| 
 | ||||
|         void dec_ref(assumption) {} | ||||
| 
 | ||||
|         void inc_ref(_assumption_set a) { | ||||
|         void inc_ref(_assumption_set a) {             | ||||
|             if (a != nullptr) m_asm.inc_ref(a); | ||||
|         } | ||||
| 
 | ||||
|          | ||||
|         void dec_ref(_assumption_set a) { | ||||
|             if (a != nullptr) m_asm.dec_ref(a); | ||||
|         } | ||||
|  | @ -1733,7 +1733,7 @@ namespace nlsat { | |||
|                 if (!simplify()) | ||||
|                     return l_false; | ||||
|             } | ||||
| 
 | ||||
|             IF_VERBOSE(3, verbose_stream() << "search\n"); | ||||
|             sort_watched_clauses(); | ||||
|             lbool r = search_check(); | ||||
|             CTRACE("nlsat_model", r == l_true, tout << "model before restore order\n"; display_assignment(tout);); | ||||
|  | @ -2792,6 +2792,7 @@ namespace nlsat { | |||
|         vector<ptr_vector<clause>> m_var_occurs; | ||||
| 
 | ||||
|         bool simplify() { | ||||
|             IF_VERBOSE(3, display(verbose_stream() << "before\n")); | ||||
|             unsigned sz = m_clauses.size(); | ||||
|             while (true) { | ||||
| 
 | ||||
|  | @ -2815,7 +2816,7 @@ namespace nlsat { | |||
|                 sz = m_clauses.size(); | ||||
|             } | ||||
| 
 | ||||
|             IF_VERBOSE(3, display(verbose_stream())); | ||||
|             IF_VERBOSE(3, display(verbose_stream() << "after\n")); | ||||
|              | ||||
|             return true; | ||||
|         }        | ||||
|  | @ -2957,7 +2958,8 @@ namespace nlsat { | |||
|                         continue; | ||||
|                     lits.push_back(l); | ||||
|                     if (a.m_bool_var != l.var()) { | ||||
|                         IF_VERBOSE(3, display(verbose_stream() << "simplify ", l) << "\n"); | ||||
|                         IF_VERBOSE(3, display(verbose_stream() << "simplify ", a) << " -> "; | ||||
|                         display(verbose_stream(), l) << "\n"); | ||||
|                         b2l.insert(a.m_bool_var, l); | ||||
|                     } | ||||
|                 } | ||||
|  | @ -3182,6 +3184,8 @@ namespace nlsat { | |||
|                     } | ||||
|                     break; | ||||
|                 case atom::EQ: { | ||||
|                     if (sign) | ||||
|                         continue; | ||||
|                     all_solved = false; | ||||
|                     if (!m_pm.is_const(B)) | ||||
|                         continue; | ||||
|  | @ -3212,21 +3216,20 @@ namespace nlsat { | |||
|             if (lo.empty() && hi.empty()) | ||||
|                 return false; | ||||
| 
 | ||||
|             IF_VERBOSE(3, | ||||
|                 verbose_stream() << "x" << x << " lo " << lo.size() << " hi " << hi.size() << "\n"; | ||||
|                 for (auto c : clauses) | ||||
|                     if (!c->is_removed()) | ||||
|                         display(verbose_stream(), *c) << "\n"; | ||||
|             ); | ||||
| 
 | ||||
|             if (apply_fm_equality(x, clauses, lo, hi)) | ||||
|                 return true; | ||||
| 
 | ||||
|             // return false;
 | ||||
| 
 | ||||
|             if (!all_solved) | ||||
|                 return false; | ||||
| 
 | ||||
|             IF_VERBOSE(3, | ||||
|                 verbose_stream() << "x" << x << " lo " << lo.size() << " hi " << hi.size() << "\n"; | ||||
|             for (auto c : clauses) | ||||
|                 if (!c->is_removed()) | ||||
|                     display(verbose_stream(), *c) << "\n"; | ||||
|             ); | ||||
| 
 | ||||
|             auto num_lo = lo.size(), num_hi = hi.size(); | ||||
|             if (num_lo >= 2 && num_hi >= 2 && (num_lo > 2 || num_hi > 2)) | ||||
|                 return false; | ||||
|  | @ -3310,6 +3313,7 @@ namespace nlsat { | |||
|             auto a1 = static_cast<_assumption_set>(l.c->assumptions()); | ||||
|             auto a2 = static_cast<_assumption_set>(h.c->assumptions()); | ||||
|             a1 = m_asm.mk_join(a1, a2); | ||||
|             inc_ref(a1); | ||||
| 
 | ||||
|             polynomial_ref A(l.A), B(l.B); | ||||
|             | ||||
|  | @ -3347,6 +3351,7 @@ namespace nlsat { | |||
|                 if (cls) | ||||
|                     compute_occurs(*cls); | ||||
|             } | ||||
|             dec_ref(a1); | ||||
|             // track updates for model reconstruction
 | ||||
|             m_bounds.push_back(l); | ||||
|             m_bounds.push_back(h);     | ||||
|  | @ -3482,7 +3487,7 @@ namespace nlsat { | |||
|         //
 | ||||
|         // Equality simplificadtion (TODO, this should is deprecated by fm)
 | ||||
|         // 
 | ||||
|         bool solve_eqs() { | ||||
|         bool solve_eqs() {             | ||||
|             polynomial_ref p(m_pm), q(m_pm); | ||||
|             var v; | ||||
|             init_var_signs(); | ||||
|  | @ -3508,7 +3513,7 @@ namespace nlsat { | |||
|                             continue; | ||||
|                         TRACE("nlsat", tout << "p: " << p << "\nq: " << q << "\n x" << v << "\n";); | ||||
|                         m_bounds.push_back(bound_constraint(v, p, q, false, nullptr)); | ||||
|                                                     | ||||
|                         IF_VERBOSE(3, display(verbose_stream(), *c) << "\n"); | ||||
|                         if (!substitute_var(v, p, q, *c)) | ||||
|                             return false; | ||||
|                         del_clause(c, m_clauses); | ||||
|  | @ -4303,12 +4308,14 @@ namespace nlsat { | |||
|         } | ||||
|              | ||||
|         std::ostream& display_assumptions(std::ostream & out, _assumption_set s) const { | ||||
|             if (!m_display_assumption) | ||||
|                 return out; | ||||
|             vector<assumption, false> deps; | ||||
|             m_asm.linearize(s, deps); | ||||
|             bool first = true; | ||||
|             for (auto dep : deps) { | ||||
|                 if (first) first = false; else out << " "; | ||||
|                 if (m_display_assumption) (*m_display_assumption)(out, dep);  | ||||
|                 (*m_display_assumption)(out, dep);  | ||||
|             } | ||||
|             return out; | ||||
|         } | ||||
|  |  | |||
|  | @ -28,6 +28,8 @@ Revision History: | |||
| # include <iostream> | ||||
| #endif | ||||
| 
 | ||||
| #define DEBUG_SMALL_ALLOC(_x_) {} | ||||
| 
 | ||||
| small_object_allocator::small_object_allocator(char const * id) { | ||||
|     for (unsigned i = 0; i < NUM_SLOTS; i++) { | ||||
|         m_chunks[i] = nullptr; | ||||
|  | @ -75,6 +77,7 @@ void small_object_allocator::reset() { | |||
| void small_object_allocator::deallocate(size_t size, void * p) { | ||||
|     if (size == 0) return; | ||||
| 
 | ||||
|     DEBUG_SMALL_ALLOC(verbose_stream() << "deallocate " << size << " " << p << " bytes\n"); | ||||
| #if defined(Z3DEBUG) && !defined(_WINDOWS) | ||||
|     // Valgrind friendly
 | ||||
|     memory::deallocate(p); | ||||
|  | @ -98,7 +101,9 @@ void small_object_allocator::deallocate(size_t size, void * p) { | |||
| 
 | ||||
| 
 | ||||
| void * small_object_allocator::allocate(size_t size) { | ||||
|     if (size == 0) return nullptr; | ||||
|     if (size == 0)  | ||||
|         return nullptr; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| #if defined(Z3DEBUG) && !defined(_WINDOWS) | ||||
|  | @ -109,6 +114,11 @@ void * small_object_allocator::allocate(size_t size) { | |||
|     if (size >= SMALL_OBJ_SIZE - (1 << PTR_ALIGNMENT)) { | ||||
|         return memory::allocate(size); | ||||
|     } | ||||
| DEBUG_SMALL_ALLOC( | ||||
|     static unsigned count = 0; | ||||
|     ++count); | ||||
| 
 | ||||
| 
 | ||||
| #ifdef Z3DEBUG | ||||
|     size_t osize = size; | ||||
| #endif | ||||
|  | @ -120,6 +130,7 @@ void * small_object_allocator::allocate(size_t size) { | |||
|     if (m_free_list[slot_id] != nullptr) { | ||||
|         void * r = m_free_list[slot_id]; | ||||
|         m_free_list[slot_id] = *(reinterpret_cast<void **>(r)); | ||||
|         DEBUG_SMALL_ALLOC(verbose_stream() << "allocate " << size << " " << r << " " << count << " bytes\n"); | ||||
|         return r; | ||||
|     } | ||||
|     chunk * c = m_chunks[slot_id];  | ||||
|  | @ -130,6 +141,7 @@ void * small_object_allocator::allocate(size_t size) { | |||
|         if (new_curr < c->m_data + CHUNK_SIZE) { | ||||
|             void * r = c->m_curr; | ||||
|             c->m_curr = new_curr; | ||||
|             DEBUG_SMALL_ALLOC(verbose_stream() << "allocate " << size << " " << r << " " << count << " bytes\n"); | ||||
|             return r; | ||||
|         } | ||||
|     } | ||||
|  | @ -138,6 +150,7 @@ void * small_object_allocator::allocate(size_t size) { | |||
|     m_chunks[slot_id] = new_c; | ||||
|     void * r = new_c->m_curr; | ||||
|     new_c->m_curr += size; | ||||
|     DEBUG_SMALL_ALLOC(verbose_stream() << "allocate " << size << " " << r << " " << count << " bytes\n"); | ||||
|     return r; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue