{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE TypeFamilies #-}
module Internal.Vectorized where
import Internal.Vector
import Internal.Devel
import Data.Complex
import Foreign.Marshal.Alloc(free,malloc)
import Foreign.Marshal.Array(newArray,copyArray)
import Foreign.Ptr(Ptr)
import Foreign.Storable(peek,Storable)
import Foreign.C.Types
import Foreign.C.String
import System.IO.Unsafe(unsafePerformIO)
import Control.Monad(when)
infixr 1 #
(#) :: TransArray c => c -> (b -> IO r) -> TransRaw c b -> IO r
a # b = applyRaw a b
{-# INLINE (#) #-}
(#!) :: (TransArray c, TransArray c1) => c1 -> c -> TransRaw c1 (TransRaw c (IO r)) -> IO r
a #! b = a # b # id
{-# INLINE (#!) #-}
fromei :: Enum a => a -> CInt
fromei x = fromIntegral (fromEnum x) :: CInt
data FunCodeV = Sin
| Cos
| Tan
| Abs
| ASin
| ACos
| ATan
| Sinh
| Cosh
| Tanh
| ASinh
| ACosh
| ATanh
| Exp
| Log
| Sign
| Sqrt
deriving Enum
data FunCodeSV = Scale
| Recip
| AddConstant
| Negate
| PowSV
| PowVS
| ModSV
| ModVS
deriving Enum
data FunCodeVV = Add
| Sub
| Mul
| Div
| Pow
| ATan2
| Mod
deriving Enum
data FunCodeS = Norm2
| AbsSum
| MaxIdx
| Max
| MinIdx
| Min
deriving Enum
sumF :: Vector Float -> Float
sumF = sumg c_sumF
sumR :: Vector Double -> Double
sumR = sumg c_sumR
sumQ :: Vector (Complex Float) -> Complex Float
sumQ = sumg c_sumQ
sumC :: Vector (Complex Double) -> Complex Double
sumC = sumg c_sumC
sumI :: ( TransRaw c (CInt -> Ptr a -> IO CInt) ~ (CInt -> Ptr I -> I :> Ok)
, TransArray c
, Storable a
)
=> I -> c -> a
sumI m = sumg (c_sumI m)
sumL :: ( TransRaw c (CInt -> Ptr a -> IO CInt) ~ (CInt -> Ptr Z -> Z :> Ok)
, TransArray c
, Storable a
) => Z -> c -> a
sumL m = sumg (c_sumL m)
sumg :: (TransArray c, Storable a) => TransRaw c (CInt -> Ptr a -> IO CInt) -> c -> a
sumg f x = unsafePerformIO $ do
r <- createVector 1
(x #! r) f #| "sum"
return $ r @> 0
type TVV t = t :> t :> Ok
foreign import ccall unsafe "sumF" c_sumF :: TVV Float
foreign import ccall unsafe "sumR" c_sumR :: TVV Double
foreign import ccall unsafe "sumQ" c_sumQ :: TVV (Complex Float)
foreign import ccall unsafe "sumC" c_sumC :: TVV (Complex Double)
foreign import ccall unsafe "sumI" c_sumI :: I -> TVV I
foreign import ccall unsafe "sumL" c_sumL :: Z -> TVV Z
prodF :: Vector Float -> Float
prodF = prodg c_prodF
prodR :: Vector Double -> Double
prodR = prodg c_prodR
prodQ :: Vector (Complex Float) -> Complex Float
prodQ = prodg c_prodQ
prodC :: Vector (Complex Double) -> Complex Double
prodC = prodg c_prodC
prodI :: I-> Vector I -> I
prodI = prodg . c_prodI
prodL :: Z-> Vector Z -> Z
prodL = prodg . c_prodL
prodg :: (TransArray c, Storable a)
=> TransRaw c (CInt -> Ptr a -> IO CInt) -> c -> a
prodg f x = unsafePerformIO $ do
r <- createVector 1
(x #! r) f #| "prod"
return $ r @> 0
foreign import ccall unsafe "prodF" c_prodF :: TVV Float
foreign import ccall unsafe "prodR" c_prodR :: TVV Double
foreign import ccall unsafe "prodQ" c_prodQ :: TVV (Complex Float)
foreign import ccall unsafe "prodC" c_prodC :: TVV (Complex Double)
foreign import ccall unsafe "prodI" c_prodI :: I -> TVV I
foreign import ccall unsafe "prodL" c_prodL :: Z -> TVV Z
toScalarAux :: (| x (
< Kn>Field<)>c -> CInt
zipVector :: (Fiea>
c_sumQ ::TransArray
CInt<"hs-identifier hs-type">a-Static.html#v:mul" title="Numeric.LinearAlgebra.Static">Numeric.LinearAlgebra. class="hs-glyph"><- [-> Vector c_sumQnvert
CInt<"hs-identifier hs-type">a
<->[-> -&gclass="hs-identifier hs-var">thinSVDAux ..) FloatTransArray>:: TVV CInt<"hs-identifier hs-type">a go ( -> createVector 1 = x scale' -> go (CInt) -> v
>:: ">f2i :: Storable CInt<"hs-identifier hs-ty2tifier hs-type">Float
:: import ccall unsafe "prodR" prodL =
a
65a>prodg prodC
type Z = Int64
‰pac> "prodR" Int prodC
type Z =e -> t :: TVV sumg"Internal.Devel.ph">:: c_prodR CInt)hs-identifier hs-type">TVV/span>(:: TVVs="hs-identifier">prodg vc CInt printf ternamul" title="Numeric.LinearAlgebra.Static">Numeric.LinearAlgebra. class="hs-glyph">+†identifier">vc"prodC" c_prodC<)span> :: TVV (Complph">= )
Internal.Vector
e="line-168">foreign Double
foreign import ccall unsafehs-identifier hs-type">TVVzgttrs :: unsafehs-identifier hs-type">TVVzgttrs an>"prodC" zgttrsccall :: Iimport unsafehs-identifier hs-type">TVVDoubl89586621679131635">e="line-168"l">(foreign "reorderF"
foreign -> go (CIntforeign c_prodR c_sumF
e="line-168"l">(import ColRangeforeign | SWAP dim foreign span>
TransArray>:: TVV :: ::an class= "pan class="hs-string">"pan cla0"> | c"prodC" Field<)>c <)span> -> u) (dim v)
<,a> w <- :: Fractional e => e . natVal $ ( hs-identifier hs-type">TVVzgtth">..selectCV sumCe .