{-# LANGUAGE FlexibleContexts    #-}
{-# LANGUAGE GADTs               #-}
{-# LANGUAGE NoImplicitPrelude   #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications    #-}
-- |
-- Module      : Data.Array.Accelerate.Numeric.LinearAlgebra.BLAS.Level1
-- Copyright   : [2017..2020] Trevor L. McDonell
-- License     : BSD3
--
-- Maintainer  : Trevor L. McDonell <trevor.mcdonell@gmail.com>
-- Stability   : experimental
-- Portability : non-portable (GHC extensions)
--
-- Level 1 (vector-vector) BLAS operations.
--

module Data.Array.Accelerate.Numeric.LinearAlgebra.BLAS.Level1 (

  -- Types
  Numeric, Vector,

  -- Level1 operations
  sdot,
  dotu,
  dotc,
  asum,
  amax,
  amin,

) where

import Data.Array.Accelerate                                        as A
import Data.Array.Accelerate.Data.Complex                           as A
import Data.Array.Accelerate.Numeric.LinearAlgebra.Type


-- | Computes a vector-vector dot product, using double precision accumulation
-- of the intermediate result. Includes a scalar (initial) value to be added to
-- the inner product.
--
-- <https://software.intel.com/en-us/mkl-developer-reference-c-cblas-sdot>
--
sdot :: forall e. Numeric e => Exp e -> Acc (Vector e) -> Acc (Vector e) -> Acc (Scalar e)
sdot :: Exp e -> Acc (Vector e) -> Acc (Vector e) -> Acc (Scalar e)
sdot Exp e
z Acc (Vector e)
xs Acc (Vector e)
ys =
  case Numeric e => NumericR e (EltR e)
forall a. Numeric a => NumericR a (EltR a)
numericR @e of
    NumericR e (EltR e)
NumericRfloat32   -> (Exp Double -> Exp e) -> Acc (Array DIM0 Double) -> Acc (Scalar e)
forall sh a b.
(Shape sh, Elt a, Elt b) =>
(Exp a -> Exp b) -> Acc (Array sh a) -> Acc (Array sh b)
map Exp Double -> Exp e
forall a b. (ToFloating a b, Num a, Floating b) => Exp a -> Exp b
toFloating (Acc (Array DIM0 Double) -> Acc (Scalar e))
-> Acc (Array DIM0 Double) -> Acc (Scalar e)
forall a b. (a -> b) -> a -> b
$ Exp Double
-> Acc (Vector Double)
-> Acc (Vector Double)
-> Acc (Array DIM0 Double)
dsdot (Exp e -> Exp Double
forall a b. (ToFloating a b, Num a, Floating b) => Exp a -> Exp b
toFloating Exp e
z) ((Exp e -> Exp Double) -> Acc (Vector e) -> Acc (Vector Double)
forall sh a b.
(Shape sh, Elt a, Elt b) =>
(Exp a -> Exp b) -> Acc (Array sh a) -> Acc (Array sh b)
map Exp e -> Exp Double
forall a b. (ToFloating a b, Num a, Floating b) => Exp a -> Exp b
toFloating Acc (Vector e)
xs) ((Exp e -> Exp Double) -> Acc (Vector e) -> Acc (Vector Double)
forall sh a b.
(Shape sh, Elt a, Elt b) =>
(Exp a -> Exp b) -> Acc (Array sh a) -> Acc (Array sh b)
map Exp e -> Exp Double
forall a b. (ToFloating a b, Num a, Floating b) => Exp a -> Exp b
toFloating Acc (Vector e)
ys)
    NumericR e (EltR e)
NumericRfloat64   -> Exp Double
-> Acc (Vector Double)
-> Acc (Vector Double)
-> Acc (Array DIM0 Double)
dsdot Exp e
Exp Double
z Acc (Vector e)
Acc (Vector Double)
xs Acc (Vector e)
Acc (Vector Double)
ys
    NumericR e (EltR e)
NumericRcomplex32 -> (Exp (Complex Double) -> Exp (Complex Float))
-> Acc (Array DIM0 (Complex Double))
-> Acc (Array DIM0 (Complex Float))
forall sh a b.
(Shape sh, Elt a, Elt b) =>
(Exp a -> Exp b) -> Acc (Array sh a) -> Acc (Array sh b)
map Exp (Complex Double) -> Exp (Complex Float)
d2f (Acc (Array DIM0 (Complex Double))
 -> Acc (Array DIM0 (Complex Float)))
-> Acc (Array DIM0 (Complex Double))
-> Acc (Array DIM0 (Complex Float))
forall a b. (a -> b) -> a -> b
$ Exp (Complex Double)
-> Acc (Vector (Complex Double))
-> Acc (Vector (Complex Double))
-> Acc (Array DIM0 (Complex Double))
zsdot (Exp (Complex Float) -> Exp (Complex Double)
f2d Exp e
Exp (Complex Float)
z) ((Exp (Complex Float) -> Exp (Complex Double))
-> Acc (Array DIM1 (Complex Float))
-> Acc (Vector (Complex Double))
forall sh a b.
(Shape sh, Elt a, Elt b) =>
(Exp a -> Exp b) -> Acc (Array sh a) -> Acc (Array sh b)
map Exp (Complex Float) -> Exp (Complex Double)
f2d Acc (Vector e)
Acc (Array DIM1 (Complex Float))
xs) ((Exp (Complex Float) -> Exp (Complex Double))
-> Acc (Array DIM1 (Complex Float))
-> Acc (Vector (Complex Double))
forall sh a b.
(Shape sh, Elt a, Elt b) =>
(Exp a -> Exp b) -> Acc (Array sh a) -> Acc (Array sh b)
map Exp (Complex Float) -> Exp (Complex Double)
f2d Acc (Vector e)
Acc (Array DIM1 (Complex Float))
ys)
    NumericR e (EltR e)
NumericRcomplex64 -> Exp (Complex Double)
-> Acc (Vector (Complex Double))
-> Acc (Vector (Complex Double))
-> Acc (Array DIM0 (Complex Double))
zsdot Exp e
Exp (Complex Double)
z Acc (Vector e)
Acc (Vector (Complex Double))
xs Acc (Vector e)
Acc (Vector (Complex Double))
ys
  where
    dsdot :: Exp Double -> Acc (Vector Double) -> Acc (Vector Double) -> Acc (Scalar Double)
    dsdot :: Exp Double
-> Acc (Vector Double)
-> Acc (Vector Double)
-> Acc (Array DIM0 Double)
dsdot Exp Double
z' Acc (Vector Double)
xs' Acc (Vector Double)
ys' = (Exp Double -> Exp Double -> Exp Double)
-> Exp Double -> Acc (Vector Double) -> Acc (Array DIM0 Double)
forall sh a.
(Shape sh, Elt a) =>
(Exp a -> Exp a -> Exp a)
-> Exp a -> Acc (Array (sh :. Int) a) -> Acc (Array sh a)
fold Exp Double -> Exp Double -> Exp Double
forall a. Num a => a -> a -> a
(+) Exp Double
z' ((Exp Double -> Exp Double -> Exp Double)
-> Acc (Vector Double)
-> Acc (Vector Double)
-> Acc (Vector Double)
forall sh a b c.
(Shape sh, Elt a, Elt b, Elt c) =>
(Exp a -> Exp b -> Exp c)
-> Acc (Array sh a) -> Acc (Array sh b) -> Acc (Array sh c)
zipWith Exp Double -> Exp Double -> Exp Double
forall a. Num a => a -> a -> a
(*) Acc (Vector Double)
xs' Acc (Vector Double)
ys')

    zsdot :: Exp (Complex Double) -> Acc (Vector (Complex Double)) -> Acc (Vector (Complex Double)) -> Acc (Scalar (Complex Double))
    zsdot :: Exp (Complex Double)
-> Acc (Vector (Complex Double))
-> Acc (Vector (Complex Double))
-> Acc (Array DIM0 (Complex Double))
zsdot Exp (Complex Double)
z' Acc (Vector (Complex Double))
xs' Acc (Vector (Complex Double))
ys' = (Exp (Complex Double)
 -> Exp (Complex Double) -> Exp (Complex Double))
-> Exp (Complex Double)
-> Acc (Vector (Complex Double))
-> Acc (Array DIM0 (Complex Double))
forall sh a.
(Shape sh, Elt a) =>
(Exp a -> Exp a -> Exp a)
-> Exp a -> Acc (Array (sh :. Int) a) -> Acc (Array sh a)
fold Exp (Complex Double)
-> Exp (Complex Double) -> Exp (Complex Double)
forall a. Num a => a -> a -> a
(+) Exp (Complex Double)
z' ((Exp (Complex Double)
 -> Exp (Complex Double) -> Exp (Complex Double))
-> Acc (Vector (Complex Double))
-> Acc (Vector (Complex Double))
-> Acc (Vector (Complex Double))
forall sh a b c.
(Shape sh, Elt a, Elt b, Elt c) =>
(Exp a -> Exp b -> Exp c)
-> Acc (Array sh a) -> Acc (Array sh b) -> Acc (Array sh c)
zipWith Exp (Complex Double)
-> Exp (Complex Double) -> Exp (Complex Double)
forall a. Num a => a -> a -> a
(*) Acc (Vector (Complex Double))
xs' Acc (Vector (Complex Double))
ys')

    f2d :: Exp (Complex Float) -> Exp (Complex Double)
    f2d :: Exp (Complex Float) -> Exp (Complex Double)
f2d Exp (Complex Float)
c = Complex (Exp Double) -> Exp (Plain (Complex (Exp Double)))
forall (c :: * -> *) e. Lift c e => e -> c (Plain e)
lift (Exp Float -> Exp Double
forall a b. (ToFloating a b, Num a, Floating b) => Exp a -> Exp b
toFloating (Exp (Complex Float) -> Exp Float
forall a. Elt a => Exp (Complex a) -> Exp a
real Exp (Complex Float)
c) Exp Double -> Exp Double -> Complex (Exp Double)
forall a. a -> a -> Complex a
:+ Exp Float -> Exp Double
forall a b. (ToFloating a b, Num a, Floating b) => Exp a -> Exp b
toFloating (Exp (Complex Float) -> Exp Float
forall a. Elt a => Exp (Complex a) -> Exp a
imag Exp (Complex Float)
c))

    d2f :: Exp (Complex Double) -> Exp (Complex Float)
    d2f :: Exp (Complex Double) -> Exp (Complex Float)
d2f Exp (Complex Double)
c = Complex (Exp Float) -> Exp (Plain (Complex (Exp Float)))
forall (c :: * -> *) e. Lift c e => e -> c (Plain e)
lift (Exp Double -> Exp Float
forall a b. (ToFloating a b, Num a, Floating b) => Exp a -> Exp b
toFloating (Exp (Complex Double) -> Exp Double
forall a. Elt a => Exp (Complex a) -> Exp a
real Exp (Complex Double)
c) Exp Float -> Exp Float -> Complex (Exp Float)
forall a. a -> a -> Complex a
:+ Exp Double -> Exp Float
forall a b. (ToFloating a b, Num a, Floating b) => Exp a -> Exp b
toFloating (Exp (Complex Double) -> Exp Double
forall a. Elt a => Exp (Complex a) -> Exp a
imag Exp (Complex Double)
c))


-- | Computes a vector-vector dot product
--
-- \[
-- res = \sum_i x_i * y_i
-- \]
--
-- <https://software.intel.com/en-us/mkl-developer-reference-c-cblas-dotu>
--
dotu :: Numeric e => Acc (Vector e) -> Acc (Vector e) -> Acc (Scalar e)
dotu :: Acc (Vector e) -> Acc (Vector e) -> Acc (Scalar e)
dotu Acc (Vector e)
xs Acc (Vector e)
ys = (Exp e -> Exp e -> Exp e)
-> Exp e -> Acc (Vector e) -> Acc (Scalar e)
forall sh a.
(Shape sh, Elt a) =>
(Exp a -> Exp a -> Exp a)
-> Exp a -> Acc (Array (sh :. Int) a) -> Acc (Array sh a)
fold Exp e -> Exp e -> Exp e
forall a. Num a => a -> a -> a
(+) Exp e
0 ((Exp e -> Exp e -> Exp e)
-> Acc (Vector e) -> Acc (Vector e) -> Acc (Vector e)
forall sh a b c.
(Shape sh, Elt a, Elt b, Elt c) =>
(Exp a -> Exp b -> Exp c)
-> Acc (Array sh a) -> Acc (Array sh b) -> Acc (Array sh c)
zipWith Exp e -> Exp e -> Exp e
forall a. Num a => a -> a -> a
(*) Acc (Vector e)
xs Acc (Vector e)
ys)


-- | Computes a dot product of a conjugated vector with another vector
--
-- \[
-- res = \sum_i \mathrm{conj}(x_i) * y_i
-- \]
--
-- <https://software.intel.com/en-us/mkl-developer-reference-c-cblas-dotc>
--
dotc :: forall e. Numeric (Complex e)
     => Acc (Vector (Complex e))
     -> Acc (Vector (Complex e))
     -> Acc (Scalar (Complex e))
dotc :: Acc (Vector (Complex e))
-> Acc (Vector (Complex e)) -> Acc (Scalar (Complex e))
dotc Acc (Vector (Complex e))
xs Acc (Vector (Complex e))
ys =
  case Numeric (Complex e) => NumericR (Complex e) (EltR (Complex e))
forall a. Numeric a => NumericR a (EltR a)
numericR @(Complex e) of
    NumericR (Complex e) (EltR (Complex e))
NumericRcomplex32 -> Acc (Vector (Complex e))
-> Acc (Vector (Complex e)) -> Acc (Scalar (Complex e))
forall e.
Numeric e =>
Acc (Vector e) -> Acc (Vector e) -> Acc (Scalar e)
dotu ((Exp (Complex e) -> Exp (Complex e))
-> Acc (Vector (Complex e)) -> Acc (Vector (Complex e))
forall sh a b.
(Shape sh, Elt a, Elt b) =>
(Exp a -> Exp b) -> Acc (Array sh a) -> Acc (Array sh b)
map Exp (Complex e) -> Exp (Complex e)
forall a. Num a => Exp (Complex a) -> Exp (Complex a)
conjugate Acc (Vector (Complex e))
xs) Acc (Vector (Complex e))
ys
    NumericR (Complex e) (EltR (Complex e))
NumericRcomplex64 -> Acc (Vector (Complex e))
-> Acc (Vector (Complex e)) -> Acc (Scalar (Complex e))
forall e.
Numeric e =>
Acc (Vector e) -> Acc (Vector e) -> Acc (Scalar e)
dotu ((Exp (Complex e) -> Exp (Complex e))
-> Acc (Vector (Complex e)) -> Acc (Vector (Complex e))
forall sh a b.
(Shape sh, Elt a, Elt b) =>
(Exp a -> Exp b) -> Acc (Array sh a) -> Acc (Array sh b)
map Exp (Complex e) -> Exp (Complex e)
forall a. Num a => Exp (Complex a) -> Exp (Complex a)
conjugate Acc (Vector (Complex e))
xs) Acc (Vector (Complex e))
ys


-- | Computes the sum of magnitudes of the vector elements. For complex values,
-- this is given by \(\sum_i \|\mathrm{real}(x_i)\| + \|\mathrm{imag}(x_i)\|\).
--
-- <https://software.intel.com/en-us/mkl-developer-reference-c-cblas-asum>
--
asum :: forall e. Numeric e => Acc (Vector e) -> Acc (Scalar (NumericBaseT e))
asum :: Acc (Vector e) -> Acc (Scalar (NumericBaseT e))
asum =
  case Numeric e => NumericR e (EltR e)
forall a. Numeric a => NumericR a (EltR a)
numericR @e of
    NumericR e (EltR e)
NumericRfloat32   -> Acc (Vector e) -> Acc (Array DIM0 e)
forall sh e.
(Shape sh, Num e) =>
Acc (Array (sh :. Int) e) -> Acc (Array sh e)
sum (Acc (Vector e) -> Acc (Array DIM0 e))
-> (Acc (Vector e) -> Acc (Vector e))
-> Acc (Vector e)
-> Acc (Array DIM0 e)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Exp e -> Exp e) -> Acc (Vector e) -> Acc (Vector e)
forall sh a b.
(Shape sh, Elt a, Elt b) =>
(Exp a -> Exp b) -> Acc (Array sh a) -> Acc (Array sh b)
map Exp e -> Exp e
forall a. Num a => a -> a
abs
    NumericR e (EltR e)
