@@ -21,24 +21,29 @@ class order: common {
2121 void order_lemma ();
2222
2323 // Structure to represent the key parameters for throttling generate_mon_ol
24+ // Optimized for memory efficiency with packed fields
2425 struct mon_ol_key {
25- lpvar ac_var;
26- lpvar a;
27- rational c_sign;
28- lpvar c;
29- lpvar bd_var;
30- lpvar b_var;
31- rational d_sign;
32- lpvar d;
33- llc ab_cmp;
26+ short ac_var;
27+ short a;
28+ signed char c_sign; // -1, 0, 1 fits in signed char
29+ short c;
30+ short bd_var;
31+ short b_var;
32+ signed char d_sign; // -1, 0, 1 fits in signed char
33+ short d;
34+ unsigned char ab_cmp; // llc enum fits in unsigned char
3435
3536 // Default constructor for hashtable
36- mon_ol_key () : ac_var(0 ), a(0 ), c_sign(0 ), c(0 ), bd_var(0 ), b_var(0 ), d_sign(0 ), d(0 ), ab_cmp(llc::EQ) {}
37+ mon_ol_key () : ac_var(0 ), a(0 ), c_sign(0 ), c(0 ), bd_var(0 ), b_var(0 ), d_sign(0 ), d(0 ), ab_cmp(static_cast < unsigned char >( llc::EQ) ) {}
3738
38- mon_ol_key (lpvar ac_var, lpvar a, const rational& c_sign, lpvar c,
39- lpvar bd_var, lpvar b_var, const rational& d_sign, lpvar d, llc ab_cmp)
40- : ac_var(ac_var), a(a), c_sign(c_sign), c(c), bd_var(bd_var),
41- b_var (b_var), d_sign(d_sign), d(d), ab_cmp(ab_cmp) {}
39+ mon_ol_key (lpvar ac_var, lpvar a, const rational& c_sign_rat, lpvar c,
40+ lpvar bd_var, lpvar b_var, const rational& d_sign_rat, lpvar d, llc ab_cmp)
41+ : ac_var(static_cast <short >(ac_var)), a(static_cast <short >(a)),
42+ c_sign (c_sign_rat.is_pos() ? 1 : (c_sign_rat.is_neg() ? -1 : 0)),
43+ c(static_cast <short >(c)), bd_var(static_cast <short >(bd_var)),
44+ b_var(static_cast <short >(b_var)),
45+ d_sign(d_sign_rat.is_pos() ? 1 : (d_sign_rat.is_neg() ? -1 : 0)),
46+ d(static_cast <short >(d)), ab_cmp(static_cast <unsigned char >(ab_cmp)) {}
4247
4348 bool operator ==(const mon_ol_key& other) const {
4449 return ac_var == other.ac_var && a == other.a && c_sign == other.c_sign &&
@@ -49,13 +54,16 @@ class order: common {
4954
5055 struct mon_ol_key_hash {
5156 unsigned operator ()(const mon_ol_key& k) const {
52- return combine_hash (combine_hash (combine_hash (combine_hash (
53- combine_hash (combine_hash (combine_hash (combine_hash (
54- static_cast <unsigned >(k.ac_var ), static_cast <unsigned >(k.a )),
55- k.c_sign .hash ()), static_cast <unsigned >(k.c )),
56- static_cast <unsigned >(k.bd_var )), static_cast <unsigned >(k.b_var )),
57- k.d_sign .hash ()), static_cast <unsigned >(k.d )),
58- static_cast <unsigned >(k.ab_cmp ));
57+ // Optimized hash with better distribution using bit shifts
58+ unsigned h1 = (static_cast <unsigned >(k.ac_var ) << 16 ) | static_cast <unsigned >(k.a );
59+ unsigned h2 = (static_cast <unsigned >(k.c_sign + 1 ) << 24 ) |
60+ (static_cast <unsigned >(k.c ) << 8 ) | static_cast <unsigned >(k.bd_var );
61+ unsigned h3 = (static_cast <unsigned >(k.b_var ) << 16 ) |
62+ ((static_cast <unsigned >(k.d_sign + 1 ) << 8 )) |
63+ static_cast <unsigned >(k.d );
64+ unsigned h4 = static_cast <unsigned >(k.ab_cmp );
65+
66+ return combine_hash (combine_hash (h1, h2), combine_hash (h3, h4));
5967 }
6068 };
6169
@@ -64,8 +72,44 @@ class order: common {
6472 const monic& bd, const factor& b, const rational& d_sign,
6573 lpvar d, llc ab_cmp, const std::string& debug_location);
6674
67- int_hashtable<int_hash, default_eq<int >> m_processed_monics;
68- bool throttle_monic (const monic&, const std::string & debug_location);
75+ // Structure to represent the key parameters for throttling order_lemma_on_binomial_sign
76+ // Optimized for memory efficiency with packed fields
77+ struct binomial_sign_key {
78+ short xy_var;
79+ short x;
80+ short y;
81+ signed char sign;
82+ signed char sy;
83+
84+ // Default constructor for hashtable
85+ binomial_sign_key () : xy_var(0 ), x(0 ), y(0 ), sign(0 ), sy(0 ) {}
86+
87+ binomial_sign_key (lpvar xy_var, lpvar x, lpvar y, int sign, int sy)
88+ : xy_var(static_cast <short >(xy_var)), x(static_cast <short >(x)),
89+ y (static_cast <short >(y)), sign(static_cast <signed char >(sign)),
90+ sy(static_cast <signed char >(sy)) {}
91+
92+ bool operator ==(const binomial_sign_key& other) const {
93+ return xy_var == other.xy_var && x == other.x && y == other.y &&
94+ sign == other.sign && sy == other.sy ;
95+ }
96+ };
97+
98+ struct binomial_sign_key_hash {
99+ unsigned operator ()(const binomial_sign_key& k) const {
100+ // Optimized hash with better distribution
101+ unsigned h1 = (static_cast <unsigned >(k.xy_var ) << 16 ) | static_cast <unsigned >(k.x );
102+ unsigned h2 = (static_cast <unsigned >(k.y ) << 16 ) |
103+ ((static_cast <unsigned >(k.sign + 127 ) << 8 )) | // shift sign to positive range
104+ static_cast <unsigned >(k.sy + 127 ); // shift sy to positive range
105+
106+ return combine_hash (h1, h2);
107+ }
108+ };
109+
110+ hashtable<binomial_sign_key, binomial_sign_key_hash, default_eq<binomial_sign_key>> m_processed_binomial_sign;
111+ bool throttle_binomial_sign (const monic& xy, lpvar x, lpvar y, int sign, int sy, const std::string& debug_location);
112+
69113 private:
70114
71115 bool order_lemma_on_ac_and_bc_and_factors (const monic& ac,
0 commit comments