diff --git a/Cargo.toml b/Cargo.toml index ef5d5f5..09b92a9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -37,4 +37,5 @@ serde_json = "1.0" siphasher = "0.3.3" [dependencies] +mem_dbg = {version="0.2.4", optional=true} serde = { version = "1.0", default-features = false, features = ["derive"] } diff --git a/evaluation/src/main.rs b/evaluation/src/main.rs index d1b9fc1..ce2387e 100644 --- a/evaluation/src/main.rs +++ b/evaluation/src/main.rs @@ -12,6 +12,7 @@ use rayon::prelude::*; use hyperloglogplus::{HyperLogLog, HyperLogLogPF, HyperLogLogPlus}; +#[cfg_attr(feature = "mem_dbg", derive(mem_dbg::MemDbg, mem_dbg::MemSize))] struct PassThroughHasher(u64); impl Hasher for PassThroughHasher { @@ -30,6 +31,7 @@ impl Hasher for PassThroughHasher { } } +#[cfg_attr(feature = "mem_dbg", derive(mem_dbg::MemDbg, mem_dbg::MemSize))] struct PassThroughHasherBuilder; impl BuildHasher for PassThroughHasherBuilder { @@ -40,6 +42,7 @@ impl BuildHasher for PassThroughHasherBuilder { } } +#[cfg_attr(feature = "mem_dbg", derive(mem_dbg::MemDbg, mem_dbg::MemSize))] struct Estimation(u64, u64); impl fmt::Display for Estimation { diff --git a/src/common.rs b/src/common.rs index 514a40d..11fd0f0 100644 --- a/src/common.rs +++ b/src/common.rs @@ -8,6 +8,10 @@ macro_rules! registers_impls { ($len:expr, $ident:ident) => { // A Registers struct. #[derive(Clone, Debug, Serialize, Deserialize)] + #[cfg_attr( + feature = "mem_dbg", + derive(mem_dbg::MemDbg, mem_dbg::MemSize) + )] pub struct $ident { // A buffer containing registers. buf: Vec, diff --git a/src/constants.rs b/src/constants.rs index 1e57fbd..67dff66 100644 --- a/src/constants.rs +++ b/src/constants.rs @@ -1,6 +1,5 @@ // raw estimates to determine bias as determined by Google. pub const RAW_ESTIMATE_DATA: &[&[f64]] = &[ - // precision 4 &[ 11.0, 11.717, 12.207, 12.7896, 13.2882, 13.8204, 14.3772, 14.9342, 15.5202, 16.161, 16.7722, 17.4636, 18.0396, 18.6766, 19.3566, 20.0454, @@ -13,62 +12,66 @@ pub const RAW_ESTIMATE_DATA: &[&[f64]] = &[ 63.9744, 64.914, 65.781, 67.1806, 68.0594, 68.8446, 69.7928, 70.8248, 71.8324, 72.8598, 73.6246, 74.7014, 75.393, 76.6708, 77.2394, ], - // precision 5 &[ - 23.0, 23.1194, 23.8208, 24.2318, 24.77, 25.2436, 25.7774, 26.2848, - 26.8224, 27.3742, 27.9336, 28.503, 29.0494, 29.6292, 30.2124, 30.798, - 31.367, 31.9728, 32.5944, 33.217, 33.8438, 34.3696, 35.0956, 35.7044, - 36.324, 37.0668, 37.6698, 38.3644, 39.049, 39.6918, 40.4146, 41.082, - 41.687, 42.5398, 43.2462, 43.857, 44.6606, 45.4168, 46.1248, 46.9222, - 47.6804, 48.447, 49.3454, 49.9594, 50.7636, 51.5776, 52.331, 53.19, - 53.9676, 54.7564, 55.5314, 56.4442, 57.3708, 57.9774, 58.9624, 59.8796, - 60.755, 61.472, 62.2076, 63.1024, 63.8908, 64.7338, 65.7728, 66.629, - 67.413, 68.3266, 69.1524, 70.2642, 71.1806, 72.0566, 72.9192, 73.7598, - 74.3516, 75.5802, 76.4386, 77.4916, 78.1524, 79.1892, 79.8414, 80.8798, - 81.8376, 82.4698, 83.7656, 84.331, 85.5914, 86.6012, 87.7016, 88.5582, - 89.3394, 90.3544, 91.4912, 92.308, 93.3552, 93.9746, 95.2052, 95.727, - 97.1322, 98.3944, 98.7588, 100.242, 101.1914, 102.2538, 102.8776, - 103.6292, 105.1932, 105.9152, 107.0868, 107.6728, 108.7144, 110.3114, - 110.8716, 111.245, 112.7908, 113.7064, 114.636, 115.7464, 116.1788, - 117.7464, 118.4896, 119.6166, 120.5082, 121.7798, 122.9028, 123.4426, - 124.8854, 125.705, 126.4652, 128.3464, 128.3462, 130.0398, 131.0342, - 131.0042, 132.4766, 133.511, 134.7252, 135.425, 136.5172, 138.0572, - 138.6694, 139.3712, 140.8598, 141.4594, 142.554, 143.4006, 144.7374, - 146.1634, 146.8994, 147.605, 147.9304, 149.1636, 150.2468, 151.5876, - 152.2096, 153.7032, 154.7146, 155.807, 156.9228, 157.0372, 158.5852, + 23.0, 23.119_4, 23.820_8, 24.231_8, 24.77, 25.243_6, 25.777_4, + 26.284_8, 26.822_4, 27.374_2, 27.933_6, 28.503, 29.049_4, 29.629_2, + 30.212_4, 30.798, 31.367, 31.972_8, 32.594_4, 33.217, 33.843_8, + 34.369_6, 35.095_6, 35.704_4, 36.324, 37.066_8, 37.669_8, 38.364_4, + 39.049, 39.691_8, 40.414_6, 41.082, 41.687, 42.539_8, 43.246_2, 43.857, + 44.660_6, 45.416_8, 46.124_8, 46.922_2, 47.680_4, 48.447, 49.345_4, + 49.959_4, 50.763_6, 51.577_6, 52.331, 53.19, 53.967_6, 54.756_4, + 55.531_4, 56.444_2, 57.370_8, 57.977_4, 58.962_4, 59.879_6, 60.755, + 61.472, 62.207_6, 63.102_4, 63.890_8, 64.733_8, 65.772_8, 66.629, + 67.413, 68.326_6, 69.152_4, 70.264_2, 71.180_6, 72.056_6, 72.919_2, + 73.759_8, 74.351_6, 75.580_2, 76.438_6, 77.491_6, 78.152_4, 79.189_2, + 79.841_4, 80.879_8, 81.837_6, 82.469_8, 83.765_6, 84.331, 85.591_4, + 86.601_2, 87.701_6, 88.558_2, 89.339_4, 90.354_4, 91.491_2, 92.308, + 93.355_2, 93.974_6, 95.205_2, 95.727, 97.132_2, 98.394_4, 98.758_8, + 100.242, 101.191_4, 102.253_8, 102.877_6, 103.629_2, 105.193_2, + 105.915_2, 107.086_8, 107.672_8, 108.714_4, 110.311_4, 110.871_6, + 111.245, 112.790_8, 113.706_4, 114.636, 115.746_4, 116.178_8, + 117.746_4, 118.489_6, 119.616_6, 120.508_2, 121.779_8, 122.902_8, + 123.442_6, 124.885_4, 125.705, 126.465_2, 128.346_2, 128.346_4, + 130.039_8, 131.004_2, 131.034_2, 132.476_6, 133.511, 134.725_2, + 135.425, 136.517_2, 138.057_2, 138.669_4, 139.371_2, 140.859_8, + 141.459_4, 142.554, 143.400_6, 144.737_4, 146.163_4, 146.899_4, + 147.605, 147.930_4, 149.163_6, 150.246_8, 151.587_6, 152.209_6, + 153.703_2, 154.714_6, 155.807, 156.922_8, 157.037_2, 158.585_2, ], - // precision 6 &[ - 46.0, 46.1902, 47.271, 47.8358, 48.8142, 49.2854, 50.317, 51.354, - 51.8924, 52.9436, 53.4596, 54.5262, 55.6248, 56.1574, 57.2822, 57.837, - 58.9636, 60.074, 60.7042, 61.7976, 62.4772, 63.6564, 64.7942, 65.5004, - 66.686, 67.291, 68.5672, 69.8556, 70.4982, 71.8204, 72.4252, 73.7744, - 75.0786, 75.8344, 77.0294, 77.8098, 79.0794, 80.5732, 81.1878, 82.5648, - 83.2902, 84.6784, 85.3352, 86.8946, 88.3712, 89.0852, 90.499, 91.2686, - 92.6844, 94.2234, 94.9732, 96.3356, 97.2286, 98.7262, 100.3284, - 101.1048, 102.5962, 103.3562, 105.1272, 106.4184, 107.4974, 109.0822, - 109.856, 111.48, 113.2834, 114.0208, 115.637, 116.5174, 118.0576, - 119.7476, 120.427, 122.1326, 123.2372, 125.2788, 126.6776, 127.7926, - 129.1952, 129.9564, 131.6454, 133.87, 134.5428, 136.2, 137.0294, - 138.6278, 139.6782, 141.792, 143.3516, 144.2832, 146.0394, 147.0748, - 148.4912, 150.849, 151.696, 153.5404, 154.073, 156.3714, 157.7216, - 158.7328, 160.4208, 161.4184, 163.9424, 165.2772, 166.411, 168.1308, - 168.769, 170.9258, 172.6828, 173.7502, 175.706, 176.3886, 179.0186, - 180.4518, 181.927, 183.4172, 184.4114, 186.033, 188.5124, 189.5564, - 191.6008, 192.4172, 193.8044, 194.997, 197.4548, 198.8948, 200.2346, - 202.3086, 203.1548, 204.8842, 206.6508, 206.6772, 209.7254, 210.4752, - 212.7228, 214.6614, 215.1676, 217.793, 218.0006, 219.9052, 221.66, - 223.5588, 225.1636, 225.6882, 227.7126, 229.4502, 231.1978, 232.9756, - 233.1654, 236.727, 238.1974, 237.7474, 241.1346, 242.3048, 244.1948, - 245.3134, 246.879, 249.1204, 249.853, 252.6792, 253.857, 254.4486, - 257.2362, 257.9534, 260.0286, 260.5632, 262.663, 264.723, 265.7566, - 267.2566, 267.1624, 270.62, 272.8216, 273.2166, 275.2056, 276.2202, - 278.3726, 280.3344, 281.9284, 283.9728, 284.1924, 286.4872, 287.587, - 289.807, 291.1206, 292.769, 294.8708, 296.665, 297.1182, 299.4012, - 300.6352, 302.1354, 304.1756, 306.1606, 307.3462, 308.5214, 309.4134, - 310.8352, 313.9684, 315.837, 316.7796, 318.9858, + 46.0, 46.190_2, 47.271, 47.835_8, 48.814_2, 49.285_4, 50.317, 51.354, + 51.892_4, 52.943_6, 53.459_6, 54.526_2, 55.624_8, 56.157_4, 57.282_2, + 57.837, 58.963_6, 60.074, 60.704_2, 61.797_6, 62.477_2, 63.656_4, + 64.794_2, 65.500_4, 66.686, 67.291, 68.567_2, 69.855_6, 70.498_2, + 71.820_4, 72.425_2, 73.774_4, 75.078_6, 75.834_4, 77.029_4, 77.809_8, + 79.079_4, 80.573_2, 81.187_8, 82.564_8, 83.290_2, 84.678_4, 85.335_2, + 86.894_6, 88.371_2, 89.085_2, 90.499, 91.268_6, 92.684_4, 94.223_4, + 94.973_2, 96.335_6, 97.228_6, 98.726_2, 100.328_4, 101.104_8, + 102.596_2, 103.356_2, 105.127_2, 106.418_4, 107.497_4, 109.082_2, + 109.856, 111.48, 113.283_4, 114.020_8, 115.637, 116.517_4, 118.057_6, + 119.747_6, 120.427, 122.132_6, 123.237_2, 125.278_8, 126.677_6, + 127.792_6, 129.195_2, 129.956_4, 131.645_4, 133.87, 134.542_8, 136.2, + 137.029_4, 138.627_8, 139.678_2, 141.792, 143.351_6, 144.283_2, + 146.039_4, 147.074_8, 148.491_2, 150.849, 151.696, 153.540_4, 154.073, + 156.371_4, 157.721_6, 158.732_8, 160.420_8, 161.418_4, 163.942_4, + 165.277_2, 166.411, 168.130_8, 168.769, 170.925_8, 172.682_8, + 173.750_2, 175.706, 176.388_6, 179.018_6, 180.451_8, 181.927, + 183.417_2, 184.411_4, 186.033, 188.512_4, 189.556_4, 191.600_8, + 192.417_2, 193.804_4, 194.997, 197.454_8, 198.894_8, 200.234_6, + 202.308_6, 203.154_8, 204.884_2, 206.650_8, 206.677_2, 209.725_4, + 210.475_2, 212.722_8, 214.661_4, 215.167_6, 217.793, 218.000_6, + 219.905_2, 221.66, 223.558_8, 225.163_6, 225.688_2, 227.712_6, + 229.450_2, 231.197_8, 232.975_6, 233.165_4, 236.727, 237.747_4, + 238.197_4, 241.134_6, 242.304_8, 244.194_8, 245.313_4, 246.879, + 249.120_4, 249.853, 252.679_2, 253.857, 254.448_6, 257.236_2, + 257.953_4, 260.028_6, 260.563_2, 262.663, 264.723, 265.756_6, + 267.162_4, 267.256_6, 270.62, 272.821_6, 273.216_6, 275.205_6, + 276.220_2, 278.372_6, 280.334_4, 281.928_4, 283.972_8, 284.192_4, + 286.487_2, 287.587, 289.807, 291.120_6, 292.769, 294.870_8, 296.665, + 297.118_2, 299.401_2, 300.635_2, 302.135_4, 304.175_6, 306.160_6, + 307.346_2, 308.521_4, 309.413_4, 310.835_2, 313.968_4, 315.837, + 316.779_6, 318.985_8, ], - // precision 7 &[ 92.0, 93.4934, 94.9758, 96.4574, 97.9718, 99.4954, 101.5302, 103.0756, 104.6374, 106.1782, 107.7888, 109.9522, 111.592, 113.2532, 114.9086, @@ -1170,7 +1173,6 @@ pub const RAW_ESTIMATE_DATA: &[&[f64]] = &[ // bias estimates for the corresponding raw estimate as determined by Google. pub const BIAS_DATA: &[&[f64]] = &[ - // precision 4 &[ 10.0, 9.717, @@ -1252,372 +1254,58 @@ pub const BIAS_DATA: &[&[f64]] = &[ -1.3292, -1.7606, ], - // precision 5 &[ - 22.0, - 21.1194, - 20.8208, - 20.2318, - 19.77, - 19.2436, - 18.7774, - 18.2848, - 17.8224, - 17.3742, - 16.9336, - 16.503, - 16.0494, - 15.6292, - 15.2124, - 14.798, - 14.367, - 13.9728, - 13.5944, - 13.217, - 12.8438, - 12.3696, - 12.0956, - 11.7044, - 11.324, - 11.0668, - 10.6698, - 10.3644, - 10.049, - 9.6918, - 9.4146, - 9.082, - 8.687, - 8.5398, - 8.2462, - 7.857, - 7.6606, - 7.4168, - 7.1248, - 6.9222, - 6.6804, - 6.447, - 6.3454, - 5.9594, - 5.7636, - 5.5776, - 5.331, - 5.19, - 4.9676, - 4.7564, - 4.5314, - 4.4442, - 4.3708, - 3.9774, - 3.9624, - 3.8796, - 3.755, - 3.472, - 3.2076, - 3.1024, - 2.8908, - 2.7338, - 2.7728, - 2.629, - 2.413, - 2.3266, - 2.1524, - 2.2642, - 2.1806, - 2.0566, - 1.9192, - 1.7598, - 1.3516, - 1.5802, - 1.43859999999999, - 1.49160000000001, - 1.1524, - 1.1892, - 0.841399999999993, - 0.879800000000003, - 0.837599999999995, - 0.469800000000006, - 0.765600000000006, - 0.331000000000003, - 0.591399999999993, - 0.601200000000006, - 0.701599999999999, - 0.558199999999999, - 0.339399999999998, - 0.354399999999998, - 0.491200000000006, - 0.308000000000007, - 0.355199999999996, - -0.0254000000000048, - 0.205200000000005, - -0.272999999999996, - 0.132199999999997, - 0.394400000000005, - -0.241200000000006, - 0.242000000000004, - 0.191400000000002, - 0.253799999999998, - -0.122399999999999, - -0.370800000000003, - 0.193200000000004, - -0.0848000000000013, - 0.0867999999999967, - -0.327200000000005, - -0.285600000000002, - 0.311400000000006, - -0.128399999999999, - -0.754999999999995, - -0.209199999999996, - -0.293599999999998, - -0.364000000000004, - -0.253600000000006, - -0.821200000000005, - -0.253600000000006, - -0.510400000000004, - -0.383399999999995, - -0.491799999999998, - -0.220200000000006, - -0.0972000000000008, - -0.557400000000001, - -0.114599999999996, - -0.295000000000002, - -0.534800000000004, - 0.346399999999988, - -0.65379999999999, - 0.0398000000000138, - 0.0341999999999985, - -0.995800000000003, - -0.523400000000009, - -0.489000000000004, - -0.274799999999999, - -0.574999999999989, - -0.482799999999997, - 0.0571999999999946, - -0.330600000000004, - -0.628800000000012, - -0.140199999999993, - -0.540600000000012, - -0.445999999999998, - -0.599400000000003, - -0.262599999999992, - 0.163399999999996, - -0.100599999999986, - -0.39500000000001, - -1.06960000000001, - -0.836399999999998, - -0.753199999999993, - -0.412399999999991, - -0.790400000000005, - -0.29679999999999, - -0.28540000000001, - -0.193000000000012, - -0.0772000000000048, - -0.962799999999987, - -0.414800000000014, + 22.0, 21.119_4, 20.820_8, 20.231_8, 19.77, 19.243_6, 18.777_4, + 18.284_8, 17.822_4, 17.374_2, 16.933_6, 16.503, 16.049_4, 15.629_2, + 15.212_4, 14.798, 14.367, 13.972_8, 13.594_4, 13.217, 12.843_8, + 12.369_6, 12.095_6, 11.704_4, 11.324, 11.066_8, 10.669_8, 10.364_4, + 10.049, 9.691_8, 9.414_6, 9.082, 8.687, 8.539_8, 8.246_2, 7.857, + 7.660_6, 7.416_8, 7.124_8, 6.922_2, 6.680_4, 6.447, 6.345_4, 5.959_4, + 5.763_6, 5.577_6, 5.331, 5.19, 4.967_6, 4.756_4, 4.531_4, 4.444_2, + 4.370_8, 3.977_4, 3.962_4, 3.879_6, 3.755, 3.472, 3.207_6, 3.102_4, + 2.890_8, 2.733_8, 2.772_8, 2.629, 2.413, 2.326_6, 2.152_4, 2.264_2, + 2.180_6, 2.056_6, 1.919_2, 1.759_8, 1.351_6, 1.580_2, 1.438_6, 1.491_6, + 1.152_4, 1.189_2, 0.841_4, 0.879_8, 0.837_6, 0.469_8, 0.765_6, 0.331, + 0.591_4, 0.601_2, 0.701_6, 0.558_2, 0.339_4, 0.354_4, 0.491_2, 0.308, + 0.355_2, -0.025_4, 0.205_2, -0.273, 0.132_2, 0.394_4, -0.241_2, 0.242, + 0.191_4, 0.253_8, -0.122_4, -0.370_8, 0.193_2, -0.084_8, 0.086_8, + -0.327_2, -0.285_6, 0.311_4, -0.128_4, -0.755, -0.209_2, -0.293_6, + -0.364, -0.253_6, -0.821_2, -0.253_6, -0.510_4, -0.383_4, -0.491_8, + -0.220_2, -0.097_2, -0.557_4, -0.114_6, -0.295, -0.534_8, -0.653_8, + 0.346_4, 0.039_8, -0.995_8, 0.034_2, -0.523_4, -0.489, -0.274_8, + -0.575, -0.482_8, 0.057_2, -0.330_6, -0.628_8, -0.140_2, -0.540_6, + -0.446, -0.599_4, -0.262_6, 0.163_4, -0.100_6, -0.395, -1.069_6, + -0.836_4, -0.753_2, -0.412_4, -0.790_4, -0.296_8, -0.285_4, -0.193, + -0.077_2, -0.962_8, -0.414_8, ], - // precision 6 &[ - 45.0, - 44.1902, - 43.271, - 42.8358, - 41.8142, - 41.2854, - 40.317, - 39.354, - 38.8924, - 37.9436, - 37.4596, - 36.5262, - 35.6248, - 35.1574, - 34.2822, - 33.837, - 32.9636, - 32.074, - 31.7042, - 30.7976, - 30.4772, - 29.6564, - 28.7942, - 28.5004, - 27.686, - 27.291, - 26.5672, - 25.8556, - 25.4982, - 24.8204, - 24.4252, - 23.7744, - 23.0786, - 22.8344, - 22.0294, - 21.8098, - 21.0794, - 20.5732, - 20.1878, - 19.5648, - 19.2902, - 18.6784, - 18.3352, - 17.8946, - 17.3712, - 17.0852, - 16.499, - 16.2686, - 15.6844, - 15.2234, - 14.9732, - 14.3356, - 14.2286, - 13.7262, - 13.3284, - 13.1048, - 12.5962, - 12.3562, - 12.1272, - 11.4184, - 11.4974, - 11.0822, - 10.856, - 10.48, - 10.2834, - 10.0208, - 9.637, - 9.51739999999999, - 9.05759999999999, - 8.74760000000001, - 8.42700000000001, - 8.1326, - 8.2372, - 8.2788, - 7.6776, - 7.79259999999999, - 7.1952, - 6.9564, - 6.6454, - 6.87, - 6.5428, - 6.19999999999999, - 6.02940000000001, - 5.62780000000001, - 5.6782, - 5.792, - 5.35159999999999, - 5.28319999999999, - 5.0394, - 5.07480000000001, - 4.49119999999999, - 4.84899999999999, - 4.696, - 4.54040000000001, - 4.07300000000001, - 4.37139999999999, - 3.7216, - 3.7328, - 3.42080000000001, - 3.41839999999999, - 3.94239999999999, - 3.27719999999999, - 3.411, - 3.13079999999999, - 2.76900000000001, - 2.92580000000001, - 2.68279999999999, - 2.75020000000001, - 2.70599999999999, - 2.3886, - 3.01859999999999, - 2.45179999999999, - 2.92699999999999, - 2.41720000000001, - 2.41139999999999, - 2.03299999999999, - 2.51240000000001, - 2.5564, - 2.60079999999999, - 2.41720000000001, - 1.80439999999999, - 1.99700000000001, - 2.45480000000001, - 1.8948, - 2.2346, - 2.30860000000001, - 2.15479999999999, - 1.88419999999999, - 1.6508, - 0.677199999999999, - 1.72540000000001, - 1.4752, - 1.72280000000001, - 1.66139999999999, - 1.16759999999999, - 1.79300000000001, - 1.00059999999999, - 0.905200000000008, - 0.659999999999997, - 1.55879999999999, - 1.1636, - 0.688199999999995, - 0.712600000000009, - 0.450199999999995, - 1.1978, - 0.975599999999986, - 0.165400000000005, - 1.727, - 1.19739999999999, - -0.252600000000001, - 1.13460000000001, - 1.3048, - 1.19479999999999, - 0.313400000000001, - 0.878999999999991, - 1.12039999999999, - 0.853000000000009, - 1.67920000000001, - 0.856999999999999, - 0.448599999999999, - 1.2362, - 0.953399999999988, - 1.02859999999998, - 0.563199999999995, - 0.663000000000011, - 0.723000000000013, - 0.756599999999992, - 0.256599999999992, - -0.837600000000009, - 0.620000000000005, - 0.821599999999989, - 0.216600000000028, - 0.205600000000004, - 0.220199999999977, - 0.372599999999977, - 0.334400000000016, - 0.928400000000011, - 0.972800000000007, - 0.192400000000021, - 0.487199999999973, - -0.413000000000011, - 0.807000000000016, - 0.120600000000024, - 0.769000000000005, - 0.870799999999974, - 0.66500000000002, - 0.118200000000002, - 0.401200000000017, - 0.635199999999998, - 0.135400000000004, - 0.175599999999974, - 1.16059999999999, - 0.34620000000001, - 0.521400000000028, - -0.586599999999976, - -1.16480000000001, - 0.968399999999974, - 0.836999999999989, - 0.779600000000016, - 0.985799999999983, + 45.0, 44.190_2, 43.271, 42.835_8, 41.814_2, 41.285_4, 40.317, 39.354, + 38.892_4, 37.943_6, 37.459_6, 36.526_2, 35.624_8, 35.157_4, 34.282_2, + 33.837, 32.963_6, 32.074, 31.704_2, 30.797_6, 30.477_2, 29.656_4, + 28.794_2, 28.500_4, 27.686, 27.291, 26.567_2, 25.855_6, 25.498_2, + 24.820_4, 24.425_2, 23.774_4, 23.078_6, 22.834_4, 22.029_4, 21.809_8, + 21.079_4, 20.573_2, 20.187_8, 19.564_8, 19.290_2, 18.678_4, 18.335_2, + 17.894_6, 17.371_2, 17.085_2, 16.499, 16.268_6, 15.684_4, 15.223_4, + 14.973_2, 14.335_6, 14.228_6, 13.726_2, 13.328_4, 13.104_8, 12.596_2, + 12.356_2, 12.127_2, 11.418_4, 11.497_4, 11.082_2, 10.856, 10.48, + 10.283_4, 10.020_8, 9.637, 9.517_4, 9.057_6, 8.747_6, 8.427, 8.132_6, + 8.237_2, 8.278_8, 7.677_6, 7.792_6, 7.195_2, 6.956_4, 6.645_4, 6.87, + 6.542_8, 6.2, 6.029_4, 5.627_8, 5.678_2, 5.792, 5.351_6, 5.283_2, + 5.039_4, 5.074_8, 4.491_2, 4.849, 4.696, 4.540_4, 4.073, 4.371_4, + 3.721_6, 3.732_8, 3.420_8, 3.418_4, 3.942_4, 3.277_2, 3.411, 3.130_8, + 2.769, 2.925_8, 2.682_8, 2.750_2, 2.706, 2.388_6, 3.018_6, 2.451_8, + 2.927, 2.417_2, 2.411_4, 2.033, 2.512_4, 2.556_4, 2.600_8, 2.417_2, + 1.804_4, 1.997, 2.454_8, 1.894_8, 2.234_6, 2.308_6, 2.154_8, 1.884_2, + 1.650_8, 0.677_2, 1.725_4, 1.475_2, 1.722_8, 1.661_4, 1.167_6, 1.793, + 1.000_6, 0.905_2, 0.66, 1.558_8, 1.163_6, 0.688_2, 0.712_6, 0.450_2, + 1.197_8, 0.975_6, 0.165_4, 1.727, -0.252_6, 1.197_4, 1.134_6, 1.304_8, + 1.194_8, 0.313_4, 0.879, 1.120_4, 0.853, 1.679_2, 0.857, 0.448_6, + 1.236_2, 0.953_4, 1.028_6, 0.563_2, 0.663, 0.723, 0.756_6, -0.837_6, + 0.256_6, 0.62, 0.821_6, 0.216_6, 0.205_6, 0.220_2, 0.372_6, 0.334_4, + 0.928_4, 0.972_8, 0.192_4, 0.487_2, -0.413, 0.807, 0.120_6, 0.769, + 0.870_8, 0.665, 0.118_2, 0.401_2, 0.635_2, 0.135_4, 0.175_6, 1.160_6, + 0.346_2, 0.521_4, -0.586_6, -1.164_8, 0.968_4, 0.837, 0.779_6, 0.985_8, ], - // precision 7 &[ 91.0, 89.4934, @@ -4060,3 +3748,36 @@ pub const BIAS_DATA: &[&[f64]] = &[ -713.308999999892, ], ]; + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_estimates_are_sorted() { + for (i, estimates) in RAW_ESTIMATE_DATA.iter().enumerate() { + let precision = i + 4; + assert!( + estimates.windows(2).all(|w| w[0] <= w[1]), + "Estimates for precision {} is not sorted", + precision + ); + } + } + + #[test] + fn test_length_compatibility() { + assert_eq!(RAW_ESTIMATE_DATA.len(), 15); + for (i, (estimates, biases)) in + RAW_ESTIMATE_DATA.iter().zip(BIAS_DATA.iter()).enumerate() + { + let precision = i + 4; + assert_eq!( + estimates.len(), + biases.len(), + "Estimates and biases for precision {} have different lengths", + precision + ); + } + } +} diff --git a/src/encoding.rs b/src/encoding.rs index 83c24b5..1d61c17 100644 --- a/src/encoding.rs +++ b/src/encoding.rs @@ -2,6 +2,7 @@ use serde::{Deserialize, Serialize}; // A Vector of bytes containing variable length encoded unsigned integers. #[derive(Clone, Debug, Serialize, Deserialize)] +#[cfg_attr(feature = "mem_dbg", derive(mem_dbg::MemDbg, mem_dbg::MemSize))] pub struct VarIntVec(Vec); // A Vector containing difference encoded unsigned integers @@ -10,6 +11,7 @@ pub struct VarIntVec(Vec); // Numbers stored are assumed to be in increasing order, hence the // difference between a new number and `last` will always be positive. #[derive(Clone, Debug, Serialize, Deserialize)] +#[cfg_attr(feature = "mem_dbg", derive(mem_dbg::MemDbg, mem_dbg::MemSize))] pub struct DifIntVec { // The count of numbers stored. count: usize, @@ -19,11 +21,13 @@ pub struct DifIntVec { buf: VarIntVec, } +#[cfg_attr(feature = "mem_dbg", derive(mem_dbg::MemDbg, mem_dbg::MemSize))] pub struct VarIntVecIntoIter<'a> { index: usize, inner: &'a VarIntVec, } +#[cfg_attr(feature = "mem_dbg", derive(mem_dbg::MemDbg, mem_dbg::MemSize))] pub struct DifIntVecIntoIter<'a> { index: usize, last: u32, diff --git a/src/hyperloglog.rs b/src/hyperloglog.rs index 6bda970..8c52caf 100644 --- a/src/hyperloglog.rs +++ b/src/hyperloglog.rs @@ -42,6 +42,7 @@ use crate::HyperLogLogError; /// Meunier.](http://algo.inria.fr/flajolet/Publications/FlFuGaMe07.pdf) /// #[derive(Clone, Debug, Serialize, Deserialize)] +#[cfg_attr(feature = "mem_dbg", derive(mem_dbg::MemDbg, mem_dbg::MemSize))] pub struct HyperLogLogPF where H: Hash + ?Sized, @@ -62,7 +63,7 @@ where // Minimum precision allowed. const MIN_PRECISION: u8 = 4; // Maximum precision allowed. - const MAX_PRECISION: u8 = 16; + const MAX_PRECISION: u8 = 18; /// Creates a new HyperLogLogPF instance. pub fn new(precision: u8, builder: B) -> Result { @@ -204,6 +205,7 @@ mod tests { use core::hash::{BuildHasher, Hasher}; use siphasher::sip::SipHasher13; + #[cfg_attr(feature = "mem_dbg", derive(mem_dbg::MemDbg, mem_dbg::MemSize))] struct PassThroughHasher(u64); impl Hasher for PassThroughHasher { @@ -222,6 +224,7 @@ mod tests { } #[derive(Serialize, Deserialize)] + #[cfg_attr(feature = "mem_dbg", derive(mem_dbg::MemDbg, mem_dbg::MemSize))] struct PassThroughHasherBuilder; impl BuildHasher for PassThroughHasherBuilder { @@ -233,6 +236,7 @@ mod tests { } #[derive(Serialize, Deserialize)] + #[cfg_attr(feature = "mem_dbg", derive(mem_dbg::MemDbg, mem_dbg::MemSize))] struct DefaultBuildHasher; impl BuildHasher for DefaultBuildHasher { diff --git a/src/hyperloglogplus.rs b/src/hyperloglogplus.rs index 9264ced..5b2cab4 100644 --- a/src/hyperloglogplus.rs +++ b/src/hyperloglogplus.rs @@ -54,6 +54,7 @@ use crate::HyperLogLogError; /// Nunkesser and Alexander Hall.](https://goo.gl/iU8Ig) /// #[derive(Clone, Debug, Serialize, Deserialize)] +#[cfg_attr(feature = "mem_dbg", derive(mem_dbg::MemDbg, mem_dbg::MemSize))] pub struct HyperLogLogPlus where H: Hash + ?Sized, @@ -534,6 +535,7 @@ mod tests { use std::collections::hash_map::DefaultHasher; use std::hash::{BuildHasher, Hasher}; + #[cfg_attr(feature = "mem_dbg", derive(mem_dbg::MemDbg, mem_dbg::MemSize))] struct PassThroughHasher(u64); impl Hasher for PassThroughHasher { @@ -552,6 +554,7 @@ mod tests { } #[derive(Serialize, Deserialize)] + #[cfg_attr(feature = "mem_dbg", derive(mem_dbg::MemDbg, mem_dbg::MemSize))] struct PassThroughHasherBuilder; impl BuildHasher for PassThroughHasherBuilder { @@ -563,6 +566,7 @@ mod tests { } #[derive(Serialize, Deserialize)] + #[cfg_attr(feature = "mem_dbg", derive(mem_dbg::MemDbg, mem_dbg::MemSize))] struct DefaultBuildHasher; impl BuildHasher for DefaultBuildHasher {