NumericRfloat64   -> Acc (Vector e) -> Acc (Array DIM0 e)
forall sh e.
(Shape sh, Num e) =>
Acc (Array (sh :. Int) e) -> Acc (Array sh e)
sum (Acc (Vector e) -> Acc (Array DIM0 e))
-> (Acc (Vector e) -> Acc (Vector e))
-> Acc (Vector e)
-> Acc (Array DIM0 e)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Exp e -> Exp e) -> Acc (Vector e) -> Acc (Vector e)
forall sh a b.
(Shape sh, Elt a, Elt b) =>
(Exp a -> Exp b) -> Acc (Array sh a) -> Acc (Array sh b)
map Exp e -> Exp e
forall a. Num a => a -> a
abs
    NumericR e (EltR e)
NumericRcomplex32 -> Acc (Array DIM1 Float) -> Acc (Array DIM0 Float)
forall sh e.
(Shape sh, Num e) =>
Acc (Array (sh :. Int) e) -> Acc (Array sh e)
sum (Acc (Array DIM1 Float) -> Acc (Array DIM0 Float))
-> (Acc (Array DIM1 (Complex Float)) -> Acc (Array DIM1 Float))
-> Acc (Array DIM1 (Complex Float))
-> Acc (Array DIM0 Float)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Exp (Complex Float) -> Exp Float)
-> Acc (Array DIM1 (Complex Float)) -> Acc (Array DIM1 Float)
forall sh a b.
(Shape sh, Elt a, Elt b) =>
(Exp a -> Exp b) -> Acc (Array sh a) -> Acc (Array sh b)
map Exp (Complex Float) -> Exp Float
forall a. (Num (Exp a), Elt a) => Exp (Complex a) -> Exp a
mag
    NumericR e (EltR e)
