use super::{MatrixErrorType, MatrixShape, MatrixWrite, Scalar};
pub trait MatrixOwned<F: Scalar>: MatrixWrite<F> + Sized {
fn zeros(nrows: usize, ncols: usize) -> Self;
}
pub trait MaterializeDense<F: Scalar>: MatrixShape + MatrixErrorType {
fn materialize_normalized_into<O: MatrixWrite<F> + ?Sized>(
&self,
centers: Option<&[F]>,
scales: Option<&[F]>,
out: &mut O,
) -> Result<(), Self::Error>;
}
pub trait DenseNormalize<F: Scalar>: MatrixWrite<F> {
fn normalize_in_place(&mut self, centers: Option<&[F]>, scales: Option<&[F]>);
}
impl<M: MaterializeDense<F> + ?Sized, F: Scalar> MaterializeDense<F> for &M {
fn materialize_normalized_into<O: MatrixWrite<F> + ?Sized>(
&self,
centers: Option<&[F]>,
scales: Option<&[F]>,
out: &mut O,
) -> Result<(), Self::Error> {
(**self).materialize_normalized_into(centers, scales, out)
}
}
impl<M: MaterializeDense<F> + ?Sized, F: Scalar> MaterializeDense<F> for &mut M {
fn materialize_normalized_into<O: MatrixWrite<F> + ?Sized>(
&self,
centers: Option<&[F]>,
scales: Option<&[F]>,
out: &mut O,
) -> Result<(), Self::Error> {
(**self).materialize_normalized_into(centers, scales, out)
}
}
impl<M: MatrixWrite<F> + ?Sized, F: Scalar> MatrixWrite<F> for &mut M {
fn set(&mut self, row: usize, column: usize, value: F) {
(**self).set(row, column, value);
}
}
impl<M: DenseNormalize<F> + ?Sized, F: Scalar> DenseNormalize<F> for &mut M {
fn normalize_in_place(&mut self, centers: Option<&[F]>, scales: Option<&[F]>) {
(**self).normalize_in_place(centers, scales);
}
}