use std::time::Duration;
use scirs2_core::ndarray::{Array1, Array2};
pub type QRWorkItem<F> = super::WorkItem<(usize, Array1<F>, Array2<F>)>;
pub type BandSolveWorkItem<F> = super::WorkItem<(usize, usize, usize, Array2<F>, Array1<F>)>;
#[derive(Debug, Clone)]
pub struct WorkItem<T>
where
T: Clone,
{
pub id: usize,
pub payload: T,
pub estimated_time: Option<Duration>,
}
impl<T: Clone> WorkItem<T> {
pub fn new(id: usize, payload: T) -> Self {
Self {
id,
payload,
estimated_time: None,
}
}
pub fn with_estimate(_id: usize, payload: T, estimatedtime: Duration) -> Self {
Self {
id: _id,
payload,
estimated_time: Some(estimatedtime),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum StealingStrategy {
Random,
RoundRobin,
MostLoaded,
LocalityAware,
#[default]
Adaptive,
}
#[derive(Debug, Clone)]
pub struct LoadBalancingParams {
pub steal_threshold: usize,
pub max_steal_attempts: usize,
pub backoff_base: Duration,
pub max_backoff: Duration,
pub chunksize: usize,
pub priority_scheduling: bool,
}
impl Default for LoadBalancingParams {
fn default() -> Self {
Self {
steal_threshold: 2,
max_steal_attempts: 3,
backoff_base: Duration::from_micros(10),
max_backoff: Duration::from_millis(1),
chunksize: 100,
priority_scheduling: false,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Default)]
pub enum WorkPriority {
Low,
#[default]
Normal,
High,
Critical,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum MatrixOperationType {
MatrixVectorMultiplication,
MatrixMatrixMultiplication,
Decomposition,
EigenComputation,
IterativeSolver,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum WorkloadCharacteristics {
HighVariance,
LowVariance,
MemoryBound,
ComputeBound,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum WorkComplexity {
Constant,
Linear,
Quadratic,
Variable,
}
#[derive(Debug, Default, Clone)]
pub struct SchedulerStats {
pub total_items: usize,
pub total_execution_time: Duration,
pub successful_steals: usize,
pub failed_steals: usize,
pub load_balance_efficiency: f64,
pub time_variance: f64,
pub avg_steal_latency: Duration,
pub work_distribution: Vec<usize>,
pub thread_utilization: Vec<f64>,
}