@@ -59,8 +59,6 @@ namespace sls {
59
59
}
60
60
}
61
61
62
-
63
-
64
62
template <typename num_t >
65
63
std::ostream& arith_base<num_t >::ineq::display(std::ostream& out) const {
66
64
bool first = true ;
@@ -118,7 +116,7 @@ namespace sls {
118
116
template <typename num_t >
119
117
void arith_base<num_t >::save_best_values() {
120
118
for (auto & v : m_vars)
121
- v.m_best_value = v. m_value ;
119
+ v.set_best_value (v. value ()) ;
122
120
check_ineqs ();
123
121
}
124
122
@@ -168,8 +166,8 @@ namespace sls {
168
166
template <typename num_t >
169
167
num_t arith_base<num_t >::dtt(bool sign, ineq const & ineq, var_t v, num_t const & new_value) const {
170
168
for (auto const & [coeff, w] : ineq.m_args )
171
- if (w == v)
172
- return dtt (sign, ineq.m_args_value + coeff * (new_value - m_vars[v].m_value ) , ineq);
169
+ if (w == v)
170
+ return dtt (sign, ineq.m_args_value + coeff * (new_value - m_vars[v].value ()) , ineq);
173
171
return num_t (1 );
174
172
}
175
173
@@ -444,17 +442,19 @@ namespace sls {
444
442
445
443
delta_out = delta;
446
444
447
- if (m_last_var == v && m_last_delta == -delta)
448
- return false ;
445
+ if (m_last_var == v && m_last_delta == -delta)
446
+ return false ;
449
447
450
- if (m_use_tabu && vi.is_tabu (m_stats.m_num_steps , delta))
448
+ if (m_use_tabu && vi.is_tabu (m_stats.m_num_steps , delta))
451
449
return false ;
450
+
452
451
453
452
auto old_value = value (v);
454
453
auto new_value = old_value + delta;
455
454
if (!vi.in_range (new_value))
456
455
return false ;
457
456
457
+
458
458
if (m_use_tabu && !in_bounds (v, new_value) && in_bounds (v, old_value)) {
459
459
auto const & lo = m_vars[v].m_lo ;
460
460
auto const & hi = m_vars[v].m_hi ;
@@ -490,9 +490,7 @@ namespace sls {
490
490
void arith_base<num_t >::add_update(var_t v, num_t delta) {
491
491
num_t delta_out;
492
492
if (!is_permitted_update (v, delta, delta_out))
493
- return ;
494
-
495
-
493
+ return ;
496
494
m_updates.push_back ({ v, delta_out, 0 });
497
495
}
498
496
@@ -647,7 +645,7 @@ namespace sls {
647
645
bool arith_base<num_t >::update(var_t v, num_t const & new_value) {
648
646
auto & vi = m_vars[v];
649
647
expr* e = vi.m_expr ;
650
- auto old_value = vi.m_value ;
648
+ auto old_value = vi.value () ;
651
649
if (old_value == new_value)
652
650
return true ;
653
651
if (!vi.in_range (new_value))
@@ -665,15 +663,10 @@ namespace sls {
665
663
}
666
664
}
667
665
catch (overflow_exception const &) {
666
+ verbose_stream () << " overflow1\n " ;
668
667
return false ;
669
668
}
670
669
671
- #if 0
672
- if (!check_update(v, new_value))
673
- return false;
674
- apply_checked_update();
675
- #else
676
-
677
670
buffer<sat::bool_var> to_flip;
678
671
for (auto const & [coeff, bv] : vi.m_bool_vars ) {
679
672
auto & ineq = *atom (bv);
@@ -687,12 +680,13 @@ namespace sls {
687
680
688
681
}
689
682
IF_VERBOSE (5 , verbose_stream () << " repair: v" << v << " := " << old_value << " -> " << new_value << " \n " );
690
- vi.m_value = new_value;
683
+ vi.set_value ( new_value) ;
691
684
ctx.new_value_eh (e);
692
685
m_last_var = v;
693
686
694
687
for (auto bv : to_flip) {
695
- ctx.flip (bv);
688
+ if (dtt (sign (bv), *atom (bv)) != 0 )
689
+ ctx.flip (bv);
696
690
SASSERT (dtt (sign (bv), *atom (bv)) == 0 );
697
691
}
698
692
@@ -711,6 +705,7 @@ namespace sls {
711
705
prod *= power_of (value (w), p);
712
706
}
713
707
catch (overflow_exception const &) {
708
+ verbose_stream () << " overflow\n " ;
714
709
return false ;
715
710
}
716
711
if (value (w) != prod && !update (w, prod))
@@ -727,82 +722,10 @@ namespace sls {
727
722
if (!update (ad.m_var , sum))
728
723
return false ;
729
724
}
730
- #endif
731
-
732
- return true ;
733
- }
734
-
735
- template <typename num_t >
736
- bool arith_base<num_t >::check_update(var_t v, num_t new_value) {
737
-
738
- ++m_update_timestamp;
739
- if (m_update_timestamp == 0 ) {
740
- for (auto & vi : m_vars)
741
- vi.set_update_value (num_t (0 ), 0 );
742
- ++m_update_timestamp;
743
- }
744
- auto & vi = m_vars[v];
745
- m_update_trail.reset ();
746
- m_update_trail.push_back (v);
747
- vi.set_update_value (new_value, m_update_timestamp);
748
-
749
- num_t delta;
750
- for (unsigned i = 0 ; i < m_update_trail.size (); ++i) {
751
- auto v = m_update_trail[i];
752
- auto & vi = m_vars[v];
753
- for (auto idx : vi.m_muls ) {
754
- auto const & [w, monomial] = m_muls[idx];
755
- num_t prod (1 );
756
- try {
757
- for (auto [w, p] : monomial)
758
- prod *= power_of (get_update_value (w), p);
759
- }
760
- catch (overflow_exception const &) {
761
- return false ;
762
- }
763
- if (get_update_value (w) != prod && (!is_permitted_update (w, prod - value (w), delta) || prod - value (w) != delta))
764
- return false ;
765
- m_update_trail.push_back (w);
766
- m_vars[w].set_update_value (prod, m_update_timestamp);
767
- }
768
725
769
- for (auto idx : vi.m_adds ) {
770
- auto const & ad = m_adds[idx];
771
- auto w = ad.m_var ;
772
- num_t sum (ad.m_coeff );
773
- for (auto const & [coeff, w] : ad.m_args )
774
- sum += coeff * get_update_value (w);
775
- if (get_update_value (v) != sum && !(is_permitted_update (w, sum - value (w), delta) || sum - value (w) != delta))
776
- return false ;
777
- m_update_trail.push_back (w);
778
- m_vars[w].set_update_value (sum, m_update_timestamp);
779
- }
780
- }
781
726
return true ;
782
727
}
783
-
784
- template <typename num_t >
785
- void arith_base<num_t >::apply_checked_update() {
786
- for (auto v : m_update_trail) {
787
- auto & vi = m_vars[v];
788
- auto old_value = vi.m_value ;
789
- vi.m_value = vi.get_update_value (m_update_timestamp);
790
- auto new_value = vi.m_value ;
791
- ctx.new_value_eh (vi.m_expr );
792
- for (auto const & [coeff, bv] : vi.m_bool_vars ) {
793
- auto & ineq = *atom (bv);
794
- bool old_sign = sign (bv);
795
- sat::literal lit (bv, old_sign);
796
- SASSERT (ctx.is_true (lit));
797
- ineq.m_args_value += coeff * (new_value - old_value);
798
- num_t dtt_new = dtt (old_sign, ineq);
799
- if (dtt_new != 0 )
800
- ctx.flip (bv);
801
- SASSERT (dtt (sign (bv), ineq) == 0 );
802
- }
803
- }
804
- }
805
-
728
+
806
729
template <typename num_t >
807
730
typename arith_base<num_t >::ineq& arith_base<num_t >::new_ineq(ineq_kind op, num_t const & coeff) {
808
731
auto * i = alloc (ineq);
@@ -906,7 +829,7 @@ namespace sls {
906
829
m_vars[w].m_muls .push_back (idx), prod *= power_of (value (w), p);
907
830
m_vars[v].m_def_idx = idx;
908
831
m_vars[v].m_op = arith_op_kind::OP_MUL;
909
- m_vars[v].m_value = prod;
832
+ m_vars[v].set_value ( prod) ;
910
833
add_arg (term, coeff, v);
911
834
break ;
912
835
}
@@ -972,7 +895,7 @@ namespace sls {
972
895
m_ops.push_back ({v, k, v, w});
973
896
m_vars[v].m_def_idx = idx;
974
897
m_vars[v].m_op = k;
975
- m_vars[v].m_value = val;
898
+ m_vars[v].set_value ( val) ;
976
899
return v;
977
900
}
978
901
@@ -993,7 +916,7 @@ namespace sls {
993
916
m_vars[w].m_adds .push_back (idx), sum += c * value (w);
994
917
m_vars[v].m_def_idx = idx;
995
918
m_vars[v].m_op = arith_op_kind::OP_ADD;
996
- m_vars[v].m_value = sum;
919
+ m_vars[v].set_value ( sum) ;
997
920
return v;
998
921
}
999
922
@@ -1055,6 +978,7 @@ namespace sls {
1055
978
else {
1056
979
SASSERT (!a.is_arith_expr (e));
1057
980
}
981
+
1058
982
}
1059
983
1060
984
template <typename num_t >
@@ -1345,6 +1269,7 @@ namespace sls {
1345
1269
hi_valid = false ;
1346
1270
}
1347
1271
catch (overflow_exception&) {
1272
+ verbose_stream () << " overflow3\n " ;
1348
1273
hi_valid = false ;
1349
1274
}
1350
1275
}
@@ -2021,7 +1946,7 @@ namespace sls {
2021
1946
if (is_num (e, n))
2022
1947
return expr_ref (a.mk_numeral (n.to_rational (), a.is_int (e)), m);
2023
1948
auto v = mk_term (e);
2024
- return expr_ref (a.mk_numeral (m_vars[v].m_value .to_rational (), a.is_int (e)), m);
1949
+ return expr_ref (a.mk_numeral (m_vars[v].value () .to_rational (), a.is_int (e)), m);
2025
1950
}
2026
1951
2027
1952
template <typename num_t >
@@ -2112,7 +2037,7 @@ namespace sls {
2112
2037
auto const & vi = m_vars[v];
2113
2038
auto const & lo = vi.m_lo ;
2114
2039
auto const & hi = vi.m_hi ;
2115
- out << " v" << v << " := " << vi.m_value << " " ;
2040
+ out << " v" << v << " := " << vi.value () << " " ;
2116
2041
if (lo || hi) {
2117
2042
if (lo)
2118
2043
out << (lo->is_strict ? " (" : " [" ) << lo->value ;
0 commit comments