#include "fusion-phases.h"
module Data.Array.Parallel.Unlifted.Parallel.Sums
( andUP, orUP
, allUP, anyUP
, sumUP, productUP
, maximumUP, maximumByUP
, maximumIndexByUP)
where
import Data.Array.Parallel.Unlifted.Sequential.Vector as Seq
import Data.Array.Parallel.Unlifted.Distributed
import Data.Array.Parallel.Unlifted.Parallel.Combinators
import Data.Array.Parallel.Unlifted.Parallel.Basics (indexedUP)
andUP :: Vector Bool -> Bool
andUP = foldUP (&&) True
orUP :: Vector Bool -> Bool
orUP = foldUP (||) False
allUP :: Unbox e => (e -> Bool) -> Vector e -> Bool
allUP p = andUP . mapUP p
anyUP :: Unbox e => (e -> Bool) -> Vector e -> Bool
anyUP p = orUP . mapUP p
sumUP :: (Unbox a, DT a, Num a) => Vector a -> a
sumUP = foldUP (+) 0
productUP :: (DT e, Num e, Unbox e) => Vector e -> e
productUP = foldUP (*) 1
maximumUP :: (DT e, Ord e, Unbox e) => Vector e -> e
maximumUP = fold1UP max
maximumByUP :: (DT e, Unbox e) => (e -> e -> Ordering) -> Vector e -> e
maximumByUP
= fold1UP . maxBy
where
maxBy compare' x y
= case x `compare'` y of
LT -> y
_ -> x
maximumIndexByUP
:: (DT e, Unbox e) => (e -> e -> Ordering) -> Vector e -> Int
maximumIndexByUP cmp
= fst . maximumByUP cmp' . indexedUP
where
cmp' (_,x) (_,y) = cmp x y