{-# LANGUAGE TypeFamilies #-}
module Numeric.LAPACK.Matrix.Symmetric.Linear (
   determinant,
   ) where

import qualified Numeric.LAPACK.Matrix.Symmetric.Unified as Symmetric
import qualified Numeric.LAPACK.Matrix.Layout.Private as Layout
import Numeric.LAPACK.Matrix.Symmetric.Basic (SymmetricP)

import qualified Numeric.Netlib.Class as Class

import qualified Data.Array.Comfort.Shape as Shape

import Foreign.Ptr (Ptr)
import Foreign.Storable (peek)


determinant ::
   (Layout.Packing pack, Shape.C sh, Class.Floating a) =>
   SymmetricP pack sh a -> a
determinant :: SymmetricP pack sh a -> a
determinant = ((Ptr a, Maybe (Ptr a, Ptr a)) -> IO a)
-> SymmetricP pack sh a -> a
forall mirror uplo sh a ar pack.
(Mirror mirror, UpLo uplo, C sh, Floating a, Floating ar) =>
((Ptr a, Maybe (Ptr a, Ptr a)) -> IO ar)
-> Mosaic pack mirror uplo sh a -> ar
Symmetric.determinant (Ptr a, Maybe (Ptr a, Ptr a)) -> IO a
forall a. Floating a => (Ptr a, Maybe (Ptr a, Ptr a)) -> IO a
peekBlockDeterminant

peekBlockDeterminant ::
   (Class.Floating a) => (Ptr a, Maybe (Ptr a, Ptr a)) -> IO a
peekBlockDeterminant :: (Ptr a, Maybe (Ptr a, Ptr a)) -> IO a
peekBlockDeterminant (Ptr a
a0Ptr,Maybe (Ptr a, Ptr a)
ext) = do
   a
a0 <- Ptr a -> IO a
forall a. Storable a => Ptr a -> IO a
peek Ptr a
a0Ptr
   case Maybe (Ptr a, Ptr a)
ext of
      Maybe (Ptr a, Ptr a)
Nothing -> a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return a
a0
      Just (Ptr a
a1Ptr,Ptr a
bPtr) -> do
         a
a1 <- Ptr a -> IO a
forall a. Storable a => Ptr a -> IO a
peek Ptr a
a1Ptr
         a
b <- Ptr a -> IO a
forall a. Storable a => Ptr a -> IO a
peek Ptr a
bPtr
         a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (a
a0a -> a -> a
forall a. Num a => a -> a -> a
*a
a1 a -> a -> a
forall a. Num a => a -> a -> a
- a
ba -> a -> a
forall a. Num a => a -> a -> a
*a
b)