bounded_sequence_inference/
bounded_sequence_inference.rs1use 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}