NumericRcomplex64 -> Acc (Vector Double) -> Acc (Array DIM0 Double)
forall sh e.
(Shape sh, Num e) =>
Acc (Array (sh :. Int) e) -> Acc (Array sh e)
sum (Acc (Vector Double) -> Acc (Array DIM0 Double))
-> (Acc (Vector (Complex Double)) -> Acc (Vector Double))
-> Acc (Vector (Complex Double))
-> Acc (Array DIM0 Double)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Exp (Complex Double) -> Exp Double)
-> Acc (Vector (Complex Double)) -> Acc (Vector Double)
forall sh a b.
(Shape sh, Elt a, Elt b) =>
(Exp a -> Exp b) -> Acc (Array sh a) -> Acc (Array sh b)
map Exp (Complex Double) -> Exp Double
forall a. (Num (Exp a), Elt a) => Exp (Complex a) -> Exp a
mag
  where
    mag :: Exp (Complex a) -> Exp a
mag Exp (Complex a)
c = Exp a -> Exp a
forall a. Num a => a -> a
abs (Exp (Complex a) -> Exp a
forall a. Elt a => Exp (Complex a) -> Exp a
real Exp (Complex a)
c) Exp a -> Exp a -> Exp a
forall a. Num a => a -> a -> a
+ Exp a -> Exp a
forall a. Num a => a -> a
abs (Exp (Complex a) -> Exp a
forall a. Elt a => Exp (Complex a) -> Exp a
imag Exp (Complex a)
c)


