mirror of
https://github.com/Z3Prover/z3
synced 2025-06-18 20:03:38 +00:00
parameterize theory-aware activity of overlap
This commit is contained in:
parent
50e2273dbd
commit
09ac5645e4
4 changed files with 16 additions and 11 deletions
|
@ -73,5 +73,6 @@ def_module_params(module_name='smt',
|
||||||
('str.binary_search_start', UINT, 64, 'initial upper bound for theory_str binary search'),
|
('str.binary_search_start', UINT, 64, 'initial upper bound for theory_str binary search'),
|
||||||
('theory_case_split', BOOL, False, 'Allow the context to use heuristics involving theory case splits, which are a set of literals of which exactly one can be assigned True. If this option is false, the context will generate extra axioms to enforce this instead.'),
|
('theory_case_split', BOOL, False, 'Allow the context to use heuristics involving theory case splits, which are a set of literals of which exactly one can be assigned True. If this option is false, the context will generate extra axioms to enforce this instead.'),
|
||||||
('theory_aware_branching', BOOL, False, 'Allow the context to use extra information from theory solvers regarding literal branching prioritization.'),
|
('theory_aware_branching', BOOL, False, 'Allow the context to use extra information from theory solvers regarding literal branching prioritization.'),
|
||||||
('str.finite_overlap_models', BOOL, False, 'attempt a finite model search for overlapping variables instead of completely giving up on the arrangement')
|
('str.finite_overlap_models', BOOL, False, 'attempt a finite model search for overlapping variables instead of completely giving up on the arrangement'),
|
||||||
|
('str.overlap_priority', DOUBLE, -0.1, 'theory-aware priority for overlapping variable cases; use smt.theory_aware_branching=true')
|
||||||
))
|
))
|
||||||
|
|
|
@ -30,4 +30,5 @@ void theory_str_params::updt_params(params_ref const & _p) {
|
||||||
m_FiniteOverlapModels = p.str_finite_overlap_models();
|
m_FiniteOverlapModels = p.str_finite_overlap_models();
|
||||||
m_UseBinarySearch = p.str_use_binary_search();
|
m_UseBinarySearch = p.str_use_binary_search();
|
||||||
m_BinarySearchInitialUpperBound = p.str_binary_search_start();
|
m_BinarySearchInitialUpperBound = p.str_binary_search_start();
|
||||||
|
m_OverlapTheoryAwarePriority = p.str_overlap_priority();
|
||||||
}
|
}
|
||||||
|
|
|
@ -78,6 +78,8 @@ struct theory_str_params {
|
||||||
bool m_UseBinarySearch;
|
bool m_UseBinarySearch;
|
||||||
unsigned m_BinarySearchInitialUpperBound;
|
unsigned m_BinarySearchInitialUpperBound;
|
||||||
|
|
||||||
|
double m_OverlapTheoryAwarePriority;
|
||||||
|
|
||||||
theory_str_params(params_ref const & p = params_ref()):
|
theory_str_params(params_ref const & p = params_ref()):
|
||||||
m_AssertStrongerArrangements(true),
|
m_AssertStrongerArrangements(true),
|
||||||
m_AggressiveLengthTesting(false),
|
m_AggressiveLengthTesting(false),
|
||||||
|
@ -88,7 +90,8 @@ struct theory_str_params {
|
||||||
m_StringConstantCache(true),
|
m_StringConstantCache(true),
|
||||||
m_FiniteOverlapModels(false),
|
m_FiniteOverlapModels(false),
|
||||||
m_UseBinarySearch(false),
|
m_UseBinarySearch(false),
|
||||||
m_BinarySearchInitialUpperBound(64)
|
m_BinarySearchInitialUpperBound(64),
|
||||||
|
m_OverlapTheoryAwarePriority(-0.1)
|
||||||
{
|
{
|
||||||
updt_params(p);
|
updt_params(p);
|
||||||
}
|
}
|
||||||
|
|
|
@ -3249,7 +3249,7 @@ void theory_str::process_concat_eq_type1(expr * concatAst1, expr * concatAst2) {
|
||||||
if (m_params.m_FiniteOverlapModels) {
|
if (m_params.m_FiniteOverlapModels) {
|
||||||
expr_ref tester = set_up_finite_model_test(concatAst1, concatAst2);
|
expr_ref tester = set_up_finite_model_test(concatAst1, concatAst2);
|
||||||
assert_implication(ax_l, tester);
|
assert_implication(ax_l, tester);
|
||||||
add_theory_aware_branching_info(tester, -0.1, l_true);
|
add_theory_aware_branching_info(tester, m_params.m_OverlapTheoryAwarePriority, l_true);
|
||||||
} else {
|
} else {
|
||||||
TRACE("t_str", tout << "AVOID LOOP: SKIPPED" << std::endl;);
|
TRACE("t_str", tout << "AVOID LOOP: SKIPPED" << std::endl;);
|
||||||
// TODO printCutVar(m, y);
|
// TODO printCutVar(m, y);
|
||||||
|
@ -3307,7 +3307,7 @@ void theory_str::process_concat_eq_type1(expr * concatAst1, expr * concatAst2) {
|
||||||
if (m_params.m_FiniteOverlapModels) {
|
if (m_params.m_FiniteOverlapModels) {
|
||||||
expr_ref tester = set_up_finite_model_test(concatAst1, concatAst2);
|
expr_ref tester = set_up_finite_model_test(concatAst1, concatAst2);
|
||||||
assert_implication(ax_l, tester);
|
assert_implication(ax_l, tester);
|
||||||
add_theory_aware_branching_info(tester, -0.1, l_true);
|
add_theory_aware_branching_info(tester, m_params.m_OverlapTheoryAwarePriority, l_true);
|
||||||
} else {
|
} else {
|
||||||
TRACE("t_str", tout << "AVOID LOOP: SKIPPED" << std::endl;);
|
TRACE("t_str", tout << "AVOID LOOP: SKIPPED" << std::endl;);
|
||||||
// TODO printCutVar(m, y);
|
// TODO printCutVar(m, y);
|
||||||
|
@ -3361,7 +3361,7 @@ void theory_str::process_concat_eq_type1(expr * concatAst1, expr * concatAst2) {
|
||||||
if (m_params.m_FiniteOverlapModels) {
|
if (m_params.m_FiniteOverlapModels) {
|
||||||
expr_ref tester = set_up_finite_model_test(concatAst1, concatAst2);
|
expr_ref tester = set_up_finite_model_test(concatAst1, concatAst2);
|
||||||
arrangement_disjunction.push_back(tester);
|
arrangement_disjunction.push_back(tester);
|
||||||
add_theory_aware_branching_info(tester, -0.1, l_true);
|
add_theory_aware_branching_info(tester, m_params.m_OverlapTheoryAwarePriority, l_true);
|
||||||
} else {
|
} else {
|
||||||
TRACE("t_str", tout << "AVOID LOOP: SKIPPED" << std::endl;);
|
TRACE("t_str", tout << "AVOID LOOP: SKIPPED" << std::endl;);
|
||||||
TRACE("t_str_detail", {print_cut_var(m, tout); print_cut_var(y, tout);});
|
TRACE("t_str_detail", {print_cut_var(m, tout); print_cut_var(y, tout);});
|
||||||
|
@ -3406,7 +3406,7 @@ void theory_str::process_concat_eq_type1(expr * concatAst1, expr * concatAst2) {
|
||||||
// TODO this might repeat the case above, we may wish to avoid doing this twice
|
// TODO this might repeat the case above, we may wish to avoid doing this twice
|
||||||
expr_ref tester = set_up_finite_model_test(concatAst1, concatAst2);
|
expr_ref tester = set_up_finite_model_test(concatAst1, concatAst2);
|
||||||
arrangement_disjunction.push_back(tester);
|
arrangement_disjunction.push_back(tester);
|
||||||
add_theory_aware_branching_info(tester, -0.1, l_true);
|
add_theory_aware_branching_info(tester, m_params.m_OverlapTheoryAwarePriority, l_true);
|
||||||
} else {
|
} else {
|
||||||
TRACE("t_str", tout << "AVOID LOOP: SKIPPED" << std::endl;);
|
TRACE("t_str", tout << "AVOID LOOP: SKIPPED" << std::endl;);
|
||||||
// TODO printCutVar(x, n);
|
// TODO printCutVar(x, n);
|
||||||
|
@ -3645,7 +3645,7 @@ void theory_str::process_concat_eq_type2(expr * concatAst1, expr * concatAst2) {
|
||||||
if (m_params.m_FiniteOverlapModels) {
|
if (m_params.m_FiniteOverlapModels) {
|
||||||
expr_ref tester = set_up_finite_model_test(concatAst1, concatAst2);
|
expr_ref tester = set_up_finite_model_test(concatAst1, concatAst2);
|
||||||
assert_implication(ax_l, tester);
|
assert_implication(ax_l, tester);
|
||||||
add_theory_aware_branching_info(tester, -0.1, l_true);
|
add_theory_aware_branching_info(tester, m_params.m_OverlapTheoryAwarePriority, l_true);
|
||||||
} else {
|
} else {
|
||||||
TRACE("t_str", tout << "AVOID LOOP: SKIP" << std::endl;);
|
TRACE("t_str", tout << "AVOID LOOP: SKIP" << std::endl;);
|
||||||
// TODO printCutVar(m, y);
|
// TODO printCutVar(m, y);
|
||||||
|
@ -3753,7 +3753,7 @@ void theory_str::process_concat_eq_type2(expr * concatAst1, expr * concatAst2) {
|
||||||
if (m_params.m_FiniteOverlapModels) {
|
if (m_params.m_FiniteOverlapModels) {
|
||||||
expr_ref tester = set_up_finite_model_test(concatAst1, concatAst2);
|
expr_ref tester = set_up_finite_model_test(concatAst1, concatAst2);
|
||||||
arrangement_disjunction.push_back(tester);
|
arrangement_disjunction.push_back(tester);
|
||||||
add_theory_aware_branching_info(tester, -0.1, l_true);
|
add_theory_aware_branching_info(tester, m_params.m_OverlapTheoryAwarePriority, l_true);
|
||||||
} else {
|
} else {
|
||||||
TRACE("t_str", tout << "AVOID LOOP: SKIPPED" << std::endl;);
|
TRACE("t_str", tout << "AVOID LOOP: SKIPPED" << std::endl;);
|
||||||
// TODO printCutVar(m, y)
|
// TODO printCutVar(m, y)
|
||||||
|
@ -4046,7 +4046,7 @@ void theory_str::process_concat_eq_type3(expr * concatAst1, expr * concatAst2) {
|
||||||
if (m_params.m_FiniteOverlapModels) {
|
if (m_params.m_FiniteOverlapModels) {
|
||||||
expr_ref tester = set_up_finite_model_test(concatAst1, concatAst2);
|
expr_ref tester = set_up_finite_model_test(concatAst1, concatAst2);
|
||||||
assert_implication(ax_l, tester);
|
assert_implication(ax_l, tester);
|
||||||
add_theory_aware_branching_info(tester, -0.1, l_true);
|
add_theory_aware_branching_info(tester, m_params.m_OverlapTheoryAwarePriority, l_true);
|
||||||
} else {
|
} else {
|
||||||
TRACE("t_str", tout << "AVOID LOOP: SKIPPED" << std::endl;);
|
TRACE("t_str", tout << "AVOID LOOP: SKIPPED" << std::endl;);
|
||||||
// TODO printCutVar(x, n);
|
// TODO printCutVar(x, n);
|
||||||
|
@ -4126,7 +4126,7 @@ void theory_str::process_concat_eq_type3(expr * concatAst1, expr * concatAst2) {
|
||||||
if (m_params.m_FiniteOverlapModels) {
|
if (m_params.m_FiniteOverlapModels) {
|
||||||
expr_ref tester = set_up_finite_model_test(concatAst1, concatAst2);
|
expr_ref tester = set_up_finite_model_test(concatAst1, concatAst2);
|
||||||
arrangement_disjunction.push_back(tester);
|
arrangement_disjunction.push_back(tester);
|
||||||
add_theory_aware_branching_info(tester, -0.1, l_true);
|
add_theory_aware_branching_info(tester, m_params.m_OverlapTheoryAwarePriority, l_true);
|
||||||
} else {
|
} else {
|
||||||
TRACE("t_str", tout << "AVOID LOOP: SKIPPED." << std::endl;);
|
TRACE("t_str", tout << "AVOID LOOP: SKIPPED." << std::endl;);
|
||||||
// TODO printCutVAR(x, n)
|
// TODO printCutVAR(x, n)
|
||||||
|
@ -4532,7 +4532,7 @@ void theory_str::process_concat_eq_type6(expr * concatAst1, expr * concatAst2) {
|
||||||
if (m_params.m_FiniteOverlapModels) {
|
if (m_params.m_FiniteOverlapModels) {
|
||||||
expr_ref tester = set_up_finite_model_test(concatAst1, concatAst2);
|
expr_ref tester = set_up_finite_model_test(concatAst1, concatAst2);
|
||||||
arrangement_disjunction.push_back(tester);
|
arrangement_disjunction.push_back(tester);
|
||||||
add_theory_aware_branching_info(tester, -0.1, l_true);
|
add_theory_aware_branching_info(tester, m_params.m_OverlapTheoryAwarePriority, l_true);
|
||||||
} else {
|
} else {
|
||||||
TRACE("t_str", tout << "AVOID LOOP: SKIPPED." << std::endl;);
|
TRACE("t_str", tout << "AVOID LOOP: SKIPPED." << std::endl;);
|
||||||
TRACE("t_str", print_cut_var(m, tout); print_cut_var(y, tout););
|
TRACE("t_str", print_cut_var(m, tout); print_cut_var(y, tout););
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue