{-# LANGUAGE FlexibleInstances #-} ----------------------------------------------------------------------------- -- | -- Module : Foreign.BLAS.Level1 -- Copyright : Copyright (c) 2010, Patrick Perry -- License : BSD3 -- Maintainer : Patrick Perry -- Stability : experimental -- -- Vector operations. -- module Foreign.BLAS.Level1 ( BLAS1(..), ) where import Foreign( Storable, Ptr, peek, with ) import Foreign.Storable.Complex() import Data.Complex( Complex(..) ) import Foreign.VMath.VFractional( VFractional ) import Foreign.BLAS.Double import Foreign.BLAS.Zomplex -- | Types with vector-vector operations. class (Storable a, VFractional a) => BLAS1 a where copy :: Int -> Ptr a -> Int -> Ptr a -> Int -> IO () swap :: Int -> Ptr a -> Int -> Ptr a -> Int -> IO () dotc :: Int -> Ptr a -> Int -> Ptr a -> Int -> IO a dotu :: Int -> Ptr a -> Int -> Ptr a -> Int -> IO a nrm2 :: Int -> Ptr a -> Int -> IO Double asum :: Int -> Ptr a -> Int -> IO Double iamax :: Int -> Ptr a -> Int -> IO Int scal :: Int -> a -> Ptr a -> Int -> IO () axpy :: Int -> a -> Ptr a -> Int -> Ptr a -> Int -> IO () rotg :: Ptr a -> Ptr a -> Ptr a -> Ptr a -> IO () rot :: Int -> Ptr a -> Int -> Ptr a -> Int -> Double -> Double -> IO () withEnum :: (Enum a, Storable a) => Int -> (Ptr a -> IO b) -> IO b withEnum = with . toEnum {-# INLINE withEnum #-} instance BLAS1 Double where copy n px incx py incy = withEnum n $ \pn -> withEnum incx $ \pincx -> withEnum incy $ \pincy -> dcopy pn px pincx py pincy {-# INLINE copy #-} swap n px incx py incy = withEnum n $ \pn -> withEnum incx $ \pincx -> withEnum incy $ \pincy -> dswap pn px pincx py pincy {-# INLINE swap #-} dotc n px incx py incy = withEnum n $ \pn -> withEnum incx $ \pincx -> withEnum incy $ \pincy -> ddot pn px pincx py pincy {-# INLINE dotc #-} dotu = dotc {-# INLINE dotu #-} nrm2 n px incx = withEnum n $ \pn -> withEnum incx $ \pincx -> dnrm2 pn px pincx {-# INLINE nrm2 #-} asum n px incx = withEnum n $ \pn -> withEnum incx $ \pincx -> dasum pn px pincx {-# INLINE asum #-} iamax n px incx = withEnum n $ \pn -> withEnum incx $ \pincx -> do i <- idamax pn px pincx return $! fromEnum (i - 1) {-# INLINE iamax #-} axpy n alpha px incx py incy = withEnum n $ \pn -> with alpha $ \palpha -> withEnum incx $ \pincx -> withEnum incy $ \pincy -> daxpy pn palpha px pincx py pincy {-# INLINE axpy #-} scal n alpha px incx = withEnum n $ \pn -> with alpha $ \palpha -> withEnum incx $ \pincx -> dscal pn palpha px pincx {-# INLINE scal #-} rotg = drotg {-# INLINE rotg #-} rot n px incx py incy c s = withEnum n $ \pn -> withEnum incx $ \pincx -> withEnum incy $ \pincy -> with c $ \pc -> with s $ \ps -> drot pn px pincx py pincy pc ps {-# INLINE rot #-} instance BLAS1 (Complex Double) where copy n px incx py incy = withEnum n $ \pn -> withEnum incx $ \pincx -> withEnum incy $ \pincy -> zcopy pn px pincx py pincy {-# INLINE copy #-} swap n px incx py incy = withEnum n $ \pn -> withEnum incx $ \pincx -> withEnum incy $ \pincy -> zswap pn px pincx py pincy {-# INLINE swap #-} dotc n px incx py incy = withEnum n $ \pn -> withEnum incx $ \pincx -> withEnum incy $ \pincy -> with 0 $ \pdotc -> do zdotc pdotc pn px pincx py pincy peek pdotc {-# INLINE dotc #-} dotu n px incx py incy = withEnum n $ \pn -> withEnum incx $ \pincx -> withEnum incy $ \pincy -> with 0 $ \pdotu -> do zdotu pdotu pn px pincx py pincy peek pdotu {-# INLINE dotu #-} nrm2 n px incx = withEnum n $ \pn -> withEnum incx $ \pincx -> znrm2 pn px pincx {-# INLINE nrm2 #-} asum n px incx = withEnum n $ \pn -> withEnum incx $ \pincx -> zasum pn px pincx {-# INLINE asum #-} iamax n px incx = withEnum n $ \pn -> withEnum incx $ \pincx -> do i <- izamax pn px pincx return $! fromEnum (i - 1) {-# INLINE iamax #-} axpy n alpha px incx py incy = withEnum n $ \pn -> with alpha $ \palpha -> withEnum incx $ \pincx -> withEnum incy $ \pincy -> zaxpy pn palpha px pincx py pincy {-# INLINE axpy #-} scal n alpha px incx = withEnum n $ \pn -> with alpha $ \palpha -> withEnum incx $ \pincx -> zscal pn palpha px pincx {-# INLINE scal #-} rotg = zrotg {-# INLINE rotg #-} rot n px incx py incy c s = withEnum n $ \pn -> withEnum incx $ \pincx -> withEnum incy $ \pincy -> with c $ \pc -> with s $ \ps -> zdrot pn px pincx py pincy pc ps {-# INLINE rot #-}