use scirs2_core::ndarray::{Array1, Array2};
use serde::{Deserialize, Serialize};
use std::collections::VecDeque;
use super::config::TimeSeriesConfig;
use super::types::ActivationFunction;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TimeSeriesPredictor {
pub arima_params: ARIMAParams,
pub nar_state: NARState,
pub kernel_weights: Array1<f64>,
pub trend_model: TrendModel,
}
impl TimeSeriesPredictor {
#[must_use]
pub fn new(config: &TimeSeriesConfig) -> Self {
Self {
arima_params: ARIMAParams {
ar_coeffs: Array1::zeros(config.ar_order),
ma_coeffs: Array1::zeros(config.ma_order),
diff_order: config.diff_order,
residuals: VecDeque::with_capacity(config.ma_order),
variance: 1.0,
},
nar_state: NARState {
order: config.nar_order,
coeffs: Array2::zeros((config.nar_order, config.nar_order)),
history: VecDeque::with_capacity(config.nar_order),
activation: ActivationFunction::Tanh,
},
kernel_weights: Array1::from_vec(config.kernel_params.clone()),
trend_model: TrendModel {
params: vec![0.0, 0.0], strength: 0.0,
direction: 0.0,
},
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ARIMAParams {
pub ar_coeffs: Array1<f64>,
pub ma_coeffs: Array1<f64>,
pub diff_order: usize,
pub residuals: VecDeque<f64>,
pub variance: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NARState {
pub order: usize,
pub coeffs: Array2<f64>,
pub history: VecDeque<f64>,
pub activation: ActivationFunction,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TrendModel {
pub params: Vec<f64>,
pub strength: f64,
pub direction: f64,
}