-- | Return the index of the element with the maximum absolute value.
--
-- <https://software.intel.com/en-us/mkl-developer-reference-c-cblas-i-amax>
--
amax :: forall e. Numeric e => Acc (Vector e) -> Acc (Scalar Int)
amax :: Acc (Vector e) -> Acc (Scalar Int)
amax =
  case Numeric e => NumericR e (EltR e)
forall a. Numeric a => NumericR a (EltR a)
numericR @e of
    NumericR e (EltR e)
NumericRfloat32   -> (Exp (DIM1, e) -> Exp Int)
-> Acc (Array DIM0 (DIM1, e)) -> Acc (Scalar Int)
forall sh a b.
(Shape sh, Elt a, Elt b) =>
(Exp a -> Exp b) -> Acc (Array sh a) -> Acc (Array sh b)
map (Exp DIM1 -> Exp Int
forall sh a. (Elt sh, Elt a) => Exp (sh :. a) -> Exp a
indexHead (Exp DIM1 -> Exp Int)
-> (Exp (DIM1, e) -> Exp DIM1) -> Exp (DIM1, e) -> Exp Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Exp (DIM1, e) -> Exp DIM1
forall a b. (Elt a, Elt b) => Exp (a, b) -> Exp a
fst) (Acc (Array DIM0 (DIM1, e)) -> Acc (Scalar Int))
-> (Acc (Vector e) -> Acc (Array DIM0 (DIM1, e)))
-> Acc (Vector e)
-> Acc (Scalar Int)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Exp (DIM1, e) -> Exp (DIM1, e) -> Exp (DIM1, e))
-> Acc (Array DIM1 (DIM1, e)) -> Acc (Array DIM0 (DIM1, e))
forall sh a.
(Shape sh, Elt a) =>
(Exp a -> Exp a -> Exp a)
-> Acc (Array (sh :. Int) a) -> Acc (Array sh a)
fold1 Exp (DIM1, e) -> Exp (DIM1, e) -> Exp (DIM1, e)
forall a a.
(Elt a, Ord a) =>
Exp (a, a) -> Exp (a, a) -> Exp (a, a)
cmp (Acc (Array DIM1 (DIM1, e)) -> Acc (Array DIM0 (DIM1, e)))
-> (Acc (Vector e) -> Acc (Array DIM1 (DIM1, e)))
-> Acc (Vector e)
-> Acc (Array DIM0 (DIM1, e))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Acc (Vector e) -> Acc (Array DIM1 (DIM1, e))
forall sh a.
(Shape sh, Elt a) =>
Acc (Array sh a) -> Acc (Array sh (sh, a))
indexed (Acc (Vector e) -> Acc (Array DIM1 (DIM1, e)))
-> (Acc (Vector e) -> Acc (Vector e))
-> Acc (Vector e)
-> Acc (Array DIM1 (DIM1, e))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Exp e -> Exp e) -> Acc (Vector e) -> Acc (Vector e)
forall sh a b.
(Shape sh, Elt a, Elt b) =>
(Exp a -> Exp b) -> Acc (Array sh a) -> Acc (Array sh b)
map Exp e -> Exp e
forall a. Num a => a -> a
abs
    NumericR e (EltR e)
