This is an automated email from the ASF dual-hosted git repository. tisonkun pushed a commit to branch tidytidy in repository https://gitbox.apache.org/repos/asf/datasketches-rust.git
commit d153795508e8795ddcf337df224802d7bf8934cd Author: tison <[email protected]> AuthorDate: Sun Jul 12 12:46:42 2026 +0800 chore: internal code tidy Signed-off-by: tison <[email protected]> --- datasketches/src/countmin/sketch.rs | 16 ++--- datasketches/src/countmin/value.rs | 115 ++++++++++++------------------------ xtask/src/main.rs | 26 ++++++-- 3 files changed, 67 insertions(+), 90 deletions(-) diff --git a/datasketches/src/countmin/sketch.rs b/datasketches/src/countmin/sketch.rs index 48b7a3f..b898763 100644 --- a/datasketches/src/countmin/sketch.rs +++ b/datasketches/src/countmin/sketch.rs @@ -179,12 +179,12 @@ impl<T: CountMinValue> CountMinSketch<T> { return; } let abs_weight = weight.abs(); - self.total_weight = self.total_weight.add(abs_weight); + self.total_weight = self.total_weight + abs_weight; let num_buckets = self.num_buckets as usize; for (row, seed) in self.hash_seeds.iter().enumerate() { let bucket = self.bucket_index(&item, *seed); let index = row * num_buckets + bucket; - self.counts[index] = self.counts[index].add(weight); + self.counts[index] = self.counts[index] + weight; } } @@ -220,8 +220,8 @@ impl<T: CountMinValue> CountMinSketch<T> { /// Returns the upper bound on the true frequency of the given item. pub fn upper_bound<I: Hash>(&self, item: I) -> T { let estimate = self.estimate(item); - let error = T::from_f64(self.relative_error() * self.total_weight.to_f64()); - estimate.add(error) + let error = self.total_weight.scale(self.relative_error()); + estimate + error } /// Merges another sketch into this one. @@ -253,9 +253,9 @@ impl<T: CountMinValue> CountMinSketch<T> { assert_eq!(self.counts.len(), other.counts.len()); let counts_len = self.counts.len(); for i in 0..counts_len { - self.counts[i] = self.counts[i].add(other.counts[i]); + self.counts[i] = self.counts[i] + other.counts[i]; } - self.total_weight = self.total_weight.add(other.total_weight); + self.total_weight = self.total_weight + other.total_weight; } /// Serializes this sketch into the DataSketches Count-Min format. @@ -452,9 +452,9 @@ impl<T: UnsignedCountMinValue> CountMinSketch<T> { pub fn decay(&mut self, decay: f64) { assert!(decay > 0.0 && decay <= 1.0, "decay must be within (0, 1]"); for c in &mut self.counts { - *c = c.decay(decay) + *c = c.scale(decay) } - self.total_weight = self.total_weight.decay(decay); + self.total_weight = self.total_weight.scale(decay); } } diff --git a/datasketches/src/countmin/value.rs b/datasketches/src/countmin/value.rs index f236440..1484b9b 100644 --- a/datasketches/src/countmin/value.rs +++ b/datasketches/src/countmin/value.rs @@ -17,77 +17,51 @@ use crate::error::Error; -mod private { - // Sealed trait to prevent external implementations of CountMinValue. - pub trait Sealed {} -} - -/// Value type supported in a Count-Min sketch. -pub trait CountMinValue: private::Sealed + Copy + Ord { - /// Zero value for counters and weights. - const ZERO: Self; - - /// One value for unit updates. - const ONE: Self; - - /// Maximum representable value for initializing minima. - const MAX: Self; - - /// Performs the + operation. - fn add(self, other: Self) -> Self; - - /// Computes the absolute value of `self`. - fn abs(self) -> Self; - - /// Converts into `f64`. - fn to_f64(self) -> f64; +/// Marker trait identifying the value types supported by +/// [`CountMinSketch`](crate::countmin::CountMinSketch). +pub trait CountMinValue: private::CountMinValue {} - /// Converts from `f64` by truncating toward zero. - fn from_f64(value: f64) -> Self; +/// Marker trait identifying the unsigned value types supported by +/// [`CountMinSketch`](crate::countmin::CountMinSketch). +/// +/// This marker enables unsigned-only operations such as halving and decay. +pub trait UnsignedCountMinValue: CountMinValue + private::UnsignedCountMinValue {} - /// Returns the raw transmutation in little-endian 8 bytes. - fn to_bytes(self) -> [u8; 8]; - - /// Constructs from the raw transmutation in little-endian 8 bytes. - fn try_from_bytes(bytes: [u8; 8]) -> Result<Self, Error>; -} - -/// Unsigned value type supported in a Count-Min sketch. -pub trait UnsignedCountMinValue: CountMinValue { - /// Divides the value by two, truncating toward zero. - fn halve(self) -> Self; - - /// Multiplies the value by decay and truncates back into `T`. - fn decay(self, decay: f64) -> Self; +mod private { + use crate::error::Error; + use std::ops::Add; + + pub trait CountMinValue: Sized + Copy + Ord + Add<Output = Self> { + const ZERO: Self; + const ONE: Self; + const MAX: Self; + + fn abs(self) -> Self; + fn scale(self, factor: f64) -> Self; + fn to_bytes(self) -> [u8; 8]; + fn try_from_bytes(bytes: [u8; 8]) -> Result<Self, Error>; + } + + pub trait UnsignedCountMinValue: CountMinValue { + fn halve(self) -> Self; + } } macro_rules! impl_signed { ($name:ty, $min:expr, $max:expr) => { - impl private::Sealed for $name {} - - impl CountMinValue for $name { + impl private::CountMinValue for $name { const ZERO: Self = 0; const ONE: Self = 1; const MAX: Self = $max; - #[inline(always)] - fn add(self, other: Self) -> Self { - self + other - } - #[inline(always)] fn abs(self) -> Self { if self >= 0 { self } else { -self } } #[inline(always)] - fn to_f64(self) -> f64 { - self as f64 - } - - #[inline(always)] - fn from_f64(value: f64) -> Self { - value.trunc() as $name + fn scale(self, factor: f64) -> Self { + ((self as f64) * factor).trunc() as $name } #[inline(always)] @@ -109,6 +83,8 @@ macro_rules! impl_signed { Ok(value as $name) } } + + impl CountMinValue for $name {} }; } @@ -119,31 +95,19 @@ impl_signed!(i64, i64::MIN, i64::MAX); macro_rules! impl_unsigned { ($name:ty, $max:expr) => { - impl private::Sealed for $name {} - - impl CountMinValue for $name { + impl private::CountMinValue for $name { const ZERO: Self = 0; const ONE: Self = 1; const MAX: Self = $max; - #[inline(always)] - fn add(self, other: Self) -> Self { - self + other - } - #[inline(always)] fn abs(self) -> Self { self } #[inline(always)] - fn to_f64(self) -> f64 { - self as f64 - } - - #[inline(always)] - fn from_f64(value: f64) -> Self { - value.trunc() as $name + fn scale(self, factor: f64) -> Self { + ((self as f64) * factor).trunc() as $name } #[inline(always)] @@ -166,18 +130,15 @@ macro_rules! impl_unsigned { } } - impl UnsignedCountMinValue for $name { + impl private::UnsignedCountMinValue for $name { #[inline(always)] fn halve(self) -> Self { self >> 1 } - - #[inline(always)] - fn decay(self, decay: f64) -> Self { - let value = self.to_f64() * decay; - Self::from_f64(value) - } } + + impl CountMinValue for $name {} + impl UnsignedCountMinValue for $name {} }; } diff --git a/xtask/src/main.rs b/xtask/src/main.rs index 260f426..da33cd0 100644 --- a/xtask/src/main.rs +++ b/xtask/src/main.rs @@ -31,6 +31,7 @@ impl Command { fn run(self) { match self.sub { SubCommand::Check(cmd) => cmd.run(), + SubCommand::Docs(cmd) => cmd.run(), SubCommand::Lint(cmd) => cmd.run(), SubCommand::Test(cmd) => cmd.run(), } @@ -41,7 +42,9 @@ impl Command { enum SubCommand { #[clap(about = "Check datasketches under the feature matrix.")] Check(CommandCheck), - #[clap(about = "Run format and clippy checks.")] + #[clap(about = "Generate documentation and open for preview")] + Docs(CommandDocs), + #[clap(about = "Run linter checks.")] Lint(CommandLint), #[clap(about = "Run unit tests.")] Test(CommandTest), @@ -63,6 +66,16 @@ impl CommandCheck { } } +#[derive(Parser)] +#[clap(name = "docs")] +struct CommandDocs {} + +impl CommandDocs { + fn run(self) { + run_command(make_docs_cmd(true)); + } +} + #[derive(Parser)] struct CommandTest { #[arg(long, help = "Run tests serially and do not capture output.")] @@ -112,7 +125,7 @@ impl CommandLint { fn run(self) { run_command(make_clippy_cmd(self.fix)); run_command(make_format_cmd(self.fix)); - run_command(make_docs_cmd()); + run_command(make_docs_cmd(false)); run_command(make_taplo_cmd(self.fix)); run_command(make_typos_cmd()); run_command(make_hawkeye_cmd(self.fix)); @@ -202,17 +215,20 @@ fn make_clippy_cmd(fix: bool) -> StdCommand { cmd } -fn make_docs_cmd() -> StdCommand { +fn make_docs_cmd(open: bool) -> StdCommand { let mut cmd = find_command("cargo"); - cmd.env("RUSTFLAGS", "--cfg docsrs"); - cmd.env("RUSTDOCFLAGS", "-D warnings"); + cmd.env("RUSTDOCFLAGS", "--cfg docsrs -D warnings"); cmd.args([ "+nightly", "doc", "--package", "datasketches", "--all-features", + "--no-deps", ]); + if open { + cmd.args(["--open"]); + } cmd } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
