use crate::{Backend,moe::MoeExpertStrategy,tensor::{FloatTensor,IntTensor}};
use core::fmt;
#[derive(Clone,Copy,Debug,PartialEq,Eq)]
pub struct ExpertProjectionOptions {
pub expert_start:usize,
pub forward:MoeExpertStrategy,
pub backward:MoeExpertStrategy,
}
#[derive(Clone,Copy,Debug,PartialEq,Eq)]
pub struct ExpertProjectionSelection {pub input:bool,pub weights:bool}
#[derive(Debug)]
pub struct ExpertProjectionBackward<B:Backend> {pub input:Option<FloatTensor<B>>,pub weights:Option<FloatTensor<B>>}
pub trait ExpertProjectionOps:Backend {
type ExpertProjectionError:fmt::Debug;
type ExpertProjectionState:Clone+Send+fmt::Debug+'static;
fn expert_projection_forward(input:FloatTensor<Self>,global_ids:IntTensor<Self>,weights:FloatTensor<Self>,options:ExpertProjectionOptions)
-> Result<(FloatTensor<Self>,Self::ExpertProjectionState),Self::ExpertProjectionError>;
fn expert_projection_backward(state:Self::ExpertProjectionState,gradient:FloatTensor<Self>,selection:ExpertProjectionSelection)
-> Result<ExpertProjectionBackward<Self>,Self::ExpertProjectionError>;
}
#[derive(Clone,Copy,Debug,PartialEq,Eq)]
pub struct NativeSwiGluSelection {pub gate:bool,pub up:bool}
#[derive(Debug)]
pub struct NativeSwiGluBackward<B:Backend> {pub gate:Option<FloatTensor<B>>,pub up:Option<FloatTensor<B>>}
pub trait NativeSwiGluOps:Backend {
type SwiGluError:fmt::Debug;
fn native_swiglu(gate:FloatTensor<Self>,up:FloatTensor<Self>) -> Result<FloatTensor<Self>,Self::SwiGluError>;
fn native_swiglu_backward(gate:FloatTensor<Self>,up:FloatTensor<Self>,gradient:FloatTensor<Self>,selection:NativeSwiGluSelection)
-> Result<NativeSwiGluBackward<Self>,Self::SwiGluError>;
}