NumericRfloat64   -> (Exp (DIM1, e) -> Exp Int)
-> Acc (Array DIM0 (DIM1, e)) -> Acc (Scalar Int)
forall sh a b.
(Shape sh, Elt a, Elt b) =>
(Exp a -> Exp b) -> Acc (Array sh a) -> Acc (Array sh b)
map (Exp DIM1 -> Exp Int
forall sh a. (Elt sh, Elt a) => Exp (sh :. a) -> Exp a
indexHead (Exp DIM1 -> Exp Int)
-> (Exp (DIM1, e) -> Exp DIM1) -> Exp (DIM1, e) -> Exp Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Exp (DIM1, e) -> Exp DIM1
forall a b. (Elt a, Elt b) => Exp (a, b) -> Exp a
fst) (Acc (Array DIM0 (DIM1, e)) -> Acc (Scalar Int))
-> (Acc (Vector e) -> Acc (Array DIM0 (DIM1, e)))
-> Acc (Vector e)
-> Acc (Scalar Int)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Exp (DIM1, e) -> Exp (DIM1, e) -> Exp (DIM1, e))
-> Acc (Array DIM1 (DIM1, e)) -> Acc (Array DIM0 (DIM1, e))
forall sh a.
(Shape sh, Elt a) =>
(Exp a -> Exp a -> Exp a)
-> Acc (Array (sh :. Int) a) -> Acc (Array sh a)
fold1 Exp (DIM1, e) -> Exp (DIM1, e) -> Exp (DIM1, e)
forall a a.
(Elt a, Ord a) =>
Exp (a, a) -> Exp (a, a) -> Exp (a, a)
cmp (Acc (Array DIM1 (DIM1, e)) -> Acc (Array DIM0 (DIM1, e)))
-> (Acc (Vector e) -> Acc (Array DIM1 (DIM1, e)))
-> Acc (Vector e)
-> Acc (Array DIM0 (DIM1, e))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Acc (Vector e) -> Acc (Array DIM1 (DIM1, e))
forall sh a.
(Shape sh, Elt a) =>
Acc (Array sh a) -> Acc (Array sh (sh, a))
indexed (Acc (Vector e) -> Acc (Array DIM1 (DIM1, e)))
-> (Acc (Vector e) -> Acc (Vector e))
-> Acc (Vector e)
-> Acc (Array DIM1 (DIM1, e))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Exp e -> Exp e) -> Acc (Vector e) -> Acc (Vector e)
forall sh a b.
(Shape sh, Elt a, Elt b) =>
(Exp a -> Exp b) -> Acc (Array sh a) -> Acc (Array sh b)
map Exp e -> Exp e
forall a. Num a => a -> a
abs
    NumericR e (EltR e)
NumericRcomplex32 -> (Exp (DIM1, Float) -> Exp Int)
-> Acc (Array DIM0 (DIM1, Float)) -> Acc (Scalar Int)
forall sh a b.
(Shape sh, Elt a, Elt b) =>
(Exp a -> Exp b) -> Acc (Array sh a) -> Acc (Array sh b)
map (Exp DIM1 -> Exp Int
forall sh a. (Elt sh, Elt a) => Exp (sh :. a) -> Exp a
indexHead (Exp DIM1 -> Exp Int)
-> (Exp (DIM1, Float) -> Exp DIM1) -> Exp (DIM1, Float) -> Exp Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Exp (DIM1, Float) -> Exp DIM1
forall a b. (Elt a, Elt b) => Exp (a, b) -> Exp a
fst) (Acc (Array DIM0 (DIM1, Float)) -> Acc (Scalar Int))
-> (Acc (Array DIM1 (Complex Float))
    -> Acc (Array DIM0 (DIM1, Float)))
-> Acc (Array DIM1 (Complex Float))
-> Acc (Scalar Int)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Exp (DIM1, Float) -> Exp (DIM1, Float) -> Exp (DIM1, Float))
-> Acc (Array DIM1 (DIM1, Float)) -> Acc (Array DIM0 (DIM1, Float))
forall sh a.
(Shape sh, Elt a) =>
(Exp a -> Exp a -> Exp a)
-> Acc (Array (sh :. Int) a) -> Acc (Array sh a)
fold1 Exp (DIM1, Float) -> Exp (DIM1, Float) -> Exp (DIM1, Float)
forall a a.
(Elt a, Ord a) =>
Exp (a, a) -> Exp (a, a) -> Exp (a, a)
cmp (Acc (Array DIM1 (DIM1, Float)) -> Acc (Array DIM0 (DIM1, Float)))
-> (Acc (Array DIM1 (Complex Float))
    -> Acc (Array DIM1 (DIM1, Float)))
-> Acc (Array DIM1 (Complex Float))
-> Acc (Array DIM0 (DIM1, Float))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Acc (Array DIM1 Float) -> Acc (Array DIM1 (DIM1, Float))
forall sh a.
(Shape sh, Elt a) =>
Acc (Array sh a) -> Acc (Array sh (sh, a))
indexed (Acc (Array DIM1 Float) -> Acc (Array DIM1 (DIM1, Float)))
-> (Acc (Array DIM1 (Complex Float)) -> Acc (Array DIM1 Float))
-> Acc (Array DIM1 (Complex Float))
-> Acc (Array DIM1 (DIM1, Float))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Exp (Complex Float) -> Exp Float)
-> Acc (Array DIM1 (Complex Float)) -> Acc (Array DIM1 Float)
forall sh a b.
(Shape sh, Elt a, Elt b) =>
(Exp a -> Exp b) -> Acc (Array sh a) -> Acc (Array sh b)
map Exp (Complex Float) -> Exp Float
forall a. (Num (Exp a), Elt a) => Exp (Complex a) -> Exp a
mag
    NumericR e (EltR e)
