@@ -15,6 +15,10 @@ const LONGTERM_CAP: usize = 100;
15
15
pub struct RecentUseStorage {
16
16
long_term : HashMap < u64 , usize > ,
17
17
short_term : HashMap < u64 , usize > ,
18
+ /// used for normalizing individual scores
19
+ max_long_term : usize ,
20
+ /// used for normalizing individual scores
21
+ max_short_term : usize ,
18
22
}
19
23
20
24
fn hash_key < K : Hash > ( key : K ) -> u64 {
@@ -26,8 +30,11 @@ fn hash_key<K: Hash>(key: K) -> u64 {
26
30
impl RecentUseStorage {
27
31
pub fn add < K : Hash > ( & mut self , exec : & K ) {
28
32
let key = hash_key ( exec) ;
29
- * self . long_term . entry ( key) . or_insert ( 0 ) += 1 ;
33
+ let entry = self . long_term . entry ( key) . or_insert ( 0 ) ;
34
+ * entry += 1 ;
35
+ self . max_long_term = self . max_long_term . max ( * entry) ;
30
36
let short_term_idx = self . short_term . values ( ) . max ( ) . unwrap_or ( & 0 ) + 1 ;
37
+ self . max_short_term = self . max_short_term . max ( short_term_idx) ;
31
38
self . short_term . insert ( key, short_term_idx) ;
32
39
self . trim ( ) ;
33
40
}
@@ -39,6 +46,8 @@ impl RecentUseStorage {
39
46
}
40
47
41
48
while self . long_term . values ( ) . sum :: < usize > ( ) > LONGTERM_CAP {
49
+ self . max_long_term /= 2 ;
50
+
42
51
let mut delete_keys = Vec :: new ( ) ;
43
52
for ( k, v) in & mut self . long_term {
44
53
* v /= 2 ;
@@ -52,12 +61,14 @@ impl RecentUseStorage {
52
61
}
53
62
}
54
63
55
- pub fn get_recent < K : Hash > ( & self , exec : & K ) -> usize {
56
- self . short_term . get ( & hash_key ( exec) ) . copied ( ) . unwrap_or ( 0 )
64
+ pub fn get_recent < K : Hash > ( & self , exec : & K ) -> f64 {
65
+ self . short_term . get ( & hash_key ( exec) ) . copied ( ) . unwrap_or ( 0 ) as f64
66
+ / ( self . max_short_term . max ( 1 ) as f64 )
57
67
}
58
68
59
- pub fn get_freq < K : Hash > ( & self , exec : & K ) -> usize {
60
- self . long_term . get ( & hash_key ( exec) ) . copied ( ) . unwrap_or ( 0 )
69
+ pub fn get_freq < K : Hash > ( & self , exec : & K ) -> f64 {
70
+ self . long_term . get ( & hash_key ( exec) ) . copied ( ) . unwrap_or ( 0 ) as f64
71
+ / ( self . max_long_term . max ( 1 ) as f64 )
61
72
}
62
73
}
63
74
@@ -80,9 +91,13 @@ impl<'de> Deserialize<'de> for RecentUseStorage {
80
91
type SerType = ( HashMap < u64 , usize > , Vec < u64 > ) ;
81
92
let ( long_term, stv) = SerType :: deserialize ( deserializer) ?;
82
93
let short_term: HashMap < _ , _ > = stv. into_iter ( ) . enumerate ( ) . map ( |( v, k) | ( k, v) ) . collect ( ) ;
94
+ let max_long_term = long_term. values ( ) . max ( ) . copied ( ) . unwrap_or ( 1 ) ;
95
+ let max_short_term = short_term. values ( ) . max ( ) . copied ( ) . unwrap_or ( 1 ) ;
83
96
Ok ( RecentUseStorage {
84
97
long_term,
85
98
short_term,
99
+ max_long_term,
100
+ max_short_term,
86
101
} )
87
102
}
88
103
}
0 commit comments