@@ -2914,6 +2914,44 @@ namespace smt {
2914
2914
register_plugin(m_user_propagator);
2915
2915
}
2916
2916
2917
+ void context::user_propagate_initialize_value(expr* var, expr* value) {
2918
+ m_values.push_back({expr_ref(var, m), expr_ref(value, m)});
2919
+ push_trail(push_back_vector(m_values));
2920
+ }
2921
+
2922
+ void context::initialize_value(expr* var, expr* value) {
2923
+ IF_VERBOSE(10, verbose_stream() << "context initialize " << mk_pp(var, m) << " := " << mk_pp(value, m) << "\n");
2924
+ sort* s = var->get_sort();
2925
+ ensure_internalized(var);
2926
+
2927
+ if (m.is_bool(s)) {
2928
+ auto v = get_bool_var_of_id_option(var->get_id());
2929
+ if (v == null_bool_var) {
2930
+ IF_VERBOSE(5, verbose_stream() << "Boolean variable has no literal " << mk_pp(var, m) << " := " << mk_pp(value, m) << "\n");
2931
+ return;
2932
+ }
2933
+ m_bdata[v].m_phase_available = true;
2934
+ if (m.is_true(value))
2935
+ m_bdata[v].m_phase = true;
2936
+ else if (m.is_false(value))
2937
+ m_bdata[v].m_phase = false;
2938
+ else
2939
+ IF_VERBOSE(5, verbose_stream() << "Boolean value is not constant " << mk_pp(var, m) << " := " << mk_pp(value, m) << "\n");
2940
+ return;
2941
+ }
2942
+
2943
+ if (!e_internalized(var))
2944
+ return;
2945
+ enode* n = get_enode(var);
2946
+ theory* th = m_theories.get_plugin(s->get_family_id());
2947
+ if (!th) {
2948
+ IF_VERBOSE(5, verbose_stream() << "No theory is attached to variable " << mk_pp(var, m) << " := " << mk_pp(value, m) << "\n");
2949
+ return;
2950
+ }
2951
+ th->initialize_value(var, value);
2952
+
2953
+ }
2954
+
2917
2955
bool context::watches_fixed(enode* n) const {
2918
2956
return m_user_propagator && m_user_propagator->has_fixed() && n->get_th_var(m_user_propagator->get_family_id()) != null_theory_var;
2919
2957
}
@@ -3756,6 +3794,9 @@ namespace smt {
3756
3794
TRACE("search", display(tout); display_enodes_lbls(tout););
3757
3795
TRACE("search_detail", m_asserted_formulas.display(tout););
3758
3796
init_search();
3797
+ for (auto const& [var, value] : m_values)
3798
+ initialize_value(var, value);
3799
+
3759
3800
flet<bool> l(m_searching, true);
3760
3801
TRACE("after_init_search", display(tout););
3761
3802
IF_VERBOSE(2, verbose_stream() << "(smt.searching)\n";);
0 commit comments