NumericRcomplex64 -> (Exp (DIM1, Double) -> Exp Int)
-> Acc (Array DIM0 (DIM1, Double)) -> Acc (Scalar Int)
forall sh a b.
(Shape sh, Elt a, Elt b) =>
(Exp a -> Exp b) -> Acc (Array sh a) -> Acc (Array sh b)
map (Exp DIM1 -> Exp Int
forall sh a. (Elt sh, Elt a) => Exp (sh :. a) -> Exp a
indexHead (Exp DIM1 -> Exp Int)
-> (Exp (DIM1, Double) -> Exp DIM1)
-> Exp (DIM1, Double)
-> Exp Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Exp (DIM1, Double) -> Exp DIM1
forall a b. (Elt a, Elt b) => Exp (a, b) -> Exp a
fst) (Acc (Array DIM0 (DIM1, Double)) -> Acc (Scalar Int))
-> (Acc (Vector (Complex Double))
    -> Acc (Array DIM0 (DIM1, Double)))
-> Acc (Vector (Complex Double))
-> Acc (Scalar Int)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Exp (DIM1, Double) -> Exp (DIM1, Double) -> Exp (DIM1, Double))
-> Acc (Array DIM1 (DIM1, Double))
-> Acc (Array DIM0 (DIM1, Double))
forall sh a.
(Shape sh, Elt a) =>
(Exp a -> Exp a -> Exp a)
-> Acc (Array (sh :. Int) a) -> Acc (Array sh a)
fold1 Exp (DIM1, Double) -> Exp (DIM1, Double) -> Exp (DIM1, Double)
forall a a.
(Elt a, Ord a) =>
Exp (a, a) -> Exp (a, a) -> Exp (a, a)
cmp (Acc (Array DIM1 (DIM1, Double))
 -> Acc (Array DIM0 (DIM1, Double)))
-> (Acc (Vector (Complex Double))
    -> Acc (Array DIM1 (DIM1, Double)))
-> Acc (Vector (Complex Double))
-> Acc (Array DIM0 (DIM1, Double))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Acc (Vector Double) -> Acc (Array DIM1 (DIM1, Double))
forall sh a.
(Shape sh, Elt a) =>
Acc (Array sh a) -> Acc (Array sh (sh, a))
indexed (Acc (Vector Double) -> Acc (Array DIM1 (DIM1, Double)))
-> (Acc (Vector (Complex Double)) -> Acc (Vector Double))
-> Acc (Vector (Complex Double))
-> Acc (Array DIM1 (DIM1, Double))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Exp (Complex Double) -> Exp Double)
-> Acc (Vector (Complex Double)) -> Acc (Vector Double)
forall sh a b.
(Shape sh, Elt a, Elt b) =>
(Exp a -> Exp b) -> Acc (Array sh a) -> Acc (Array sh b)
map Exp (Complex Double) -> Exp Double
forall a. (Num (Exp a), Elt a) => Exp (Complex a) -> Exp a
mag
  where
    cmp :: Exp (a, a) -> Exp (a, a) -> Exp (a, a)
cmp Exp (a, a)
ix Exp (a, a)
iy = Exp (a, a) -> Exp a
forall a b. (Elt a, Elt b) => Exp (a, b) -> Exp b
snd Exp (a, a)
ix Exp a -> Exp a -> Exp Bool
forall a. Ord a => Exp a -> Exp a -> Exp Bool
> Exp (a, a) -> Exp a
forall a b. (Elt a, Elt b) => Exp (a, b) -> Exp b
snd Exp (a, a)
iy Exp Bool -> (Exp (a, a), Exp (a, a)) -> Exp (a, a)
forall t. Elt t => Exp Bool -> (Exp t, Exp t) -> Exp t
? ( Exp (a, a)
ix, Exp (a, a)
iy )
    mag :: Exp (Complex a) -> Exp a
mag Exp (Complex a)
c     = Exp a -> Exp a
forall a. Num a => a -> a
abs (Exp (Complex a) -> Exp a
forall a. Elt a => Exp (Complex a) -> Exp a
real Exp (Complex a)
c) Exp a -> Exp a -> Exp a
forall a. Num a => a -> a -> a
+ Exp a -> Exp a
forall a. Num a => a -> a
abs (Exp (Complex a) -> Exp a
forall a. Elt a => Exp (Complex a) -> Exp a
imag Exp (Complex a)
c)

-- | Return the index of the element with the minimum absolute value.
--
-- <https://software.intel.com/en-us/mkl-developer-reference-c-cblas-i-amin>
--
amin :: forall e. Numeric e => Acc (Vector e) -> Acc (Scalar Int)
amin :: Acc (Vector e) -> Acc (Scalar Int)
amin =
  case Numeric e => NumericR e (EltR e)
forall a. Numeric a => NumericR a (EltR a)
numericR @e of
    NumericR e (EltR e)
