use super::memory_manager::CacheEvictionPolicy;
use super::types::*;
use crate::error::FFTResult;
use scirs2_core::numeric::Float;
use std::collections::{HashMap, VecDeque};
use std::fmt::Debug;
use std::time::Instant;
#[derive(Debug)]
#[allow(dead_code)]
pub struct AdaptiveFftCache<F: Float + Debug> {
pub(crate) plan_cache: HashMap<PlanCacheKey, CachedPlan<F>>,
pub cache_stats: CacheStatistics,
pub(crate) cache_policy: AdaptiveCachePolicy,
pub(crate) prefetch_system: PredictivePrefetchSystem<F>,
}
#[derive(Debug, Clone, Hash, Eq, PartialEq)]
pub struct PlanCacheKey {
pub size: usize,
pub dimensions: Vec<usize>,
pub algorithm: FftAlgorithmType,
pub data_type: String,
}
#[derive(Debug, Clone)]
pub struct CachedPlan<F: Float> {
pub plan_data: Vec<u8>,
pub creation_time: Instant,
pub access_count: usize,
pub last_access: Instant,
pub performance_metrics: CachedPlanMetrics<F>,
}
#[derive(Debug, Clone)]
pub struct CachedPlanMetrics<F: Float> {
pub avg_execution_time: F,
pub memory_usage: usize,
pub accuracy_score: F,
}
#[derive(Debug, Default)]
pub struct CacheStatistics {
pub hit_count: usize,
pub miss_count: usize,
pub eviction_count: usize,
pub total_cache_size: usize,
}
#[derive(Debug)]
#[allow(dead_code)]
pub struct AdaptiveCachePolicy {
pub(crate) base_policy: CacheEvictionPolicy,
pub(crate) adaptive_params: CacheAdaptiveParams,
pub(crate) policy_learning: PolicyLearningSystem,
}
#[derive(Debug, Clone)]
pub struct CacheAdaptiveParams {
pub hit_ratio_threshold: f64,
pub memory_pressure_threshold: f64,
pub access_pattern_weight: f64,
pub temporal_locality_weight: f64,
}
impl Default for CacheAdaptiveParams {
fn default() -> Self {
Self {
hit_ratio_threshold: 0.8,
memory_pressure_threshold: 0.9,
access_pattern_weight: 0.7,
temporal_locality_weight: 0.3,
}
}
}
#[derive(Debug)]
#[allow(dead_code)]
pub struct PolicyLearningSystem {
pub(crate) policy_history: VecDeque<PolicyPerformanceRecord>,
pub(crate) learning_params: PolicyLearningParams,
}
#[derive(Debug, Clone)]
pub struct PolicyPerformanceRecord {
pub policy: String,
pub hit_ratio: f64,
pub memory_efficiency: f64,
pub timestamp: Instant,
}
#[derive(Debug, Clone)]
pub struct PolicyLearningParams {
pub learning_rate: f64,
pub exploration_rate: f64,
pub memory_window: usize,
}
impl Default for PolicyLearningParams {
fn default() -> Self {
Self {
learning_rate: 0.01,
exploration_rate: 0.1,
memory_window: 1000,
}
}
}
#[derive(Debug)]
#[allow(dead_code)]
pub struct PredictivePrefetchSystem<F: Float> {
pub(crate) pattern_predictor: AccessPatternPredictor,
pub(crate) prefetch_queue: VecDeque<PrefetchRequest<F>>,
pub(crate) prefetch_stats: PrefetchStatistics,
}
#[derive(Debug)]
#[allow(dead_code)]
pub struct AccessPatternPredictor {
pub(crate) access_history: VecDeque<PlanCacheKey>,
pub(crate) pattern_models: Vec<PatternModel>,
pub(crate) prediction_accuracy: f64,
}
#[derive(Debug, Clone)]
pub struct PatternModel {
pub name: String,
pub parameters: Vec<f64>,
pub confidence: f64,
}
#[derive(Debug, Clone)]
pub struct PrefetchRequest<F: Float> {
pub plan_key: PlanCacheKey,
pub priority: f64,
pub estimated_access_time: Instant,
pub confidence: F,
}
#[derive(Debug, Default)]
pub struct PrefetchStatistics {
pub successful_prefetches: usize,
pub failed_prefetches: usize,
pub prefetch_accuracy: f64,
pub memory_overhead: usize,
}
impl<F: Float + Debug> AdaptiveFftCache<F> {
pub fn new() -> FFTResult<Self> {
Ok(Self {
plan_cache: HashMap::new(),
cache_stats: CacheStatistics::default(),
cache_policy: AdaptiveCachePolicy::new()?,
prefetch_system: PredictivePrefetchSystem::new()?,
})
}
}
impl AdaptiveCachePolicy {
pub fn new() -> FFTResult<Self> {
Ok(Self {
base_policy: CacheEvictionPolicy::Adaptive,
adaptive_params: CacheAdaptiveParams::default(),
policy_learning: PolicyLearningSystem::new()?,
})
}
}
impl PolicyLearningSystem {
pub fn new() -> FFTResult<Self> {
Ok(Self {
policy_history: VecDeque::new(),
learning_params: PolicyLearningParams::default(),
})
}
}
impl<F: Float> PredictivePrefetchSystem<F> {
pub fn new() -> FFTResult<Self> {
Ok(Self {
pattern_predictor: AccessPatternPredictor::new()?,
prefetch_queue: VecDeque::new(),
prefetch_stats: PrefetchStatistics::default(),
})
}
}
impl AccessPatternPredictor {
pub fn new() -> FFTResult<Self> {
Ok(Self {
access_history: VecDeque::new(),
pattern_models: Vec::new(),
prediction_accuracy: 0.0,
})
}
}