use crate::device::{Device, OperationResult};
pub trait CoreDeviceOps: Device {
fn select(
batch_size: usize,
input_batched: bool,
input_size: usize,
output_size: usize,
input: &Self::BufferF32,
indices: &Self::BufferI32,
output: &mut Self::BufferF32,
) -> OperationResult<Self::DeviceError>;
fn select_backprop(
batch_size: usize,
input_grad_batched: bool,
input_size: usize,
output_size: usize,
indices: &Self::BufferI32,
output_grad: &Self::BufferF32,
input_grad: &mut Self::BufferF32,
) -> OperationResult<Self::DeviceError>;
fn softmax_across_batch(
batch_size: usize,
single_size: usize,
input: &Self::BufferF32,
output: &mut Self::BufferF32,
) -> OperationResult<Self::DeviceError>;
fn crossentropy(
size: usize,
pred: &Self::BufferF32,
target: &Self::BufferF32,
output: &mut Self::BufferF32,
) -> OperationResult<Self::DeviceError>;
fn backprop_softmax_crossentropy(
size: usize,
softmaxed: &Self::BufferF32,
target: &Self::BufferF32,
output_grad: &Self::BufferF32,
input_grad: &mut Self::BufferF32,
) -> OperationResult<Self::DeviceError>;
}