1pub mod algorithms;
2pub mod core;
3pub mod metrics;
4
5pub use crate::algorithms::ab_join::ab_join;
6pub use crate::algorithms::chains::{allc, atsc, Chain, ChainsResult};
7pub use crate::algorithms::fluss::{fluss, Floss, SegmentationResult};
8pub use crate::algorithms::mass::{find_matches, mass, Match};
9pub use crate::algorithms::mdl::mdl;
10pub use crate::algorithms::mmotifs::{mmotifs, MultiDimensionalMotif};
11pub use crate::algorithms::motifs::{find_discords, find_motifs, Discord, Motif};
12pub use crate::algorithms::mpdist::{mpdist, mpdist_pnorm};
13pub use crate::algorithms::mstump::{mstump, MultiDimensionalProfile};
14pub use crate::algorithms::ostinato::{ostinato, ConsensusMotif};
15pub use crate::algorithms::pnorm::{ab_join_pnorm, stomp_pnorm};
16pub use crate::algorithms::scrump::scrump;
17pub use crate::algorithms::snippets::{find_snippets, SnippetsResult};
18pub use crate::algorithms::stimp::{stimp, PanMatrixProfile};
19pub use crate::algorithms::subspace::subspace;
20pub use crate::algorithms::topk::TopKMatrixProfile;
21pub use crate::core::distance_metric::DistanceMetric;
22pub use crate::core::matrix_profile::{
23 JoinProfile, MatrixProfile, MatrixProfileConfig, RollingStats, DEFAULT_SIGMA_THRESHOLD,
24};
25pub use crate::metrics::absolute::AbsoluteEuclidean;
26pub use crate::metrics::euclidean::ZNormalizedEuclidean;
27
28use crate::algorithms::stampi::Stampi;
29use crate::algorithms::stomp::stomp;
30
31pub struct Engine<M: DistanceMetric> {
44 config: MatrixProfileConfig,
45 _metric: std::marker::PhantomData<M>,
46}
47
48impl<M: DistanceMetric> Engine<M> {
49 pub fn new(config: MatrixProfileConfig) -> Self {
51 Self {
52 config,
53 _metric: std::marker::PhantomData,
54 }
55 }
56
57 pub fn compute(&self, ts: &[f64]) -> MatrixProfile {
59 stomp::<M>(ts, &self.config)
60 }
61
62 pub fn streaming(&self, initial_ts: &[f64], egress: bool) -> Stampi<M> {
67 Stampi::<M>::new(initial_ts, self.config.clone(), egress)
68 }
69
70 pub fn ab_join(&self, ts_a: &[f64], ts_b: &[f64]) -> (JoinProfile, JoinProfile) {
74 crate::algorithms::ab_join::ab_join::<M>(ts_a, ts_b, self.config.m)
75 }
76
77 pub fn compute_topk(&self, ts: &[f64], k: usize) -> TopKMatrixProfile {
81 crate::algorithms::topk::stomp_topk::<M>(ts, &self.config, k)
82 }
83
84 pub fn snippets(&self, ts: &[f64], k: usize) -> SnippetsResult {
88 crate::algorithms::snippets::find_snippets(ts, self.config.m, k)
89 }
90
91 pub fn mpdist(&self, ts_a: &[f64], ts_b: &[f64], percentage: Option<f64>) -> f64 {
95 crate::algorithms::mpdist::mpdist::<M>(ts_a, ts_b, self.config.m, percentage)
96 }
97
98 pub fn scrump(&self, ts: &[f64], percentage: f64) -> MatrixProfile {
103 crate::algorithms::scrump::scrump::<M>(ts, &self.config, percentage)
104 }
105
106 pub fn ostinato(&self, ts_list: &[&[f64]]) -> ConsensusMotif {
111 crate::algorithms::ostinato::ostinato::<M>(ts_list, self.config.m)
112 }
113
114 pub fn stimp(
118 &self,
119 ts: &[f64],
120 min_m: usize,
121 max_m: usize,
122 step: Option<usize>,
123 percentage: Option<f64>,
124 ) -> PanMatrixProfile {
125 crate::algorithms::stimp::stimp::<M>(ts, min_m, max_m, step, percentage)
126 }
127
128 pub fn compute_pnorm(&self, ts: &[f64], p: f64) -> MatrixProfile {
134 crate::algorithms::pnorm::stomp_pnorm(ts, &self.config, p)
135 }
136
137 pub fn ab_join_pnorm(&self, ts_a: &[f64], ts_b: &[f64], p: f64) -> (JoinProfile, JoinProfile) {
142 crate::algorithms::pnorm::ab_join_pnorm(ts_a, ts_b, self.config.m, p)
143 }
144
145 pub fn mpdist_pnorm(&self, ts_a: &[f64], ts_b: &[f64], p: f64, percentage: Option<f64>) -> f64 {
149 crate::algorithms::mpdist::mpdist_pnorm(ts_a, ts_b, self.config.m, p, percentage)
150 }
151}
152
153pub type EuclideanEngine = Engine<ZNormalizedEuclidean>;
155
156pub type AampEngine = Engine<AbsoluteEuclidean>;