use std::ops::DerefMut;
use crate::shared::{statistics::ComputeSum, Precision};
use anndata_memory::IMArrayElement;
use anyhow::bail;
use single_algebra::Log1P;
use single_algebra::Normalize;
use single_utilities::traits::FloatOpsTS;
use single_utilities::types::Direction;
pub fn normalize_expression(
matrix: &IMArrayElement,
expression_target: u32,
direction: &Direction,
precision: Option<Precision>,
) -> anyhow::Result<()> {
let precision = precision.unwrap_or_default();
crate::memory::utils::convert_to_float_if_non_float_type(matrix, Some(precision))?;
match precision {
Precision::Single => normalize_with_type::<f32>(matrix, expression_target, direction),
Precision::Double => normalize_with_type::<f64>(matrix, expression_target, direction),
}
}
pub fn log1p_expression(
matrix: &IMArrayElement,
precision: Option<Precision>,
) -> anyhow::Result<()> {
let precision = precision.unwrap_or_default();
crate::memory::utils::convert_to_float_if_non_float_type(matrix, Some(precision))?;
log1p(matrix)
}
fn log1p(matrix: &IMArrayElement) -> anyhow::Result<()> {
let mut write_guard = matrix.0.write_inner();
let data = write_guard.deref_mut();
match data {
anndata::ArrayData::Array(dyn_array) => match dyn_array {
anndata::data::DynArray::I8(_) => {
bail!("Array - Normalization it not implemented for type <I8>!")
}
anndata::data::DynArray::I16(_) => {
bail!("Array - Normalization it not implemented for type <I16>!")
}
anndata::data::DynArray::I32(_) => {
bail!("Array - Normalization it not implemented for type <I32>!")
}
anndata::data::DynArray::I64(_) => {
bail!("Array - Normalization it not implemented for type <I64>!")
}
anndata::data::DynArray::U8(_) => {
bail!("Array - Normalization it not implemented for type <U8>!")
}
anndata::data::DynArray::U16(_) => {
bail!("Array - Normalization it not implemented for type <U16>!")
}
anndata::data::DynArray::U32(_) => {
bail!("Array - Normalization it not implemented for type <U32>!")
}
anndata::data::DynArray::U64(_) => {
bail!("Array - Normalization it not implemented for type <U64>!")
}
anndata::data::DynArray::F32(_) => todo!("Need to implement here!"),
anndata::data::DynArray::F64(_) => todo!("Need to implement here!"),
anndata::data::DynArray::Bool(_) => {
bail!("Array - Normalization it not implemented for type <bool>!")
}
anndata::data::DynArray::String(_) => {
bail!("Array - Normalization it not implemented for type <bool>!")
}
},
anndata::ArrayData::CsrMatrix(dyn_csr_matrix) => match dyn_csr_matrix {
anndata::data::DynCsrMatrix::I8(_) => {
bail!("CsrMatrix - Normalization it not implemented for type <I8>!")
}
anndata::data::DynCsrMatrix::I16(_) => {
bail!("CsrMatrix - Normalization it not implemented for type <I16>!")
}
anndata::data::DynCsrMatrix::I32(_) => {
bail!("CsrMatrix - Normalization it not implemented for type <I32>!")
}
anndata::data::DynCsrMatrix::I64(_) => {
bail!("CsrMatrix - Normalization it not implemented for type <I64>!")
}
anndata::data::DynCsrMatrix::U8(_) => {
bail!("CsrMatrix - Normalization it not implemented for type <U8>!")
}
anndata::data::DynCsrMatrix::U16(_) => {
bail!("CsrMatrix - Normalization it not implemented for type <U16>!")
}
anndata::data::DynCsrMatrix::U32(_) => {
bail!("CsrMatrix - Normalization it not implemented for type <U32>!")
}
anndata::data::DynCsrMatrix::U64(_) => {
bail!("CsrMatrix - Normalization it not implemented for type <U64>!")
}
anndata::data::DynCsrMatrix::F32(csr_matrix) => csr_matrix.log1p_normalize(),
anndata::data::DynCsrMatrix::F64(csr_matrix) => csr_matrix.log1p_normalize(),
anndata::data::DynCsrMatrix::Bool(_) => {
bail!("CsrMatrix - Normalization it not implemented for type <bool>!")
}
anndata::data::DynCsrMatrix::String(_) => {
bail!("CsrMatrix - Normalization it not implemented for type <string>!")
}
},
anndata::ArrayData::CsrNonCanonical(_) => {
todo!("This is not implemented yet!")
}
anndata::ArrayData::CscMatrix(dyn_csc_matrix) => match dyn_csc_matrix {
anndata::data::DynCscMatrix::I8(_) => {
bail!("CscMatrix - Normalization it not implemented for type <I8>!")
}
anndata::data::DynCscMatrix::I16(_) => {
bail!("CscMatrix - Normalization it not implemented for type <I16>!")
}
anndata::data::DynCscMatrix::I32(_) => {
bail!("CscMatrix - Normalization it not implemented for type <I32>!")
}
anndata::data::DynCscMatrix::I64(_) => {
bail!("CscMatrix - Normalization it not implemented for type <I64>!")
}
anndata::data::DynCscMatrix::U8(_) => {
bail!("CscMatrix - Normalization it not implemented for type <U8>!")
}
anndata::data::DynCscMatrix::U16(_) => {
bail!("CscMatrix - Normalization it not implemented for type <U16>!")
}
anndata::data::DynCscMatrix::U32(_) => {
bail!("CscMatrix - Normalization it not implemented for type <U32>!")
}
anndata::data::DynCscMatrix::U64(_) => {
bail!("CscMatrix - Normalization it not implemented for type <U64>!")
}
anndata::data::DynCscMatrix::F32(csc_matrix) => csc_matrix.log1p_normalize(),
anndata::data::DynCscMatrix::F64(csc_matrix) => csc_matrix.log1p_normalize(),
anndata::data::DynCscMatrix::Bool(_) => {
bail!("CscMatrix - Normalization it not implemented for type <bool>!")
}
anndata::data::DynCscMatrix::String(_) => {
bail!("CscMatrix - Normalization it not implemented for type <string>!")
}
},
anndata::ArrayData::DataFrame(_) => todo!("This is not implemented yet!"),
}
}
fn normalize_with_type<T>(
matrix: &IMArrayElement,
expression_target: u32,
direction: &Direction,
) -> anyhow::Result<()>
where
T: FloatOpsTS,
{
let sums: Vec<T> = matrix.sum_whole(direction)?;
let mut write_guard = matrix.0.write_inner();
let data = write_guard.deref_mut();
let target = T::from(expression_target).unwrap();
match data {
anndata::ArrayData::Array(dyn_array) => match dyn_array {
anndata::data::DynArray::I8(_) => {
bail!("Array - Normalization it not implemented for type <I8>!")
}
anndata::data::DynArray::I16(_) => {
bail!("Array - Normalization it not implemented for type <I16>!")
}
anndata::data::DynArray::I32(_) => {
bail!("Array - Normalization it not implemented for type <I32>!")
}
anndata::data::DynArray::I64(_) => {
bail!("Array - Normalization it not implemented for type <I64>!")
}
anndata::data::DynArray::U8(_) => {
bail!("Array - Normalization it not implemented for type <U8>!")
}
anndata::data::DynArray::U16(_) => {
bail!("Array - Normalization it not implemented for type <U16>!")
}
anndata::data::DynArray::U32(_) => {
bail!("Array - Normalization it not implemented for type <U32>!")
}
anndata::data::DynArray::U64(_) => {
bail!("Array - Normalization it not implemented for type <U64>!")
}
anndata::data::DynArray::F32(_) => todo!("Need to implement here!"),
anndata::data::DynArray::F64(_) => todo!("Need to implement here!"),
anndata::data::DynArray::Bool(_) => {
bail!("Array - Normalization it not implemented for type <bool>!")
}
anndata::data::DynArray::String(_) => {
bail!("Array - Normalization it not implemented for type <bool>!")
}
},
anndata::ArrayData::CsrMatrix(dyn_csr_matrix) => match dyn_csr_matrix {
anndata::data::DynCsrMatrix::I8(_) => {
bail!("CsrMatrix - Normalization it not implemented for type <I8>!")
}
anndata::data::DynCsrMatrix::I16(_) => {
bail!("CsrMatrix - Normalization it not implemented for type <I16>!")
}
anndata::data::DynCsrMatrix::I32(_) => {
bail!("CsrMatrix - Normalization it not implemented for type <I32>!")
}
anndata::data::DynCsrMatrix::I64(_) => {
bail!("CsrMatrix - Normalization it not implemented for type <I64>!")
}
anndata::data::DynCsrMatrix::U8(_) => {
bail!("CsrMatrix - Normalization it not implemented for type <U8>!")
}
anndata::data::DynCsrMatrix::U16(_) => {
bail!("CsrMatrix - Normalization it not implemented for type <U16>!")
}
anndata::data::DynCsrMatrix::U32(_) => {
bail!("CsrMatrix - Normalization it not implemented for type <U32>!")
}
anndata::data::DynCsrMatrix::U64(_) => {
bail!("CsrMatrix - Normalization it not implemented for type <U64>!")
}
anndata::data::DynCsrMatrix::F32(csr_matrix) => {
csr_matrix.normalize::<T>(sums.as_slice(), target, direction)
}
anndata::data::DynCsrMatrix::F64(csr_matrix) => {
csr_matrix.normalize::<T>(sums.as_slice(), target, direction)
}
anndata::data::DynCsrMatrix::Bool(_) => {
bail!("CsrMatrix - Normalization it not implemented for type <bool>!")
}
anndata::data::DynCsrMatrix::String(_) => {
bail!("CsrMatrix - Normalization it not implemented for type <string>!")
}
},
anndata::ArrayData::CsrNonCanonical(_) => {
todo!("This is not implemented yet!")
}
anndata::ArrayData::CscMatrix(dyn_csc_matrix) => match dyn_csc_matrix {
anndata::data::DynCscMatrix::I8(_) => {
bail!("CscMatrix - Normalization it not implemented for type <I8>!")
}
anndata::data::DynCscMatrix::I16(_) => {
bail!("CscMatrix - Normalization it not implemented for type <I16>!")
}
anndata::data::DynCscMatrix::I32(_) => {
bail!("CscMatrix - Normalization it not implemented for type <I32>!")
}
anndata::data::DynCscMatrix::I64(_) => {
bail!("CscMatrix - Normalization it not implemented for type <I64>!")
}
anndata::data::DynCscMatrix::U8(_) => {
bail!("CscMatrix - Normalization it not implemented for type <U8>!")
}
anndata::data::DynCscMatrix::U16(_) => {
bail!("CscMatrix - Normalization it not implemented for type <U16>!")
}
anndata::data::DynCscMatrix::U32(_) => {
bail!("CscMatrix - Normalization it not implemented for type <U32>!")
}
anndata::data::DynCscMatrix::U64(_) => {
bail!("CscMatrix - Normalization it not implemented for type <U64>!")
}
anndata::data::DynCscMatrix::F32(csc_matrix) => {
csc_matrix.normalize::<T>(sums.as_slice(), target, direction)
}
anndata::data::DynCscMatrix::F64(csc_matrix) => {
csc_matrix.normalize::<T>(sums.as_slice(), target, direction)
}
anndata::data::DynCscMatrix::Bool(_) => {
bail!("CscMatrix - Normalization it not implemented for type <bool>!")
}
anndata::data::DynCscMatrix::String(_) => {
bail!("CscMatrix - Normalization it not implemented for type <string>!")
}
},
anndata::ArrayData::DataFrame(_) => todo!("This is not implemented yet!"),
}
}