use std::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum BackendTranspose {
NoTrans,
Trans,
ConjTrans,
}
impl fmt::Display for BackendTranspose {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::NoTrans => write!(f, "N"),
Self::Trans => write!(f, "T"),
Self::ConjTrans => write!(f, "C"),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum ReduceOp {
Sum,
Max,
Min,
Mean,
}
impl fmt::Display for ReduceOp {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Sum => write!(f, "sum"),
Self::Max => write!(f, "max"),
Self::Min => write!(f, "min"),
Self::Mean => write!(f, "mean"),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum UnaryOp {
Relu,
Sigmoid,
Tanh,
Exp,
Log,
Sqrt,
Abs,
Neg,
}
impl fmt::Display for UnaryOp {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Relu => write!(f, "relu"),
Self::Sigmoid => write!(f, "sigmoid"),
Self::Tanh => write!(f, "tanh"),
Self::Exp => write!(f, "exp"),
Self::Log => write!(f, "log"),
Self::Sqrt => write!(f, "sqrt"),
Self::Abs => write!(f, "abs"),
Self::Neg => write!(f, "neg"),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum MixedPrecision {
F16,
Bf16,
}
impl fmt::Display for MixedPrecision {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::F16 => write!(f, "f16"),
Self::Bf16 => write!(f, "bf16"),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum BinaryOp {
Add,
Sub,
Mul,
Div,
Max,
Min,
}
impl fmt::Display for BinaryOp {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Add => write!(f, "add"),
Self::Sub => write!(f, "sub"),
Self::Mul => write!(f, "mul"),
Self::Div => write!(f, "div"),
Self::Max => write!(f, "max"),
Self::Min => write!(f, "min"),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn backend_transpose_display_and_values() {
assert_eq!(BackendTranspose::NoTrans.to_string(), "N");
assert_eq!(BackendTranspose::Trans.to_string(), "T");
assert_eq!(BackendTranspose::ConjTrans.to_string(), "C");
assert_eq!(BackendTranspose::NoTrans, BackendTranspose::NoTrans);
assert_ne!(BackendTranspose::NoTrans, BackendTranspose::Trans);
}
#[test]
fn reduce_op_display_and_coverage() {
let ops = [ReduceOp::Sum, ReduceOp::Max, ReduceOp::Min, ReduceOp::Mean];
let names = ["sum", "max", "min", "mean"];
for (op, name) in ops.iter().zip(names.iter()) {
assert_eq!(op.to_string(), *name);
}
}
#[test]
fn unary_op_display_and_coverage() {
let ops = [
UnaryOp::Relu,
UnaryOp::Sigmoid,
UnaryOp::Tanh,
UnaryOp::Exp,
UnaryOp::Log,
UnaryOp::Sqrt,
UnaryOp::Abs,
UnaryOp::Neg,
];
let names = [
"relu", "sigmoid", "tanh", "exp", "log", "sqrt", "abs", "neg",
];
for (op, name) in ops.iter().zip(names.iter()) {
assert_eq!(op.to_string(), *name);
}
}
#[test]
fn mixed_precision_display_and_coverage() {
assert_eq!(MixedPrecision::F16.to_string(), "f16");
assert_eq!(MixedPrecision::Bf16.to_string(), "bf16");
assert_ne!(MixedPrecision::F16, MixedPrecision::Bf16);
use std::collections::HashSet;
let mut set = HashSet::new();
set.insert(MixedPrecision::F16);
assert!(set.contains(&MixedPrecision::F16));
assert!(!set.contains(&MixedPrecision::Bf16));
}
#[test]
fn binary_op_display_and_coverage() {
let ops = [
BinaryOp::Add,
BinaryOp::Sub,
BinaryOp::Mul,
BinaryOp::Div,
BinaryOp::Max,
BinaryOp::Min,
];
let names = ["add", "sub", "mul", "div", "max", "min"];
for (op, name) in ops.iter().zip(names.iter()) {
assert_eq!(op.to_string(), *name);
}
}
#[test]
fn enum_clone_and_hash() {
use std::collections::HashSet;
let mut set = HashSet::new();
set.insert(ReduceOp::Sum);
set.insert(ReduceOp::Max);
assert!(set.contains(&ReduceOp::Sum));
assert!(!set.contains(&ReduceOp::Min));
let op = UnaryOp::Relu;
let cloned = op;
assert_eq!(op, cloned);
let bop = BinaryOp::Add;
let bcloned = bop;
assert_eq!(bop, bcloned);
let trans = BackendTranspose::ConjTrans;
let tcloned = trans;
assert_eq!(trans, tcloned);
}
}