#![allow(clippy::redundant_closure_call)]
use float8::F8E4M3 as f8e4m3;
use half::{bf16, f16};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum BinaryOp {
Add,
Mul,
Sub,
Div,
Maximum,
Minimum,
}
impl BinaryOp {
pub fn from_name(name: &str) -> Option<Self> {
match name {
"add" => Some(Self::Add),
"sub" => Some(Self::Sub),
"mul" => Some(Self::Mul),
"div" => Some(Self::Div),
"maximum" => Some(Self::Maximum),
"minimum" => Some(Self::Minimum),
_ => None,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum UnaryOp {
Exp,
Log,
Sin,
Cos,
Abs,
Neg,
Recip,
Sqr,
Sqrt,
GeluTanh,
Gelu,
Erf,
Relu,
Silu,
Tanh,
Floor,
Ceil,
Round,
Sign,
}
impl UnaryOp {
pub fn from_name(name: &str) -> Option<Self> {
match name {
"exp" => Some(Self::Exp),
"log" => Some(Self::Log),
"sin" => Some(Self::Sin),
"cos" => Some(Self::Cos),
"abs" => Some(Self::Abs),
"neg" => Some(Self::Neg),
"recip" => Some(Self::Recip),
"sqr" => Some(Self::Sqr),
"sqrt" => Some(Self::Sqrt),
"gelu_tanh" => Some(Self::GeluTanh),
"gelu" => Some(Self::Gelu),
"erf" => Some(Self::Erf),
"relu" => Some(Self::Relu),
"silu" => Some(Self::Silu),
"tanh" => Some(Self::Tanh),
"floor" => Some(Self::Floor),
"ceil" => Some(Self::Ceil),
"round" => Some(Self::Round),
"sign" => Some(Self::Sign),
_ => None,
}
}
}
#[derive(Clone, Copy, PartialEq, Eq)]
pub enum CmpOp {
Eq,
Ne,
Le,
Ge,
Lt,
Gt,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ReduceOp {
Sum,
Min,
Max,
ArgMin,
ArgMax,
}
impl ReduceOp {
pub fn name(&self) -> &'static str {
match self {
Self::ArgMax => "argmax",
Self::ArgMin => "argmin",
Self::Min => "min",
Self::Max => "max",
Self::Sum => "sum",
}
}
}
pub trait UnaryOpT {
const NAME: &'static str;
const KERNEL: &'static str;
const V: Self;
fn bf16(v1: bf16) -> bf16;
fn f16(v1: f16) -> f16;
fn f32(v1: f32) -> f32;
fn f64(v1: f64) -> f64;
fn u8(v1: u8) -> u8;
fn u32(v1: u32) -> u32;
fn i16(v1: i16) -> i16;
fn i32(v1: i32) -> i32;
fn i64(v1: i64) -> i64;
fn f8e4m3(v1: f8e4m3) -> f8e4m3;
const BF16_VEC: bool = false;
fn bf16_vec(_xs: &[bf16], _ys: &mut [bf16]) {}
const F16_VEC: bool = false;
fn f16_vec(_xs: &[f16], _ys: &mut [f16]) {}
const F32_VEC: bool = false;
fn f32_vec(_xs: &[f32], _ys: &mut [f32]) {}
const F64_VEC: bool = false;
fn f64_vec(_xs: &[f64], _ys: &mut [f64]) {}
}
pub trait BinaryOpT {
const NAME: &'static str;
const KERNEL: &'static str;
const V: Self;
fn bf16(v1: bf16, v2: bf16) -> bf16;
fn f16(v1: f16, v2: f16) -> f16;
fn f32(v1: f32, v2: f32) -> f32;
fn f64(v1: f64, v2: f64) -> f64;
fn u8(v1: u8, v2: u8) -> u8;
fn u32(v1: u32, v2: u32) -> u32;
fn i16(v1: i16, v2: i16) -> i16;
fn i32(v1: i32, v2: i32) -> i32;
fn i64(v1: i64, v2: i64) -> i64;
fn f8e4m3(v1: f8e4m3, v2: f8e4m3) -> f8e4m3;
const BF16_VEC: bool = false;
fn bf16_vec(_xs1: &[bf16], _xs2: &[bf16], _ys: &mut [bf16]) {}
const F16_VEC: bool = false;
fn f16_vec(_xs1: &[f16], _xs2: &[f16], _ys: &mut [f16]) {}
const F32_VEC: bool = false;
fn f32_vec(_xs1: &[f32], _xs2: &[f32], _ys: &mut [f32]) {}
const F64_VEC: bool = false;
fn f64_vec(_xs1: &[f64], _xs2: &[f64], _ys: &mut [f64]) {}
const U8_VEC: bool = false;
fn u8_vec(_xs1: &[u8], _xs2: &[u8], _ys: &mut [u8]) {}
const U32_VEC: bool = false;
fn u32_vec(_xs1: &[u32], _xs2: &[u32], _ys: &mut [u32]) {}
const I64_VEC: bool = false;
fn i64_vec(_xs1: &[i64], _xs2: &[i64], _ys: &mut [i64]) {}
}