ruda-nn 0.21.27

Ruda neural network layers, activation modules and losses.
use ruda_model::module::Param;
use ruda_model::record::{CsrTensorRecord, PrecisionSettings, Record};
use ruda_model::tensor::{Tensor, ops::SparseOps};
use serde::{Serialize, de::DeserializeOwned};

#[derive(Clone, Debug)]
pub struct SparseLinearRecord<B: SparseOps> {
    pub weight: CsrTensorRecord<B>,
    pub weight_id: u64,
    pub bias: Option<Param<Tensor<B, 1>>>,
}

impl<B: SparseOps> Record<B> for SparseLinearRecord<B>
where
    B::CsrData: Serialize + DeserializeOwned,
{
    type Item<S: PrecisionSettings> = (
        B::CsrData,
        u64,
        <Option<Param<Tensor<B, 1>>> as Record<B>>::Item<S>,
    );

    fn into_item<S: PrecisionSettings>(self) -> Self::Item<S> {
        (self.weight.into_item::<S>(), self.weight_id, self.bias.into_item::<S>())
    }

    fn from_item<S: PrecisionSettings>(item: Self::Item<S>, device: &B::Device) -> Self {
        Self {
            weight: CsrTensorRecord::from_item::<S>(item.0, device),
            weight_id: item.1,
            bias: Record::from_item::<S>(item.2, device),
        }
    }
}