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}