module Numeric.LAPACK.Vector.Private where

import qualified Numeric.LAPACK.Shape.Private as ShapePriv

import qualified Numeric.LAPACK.FFI.Complex as LapackComplex
import qualified Numeric.BLAS.FFI.Generic as BlasGen
import qualified Numeric.Netlib.Class as Class

import Foreign.Ptr (Ptr)
import Foreign.C.Types (CInt)

import qualified Data.Array.Comfort.Storable.Unchecked as Array
import Data.Array.Comfort.Storable.Unchecked (Array)


newtype ArgMaximum a =
   ArgMaximum {forall a. ArgMaximum a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO CInt
runArgMaximum :: Ptr CInt -> Ptr a -> Ptr CInt -> IO CInt}

absMax :: Class.Floating a => Ptr CInt -> Ptr a -> Ptr CInt -> IO CInt
absMax :: forall a. Floating a => Ptr CInt -> Ptr a -> Ptr CInt -> IO CInt
absMax =
   ArgMaximum a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO CInt
forall a. ArgMaximum a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO CInt
runArgMaximum (ArgMaximum a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO CInt)
-> ArgMaximum a -> Ptr CInt -> Ptr a -> Ptr CInt -> IO CInt
forall a b. (a -> b) -> a -> b
$
   ArgMaximum Float
-> ArgMaximum Double
-> ArgMaximum (Complex Float)
-> ArgMaximum (Complex Double)
-> ArgMaximum a
forall a (f :: * -> *).
Floating a =>
f Float
-> f Double -> f (Complex Float) -> f (Complex Double) -> f a
forall (f :: * -> *).
f Float
-> f Double -> f (Complex Float) -> f (Complex Double) -> f a
Class.switchFloating
      ((Ptr CInt -> Ptr Float -> Ptr CInt -> IO CInt) -> ArgMaximum Float
forall a.
(Ptr CInt -> Ptr a -> Ptr CInt -> IO CInt) -> ArgMaximum a
ArgMaximum Ptr CInt -> Ptr Float -> Ptr CInt -> IO CInt
forall a. Floating a => Ptr CInt -> Ptr a -> Ptr CInt -> IO CInt
BlasGen.iamax)
      ((Ptr CInt -> Ptr Double -> Ptr CInt -> IO CInt)
-> ArgMaximum Double
forall a.
(Ptr CInt -> Ptr a -> Ptr CInt -> IO CInt) -> ArgMaximum a
ArgMaximum Ptr CInt -> Ptr Double -> Ptr CInt -> IO CInt
forall a. Floating a => Ptr CInt -> Ptr a -> Ptr CInt -> IO CInt
BlasGen.iamax)
      ((Ptr CInt -> Ptr (Complex Float) -> Ptr CInt -> IO CInt)
-> ArgMaximum (Complex Float)
forall a.
(Ptr CInt -> Ptr a -> Ptr CInt -> IO CInt) -> ArgMaximum a
ArgMaximum Ptr CInt -> Ptr (Complex Float) -> Ptr CInt -> IO CInt
forall a.
Real a =>
Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> IO CInt
LapackComplex.imax1)
      ((Ptr CInt -> Ptr (Complex Double) -> Ptr CInt -> IO CInt)
-> ArgMaximum (Complex Double)
forall a.
(Ptr CInt -> Ptr a -> Ptr CInt -> IO CInt) -> ArgMaximum a
ArgMaximum Ptr CInt -> Ptr (Complex Double) -> Ptr CInt -> IO CInt
forall a.
Real a =>
Ptr CInt -> Ptr (Complex a) -> Ptr CInt -> IO CInt
LapackComplex.imax1)


uncheck :: Array sh a -> Array (ShapePriv.Unchecked sh) a
uncheck :: forall sh a. Array sh a -> Array (Unchecked sh) a
uncheck = (sh -> Unchecked sh) -> Array sh a -> Array (Unchecked sh) a
forall sh0 sh1 a. (sh0 -> sh1) -> Array sh0 a -> Array sh1 a
Array.mapShape sh -> Unchecked sh
forall sh. sh -> Unchecked sh
ShapePriv.Unchecked

recheck :: Array (ShapePriv.Unchecked sh) a -> Array sh a
recheck :: forall sh a. Array (Unchecked sh) a -> Array sh a
recheck = (Unchecked sh -> sh) -> Array (Unchecked sh) a -> Array sh a
forall sh0 sh1 a. (sh0 -> sh1) -> Array sh0 a -> Array sh1 a
Array.mapShape Unchecked sh -> sh
forall sh. Unchecked sh -> sh
ShapePriv.deconsUnchecked