rstsr_openblas/linalg_auto_impl/
slogdet.rs

1use crate::DeviceBLAS;
2use rstsr_blas_traits::prelude::*;
3use rstsr_core::prelude_dev::*;
4use rstsr_linalg_traits::prelude_dev::*;
5
6#[duplicate_item(
7    ImplType                          Tr                               ;
8   [T, D, R: DataAPI<Data = Vec<T>>] [&TensorAny<R, T, DeviceBLAS, D> ];
9   [T, D                           ] [TensorView<'_, T, DeviceBLAS, D>];
10)]
11impl<ImplType> SLogDetAPI<DeviceBLAS> for Tr
12where
13    T: BlasFloat,
14    D: DimAPI,
15    DeviceBLAS: LapackDriverAPI<T>,
16{
17    type Out = SLogDetResult<T>;
18    fn slogdet_f(self) -> Result<Self::Out> {
19        rstsr_assert_eq!(self.ndim(), 2, InvalidLayout, "Currently we can only handle 2-D matrix.")?;
20        let a = self;
21        let a_view = a.view().into_dim::<Ix2>();
22        let (sign, logabsdet) = ref_impl_slogdet_f(a_view.into())?;
23        Ok(SLogDetResult { sign, logabsdet })
24    }
25}
26
27#[duplicate_item(
28    ImplType   Tr                              ;
29   ['a, T, D] [TensorMut<'a, T, DeviceBLAS, D>];
30   [    T, D] [Tensor<T, DeviceBLAS, D>       ];
31)]
32impl<ImplType> SLogDetAPI<DeviceBLAS> for Tr
33where
34    T: BlasFloat,
35    D: DimAPI,
36    DeviceBLAS: LapackDriverAPI<T>,
37{
38    type Out = SLogDetResult<T>;
39    fn slogdet_f(self) -> Result<Self::Out> {
40        rstsr_assert_eq!(self.ndim(), 2, InvalidLayout, "Currently we can only handle 2-D matrix.")?;
41        let mut a = self;
42        let a_view = a.view_mut().into_dim::<Ix2>();
43        let (sign, logabsdet) = ref_impl_slogdet_f(a_view.into())?;
44        Ok(SLogDetResult { sign, logabsdet })
45    }
46}