use std::marker::PhantomData;
use libc::{c_int, c_void};
use crate::cuda::{AsKernelPtr, CudaConstPtr, CudaTensor1dPtr, CudaTensor1dPtrView, CudaVec, CudaVecView, DataTypeInfo, Kernel, KernelArgs};
use crate::ope::UnitValue;
extern "C" {
fn loss_linear_batch_mse_derive_float(r: *const f32, t: *const f32, output: *mut f32, nlen: c_int, batch_size: c_int) -> c_void;
fn loss_linear_batch_mse_derive_double(r: *const f64, t: *const f64, output: *mut f64, nlen: c_int, batch_size: c_int) -> c_void;
fn loss_linear_batch_cross_entropy_derive_float(r: *const f32, t: *const f32, output: *mut f32, nlen: c_int, batch_size: c_int) -> c_void;
fn loss_linear_batch_cross_entropy_derive_double(r: *const f64, t: *const f64, output: *mut f64, nlen: c_int, batch_size: c_int) -> c_void;
fn loss_linear_batch_cross_entropy_multiclass_derive_float(r: *const f32, t: *const f32, output: *mut f32, nlen: c_int, batch_size: c_int) -> c_void;
fn loss_linear_batch_cross_entropy_multiclass_derive_double(r: *const f64, t: *const f64, output: *mut f64, nlen: c_int, batch_size: c_int) -> c_void;
}
pub struct LinearBatchMseArgs<'a,T,const N:usize> where T: DataTypeInfo + UnitValue<T> {
expected: CudaConstPtr<'a,CudaVecView<'a,T,CudaTensor1dPtr<T,N>>>,
actual: CudaConstPtr<'a,CudaVecView<'a,T,CudaTensor1dPtr<T,N>>>,
pub output: CudaVec<T,CudaTensor1dPtr<T,N>>,
out_len: usize,
batch_len: usize,
}
impl<'a,T,const N:usize> LinearBatchMseArgs<'a,T,N> where T: DataTypeInfo + UnitValue<T> {
pub fn new(t:&'a CudaVecView<'a,T,CudaTensor1dPtr<T,N>>,r:&'a CudaVecView<'a,T,CudaTensor1dPtr<T,N>>,
output: CudaVec<T,CudaTensor1dPtr<T,N>>,out_len:usize,batch_len:usize) -> LinearBatchMseArgs<'a,T,N> {
LinearBatchMseArgs {
expected: CudaConstPtr::new(t),
actual: CudaConstPtr::new(r),
output: output,
out_len: out_len,
batch_len: batch_len
}
}
}
impl<'a,T,const N:usize> KernelArgs for LinearBatchMseArgs<'a,T,N> where T: DataTypeInfo + UnitValue<T> {
fn as_vec(&mut self) -> Vec<&mut dyn AsKernelPtr> {
vec![
&mut self.expected,
&mut self.actual,
&mut self.output,
&mut self.out_len,
&mut self.batch_len
]
}
}
pub struct LinearBatchMse<'a,T,const N:usize> where T: DataTypeInfo + UnitValue<T> {
t:PhantomData<T>,
n:PhantomData<[();N]>,
l:PhantomData<&'a ()>
}
impl<'a,T,const N:usize> LinearBatchMse<'a,T,N> where T: DataTypeInfo + UnitValue<T> {
pub fn new() -> LinearBatchMse<'a,T,N> {
LinearBatchMse {
t: PhantomData::<T>,
n: PhantomData::<[();N]>,
l: PhantomData::<&'a ()>
}
}
}
impl<'a,const N:usize> Kernel for LinearBatchMse<'a,f32,N> {
const FUNC_PTR: *const c_void = loss_linear_batch_mse_derive_float as *const c_void;
type Args = LinearBatchMseArgs<'a,f32,N>;
}
impl<'a,const N:usize> Kernel for LinearBatchMse<'a,f64,N> {
const FUNC_PTR: *const c_void = loss_linear_batch_mse_derive_double as *const c_void;
type Args = LinearBatchMseArgs<'a,f64,N>;
}
pub struct LinearMseArgs<'a,T,const N:usize> where T: DataTypeInfo + UnitValue<T> {
expected: CudaConstPtr<'a,CudaTensor1dPtrView<'a,T,N>>,
actual: CudaConstPtr<'a,CudaTensor1dPtrView<'a,T,N>>,
pub output: CudaTensor1dPtr<T,N>,
out_len: usize,
batch_len: usize,
}
impl<'a,T,const N:usize> LinearMseArgs<'a,T,N> where T: DataTypeInfo + UnitValue<T> {
pub fn new(t:&'a CudaTensor1dPtrView<'a,T,N>,
r:&'a CudaTensor1dPtrView<'a,T,N>,
output: CudaTensor1dPtr<T,N>,
out_len:usize) -> LinearMseArgs<'a,T,N> {
LinearMseArgs {
expected: CudaConstPtr::new(t),
actual: CudaConstPtr::new(r),
output: output,
out_len: out_len,
batch_len: 1
}
}
}
impl<'a,T,const N:usize> KernelArgs for LinearMseArgs<'a,T,N> where T: DataTypeInfo + UnitValue<T> {
fn as_vec(&mut self) -> Vec<&mut dyn AsKernelPtr> {
vec![
&mut self.expected,
&mut self.actual,
&mut self.output,
&mut self.out_len,
&mut self.batch_len
]
}
}
pub struct LinearMse<'a,T,const N:usize> where T: DataTypeInfo + UnitValue<T> {
t:PhantomData<T>,
n:PhantomData<[();N]>,
l:PhantomData<&'a ()>
}
impl<'a,T,const N:usize> LinearMse<'a,T,N> where T: DataTypeInfo + UnitValue<T> {
pub fn new() -> LinearMse<'a,T,N> {
LinearMse {
t: PhantomData::<T>,
n: PhantomData::<[();N]>,
l: PhantomData::<&'a ()>
}
}
}
impl<'a,const N:usize> Kernel for LinearMse<'a,f32,N> {
const FUNC_PTR: *const c_void = loss_linear_batch_mse_derive_float as *const c_void;
type Args = LinearMseArgs<'a,f32,N>;
}
impl<'a,const N:usize> Kernel for LinearMse<'a,f64,N> {
const FUNC_PTR: *const c_void = loss_linear_batch_mse_derive_double as *const c_void;
type Args = LinearMseArgs<'a,f64,N>;
}
pub struct LinearBatchCrossEntropyArgs<'a,T,const N:usize> where T: DataTypeInfo + UnitValue<T> {
expected: CudaConstPtr<'a,CudaVecView<'a,T,CudaTensor1dPtr<T,N>>>,
actual: CudaConstPtr<'a,CudaVecView<'a,T,CudaTensor1dPtr<T,N>>>,
pub output: CudaVec<T,CudaTensor1dPtr<T,N>>,
out_len: usize,
batch_len: usize,
}
impl<'a,T,const N:usize> LinearBatchCrossEntropyArgs<'a,T,N> where T: DataTypeInfo + UnitValue<T> {
pub fn new(t:&'a CudaVecView<'a,T,CudaTensor1dPtr<T,N>>,
r:&'a CudaVecView<'a,T,CudaTensor1dPtr<T,N>>,
output: CudaVec<T,CudaTensor1dPtr<T,N>>,
out_len:usize,batch_len:usize) -> LinearBatchCrossEntropyArgs<'a,T,N> {
LinearBatchCrossEntropyArgs {
expected: CudaConstPtr::new(t),
actual: CudaConstPtr::new(r),
output: output,
out_len: out_len,
batch_len: batch_len
}
}
}
impl<'a,T,const N:usize> KernelArgs for LinearBatchCrossEntropyArgs<'a,T,N> where T: DataTypeInfo + UnitValue<T> {
fn as_vec(&mut self) -> Vec<&mut dyn AsKernelPtr> {
vec![
&mut self.expected,
&mut self.actual,
&mut self.output,
&mut self.out_len,
&mut self.batch_len
]
}
}
pub struct LinearBatchCrossEntropy<'a,T,const N:usize> where T: DataTypeInfo + UnitValue<T> {
t:PhantomData<T>,
n:PhantomData<[();N]>,
l:PhantomData<&'a ()>
}
impl<'a,T,const N:usize> LinearBatchCrossEntropy<'a,T,N> where T: DataTypeInfo + UnitValue<T> {
pub fn new() -> LinearBatchCrossEntropy<'a,T,N> {
LinearBatchCrossEntropy {
t: PhantomData::<T>,
n: PhantomData::<[();N]>,
l: PhantomData::<&'a ()>
}
}
}
impl<'a,const N:usize> Kernel for LinearBatchCrossEntropy<'a,f32,N> {
const FUNC_PTR: *const c_void = loss_linear_batch_cross_entropy_derive_float as *const c_void;
type Args = LinearBatchCrossEntropyArgs<'a,f32,N>;
}
impl<'a,const N:usize> Kernel for LinearBatchCrossEntropy<'a,f64,N> {
const FUNC_PTR: *const c_void = loss_linear_batch_cross_entropy_derive_double as *const c_void;
type Args = LinearBatchCrossEntropyArgs<'a,f64,N>;
}
pub struct LinearCrossEntropyArgs<'a,T,const N:usize> where T: DataTypeInfo + UnitValue<T> {
expected: CudaConstPtr<'a,CudaTensor1dPtrView<'a,T,N>>,
actual: CudaConstPtr<'a,CudaTensor1dPtrView<'a,T,N>>,
pub output: CudaTensor1dPtr<T,N>,
out_len: usize,
batch_len: usize,
}
impl<'a,T,const N:usize> LinearCrossEntropyArgs<'a,T,N> where T: DataTypeInfo + UnitValue<T> {
pub fn new(t:&'a CudaTensor1dPtrView<'a,T,N>,
r:&'a CudaTensor1dPtrView<'a,T,N>,
output: CudaTensor1dPtr<T,N>,
out_len:usize) -> LinearCrossEntropyArgs<'a, T, N> {
LinearCrossEntropyArgs {
expected: CudaConstPtr::new(t),
actual: CudaConstPtr::new(r),
output: output,
out_len: out_len,
batch_len: 1
}
}
}
impl<'a,T,const N:usize> KernelArgs for LinearCrossEntropyArgs<'a,T,N> where T: DataTypeInfo + UnitValue<T> {
fn as_vec(&mut self) -> Vec<&mut dyn AsKernelPtr> {
vec![
&mut self.expected,
&mut self.actual,
&mut self.output,
&mut self.out_len,
&mut self.batch_len
]
}
}
pub struct LinearCrossEntropy<'a,T,const N:usize> where T: DataTypeInfo + UnitValue<T> {
t:PhantomData<T>,
n:PhantomData<[();N]>,
l:PhantomData<&'a ()>
}
impl<'a,T,const N:usize> LinearCrossEntropy<'a,T,N> where T: DataTypeInfo + UnitValue<T> {
pub fn new() -> LinearCrossEntropy<'a,T,N> {
LinearCrossEntropy {
t: PhantomData::<T>,
n: PhantomData::<[();N]>,
l: PhantomData::<&'a ()>
}
}
}
impl<'a,const N:usize> Kernel for LinearCrossEntropy<'a,f32,N> {
const FUNC_PTR: *const c_void = loss_linear_batch_cross_entropy_derive_float as *const c_void;
type Args = LinearCrossEntropyArgs<'a,f32,N>;
}
impl<'a,const N:usize> Kernel for LinearCrossEntropy<'a,f64,N> {
const FUNC_PTR: *const c_void = loss_linear_batch_cross_entropy_derive_double as *const c_void;
type Args = LinearCrossEntropyArgs<'a,f64,N>;
}
pub struct LinearBatchCrossEntropyMulticlassArgs<'a,T,const N:usize> where T: DataTypeInfo + UnitValue<T> {
expected: CudaConstPtr<'a,CudaVecView<'a,T,CudaTensor1dPtr<T,N>>>,
actual: CudaConstPtr<'a,CudaVecView<'a,T,CudaTensor1dPtr<T,N>>>,
pub output: CudaVec<T,CudaTensor1dPtr<T,N>>,
out_len: usize,
batch_len: usize,
}
impl<'a,T,const N:usize> LinearBatchCrossEntropyMulticlassArgs<'a,T,N> where T: DataTypeInfo + UnitValue<T> {
pub fn new(t:&'a CudaVecView<'a,T,CudaTensor1dPtr<T,N>>,
r:&'a CudaVecView<'a,T,CudaTensor1dPtr<T,N>>,
output: CudaVec<T,CudaTensor1dPtr<T,N>>,
out_len:usize,batch_len:usize) -> LinearBatchCrossEntropyMulticlassArgs<'a,T,N> {
LinearBatchCrossEntropyMulticlassArgs {
expected: CudaConstPtr::new(t),
actual: CudaConstPtr::new(r),
output: output,
out_len: out_len,
batch_len: batch_len
}
}
}
impl<'a,T,const N:usize> KernelArgs for LinearBatchCrossEntropyMulticlassArgs<'a,T,N> where T: DataTypeInfo + UnitValue<T> {
fn as_vec(&mut self) -> Vec<&mut dyn AsKernelPtr> {
vec![
&mut self.expected,
&mut self.actual,
&mut self.output,
&mut self.out_len,
&mut self.batch_len
]
}
}
pub struct LinearBatchCrossEntropyMulticlass<'a,T,const N:usize> where T: DataTypeInfo + UnitValue<T> {
t:PhantomData<T>,
n:PhantomData<[();N]>,
l:PhantomData<&'a ()>
}
impl<'a,T,const N:usize> LinearBatchCrossEntropyMulticlass<'a,T,N> where T: DataTypeInfo + UnitValue<T> {
pub fn new() -> LinearBatchCrossEntropyMulticlass<'a,T,N> {
LinearBatchCrossEntropyMulticlass {
t: PhantomData::<T>,
n: PhantomData::<[();N]>,
l: PhantomData::<&'a ()>
}
}
}
impl<'a,const N:usize> Kernel for LinearBatchCrossEntropyMulticlass<'a,f32,N> {
const FUNC_PTR: *const c_void = loss_linear_batch_cross_entropy_multiclass_derive_float as *const c_void;
type Args = LinearBatchCrossEntropyMulticlassArgs<'a,f32,N>;
}
impl<'a,const N:usize> Kernel for LinearBatchCrossEntropyMulticlass<'a,f64,N> {
const FUNC_PTR: *const c_void = loss_linear_batch_cross_entropy_multiclass_derive_double as *const c_void;
type Args = LinearBatchCrossEntropyMulticlassArgs<'a,f64,N>;
}
pub struct LinearCrossEntropyMulticlassArgs<'a,T,const N:usize> where T: DataTypeInfo + UnitValue<T> {
expected: CudaConstPtr<'a,CudaTensor1dPtrView<'a,T,N>>,
actual: CudaConstPtr<'a,CudaTensor1dPtrView<'a,T,N>>,
pub output: CudaTensor1dPtr<T,N>,
out_len: usize,
batch_len: usize,
}
impl<'a,T,const N:usize> LinearCrossEntropyMulticlassArgs<'a,T,N> where T: DataTypeInfo + UnitValue<T> {
pub fn new(t:&'a CudaTensor1dPtrView<T,N>,
r:&'a CudaTensor1dPtrView<'a,T,N>,
output: CudaTensor1dPtr<T,N>,
out_len:usize) -> LinearCrossEntropyMulticlassArgs<'a,T,N> {
LinearCrossEntropyMulticlassArgs {
expected: CudaConstPtr::new(t),
actual: CudaConstPtr::new(r),
output: output,
out_len: out_len,
batch_len: 1
}
}
}
impl<'a,T,const N:usize> KernelArgs for LinearCrossEntropyMulticlassArgs<'a,T,N> where T: DataTypeInfo + UnitValue<T> {
fn as_vec(&mut self) -> Vec<&mut dyn AsKernelPtr> {
vec![
&mut self.expected,
&mut self.actual,
&mut self.output,
&mut self.out_len,
&mut self.batch_len
]
}
}
pub struct LinearCrossEntropyMulticlass<'a,T,const N:usize> where T: DataTypeInfo + UnitValue<T> {
t:PhantomData<T>,
n:PhantomData<[();N]>,
l:PhantomData<&'a ()>
}
impl<'a,T,const N:usize> LinearCrossEntropyMulticlass<'a,T,N> where T: DataTypeInfo + UnitValue<T> {
pub fn new() -> LinearCrossEntropyMulticlass<'a,T,N> {
LinearCrossEntropyMulticlass {
t: PhantomData::<T>,
n: PhantomData::<[();N]>,
l: PhantomData::<&'a ()>
}
}
}
impl<'a,const N:usize> Kernel for LinearCrossEntropyMulticlass<'a,f32,N> {
const FUNC_PTR: *const c_void = loss_linear_batch_cross_entropy_multiclass_derive_float as *const c_void;
type Args = LinearCrossEntropyMulticlassArgs<'a, f32, N>;
}
impl<'a,const N:usize> Kernel for LinearCrossEntropyMulticlass<'a,f64,N> {
const FUNC_PTR: *const c_void = loss_linear_batch_cross_entropy_multiclass_derive_double as *const c_void;
type Args = LinearCrossEntropyMulticlassArgs<'a,f64,N>;
}