{-# LANGUAGE FlexibleInstances, BangPatterns #-} ----------------------------------------------------------------------------- -- | -- Module : Foreign.VMath.VNum -- Copyright : Copyright (c) 2010, Patrick Perry -- License : BSD3 -- Maintainer : Patrick Perry -- Stability : experimental -- -- Vector Num operations. -- module Foreign.VMath.VNum where import Foreign( Storable, Ptr, with, ) import Foreign.Storable.Complex() import Data.Complex( Complex(..) ) import Foreign.BLAS.Double( dcopy ) import Foreign.VMath.Double import Foreign.VMath.Zomplex -- | Types with vectorized 'Num' operations. class (Storable a, Num a) => VNum a where vShift :: Int -> a -> Ptr a -> Ptr a -> IO () vAdd :: Int -> Ptr a -> Ptr a -> Ptr a -> IO () vSub :: Int -> Ptr a -> Ptr a -> Ptr a -> IO () vAxpby :: Int -> a -> Ptr a -> a -> Ptr a -> Ptr a -> IO () vScale :: Int -> a -> Ptr a -> Ptr a -> IO () vMul :: Int -> Ptr a -> Ptr a -> Ptr a -> IO () vConj :: Int -> Ptr a -> Ptr a -> IO () vNeg :: Int -> Ptr a -> Ptr a -> IO () vAbs :: Int -> Ptr a -> Ptr a -> IO () vSgn :: Int -> Ptr a -> Ptr a -> IO () instance VNum Double where vShift = vdShift {-# INLINE vShift #-} vAdd = vdAdd {-# INLINE vAdd #-} vSub = vdSub {-# INLINE vSub #-} vAxpby = vdAxpby {-# INLINE vAxpby #-} vScale = vdScale {-# INLINE vScale #-} vMul = vdMul {-# INLINE vMul #-} vConj n src dst = with (toEnum n) $ \pn -> with 1 $ \pone -> dcopy pn src pone dst pone {-# INLINE vConj #-} vNeg = vdNeg {-# INLINE vNeg #-} vAbs = vdAbs {-# INLINE vAbs #-} vSgn = vdSgn {-# INLINE vSgn #-} instance VNum (Complex Double) where vShift n alpha pX pZ = with alpha $ \pAlpha -> vzShift n pAlpha pX pZ {-# INLINE vShift #-} vAdd = vzAdd {-# INLINE vAdd #-} vSub = vzSub {-# INLINE vSub #-} vAxpby n alpha pX beta pY pZ = with alpha $ \pAlpha -> with beta $ \pBeta -> vzAxpby n pAlpha pX pBeta pY pZ {-# INLINE vAxpby #-} vScale n alpha pX pZ = with alpha $ \pAlpha -> vzScale n pAlpha pX pZ {-# INLINE vScale #-} vMul = vzMul {-# INLINE vMul #-} vConj = vzConj {-# INLINE vConj #-} vNeg = vzNeg {-# INLINE vNeg #-} vAbs = vzAbs {-# INLINE vAbs #-} vSgn = vzSgn {-# INLINE vSgn #-}