pub mod algorithms;
pub mod core;
pub mod metrics;
pub use crate::algorithms::ab_join::ab_join;
pub use crate::algorithms::chains::{allc, atsc, Chain, ChainsResult};
pub use crate::algorithms::fluss::{fluss, Floss, SegmentationResult};
pub use crate::algorithms::mass::{find_matches, mass, Match};
pub use crate::algorithms::mdl::mdl;
pub use crate::algorithms::mmotifs::{mmotifs, MultiDimensionalMotif};
pub use crate::algorithms::motifs::{find_discords, find_motifs, Discord, Motif};
pub use crate::algorithms::mpdist::{mpdist, mpdist_pnorm};
pub use crate::algorithms::mstump::{mstump, MultiDimensionalProfile};
pub use crate::algorithms::ostinato::{ostinato, ConsensusMotif};
pub use crate::algorithms::pnorm::{ab_join_pnorm, stomp_pnorm};
pub use crate::algorithms::scrump::scrump;
pub use crate::algorithms::snippets::{find_snippets, SnippetsResult};
pub use crate::algorithms::stimp::{stimp, PanMatrixProfile};
pub use crate::algorithms::subspace::subspace;
pub use crate::algorithms::topk::TopKMatrixProfile;
pub use crate::core::distance_metric::DistanceMetric;
pub use crate::core::matrix_profile::{
JoinProfile, MatrixProfile, MatrixProfileConfig, RollingStats, DEFAULT_SIGMA_THRESHOLD,
};
pub use crate::metrics::absolute::AbsoluteEuclidean;
pub use crate::metrics::euclidean::ZNormalizedEuclidean;
use crate::algorithms::stampi::Stampi;
use crate::algorithms::stomp::stomp;
pub struct Engine<M: DistanceMetric> {
config: MatrixProfileConfig,
_metric: std::marker::PhantomData<M>,
}
impl<M: DistanceMetric> Engine<M> {
pub fn new(config: MatrixProfileConfig) -> Self {
Self {
config,
_metric: std::marker::PhantomData,
}
}
pub fn compute(&self, ts: &[f64]) -> MatrixProfile {
stomp::<M>(ts, &self.config)
}
pub fn streaming(&self, initial_ts: &[f64], egress: bool) -> Stampi<M> {
Stampi::<M>::new(initial_ts, self.config.clone(), egress)
}
pub fn ab_join(&self, ts_a: &[f64], ts_b: &[f64]) -> (JoinProfile, JoinProfile) {
crate::algorithms::ab_join::ab_join::<M>(ts_a, ts_b, self.config.m)
}
pub fn compute_topk(&self, ts: &[f64], k: usize) -> TopKMatrixProfile {
crate::algorithms::topk::stomp_topk::<M>(ts, &self.config, k)
}
pub fn snippets(&self, ts: &[f64], k: usize) -> SnippetsResult {
crate::algorithms::snippets::find_snippets(ts, self.config.m, k)
}
pub fn mpdist(&self, ts_a: &[f64], ts_b: &[f64], percentage: Option<f64>) -> f64 {
crate::algorithms::mpdist::mpdist::<M>(ts_a, ts_b, self.config.m, percentage)
}
pub fn scrump(&self, ts: &[f64], percentage: f64) -> MatrixProfile {
crate::algorithms::scrump::scrump::<M>(ts, &self.config, percentage)
}
pub fn ostinato(&self, ts_list: &[&[f64]]) -> ConsensusMotif {
crate::algorithms::ostinato::ostinato::<M>(ts_list, self.config.m)
}
pub fn stimp(
&self,
ts: &[f64],
min_m: usize,
max_m: usize,
step: Option<usize>,
percentage: Option<f64>,
) -> PanMatrixProfile {
crate::algorithms::stimp::stimp::<M>(ts, min_m, max_m, step, percentage)
}
pub fn compute_pnorm(&self, ts: &[f64], p: f64) -> MatrixProfile {
crate::algorithms::pnorm::stomp_pnorm(ts, &self.config, p)
}
pub fn ab_join_pnorm(&self, ts_a: &[f64], ts_b: &[f64], p: f64) -> (JoinProfile, JoinProfile) {
crate::algorithms::pnorm::ab_join_pnorm(ts_a, ts_b, self.config.m, p)
}
pub fn mpdist_pnorm(&self, ts_a: &[f64], ts_b: &[f64], p: f64, percentage: Option<f64>) -> f64 {
crate::algorithms::mpdist::mpdist_pnorm(ts_a, ts_b, self.config.m, p, percentage)
}
}
pub type EuclideanEngine = Engine<ZNormalizedEuclidean>;
pub type AampEngine = Engine<AbsoluteEuclidean>;