mirror of
				https://github.com/Z3Prover/z3
				synced 2025-10-31 03:32:28 +00:00 
			
		
		
		
	fix initialization order
This commit is contained in:
		
							parent
							
								
									894fb836e2
								
							
						
					
					
						commit
						981c82c814
					
				
					 4 changed files with 1812 additions and 1797 deletions
				
			
		|  | @ -23,7 +23,7 @@ namespace nla { | |||
|     grobner::grobner(core* c): | ||||
|         common(c), | ||||
|         m_pdd_manager(m_core.m_lar_solver.number_of_vars()), | ||||
|         m_pdd_grobner(m_core.m_reslim, m_pdd_manager), | ||||
|         m_solver(m_core.m_reslim, m_pdd_manager), | ||||
|         m_lar_solver(m_core.m_lar_solver) | ||||
| 
 | ||||
|     {} | ||||
|  | @ -34,30 +34,16 @@ namespace nla { | |||
| 
 | ||||
|     void grobner::operator()() { | ||||
|         unsigned& quota = c().m_nla_settings.grobner_quota; | ||||
|         if (quota == 1) { | ||||
|         if (quota == 1) | ||||
|             return; | ||||
|         } | ||||
|         c().clear_and_resize_active_var_set();  | ||||
|         find_nl_cluster(); | ||||
| 
 | ||||
|         c().lp_settings().stats().m_grobner_calls++; | ||||
|         lp_settings().stats().m_grobner_calls++; | ||||
|         find_nl_cluster();         | ||||
|         configure(); | ||||
|         m_pdd_grobner.saturate(); | ||||
|         bool conflict = false; | ||||
|         unsigned n = m_pdd_grobner.number_of_conflicts_to_report(); | ||||
|         SASSERT(n > 0); | ||||
|         for (auto eq : m_pdd_grobner.equations()) {         | ||||
|             if (check_pdd_eq(eq)) { | ||||
|                 conflict = true; | ||||
|                 if (--n == 0) | ||||
|                     break; | ||||
|             } | ||||
|         } | ||||
|         TRACE("grobner", m_pdd_grobner.display(tout)); | ||||
|         if (conflict) { | ||||
|             IF_VERBOSE(2, verbose_stream() << "grobner conflict\n"); | ||||
|         m_solver.saturate(); | ||||
| 
 | ||||
|         if (find_conflict()) | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         if (propagate_bounds()) | ||||
|             return; | ||||
|  | @ -68,22 +54,33 @@ namespace nla { | |||
|         if (quota > 1) | ||||
|             quota--; | ||||
| 
 | ||||
| 
 | ||||
|         IF_VERBOSE(2, verbose_stream() << "grobner miss, quota " << quota << "\n"); | ||||
|         IF_VERBOSE(4, diagnose_pdd_miss(verbose_stream())); | ||||
|     } | ||||
| 
 | ||||
|     bool grobner::find_conflict() { | ||||
|         unsigned conflicts = 0; | ||||
|         for (auto eq : m_solver.equations()) { | ||||
|             if (check_pdd_eq(eq) && ++conflicts >= m_solver.number_of_conflicts_to_report()) | ||||
|                 break; | ||||
|         } | ||||
|         TRACE("grobner", m_solver.display(tout)); | ||||
|         IF_VERBOSE(2, if (conflicts > 0) verbose_stream() << "grobner conflict\n"); | ||||
| 
 | ||||
| #if 0 | ||||
|         // diagnostics: did we miss something
 | ||||
|         vector<dd::pdd> eqs; | ||||
|         for (auto eq : m_pdd_grobner.equations()) | ||||
|             eqs.push_back(eq->poly()); | ||||
|         m_nra.check(eqs); | ||||
| #endif | ||||
|      | ||||
|         return conflicts > 0; | ||||
|     } | ||||
| 
 | ||||
|     bool grobner::propagate_bounds() { | ||||
|         for (auto eq : m_solver.equations()) { | ||||
| 
 | ||||
|         } | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     bool grobner::propagate_eqs() { | ||||
| #if 0 | ||||
|         bool propagated = false; | ||||
|         for (auto eq : m_pdd_grobner.equations()) { | ||||
|         for (auto eq : m_solver.equations()) { | ||||
|             auto const& p = eq->poly(); | ||||
|             if (p.is_offset()) { | ||||
|                 lpvar v = p.var(); | ||||
|  | @ -103,34 +100,25 @@ namespace nla { | |||
|                 propagated = true; | ||||
|             } | ||||
|         } | ||||
|         if (propagated)  | ||||
|         if (propagated) | ||||
|             return; | ||||
| #endif | ||||
| 
 | ||||
|      | ||||
|     } | ||||
| 
 | ||||
|     bool grobner::propagate_bounds() { | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     bool grobner::propagate_eqs() { | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     void grobner::configure() { | ||||
|         m_pdd_grobner.reset(); | ||||
|         m_solver.reset(); | ||||
|         try { | ||||
|             set_level2var(); | ||||
|             TRACE("grobner", | ||||
|                   tout << "base vars: "; | ||||
|                   for (lpvar j : c().active_var_set()) | ||||
|                       if (c().m_lar_solver.is_base(j)) | ||||
|                       if (m_lar_solver.is_base(j)) | ||||
|                           tout << "j" << j << " "; | ||||
|                   tout << "\n"); | ||||
|             for (lpvar j : c().active_var_set()) { | ||||
|                 if (c().m_lar_solver.is_base(j)) | ||||
|                     add_row(c().m_lar_solver.basic2row(j)); | ||||
|                 if (m_lar_solver.is_base(j)) | ||||
|                     add_row(m_lar_solver.basic2row(j)); | ||||
|                  | ||||
|                 if (c().is_monic_var(j) && c().var_is_fixed(j)) | ||||
|                     add_fixed_monic(j); | ||||
|  | @ -140,7 +128,7 @@ namespace nla { | |||
|             IF_VERBOSE(2, verbose_stream() << "pdd throw\n"); | ||||
|             return; | ||||
|         } | ||||
|         TRACE("grobner", m_pdd_grobner.display(tout)); | ||||
|         TRACE("grobner", m_solver.display(tout)); | ||||
|      | ||||
| #if 0 | ||||
|         IF_VERBOSE(2, m_pdd_grobner.display(verbose_stream())); | ||||
|  | @ -156,14 +144,14 @@ namespace nla { | |||
| #endif | ||||
|     | ||||
|         struct dd::solver::config cfg; | ||||
|         cfg.m_max_steps = m_pdd_grobner.equations().size(); | ||||
|         cfg.m_max_steps = m_solver.equations().size(); | ||||
|         cfg.m_max_simplified = c().m_nla_settings.grobner_max_simplified; | ||||
|         cfg.m_eqs_growth = c().m_nla_settings.grobner_eqs_growth; | ||||
|         cfg.m_expr_size_growth = c().m_nla_settings.grobner_expr_size_growth; | ||||
|         cfg.m_expr_degree_growth = c().m_nla_settings.grobner_expr_degree_growth; | ||||
|         cfg.m_number_of_conflicts_to_report = c().m_nla_settings.grobner_number_of_conflicts_to_report; | ||||
|         m_pdd_grobner.set(cfg); | ||||
|         m_pdd_grobner.adjust_cfg(); | ||||
|         m_solver.set(cfg); | ||||
|         m_solver.adjust_cfg(); | ||||
|         m_pdd_manager.set_max_num_nodes(10000); // or something proportional to the number of initial nodes.
 | ||||
|     } | ||||
| 
 | ||||
|  | @ -173,7 +161,7 @@ namespace nla { | |||
| 
 | ||||
|         dd::pdd_eval eval; | ||||
|         eval.var2val() = [&](unsigned j){ return val(j); }; | ||||
|         for (auto* e : m_pdd_grobner.equations()) { | ||||
|         for (auto* e : m_solver.equations()) { | ||||
|             dd::pdd p = e->poly(); | ||||
|             rational v = eval(p); | ||||
|             if (!v.is_zero()) { | ||||
|  | @ -190,6 +178,14 @@ namespace nla { | |||
|                 out << "]\n"; | ||||
|             } | ||||
|         }               | ||||
| 
 | ||||
| #if 0 | ||||
|         // diagnostics: did we miss something
 | ||||
|         vector<dd::pdd> eqs; | ||||
|         for (auto eq : m_solver.equations()) | ||||
|             eqs.push_back(eq->poly()); | ||||
|         m_nra.check(eqs); | ||||
| #endif | ||||
|         return out; | ||||
|     } | ||||
| 
 | ||||
|  | @ -203,7 +199,7 @@ namespace nla { | |||
|         scoped_dep_interval i(di), i_wd(di); | ||||
|         eval.get_interval<dd::w_dep::without_deps>(e->poly(), i);     | ||||
|         if (!di.separated_from_zero(i)) { | ||||
|             TRACE("grobner", m_pdd_grobner.display(tout << "not separated from 0 ", *e) << "\n"; | ||||
|             TRACE("grobner", m_solver.display(tout << "not separated from 0 ", *e) << "\n"; | ||||
|                   eval.get_interval_distributed<dd::w_dep::without_deps>(e->poly(), i); | ||||
|                   tout << "separated from 0: " << di.separated_from_zero(i) << "\n"; | ||||
|                   for (auto j : e->poly().free_vars()) { | ||||
|  | @ -221,12 +217,12 @@ namespace nla { | |||
|             lemma &= e; | ||||
|         }; | ||||
|         if (di.check_interval_for_conflict_on_zero(i_wd, e->dep(), f)) { | ||||
|             TRACE("grobner", m_pdd_grobner.display(tout << "conflict ", *e) << "\n"); | ||||
|             TRACE("grobner", m_solver.display(tout << "conflict ", *e) << "\n"); | ||||
|             lp_settings().stats().m_grobner_conflicts++; | ||||
|             return true; | ||||
|         } | ||||
|         else { | ||||
|             TRACE("grobner", m_pdd_grobner.display(tout << "no conflict ", *e) << "\n"); | ||||
|             TRACE("grobner", m_solver.display(tout << "no conflict ", *e) << "\n"); | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
|  | @ -260,8 +256,6 @@ namespace nla { | |||
|             for (auto& rc : matrix.m_rows[row])  | ||||
|                 add_var_and_its_factors_to_q_and_collect_new_rows(rc.var(), q); | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     const rational& grobner::val_of_fixed_var_with_deps(lpvar j, u_dependency*& dep) { | ||||
|  | @ -358,11 +352,11 @@ namespace nla { | |||
|     void grobner::add_eq(dd::pdd& p, u_dependency* dep) { | ||||
|         unsigned v; | ||||
|         dd::pdd q(m_pdd_manager); | ||||
|         m_pdd_grobner.simplify(p, dep); | ||||
|         m_solver.simplify(p, dep); | ||||
|         if (is_solved(p, v, q))  | ||||
|             m_pdd_grobner.add_subst(v, q, dep); | ||||
|             m_solver.add_subst(v, q, dep); | ||||
|         else          | ||||
|             m_pdd_grobner.add(p, dep);     | ||||
|             m_solver.add(p, dep); | ||||
|     } | ||||
| 
 | ||||
|     void grobner::add_fixed_monic(unsigned j) { | ||||
|  | @ -385,7 +379,7 @@ namespace nla { | |||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     void grobner::find_nl_cluster() { | ||||
|     void grobner::find_nl_cluster() {         | ||||
|         prepare_rows_and_active_vars(); | ||||
|         svector<lpvar> q; | ||||
|         TRACE("grobner", for (lpvar j : c().m_to_refine) print_monic(c().emons()[j], tout) << "\n";); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue