pub mod q4k;
pub mod q6k;
pub mod scalar;
#[cfg(target_arch = "x86_64")]
pub mod sse2;
#[cfg(target_arch = "x86_64")]
pub mod avx2;
#[cfg(target_arch = "x86_64")]
#[cfg(test)]
mod avx2_tests;
#[cfg(any(target_arch = "aarch64", target_arch = "arm"))]
pub mod neon;
#[cfg(target_arch = "wasm32")]
pub mod wasm;
pub mod gpu;
#[cfg(target_arch = "x86_64")]
pub mod avx512;
pub trait VectorBackend {
unsafe fn add(a: &[f32], b: &[f32], result: &mut [f32]);
unsafe fn sub(a: &[f32], b: &[f32], result: &mut [f32]);
unsafe fn mul(a: &[f32], b: &[f32], result: &mut [f32]);
unsafe fn div(a: &[f32], b: &[f32], result: &mut [f32]);
unsafe fn dot(a: &[f32], b: &[f32]) -> f32;
unsafe fn sum(a: &[f32]) -> f32;
unsafe fn max(a: &[f32]) -> f32;
unsafe fn min(a: &[f32]) -> f32;
unsafe fn argmax(a: &[f32]) -> usize;
unsafe fn argmin(a: &[f32]) -> usize;
unsafe fn sum_kahan(a: &[f32]) -> f32;
unsafe fn norm_l2(a: &[f32]) -> f32;
unsafe fn norm_l1(a: &[f32]) -> f32;
unsafe fn norm_linf(a: &[f32]) -> f32;
unsafe fn scale(a: &[f32], scalar: f32, result: &mut [f32]);
unsafe fn abs(a: &[f32], result: &mut [f32]);
unsafe fn clamp(a: &[f32], min_val: f32, max_val: f32, result: &mut [f32]);
unsafe fn lerp(a: &[f32], b: &[f32], t: f32, result: &mut [f32]);
unsafe fn fma(a: &[f32], b: &[f32], c: &[f32], result: &mut [f32]);
unsafe fn relu(a: &[f32], result: &mut [f32]);
unsafe fn exp(a: &[f32], result: &mut [f32]);
unsafe fn sigmoid(a: &[f32], result: &mut [f32]);
unsafe fn gelu(a: &[f32], result: &mut [f32]);
unsafe fn swish(a: &[f32], result: &mut [f32]);
unsafe fn tanh(a: &[f32], result: &mut [f32]);
unsafe fn sqrt(a: &[f32], result: &mut [f32]);
unsafe fn recip(a: &[f32], result: &mut [f32]);
unsafe fn ln(a: &[f32], result: &mut [f32]);
unsafe fn log2(a: &[f32], result: &mut [f32]);
unsafe fn log10(a: &[f32], result: &mut [f32]);
unsafe fn sin(a: &[f32], result: &mut [f32]);
unsafe fn cos(a: &[f32], result: &mut [f32]);
unsafe fn tan(a: &[f32], result: &mut [f32]);
unsafe fn floor(a: &[f32], result: &mut [f32]);
unsafe fn ceil(a: &[f32], result: &mut [f32]);
unsafe fn round(a: &[f32], result: &mut [f32]);
}