Skip to main content

bounded_sequence_inference/
bounded_sequence_inference.rs

1use sim_lib_numbers_stats::{
2    HiddenMarkovModel, HmmFitControl, HmmSpec, QuantilePolicy, QuantileSketch, Sequence, fit_hmm,
3    forward_backward, viterbi,
4};
5
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}