NumericRfloat32   -> (Exp (DIM1, e) -> Exp Int)
-> Acc (Array DIM0 (DIM1, e)) -> Acc (Scalar Int)
forall sh a b.
(Shape sh, Elt a, Elt b) =>
(Exp a -> Exp b) -> Acc (Array sh a) -> Acc (Array sh b)
map (Exp DIM1 -> Exp Int
forall sh a. (Elt sh, Elt a) => Exp (sh :. a) -> Exp a
indexHead (Exp DIM1 -> Exp Int)
-> (Exp (DIM1, e) -> Exp DIM1) -> Exp (DIM1, e) -> Exp Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Exp (DIM1, e) -> Exp DIM1
forall a b. (Elt a, Elt b) => Exp (a, b) -> Exp a
fst) (Acc (Array DIM0 (DIM1, e)) -> Acc (Scalar Int))
-> (Acc (Vector e) -> Acc (Array DIM0 (DIM1, e)))
-> Acc (Vector e)
-> Acc (Scalar Int)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Exp (DIM1, e) -> Exp (DIM1, e) -> Exp (DIM1, e))
-> Acc (Array DIM1 (DIM1, e)) -> Acc (Array DIM0 (DIM1, e))
forall sh a.
(Shape sh, Elt a) =>
(Exp a -> Exp a -> Exp a)
-> Acc (Array (sh :. Int) a) -> Acc (Array sh a)
fold1 Exp (DIM1, e) -> Exp (DIM1, e) -> Exp (DIM1, e)
forall a a.
(Elt a, Ord a) =>
Exp (a, a) -> Exp (a, a) -> Exp (a, a)
cmp (Acc (Array DIM1 (DIM1, e)) -> Acc (Array DIM0 (DIM1, e)))
-> (Acc (Vector e) -> Acc (Array DIM1 (DIM1, e)))
-> Acc (Vector e)
-> Acc (Array DIM0 (DIM1, e))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Acc (Vector e) -> Acc (Array DIM1 (DIM1, e))
forall sh a.
(Shape sh, Elt a) =>
Acc (Array sh a) -> Acc (Array sh (sh, a))
indexed (Acc (Vector e) -> Acc (Array DIM1 (DIM1, e)))
-> (Acc (Vector e) -> Acc (Vector e))
-> Acc (Vector e)
-> Acc (Array DIM1 (DIM1, e))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Exp e -> Exp e) -> Acc (Vector e) -> Acc (Vector e)
forall sh a b.
(Shape sh, Elt a, Elt b) =>
(Exp a -> Exp b) -> Acc (Array sh a) -> Acc (Array sh b)
map Exp e -> Exp e
forall a. Num a => a -> a
abs
    NumericR e (EltR e)
NumericRfloat64   -> (Exp (DIM1, e) -> Exp Int)
-> Acc (Array DIM0 (DIM1, e)) -> Acc (Scalar Int)
forall sh a b.
(Shape sh, Elt a, Elt b) =>
(Exp a -> Exp b) -> Acc (Array sh a) -> Acc (Array sh b)
map (Exp DIM1 -> Exp Int
forall sh a. (Elt sh, Elt a) => Exp (sh :. a) -> Exp a
indexHead (Exp DIM1 -> Exp Int)
-> (Exp (DIM1, e) -> Exp DIM1) -> Exp (DIM1, e) -> Exp Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Exp (DIM1, e) -> Exp DIM1
forall a b. (Elt a, Elt b) => Exp (a, b) -> Exp a
fst) (Acc (Array DIM0 (DIM1, e)) -> Acc (Scalar Int))
-> (Acc (Vector e) -> Acc (Array DIM0 (DIM1, e)))
-> Acc (Vector e)
-> Acc (Scalar Int)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Exp (DIM1, e) -> Exp (DIM1, e) -> Exp (DIM1, e))
-> Acc (Array DIM1 (DIM1, e)) -> Acc (Array DIM0 (DIM1, e))
forall sh a.
(Shape sh, Elt a) =>
(Exp a -> Exp a -> Exp a)
-> Acc (Array (sh :. Int) a) -> Acc (Array sh a)
fold1 Exp (DIM1, e) -> Exp (DIM1, e) -> Exp (DIM1, e)
forall a a.
(Elt a, Ord a) =>
Exp (a, a) -> Exp (a, a) -> Exp (a, a)
cmp (Acc (Array DIM1 (DIM1, e)) -> Acc (Array DIM0 (DIM1, e)))
-> (Acc (Vector e) -> Acc (Array DIM1 (DIM1, e)))
-> Acc (Vector e)
-> Acc (Array DIM0 (DIM1, e))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Acc (Vector e) -> Acc (Array DIM1 (DIM1, e))
forall sh a.
(Shape sh, Elt a) =>
Acc (Array sh a) -> Acc (Array sh (sh, a))
indexed (Acc (Vector e) -> Acc (Array DIM1 (DIM1, e)))
-> (Acc (Vector e) -> Acc (Vector e))
-> Acc (Vector e)
-> Acc (Array DIM1 (DIM1, e))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Exp e -> Exp e) -> Acc (Vector e) -> Acc (Vector e)
forall sh a b.
(Shape sh, Elt a, Elt b) =>
(Exp a -> Exp b) -> Acc (Array sh a) -> Acc (Array sh b)
map Exp e -> Exp e
forall a. Num a => a -> a
abs
    NumericR e (EltR e)
NumericRcomplex32 -> (Exp (DIM1, Float) -> Exp Int)
-> Acc (Array DIM0 (DIM1, Float)) -> Acc (Scalar Int)
forall sh a b.
(Shape sh, Elt a, Elt b) =>
(Exp a -> Exp b) -> Acc (Array sh a) -> Acc (Array sh b)
map (Exp DIM1 -> Exp Int
forall sh a. (Elt sh, Elt a) => Exp (sh :. a) -> Exp a
indexHead (Exp DIM1 -> Exp Int)
-> (Exp (DIM1, Float) -> Exp DIM1) -> Exp (DIM1, Float) -> Exp Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Exp (DIM1, Float) -> Exp DIM1
forall a b. (Elt a, Elt b) => Exp (a, b) -> Exp a
fst) (Acc (Array DIM0 (DIM1, Float)) -> Acc (Scalar Int))
-> (Acc (Array DIM1 (Complex Float))
    -> Acc (Array DIM0 (DIM1, Float)))
-> Acc (Array DIM1 (Complex Float))
-> Acc (Scalar Int)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Exp (DIM1, Float) -> Exp (DIM1, Float) -> Exp (DIM1, Float))
-> Acc (Array DIM1 (DIM1, Float)) -> Acc (Array DIM0 (DIM1, Float))
forall sh a.
(Shape sh, Elt a) =>
(Exp a -> Exp a -> Exp a)
-> Acc (Array (sh :. Int) a) -> Acc (Array sh a)
fold1 Exp (DIM1, Float) -> Exp (DIM1, Float) -> Exp (DIM1, Float)
forall a a.
(Elt a, Ord a) =>
Exp (a, a) -> Exp (a, a) -> Exp (a, a)
cmp (Acc (Array DIM1 (DIM1, Float)) -> Acc (Array DIM0 (DIM1, Float)))
-> (Acc (Array DIM1 (Complex Float))
    -> Acc (Array DIM1 (DIM1, Float)))
