#[derive(Clone, Copy, Debug, PartialEq)]
pub enum LossKindStd {
Mse,
Mae,
Huber { delta: f32 },
}
impl From<LossKindStd> for native_neural_network::losses::LossKind {
fn from(k: LossKindStd) -> Self {
match k {
LossKindStd::Mse => native_neural_network::losses::LossKind::Mse,
LossKindStd::Mae => native_neural_network::losses::LossKind::Mae,
LossKindStd::Huber { delta } => {
native_neural_network::losses::LossKind::Huber { delta }
}
}
}
}
#[derive(Debug)]
pub enum LossesStdError {
LossError,
}
impl From<native_neural_network::losses::LossError> for LossesStdError {
fn from(_e: native_neural_network::losses::LossError) -> Self {
LossesStdError::LossError
}
}
pub fn loss_and_gradient(
kind: LossKindStd,
preds: &[f32],
targets: &[f32],
out_grad: &mut [f32],
) -> Result<f32, LossesStdError> {
let upstream: native_neural_network::losses::LossKind = kind.into();
native_neural_network::losses::loss_and_gradient(upstream, preds, targets, out_grad)
.map_err(|e| e.into())
}
pub fn reduce_sum(slice: &[f32]) -> f32 {
native_neural_network::losses::reduce_sum_f32(slice)
}
pub fn reduce_mean(slice: &[f32]) -> Option<f32> {
native_neural_network::losses::reduce_mean_f32(slice)
}
impl core::fmt::Display for LossesStdError {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(f, "LossesStdError::{:?}", self)
}
}
impl std::error::Error for LossesStdError {}