Skip to main content

rsiot/components/cmp_math/algs/
mod.rs

1//! Алгоритмы
2
3#[allow(unused)]
4mod _alg_template;
5pub(crate) mod derivative;
6pub mod downsampling;
7pub(crate) mod ema;
8pub(crate) mod last_over_time_window;
9pub(crate) mod sma;
10pub mod statistic;
11
12use crate::message::{MsgDataBound, ValueTime};
13
14pub use {derivative::Gamma, ema::EmaKind};
15
16use tokio::sync::mpsc;
17
18use std::time::Duration;
19
20use super::Error;
21
22type AlgInput = mpsc::Receiver<ValueTime>;
23type AlgOutput = mpsc::Sender<ValueTime>;
24type AlgFnOutputMsgbus<TMsg, OV> = fn(&OV) -> Option<TMsg>;
25
26/// Перечень алгоритмов для обработки данных
27pub enum Algs<TMsg>
28where
29    TMsg: MsgDataBound,
30{
31    // ANCHOR: Derivative
32    /// Дифференциальное значение
33    Derivative {
34        /// Функция нахождения окна времени
35        ///
36        /// Константа: `|_| Some(Duration::from_millis(100))`
37        time_window: Duration,
38
39        /// Время нормализации.
40        ///
41        /// Например, чтобы определить расход в час, задаём `Duration::from_secs(3600)`
42        normalization_time: Duration,
43
44        /// Коэффициент
45        gamma: derivative::Gamma,
46
47        /// Функция создания выходного значения
48        fn_output_msgbus: AlgFnOutputMsgbus<TMsg, derivative::OutputValue>,
49    },
50    // ANCHOR: Derivative
51
52    // ANCHOR: Downsampling
53    /// Прореживание
54    Downsampling {
55        /// Окно времени
56        time_window: Duration,
57
58        /// Функция создания выходного значения
59        fn_output_msgbus: AlgFnOutputMsgbus<TMsg, downsampling::OutputValue>,
60    },
61    // ANCHOR: Downsampling
62
63    // ANCHOR: EMA
64    /// Экспоненциальное скользящее среднее
65    EMA {
66        /// Вид алгоритма
67        kind: ema::EmaKind,
68
69        /// Функция нахождения окна времени
70        ///
71        /// Константа: `|_| Some(Duration::from_millis(100))`
72        time_window: Duration,
73
74        /// Функция создания выходного значения
75        fn_output_msgbus: AlgFnOutputMsgbus<TMsg, ema::OutputValue>,
76    },
77    // ANCHOR: EMA
78
79    // ANCHOR: LastOverTimeWindow
80    /// Выборка последних значений в каждом периоде времени
81    LastOverTimeWindow {
82        /// Период времени, за который выбирается последнее значение
83        ///
84        /// Константа: `|_| Some(Duration::from_millis(100))`
85        time_window: Duration,
86
87        /// Исходящие сообщения
88        fn_output_msgbus: AlgFnOutputMsgbus<TMsg, f64>,
89    },
90    // ANCHOR: LastOverTimeWindow
91
92    // ANCHOR: SMA
93    /// Простое скользящее среднее
94    ///
95    /// TODO: Текущая реализация - last. Проработать next и linear.
96    SMA {
97        /// Функция нахождения окна времени
98        ///
99        /// Константа: `|_| Some(Duration::from_millis(100))`
100        time_window: Duration,
101
102        /// Функция создания выходного значения
103        fn_output_msgbus: AlgFnOutputMsgbus<TMsg, sma::OutputValue>,
104    },
105    // ANCHOR: SMA
106
107    // ANCHOR: Statistic
108    /// Статистиска
109    Statistic {
110        /// Окно времени
111        time_window: Duration,
112
113        /// Выбор индикаторов
114        indicators: statistic::Indicators,
115
116        /// Функция создания выходного значения
117        fn_output_msgbus: AlgFnOutputMsgbus<TMsg, statistic::OutputValue>,
118    },
119    // ANCHOR: Statistic
120}