-> Acc (Array DIM1 (Complex Float))
-> Acc (Array DIM0 (DIM1, Float))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Acc (Array DIM1 Float) -> Acc (Array DIM1 (DIM1, Float))
forall sh a.
(Shape sh, Elt a) =>
Acc (Array sh a) -> Acc (Array sh (sh, a))
indexed (Acc (Array DIM1 Float) -> Acc (Array DIM1 (DIM1, Float)))
-> (Acc (Array DIM1 (Complex Float)) -> Acc (Array DIM1 Float))
-> Acc (Array DIM1 (Complex Float))
-> Acc (Array DIM1 (DIM1, Float))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Exp (Complex Float) -> Exp Float)
-> Acc (Array DIM1 (Complex Float)) -> Acc (Array DIM1 Float)
forall sh a b.
(Shape sh, Elt a, Elt b) =>
(Exp a -> Exp b) -> Acc (Array sh a) -> Acc (Array sh b)
map Exp (Complex Float) -> Exp Float
forall a. (Num (Exp a), Elt a) => Exp (Complex a) -> Exp a
mag
    NumericR e (EltR e)
NumericRcomplex64 -> (Exp (DIM1, Double) -> Exp Int)
-> Acc (Array DIM0 (DIM1, Double)) -> Acc (Scalar Int)
forall sh a b.
(Shape sh, Elt a, Elt b) =>
(Exp a -> Exp b) -> Acc (Array sh a) -> Acc (Array sh b)
map (Exp DIM1 -> Exp Int
forall sh a. (Elt sh, Elt a) => Exp (sh :. a) -> Exp a
indexHead (Exp DIM1 -> Exp Int)
-> (Exp (DIM1, Double) -> Exp DIM1)
-> Exp (DIM1, Double)
-> Exp Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Exp (DIM1, Double) -> Exp DIM1
forall a b. (Elt a, Elt b) => Exp (a, b) -> Exp a
fst) (Acc (Array DIM0 (DIM1, Double)) -> Acc (Scalar Int))
-> (Acc (Vector (Complex Double))
    -> Acc (Array DIM0 (DIM1, Double)))
-> Acc (Vector (Complex Double))
-> Acc (Scalar Int)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Exp (DIM1, Double) -> Exp (DIM1, Double) -> Exp (DIM1, Double))
-> Acc (Array DIM1 (DIM1, Double))
-> Acc (Array DIM0 (DIM1, Double))
forall sh a.
(Shape sh, Elt a) =>
(Exp a -> Exp a -> Exp a)
-> Acc (Array (sh :. Int) a) -> Acc (Array sh a)
fold1 Exp (DIM1, Double) -> Exp (DIM1, Double) -> Exp (DIM1, Double)
forall a a.
(Elt a, Ord a) =>
Exp (a, a) -> Exp (a, a) -> Exp (a, a)
cmp (Acc (Array DIM1 (DIM1, Double))
 -> Acc (Array DIM0 (DIM1, Double)))
-> (Acc (Vector (Complex Double))
    -> Acc (Array DIM1 (DIM1, Double)))
-> Acc (Vector (Complex Double))
-> Acc (Array DIM0 (DIM1, Double))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Acc (Vector Double) -> Acc (Array DIM1 (DIM1, Double))
forall sh a.
(Shape sh, Elt a) =>
Acc (Array sh a) -> Acc (Array sh (sh, a))
indexed (Acc (Vector Double) -> Acc (Array DIM1 (DIM1, Double)))
-> (Acc (Vector (Complex Double)) -> Acc (Vector Double))
-> Acc (Vector (Complex Double))
-> Acc (Array DIM1 (DIM1, Double))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Exp (Complex Double) -> Exp Double)
-> Acc (Vector (Complex Double)) -> Acc (Vector Double)
forall sh a b.
(Shape sh, Elt a, Elt b) =>
(Exp a -> Exp b) -> Acc (Array sh a) -> Acc (Array sh b)
map Exp (Complex Double) -> Exp Double
forall a. (Num (Exp a), Elt a) => Exp (Complex a) -> Exp a
mag
  where
    cmp :: Exp (a, a) -> Exp (a, a) -> Exp (a, a)
cmp Exp (a, a)
ix Exp (a, a)
iy = Exp (a, a) -> Exp a
forall a b. (Elt a, Elt b) => Exp (a, b) -> Exp b
snd Exp (a, a)
ix Exp a -> Exp a -> Exp Bool
forall a. Ord a => Exp a -> Exp a -> Exp Bool
< Exp (a, a) -> Exp a
forall a b. (Elt a, Elt b) => Exp (a, b) -> Exp b
snd Exp (a, a)
iy Exp Bool -> (Exp (a, a), Exp (a, a)) -> Exp (a, a)
forall t. Elt t => Exp Bool -> (Exp t, Exp t) -> Exp t
? ( Exp (a, a)
ix, Exp (a, a)
iy )
    mag :: Exp (Complex a) -> Exp a
mag Exp (Complex a)
c     = Exp a -> Exp a
forall a. Num a => a -> a
abs (Exp (Complex a) -> Exp a
forall a. Elt a => Exp (Complex a) -> Exp a
real Exp (Complex a)
c) Exp a -> Exp a -> Exp a
forall a. Num a => a -> a -> a
+ Exp a -> Exp a
forall a. Num a => a -> a
abs (Exp (Complex a) -> Exp a
forall a. Elt a => Exp (Complex a) -> Exp a
imag Exp (Complex a)
c)