1pub trait BucketToActivateEvaluator {
3 type Value: PartialEq + PartialOrd + Ord;
5
6 const MIN: Self::Value;
8
9 fn eval(&self, bucket_nr: usize, bucket_size: usize) -> Self::Value;
12}
13
14#[derive(Clone)]
67pub struct Weights(pub [i32; 7]);
68
69impl Weights {
70 pub fn new(bits_per_seed: u8, slice_len: u16) -> Self {
71 Self(if slice_len <= 256 { match (bits_per_seed, slice_len) {
73 (..=4, ..=32) => [-64542, 121567, 125058, 126982, 128486, 129929, 131003], (..=4, ..=64) => [-64511, 116865, 123821, 127467, 130311, 132528, 134191], (..=4, ..=128) => [-64100, 107340, 121197, 128499, 133718, 137312, 140441], (..=4, _) => [-73492, 86604, 113513, 128141, 138220, 145456, 151294], (..=6, ..=32) => [-63646, 124629, 127000, 128169, 129621, 130183, 130981], (..=6, ..=64) => [-63968, 120034, 125091, 127987, 130094, 131516, 132634], (..=6, ..=128) => [-64639, 112284, 121682, 127366, 131200, 134360, 136609], (..=6, _) => [-72990, 97195, 115735, 127046, 134403, 140267, 144429], (_, ..=32) => [-60034, 117057, 129045, 130280, 131078, 131608, 132110], (8, ..=64) => [-61931, 123320, 127144, 129416, 130764, 132175, 132978], (8, ..=128) => [-64853, 115515, 122738, 127413, 130280, 132894, 134336], (8, _) => [-73167, 104363, 117831, 126314, 132226, 137072, 139738], (_, ..=64) => [-63025, 125358, 128028, 129964, 131317, 132267, 132817], (_, ..=128) => [-64675, 118668, 124723, 128169, 130578, 132997, 133906], (_, _) => [-71069, 108154, 121466, 128466, 133053, 137026, 138821] }
89 } else { match (bits_per_seed, slice_len) {
91 (..=4, ..=512) => [-126969, 15686, 67995, 99429, 116711, 218955, 233075], (..=4, ..=1024) => [-67844, 12942, 103312, 155604, 191240, 199105, 203210], (5, ..=512) => [-125171, 31908, 74770, 100065, 115115, 126729, 164878], (5, ..=1024) => [-61359, 22918, 98732, 144970, 180112, 206496, 225555], (6, ..=512) => [-67857, 49430, 91006, 113610, 131179, 139109, 265291], (6, ..=1024) => [-55666, 36632, 104571, 145873, 173644, 195822, 221577], (7, ..=512) => [-67100, 66220, 100180, 115051, 131394, 142288, 148202], (7, ..=1024) => [-50734, 49098, 107496, 143459, 169287, 189260, 204132], (8, ..=512) => [-61642, 85224, 112939, 129036, 140809, 150323, 155582], (8, ..=1024) => [-50171, 59462, 109868, 141865, 163564, 181092, 192852], (..=8, _) => [-1978, 14936, 89762, 150112, 190119, 224213, 343071], (9, ..=512) => [-60668, 86903, 117046, 132208, 140749, 149552, 153428], (9, ..=1024) => [-58532, 61384, 117335, 146309, 164136, 179495, 187003], (9, _) => [-2028, 10459, 102197, 161103, 201199, 227967, 354134], (10, ..=512) => [-65892, 66203, 136361, 155795, 162095, 171627, 174716], (10, ..=1024) => [-65204, 67367, 119335, 145691, 163238, 179459, 185645], (10, _) => [-1683, 8322, 119258, 171679, 203830, 233213, 320945], (_, ..=512) => [-64904, 67974, 141210, 154142, 162631, 171673, 174504], (_, ..=1024) => [-63000, 69496, 123197, 147274, 164471, 179677, 184910], (_, _) => [-1566, 8599, 116024, 185394, 213039, 237292, 249657] }
112 })
113 }
114}
115
116impl BucketToActivateEvaluator for Weights {
117 type Value = i64;
118
119 const MIN: Self::Value = i64::MIN;
120
121 fn eval(&self, bucket_nr: usize, bucket_size: usize) -> Self::Value {
122 let sw = self.0.get(bucket_size-1).copied()
123 .unwrap_or_else(|| {
124 let len = self.0.len();
125 let l = self.0[len-1];
126 let p = self.0[len-2];
127 l + (l-p) * (bucket_size - len) as i32
128 }) as i64;
129 sw - 1024 * bucket_nr as i64
130 }
131}