pub struct QuantileSketch { /* private fields */ }Expand description
A deterministic Greenwald-Khanna streaming quantile summary.
The sketch stores observations exactly through
QuantilePolicy::exact_threshold. Larger streams use rank intervals and
deterministic compression. Compatible sketches can be merged without
replaying their source streams. The hard entry limit makes memory admission
explicit: an operation that cannot retain the requested rank error is
rejected transactionally.
Implementations§
Source§impl QuantileSketch
impl QuantileSketch
Sourcepub fn new(policy: QuantilePolicy) -> Result<Self, QuantileError>
pub fn new(policy: QuantilePolicy) -> Result<Self, QuantileError>
Creates an empty sketch governed by policy.
Examples found in repository?
6fn main() -> Result<(), Box<dyn std::error::Error>> {
7 let policy = QuantilePolicy::new(0.02, 8, 256)?;
8 let mut left = QuantileSketch::new(policy.clone())?;
9 let mut right = QuantileSketch::new(policy)?;
10 for value in 0..100 {
11 if value % 2 == 0 {
12 left.insert(value as f64)?;
13 } else {
14 right.insert(value as f64)?;
15 }
16 }
17 left.merge(&right)?;
18 let median = left.estimate(0.5)?;
19 println!(
20 "quantile value={} rank=[{:.3},{:.3}] retained={} exact={}",
21 median.value, median.rank_lower, median.rank_upper, median.retained_entries, median.exact
22 );
23
24 let model = HiddenMarkovModel::discrete(
25 vec!["quiet", "active"],
26 vec![0.6, 0.4],
27 vec![vec![0.8, 0.2], vec![0.3, 0.7]],
28 vec![vec![0.9, 0.1], vec![0.2, 0.8]],
29 )?;
30 let observations = [0, 0, 1, 1];
31 let inference = forward_backward(&model, &observations)?;
32 let path = viterbi(&model, &observations)?;
33 println!(
34 "inference log-likelihood={:.6} path={:?} repairs={}",
35 inference.evidence.log_likelihood, path.states, inference.evidence.numerical_repairs
36 );
37
38 let data = [
39 Sequence::Discrete(vec![0, 0, 1, 1, 1, 0]),
40 Sequence::Discrete(vec![0, 1, 1, 0, 0, 0]),
41 ];
42 let report = fit_hmm(
43 &data,
44 HmmSpec::Discrete {
45 states: 2,
46 symbols: 2,
47 additive_smoothing: 1.0e-6,
48 },
49 HmmFitControl::new(23, 6, 1.0e-7, 10_000, 1.0e-12)?,
50 )?;
51 println!(
52 "fit likelihood={:.6} iterations={} converged={} repairs={} work={} termination={:?} seed={}",
53 report.evidence.log_likelihood,
54 report.evidence.iterations,
55 report.evidence.converged,
56 report.evidence.numerical_repairs,
57 report.evidence.work,
58 report.evidence.termination,
59 report.evidence.seed
60 );
61 Ok(())
62}Sourcepub fn policy(&self) -> &QuantilePolicy
pub fn policy(&self) -> &QuantilePolicy
Returns the immutable error and memory policy.
Sourcepub fn retained_entries(&self) -> usize
pub fn retained_entries(&self) -> usize
Returns the number of retained exact values or summary entries.
Sourcepub fn retained_entry_bytes(&self) -> usize
pub fn retained_entry_bytes(&self) -> usize
Returns an upper bound on bytes occupied by retained numeric entries. This excludes allocator metadata and the fixed-size sketch value.
Sourcepub fn insert(&mut self, value: f64) -> Result<(), QuantileError>
pub fn insert(&mut self, value: f64) -> Result<(), QuantileError>
Inserts one finite observation. The operation is transactional when the configured entry limit is too small for the requested error.
Examples found in repository?
6fn main() -> Result<(), Box<dyn std::error::Error>> {
7 let policy = QuantilePolicy::new(0.02, 8, 256)?;
8 let mut left = QuantileSketch::new(policy.clone())?;
9 let mut right = QuantileSketch::new(policy)?;
10 for value in 0..100 {
11 if value % 2 == 0 {
12 left.insert(value as f64)?;
13 } else {
14 right.insert(value as f64)?;
15 }
16 }
17 left.merge(&right)?;
18 let median = left.estimate(0.5)?;
19 println!(
20 "quantile value={} rank=[{:.3},{:.3}] retained={} exact={}",
21 median.value, median.rank_lower, median.rank_upper, median.retained_entries, median.exact
22 );
23
24 let model = HiddenMarkovModel::discrete(
25 vec!["quiet", "active"],
26 vec![0.6, 0.4],
27 vec![vec![0.8, 0.2], vec![0.3, 0.7]],
28 vec![vec![0.9, 0.1], vec![0.2, 0.8]],
29 )?;
30 let observations = [0, 0, 1, 1];
31 let inference = forward_backward(&model, &observations)?;
32 let path = viterbi(&model, &observations)?;
33 println!(
34 "inference log-likelihood={:.6} path={:?} repairs={}",
35 inference.evidence.log_likelihood, path.states, inference.evidence.numerical_repairs
36 );
37
38 let data = [
39 Sequence::Discrete(vec![0, 0, 1, 1, 1, 0]),
40 Sequence::Discrete(vec![0, 1, 1, 0, 0, 0]),
41 ];
42 let report = fit_hmm(
43 &data,
44 HmmSpec::Discrete {
45 states: 2,
46 symbols: 2,
47 additive_smoothing: 1.0e-6,
48 },
49 HmmFitControl::new(23, 6, 1.0e-7, 10_000, 1.0e-12)?,
50 )?;
51 println!(
52 "fit likelihood={:.6} iterations={} converged={} repairs={} work={} termination={:?} seed={}",
53 report.evidence.log_likelihood,
54 report.evidence.iterations,
55 report.evidence.converged,
56 report.evidence.numerical_repairs,
57 report.evidence.work,
58 report.evidence.termination,
59 report.evidence.seed
60 );
61 Ok(())
62}Sourcepub fn merge(&mut self, other: &Self) -> Result<(), QuantileError>
pub fn merge(&mut self, other: &Self) -> Result<(), QuantileError>
Merges another compatible sketch transactionally.
Examples found in repository?
6fn main() -> Result<(), Box<dyn std::error::Error>> {
7 let policy = QuantilePolicy::new(0.02, 8, 256)?;
8 let mut left = QuantileSketch::new(policy.clone())?;
9 let mut right = QuantileSketch::new(policy)?;
10 for value in 0..100 {
11 if value % 2 == 0 {
12 left.insert(value as f64)?;
13 } else {
14 right.insert(value as f64)?;
15 }
16 }
17 left.merge(&right)?;
18 let median = left.estimate(0.5)?;
19 println!(
20 "quantile value={} rank=[{:.3},{:.3}] retained={} exact={}",
21 median.value, median.rank_lower, median.rank_upper, median.retained_entries, median.exact
22 );
23
24 let model = HiddenMarkovModel::discrete(
25 vec!["quiet", "active"],
26 vec![0.6, 0.4],
27 vec![vec![0.8, 0.2], vec![0.3, 0.7]],
28 vec![vec![0.9, 0.1], vec![0.2, 0.8]],
29 )?;
30 let observations = [0, 0, 1, 1];
31 let inference = forward_backward(&model, &observations)?;
32 let path = viterbi(&model, &observations)?;
33 println!(
34 "inference log-likelihood={:.6} path={:?} repairs={}",
35 inference.evidence.log_likelihood, path.states, inference.evidence.numerical_repairs
36 );
37
38 let data = [
39 Sequence::Discrete(vec![0, 0, 1, 1, 1, 0]),
40 Sequence::Discrete(vec![0, 1, 1, 0, 0, 0]),
41 ];
42 let report = fit_hmm(
43 &data,
44 HmmSpec::Discrete {
45 states: 2,
46 symbols: 2,
47 additive_smoothing: 1.0e-6,
48 },
49 HmmFitControl::new(23, 6, 1.0e-7, 10_000, 1.0e-12)?,
50 )?;
51 println!(
52 "fit likelihood={:.6} iterations={} converged={} repairs={} work={} termination={:?} seed={}",
53 report.evidence.log_likelihood,
54 report.evidence.iterations,
55 report.evidence.converged,
56 report.evidence.numerical_repairs,
57 report.evidence.work,
58 report.evidence.termination,
59 report.evidence.seed
60 );
61 Ok(())
62}Sourcepub fn estimate(&self, quantile: f64) -> Result<QuantileEstimate, QuantileError>
pub fn estimate(&self, quantile: f64) -> Result<QuantileEstimate, QuantileError>
Estimates a quantile and returns its retained rank interval.
Examples found in repository?
6fn main() -> Result<(), Box<dyn std::error::Error>> {
7 let policy = QuantilePolicy::new(0.02, 8, 256)?;
8 let mut left = QuantileSketch::new(policy.clone())?;
9 let mut right = QuantileSketch::new(policy)?;
10 for value in 0..100 {
11 if value % 2 == 0 {
12 left.insert(value as f64)?;
13 } else {
14 right.insert(value as f64)?;
15 }
16 }
17 left.merge(&right)?;
18 let median = left.estimate(0.5)?;
19 println!(
20 "quantile value={} rank=[{:.3},{:.3}] retained={} exact={}",
21 median.value, median.rank_lower, median.rank_upper, median.retained_entries, median.exact
22 );
23
24 let model = HiddenMarkovModel::discrete(
25 vec!["quiet", "active"],
26 vec![0.6, 0.4],
27 vec![vec![0.8, 0.2], vec![0.3, 0.7]],
28 vec![vec![0.9, 0.1], vec![0.2, 0.8]],
29 )?;
30 let observations = [0, 0, 1, 1];
31 let inference = forward_backward(&model, &observations)?;
32 let path = viterbi(&model, &observations)?;
33 println!(
34 "inference log-likelihood={:.6} path={:?} repairs={}",
35 inference.evidence.log_likelihood, path.states, inference.evidence.numerical_repairs
36 );
37
38 let data = [
39 Sequence::Discrete(vec![0, 0, 1, 1, 1, 0]),
40 Sequence::Discrete(vec![0, 1, 1, 0, 0, 0]),
41 ];
42 let report = fit_hmm(
43 &data,
44 HmmSpec::Discrete {
45 states: 2,
46 symbols: 2,
47 additive_smoothing: 1.0e-6,
48 },
49 HmmFitControl::new(23, 6, 1.0e-7, 10_000, 1.0e-12)?,
50 )?;
51 println!(
52 "fit likelihood={:.6} iterations={} converged={} repairs={} work={} termination={:?} seed={}",
53 report.evidence.log_likelihood,
54 report.evidence.iterations,
55 report.evidence.converged,
56 report.evidence.numerical_repairs,
57 report.evidence.work,
58 report.evidence.termination,
59 report.evidence.seed
60 );
61 Ok(())
62}Trait Implementations§
Source§impl Clone for QuantileSketch
impl Clone for QuantileSketch
Source§fn clone(&self) -> QuantileSketch
fn clone(&self) -> QuantileSketch
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more