Skip to content

Commit 0481adb

Browse files
fix #2547
Signed-off-by: Nikolaj Bjorner <[email protected]>
1 parent 0d3fed9 commit 0481adb

File tree

4 files changed

+84
-82
lines changed

4 files changed

+84
-82
lines changed

src/smt/qi_queue.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,9 @@ namespace smt {
171171
if (m_context.resource_limits_exceeded()) {
172172
break;
173173
}
174+
if (m_context.get_cancel_flag()) {
175+
break;
176+
}
174177
since_last_check = 0;
175178
}
176179
}

src/smt/smt_context.cpp

Lines changed: 23 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1711,39 +1711,36 @@ namespace smt {
17111711
congruences cannot be retracted to a consistent state.
17121712
*/
17131713
bool context::propagate() {
1714-
scoped_suspend_rlimit _suspend_cancel(m_manager.limit(), at_base_level());
17151714
TRACE("propagate", tout << "propagating... " << m_qhead << ":" << m_assigned_literals.size() << "\n";);
17161715
while (true) {
17171716
if (inconsistent())
17181717
return false;
17191718
unsigned qhead = m_qhead;
1720-
if (!bcp())
1721-
return false;
1722-
if (!propagate_th_case_split(qhead))
1723-
return false;
1724-
if (get_cancel_flag()) {
1725-
m_qhead = qhead;
1726-
return true;
1719+
{
1720+
scoped_suspend_rlimit _suspend_cancel(m_manager.limit(), at_base_level());
1721+
if (!bcp())
1722+
return false;
1723+
if (!propagate_th_case_split(qhead))
1724+
return false;
1725+
SASSERT(!inconsistent());
1726+
propagate_relevancy(qhead);
1727+
if (inconsistent())
1728+
return false;
1729+
if (!propagate_atoms())
1730+
return false;
1731+
if (!propagate_eqs())
1732+
return false;
1733+
propagate_th_eqs();
1734+
propagate_th_diseqs();
1735+
if (inconsistent())
1736+
return false;
1737+
if (!propagate_theories())
1738+
return false;
17271739
}
1728-
SASSERT(!inconsistent());
1729-
propagate_relevancy(qhead);
1730-
if (inconsistent())
1731-
return false;
1732-
if (!propagate_atoms())
1733-
return false;
1734-
if (!propagate_eqs())
1735-
return false;
1736-
if (get_cancel_flag()) {
1737-
m_qhead = qhead;
1738-
return true;
1740+
if (!get_cancel_flag()) {
1741+
scoped_suspend_rlimit _suspend_cancel(m_manager.limit(), at_base_level());
1742+
m_qmanager->propagate();
17391743
}
1740-
propagate_th_eqs();
1741-
propagate_th_diseqs();
1742-
if (inconsistent())
1743-
return false;
1744-
if (!propagate_theories())
1745-
return false;
1746-
m_qmanager->propagate();
17471744
if (inconsistent())
17481745
return false;
17491746
if (resource_limits_exceeded()) {

src/smt/theory_arith.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,12 @@ namespace smt {
159159
typename vector<row_entry>::const_iterator begin_entries() const { return m_entries.begin(); }
160160
typename vector<row_entry>::iterator end_entries() { return m_entries.end(); }
161161
typename vector<row_entry>::const_iterator end_entries() const { return m_entries.end(); }
162+
163+
typename vector<row_entry>::iterator begin() { return m_entries.begin(); }
164+
typename vector<row_entry>::const_iterator begin() const { return m_entries.begin(); }
165+
typename vector<row_entry>::iterator end() { return m_entries.end(); }
166+
typename vector<row_entry>::const_iterator end() const { return m_entries.end(); }
167+
162168
row_entry & add_row_entry(int & pos_idx);
163169
void del_row_entry(unsigned idx);
164170
void compress(vector<column> & cols);
@@ -198,6 +204,10 @@ namespace smt {
198204
typename svector<col_entry>::const_iterator begin_entries() const { return m_entries.begin(); }
199205
typename svector<col_entry>::iterator end_entries() { return m_entries.end(); }
200206
typename svector<col_entry>::const_iterator end_entries() const { return m_entries.end(); }
207+
typename svector<col_entry>::iterator begin() { return m_entries.begin(); }
208+
typename svector<col_entry>::const_iterator begin() const { return m_entries.begin(); }
209+
typename svector<col_entry>::iterator end() { return m_entries.end(); }
210+
typename svector<col_entry>::const_iterator end() const { return m_entries.end(); }
201211
col_entry & add_col_entry(int & pos_idx);
202212
void del_col_entry(unsigned idx);
203213
};

src/smt/theory_arith_core.h

Lines changed: 48 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1661,13 +1661,11 @@ namespace smt {
16611661
sum.reset();
16621662
unsigned r_id = get_var_row(v);
16631663
row const & r = m_rows[r_id];
1664-
typename vector<row_entry>::const_iterator it = r.begin_entries();
1665-
typename vector<row_entry>::const_iterator end = r.end_entries();
1666-
for (; it != end; ++it) {
1667-
if (!it->is_dead() && it->m_var != v) {
1668-
SASSERT(!is_quasi_base(it->m_var));
1669-
SASSERT(get_value(it->m_var) == m_value[it->m_var]);
1670-
sum += it->m_coeff * get_value(it->m_var);
1664+
for (row_entry const& re : r) {
1665+
if (!re.is_dead() && re.m_var != v) {
1666+
SASSERT(!is_quasi_base(re.m_var));
1667+
SASSERT(get_value(re.m_var) == m_value[re.m_var]);
1668+
sum += re.m_coeff * get_value(re.m_var);
16711669
}
16721670
}
16731671
sum.neg();
@@ -1689,19 +1687,17 @@ namespace smt {
16891687
result.reset();
16901688
unsigned r_id = get_var_row(v);
16911689
row const & r = m_rows[r_id];
1692-
typename vector<row_entry>::const_iterator it = r.begin_entries();
1693-
typename vector<row_entry>::const_iterator end = r.end_entries();
1694-
for (; it != end; ++it) {
1695-
if (!it->is_dead() && it->m_var != v) {
1696-
theory_var v2 = it->m_var;
1690+
for (row_entry const& re : r) {
1691+
if (!re.is_dead() && re.m_var != v) {
1692+
theory_var v2 = re.m_var;
16971693
SASSERT(!is_quasi_base(v2));
16981694
SASSERT(get_value(v2) == m_value[v2]);
16991695
if (m_in_update_trail_stack.contains(v2)) {
1700-
result += it->m_coeff * m_old_value[v2];
1696+
result += re.m_coeff * m_old_value[v2];
17011697
is_diff = true;
17021698
}
17031699
else {
1704-
result += it->m_coeff * m_value[v2];
1700+
result += re.m_coeff * m_value[v2];
17051701
}
17061702
}
17071703
}
@@ -1925,15 +1921,13 @@ namespace smt {
19251921
c.compress_if_needed(m_rows);
19261922

19271923
inf_numeral delta2;
1928-
typename svector<col_entry>::const_iterator it = c.begin_entries();
1929-
typename svector<col_entry>::const_iterator end = c.end_entries();
1930-
for (; it != end; ++it) {
1931-
if (!it->is_dead()) {
1932-
row & r = m_rows[it->m_row_id];
1924+
for (auto& ce : c) {
1925+
if (!ce.is_dead()) {
1926+
row & r = m_rows[ce.m_row_id];
19331927
theory_var s = r.get_base_var();
19341928
if (s != null_theory_var && !is_quasi_base(s)) {
19351929
delta2 = delta;
1936-
delta2 *= r[it->m_row_idx].m_coeff;
1930+
delta2 *= r[ce.m_row_idx].m_coeff;
19371931
delta2.neg();
19381932
update_value_core(s, delta2);
19391933
}
@@ -2284,16 +2278,7 @@ namespace smt {
22842278
<< ", best_error: " << best_error << ", curr_error: " << curr_error << "\n";);
22852279
best = v;
22862280
best_error = curr_error;
2287-
//n = 2;
22882281
}
2289-
#if 0
2290-
else if (false && n > 0 && curr_error == best_error) {
2291-
n++;
2292-
if (m_random()%n == 0) {
2293-
best = v;
2294-
}
2295-
}
2296-
#endif
22972282
}
22982283
if (best == null_theory_var)
22992284
m_to_patch.clear(); // all variables are satisfied
@@ -2321,6 +2306,22 @@ namespace smt {
23212306
}
23222307
}
23232308

2309+
#if 0
2310+
/**
2311+
\brief Return true if it was possible to patch all variables in m_to_patch.
2312+
*/
2313+
template<typename Ext>
2314+
bool theory_arith<Ext>::reduce_feasible() {
2315+
for (theory_vars v : sort_by_coefficients()) {
2316+
2317+
}
2318+
m_value[v] += delta;
2319+
if (is_base(v) && !m_to_patch.contains(v) && (below_lower(v) || above_upper(v))) {
2320+
m_value[v] -= delta;
2321+
}
2322+
}
2323+
#endif
2324+
23242325
/**
23252326
\brief Return true if it was possible to patch all variables in m_to_patch.
23262327
*/
@@ -2593,12 +2594,9 @@ namespace smt {
25932594
*/
25942595
template<typename Ext>
25952596
void theory_arith<Ext>::mark_rows_for_bound_prop(theory_var v) {
2596-
column const & c = m_columns[v];
2597-
typename svector<col_entry>::const_iterator it = c.begin_entries();
2598-
typename svector<col_entry>::const_iterator end = c.end_entries();
2599-
for (; it != end; ++it) {
2600-
if (!it->is_dead())
2601-
mark_row_for_bound_prop(it->m_row_id);
2597+
for (col_entry const& ce : m_columns[v]) {
2598+
if (!ce.is_dead())
2599+
mark_row_for_bound_prop(ce.m_row_id);
26022600
}
26032601
}
26042602

@@ -2736,18 +2734,17 @@ namespace smt {
27362734
// bb = (Sum_{a_i < 0} -a_i*lower(x_i)) + (Sum_{a_j > 0} -a_j * upper(x_j)) If is_lower = true
27372735
// bb = (Sum_{a_i > 0} -a_i*lower(x_i)) + (Sum_{a_j < 0} -a_j * upper(x_j)) If is_lower = false
27382736
inf_numeral bb;
2739-
typename vector<row_entry>::const_iterator it = r.begin_entries();
2740-
typename vector<row_entry>::const_iterator end = r.end_entries();
2741-
for (; it != end; ++it) {
2742-
if (!it->is_dead()) {
2743-
inf_numeral const & b = get_bound(it->m_var, is_lower ? it->m_coeff.is_pos() : it->m_coeff.is_neg())->get_value();
2744-
// bb -= it->m_coeff * b;
2745-
bb.submul(it->m_coeff, b);
2737+
for (row_entry const& re : r) {
2738+
if (!re.is_dead()) {
2739+
inf_numeral const & b = get_bound(re.m_var, is_lower ? re.m_coeff.is_pos() : re.m_coeff.is_neg())->get_value();
2740+
// bb -= re.m_coeff * b;
2741+
bb.submul(re.m_coeff, b);
27462742
}
27472743
}
27482744

27492745
inf_numeral implied_k;
2750-
it = r.begin_entries();
2746+
typename vector<row_entry>::const_iterator it = r.begin();
2747+
typename vector<row_entry>::const_iterator end = r.end();
27512748
for (int idx = 0; it != end; ++it, ++idx) {
27522749
if (!it->is_dead() && m_unassigned_atoms[it->m_var] > 0) {
27532750
inf_numeral const & b = get_bound(it->m_var, is_lower ? it->m_coeff.is_pos() : it->m_coeff.is_neg())->get_value();
@@ -3140,12 +3137,10 @@ namespace smt {
31403137
*/
31413138
template<typename Ext>
31423139
void theory_arith<Ext>::collect_fixed_var_justifications(row const & r, antecedents& antecedents) const {
3143-
typename vector<row_entry>::const_iterator it = r.begin_entries();
3144-
typename vector<row_entry>::const_iterator end = r.end_entries();
3145-
for (; it != end; ++it) {
3146-
if (!it->is_dead() && is_fixed(it->m_var)) {
3147-
lower(it->m_var)->push_justification(antecedents, it->m_coeff, coeffs_enabled());
3148-
upper(it->m_var)->push_justification(antecedents, it->m_coeff, coeffs_enabled());
3140+
for (row_entry const& re : r) {
3141+
if (!re.is_dead() && is_fixed(re.m_var)) {
3142+
lower(re.m_var)->push_justification(antecedents, re.m_coeff, coeffs_enabled());
3143+
upper(re.m_var)->push_justification(antecedents, re.m_coeff, coeffs_enabled());
31493144
}
31503145
}
31513146
}
@@ -3555,13 +3550,10 @@ namespace smt {
35553550
template<typename Ext>
35563551
void theory_arith<Ext>::del_row(unsigned r_id) {
35573552
row & r = m_rows[r_id];
3558-
typename vector<row_entry>::const_iterator it = r.begin_entries();
3559-
typename vector<row_entry>::const_iterator end = r.end_entries();
3560-
for (; it != end; ++it) {
3561-
if (!it->is_dead()) {
3562-
theory_var v = it->m_var;
3563-
column & c = m_columns[v];
3564-
c.del_col_entry(it->m_col_idx);
3553+
for (row_entry const& re : r) {
3554+
if (!re.is_dead()) {
3555+
column & c = m_columns[re.m_var];
3556+
c.del_col_entry(re.m_col_idx);
35653557
}
35663558
}
35673559
r.m_base_var = null_theory_var;

0 commit comments

Comments
 (0)