use crate::forecast_trade::{data::TimeSeriesData, ForecastError, TimeGranularity};
#[derive(Debug, Clone)]
pub struct ErrorMetrics {
pub mae: f64,
pub mse: f64,
pub rmse: f64,
pub mape: f64,
}
#[derive(Debug, Clone)]
pub struct ForecastResult {
pub forecasts: Vec<f64>,
pub confidence_intervals: Option<(Vec<f64>, Vec<f64>)>,
pub model_info: String,
}
pub type Result<T> = std::result::Result<T, ForecastError>;
pub trait BoxClone {
fn box_clone(&self) -> Box<dyn ForecastModel>;
}
impl<T> BoxClone for T
where
T: 'static + ForecastModel + Clone,
{
fn box_clone(&self) -> Box<dyn ForecastModel> {
Box::new(self.clone())
}
}
impl Clone for Box<dyn ForecastModel> {
fn clone(&self) -> Box<dyn ForecastModel> {
BoxClone::box_clone(self.as_ref())
}
}
#[macro_export]
macro_rules! impl_box_clone {
($name:ty) => {
impl $crate::forecast_trade::models::BoxClone for $name {
fn box_clone(&self) -> Box<dyn $crate::forecast_trade::ForecastModel> {
Box::new(self.clone())
}
}
};
}
pub trait ForecastModel: Send + Sync + BoxClone {
fn train(&self, data: &TimeSeriesData) -> Result<Box<dyn ForecastModel>>;
fn forecast(&self, data: &TimeSeriesData, periods: usize) -> Result<ForecastResult>;
fn validate(
&self,
train_data: &TimeSeriesData,
test_data: &TimeSeriesData,
) -> Result<ErrorMetrics>;
fn time_granularity(&self) -> TimeGranularity;
fn adjust_for_granularity(&mut self, granularity: TimeGranularity) -> Result<()>;
fn name(&self) -> &str;
fn parameters(&self) -> Option<Vec<f64>> {
None
}
}
pub mod oxidiviner;