#[derive(Clone, Copy, Debug)]
pub struct AdamConfig {
pub beta1: f32,
pub beta2: f32,
pub gradient_factor: f32,
pub learning_rate: f32,
pub denom: bool,
pub decay: f32,
pub clip: Option<(f32, f32)>,
}
#[repr(i32)]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum DiffableFromOutput {
Identity = 0,
ReLU = 1,
CReLU = 2,
SCReLU = 3,
SqrReLU = 4,
Sigmoid = 5,
}
pub trait BaseOperations {
type BaseError;
fn set_to(&mut self, size: usize, val: f32) -> Result<(), Self::BaseError>;
#[allow(clippy::too_many_arguments)]
fn copy_or_add_strided(
&mut self,
add: bool,
rows: usize,
cols: usize,
offset: usize,
stride: usize,
a: &Self,
offset_a: usize,
stride_a: usize,
) -> Result<(), Self::BaseError>;
fn diffable_from_output_fwd(
&mut self,
size: usize,
a: &Self,
act: DiffableFromOutput,
) -> Result<(), Self::BaseError>;
fn diffable_from_output_bwd(
&mut self,
size: usize,
a: &Self,
grd: &Self,
act: DiffableFromOutput,
) -> Result<(), Self::BaseError>;
fn linear_comb(&mut self, size: usize, alpha: f32, beta: f32, input: &Self) -> Result<(), Self::BaseError>;
fn linear_comb_splat(
&mut self,
size: usize,
reps: usize,
alpha: f32,
beta: f32,
input: &Self,
) -> Result<(), Self::BaseError>;
fn reduce_across_batch(
&mut self,
size: usize,
batch_size: usize,
output_mul: f32,
input_mul: f32,
input: &Self,
) -> Result<(), Self::BaseError>;
fn mul_scalar(&mut self, size: usize, alpha: f32) -> Result<(), Self::BaseError>;
fn add_scalar(&mut self, size: usize, alpha: f32, input: &Self) -> Result<(), Self::BaseError>;
fn abs_pow_scalar(&mut self, size: usize, alpha: f32, input: &Self) -> Result<(), Self::BaseError>;
fn abs_pow_scalar_backward(
&mut self,
size: usize,
alpha: f32,
input: &Self,
grd: &Self,
) -> Result<(), Self::BaseError>;
fn pairwise_fwd(
&mut self,
offset: usize,
stride: usize,
size: usize,
batch_size: usize,
a: &Self,
) -> Result<(), Self::BaseError>;
fn pairwise_bwd(
&mut self,
offset: usize,
stride: usize,
size: usize,
batch_size: usize,
a: &Self,
grd: &Self,
) -> Result<(), Self::BaseError>;
fn power_error_fwd(&mut self, power: f32, size: usize, a: &Self, b: &Self) -> Result<(), Self::BaseError>;
fn power_error_bwd(
&mut self,
power: f32,
size: usize,
a: &Self,
b: &Self,
grd: &Self,
) -> Result<(), Self::BaseError>;
fn clip(&mut self, size: usize, min: f32, max: f32) -> Result<(), Self::BaseError>;
fn adam(
&mut self,
config: &AdamConfig,
size: usize,
grd: &Self,
mom: &mut Self,
vel: &mut Self,
) -> Result<(), Self::BaseError>;
}