{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
module LLVM.DSL.Expression.Vector where

import qualified LLVM.DSL.Expression as Expr
import LLVM.DSL.Expression (Exp)

import qualified LLVM.Extra.Multi.Value.Vector as MultiValueVec
import qualified LLVM.Extra.Multi.Value as MultiValue
import qualified LLVM.Extra.Multi.Vector.Instance as MultiVectorInst
import qualified LLVM.Extra.Multi.Vector as MultiVector
import qualified LLVM.Extra.Arithmetic as A
import qualified LLVM.Core as LLVM

import qualified Data.Tuple.HT as Tuple

import Prelude hiding (replicate, take, zip, fst, snd, min, max)


cons ::
   (LLVM.Positive n, MultiVector.C a) =>
   LLVM.Vector n a -> Exp (LLVM.Vector n a)
cons :: forall n a. (Positive n, C a) => Vector n a -> Exp (Vector n a)
cons = T (Vector n a) -> Exp (Vector n a)
forall a. T a -> Exp a
forall (val :: * -> *) a. Value val => T a -> val a
Expr.lift0 (T (Vector n a) -> Exp (Vector n a))
-> (Vector n a -> T (Vector n a)) -> Vector n a -> Exp (Vector n a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector n a -> T (Vector n a)
forall n a. (Positive n, C a) => Vector n a -> MVVector n a
MultiValueVec.cons

fst ::
   (LLVM.Positive n, MultiVector.C a, MultiVector.C b) =>
   Exp (LLVM.Vector n (a,b)) -> Exp (LLVM.Vector n a)
fst :: forall n a b.
(Positive n, C a, C b) =>
Exp (Vector n (a, b)) -> Exp (Vector n a)
fst = (T (Vector n (a, b)) -> T (Vector n a))
-> Exp (Vector n (a, b)) -> Exp (Vector n a)
forall a b. (T a -> T b) -> Exp a -> Exp b
forall (val :: * -> *) a b.
Value val =>
(T a -> T b) -> val a -> val b
Expr.lift1 T (Vector n (a, b)) -> T (Vector n a)
forall n a b. MVVector n (a, b) -> MVVector n a
MultiValueVec.fst

snd ::
   (LLVM.Positive n, MultiVector.C a, MultiVector.C b) =>
   Exp (LLVM.Vector n (a,b)) -> Exp (LLVM.Vector n b)
snd :: forall n a b.
(Positive n, C a, C b) =>
Exp (Vector n (a, b)) -> Exp (Vector n b)
snd = (T (Vector n (a, b)) -> T (Vector n b))
-> Exp (Vector n (a, b)) -> Exp (Vector n b)
forall a b. (T a -> T b) -> Exp a -> Exp b
forall (val :: * -> *) a b.
Value val =>
(T a -> T b) -> val a -> val b
Expr.lift1 T (Vector n (a, b)) -> T (Vector n b)
forall n a b. MVVector n (a, b) -> MVVector n b
MultiValueVec.snd

swap ::
   (LLVM.Positive n, MultiVector.C a, MultiVector.C b) =>
   Exp (LLVM.Vector n (a,b)) -> Exp (LLVM.Vector n (b,a))
swap :: forall n a b.
(Positive n, C a, C b) =>
Exp (Vector n (a, b)) -> Exp (Vector n (b, a))
swap = (T (Vector n (a, b)) -> T (Vector n (b, a)))
-> Exp (Vector n (a, b)) -> Exp (Vector n (b, a))
forall a b. (T a -> T b) -> Exp a -> Exp b
forall (val :: * -> *) a b.
Value val =>
(T a -> T b) -> val a -> val b
Expr.lift1 T (Vector n (a, b)) -> T (Vector n (b, a))
forall n a b. MVVector n (a, b) -> MVVector n (b, a)
MultiValueVec.swap

mapFst ::
   (Exp (LLVM.Vector n a0) -> Exp (LLVM.Vector n a1)) ->
   Exp (LLVM.Vector n (a0,b)) -> Exp (LLVM.Vector n (a1,b))
mapFst :: forall n a0 a1 b.
(Exp (Vector n a0) -> Exp (Vector n a1))
-> Exp (Vector n (a0, b)) -> Exp (Vector n (a1, b))
mapFst Exp (Vector n a0) -> Exp (Vector n a1)
f =
   (forall r.
 Repr (Vector n (a0, b))
 -> CodeGenFunction r (Repr (Vector n (a1, b))))
-> Exp (Vector n (a0, b)) -> Exp (Vector n (a1, b))
forall a b.
(forall r. Repr a -> CodeGenFunction r (Repr b)) -> Exp a -> Exp b
Expr.liftReprM
      (\(Repr n a0
a0,Repr n b
b) -> do
         MultiValue.Cons Repr (Vector n a1)
a1 <- (Exp (Vector n a0) -> Exp (Vector n a1))
-> T (Vector n a0) -> CodeGenFunction r (T (Vector n a1))
forall ae am be bm r.
(Aggregate ae am, Aggregate be bm) =>
(ae -> be) -> am -> CodeGenFunction r bm
Expr.unliftM1 Exp (Vector n a0) -> Exp (Vector n a1)
f (T (Vector n a0) -> CodeGenFunction r (T (Vector n a1)))
-> T (Vector n a0) -> CodeGenFunction r (T (Vector n a1))
forall a b. (a -> b) -> a -> b
$ Repr (Vector n a0) -> T (Vector n a0)
forall a. Repr a -> T a
MultiValue.Cons Repr (Vector n a0)
Repr n a0
a0
         (Repr n a1, Repr n b) -> CodeGenFunction r (Repr n a1, Repr n b)
forall a. a -> CodeGenFunction r a
forall (m :: * -> *) a. Monad m => a -> m a
return (Repr (Vector n a1)
Repr n a1
a1,Repr n b
b))

mapSnd ::
   (Exp (LLVM.Vector n b0) -> Exp (LLVM.Vector n b1)) ->
   Exp (LLVM.Vector n (a,b0)) -> Exp (LLVM.Vector n (a,b1))
mapSnd :: forall n b0 b1 a.
(Exp (Vector n b0) -> Exp (Vector n b1))
-> Exp (Vector n (a, b0)) -> Exp (Vector n (a, b1))
mapSnd Exp (Vector n b0) -> Exp (Vector n b1)
f =
   (forall r.
 Repr (Vector n (a, b0))
 -> CodeGenFunction r (Repr (Vector n (a, b1))))
-> Exp (Vector n (a, b0)) -> Exp (Vector n (a, b1))
forall a b.
(forall r. Repr a -> CodeGenFunction r (Repr b)) -> Exp a -> Exp b
Expr.liftReprM
      (\(Repr n a
a,Repr n b0
b0) -> do
         MultiValue.Cons Repr (Vector n b1)
b1 <- (Exp (Vector n b0) -> Exp (Vector n b1))
-> T (Vector n b0) -> CodeGenFunction r (T (Vector n b1))
forall ae am be bm r.
(Aggregate ae am, Aggregate be bm) =>
(ae -> be) -> am -> CodeGenFunction r bm
Expr.unliftM1 Exp (Vector n b0) -> Exp (Vector n b1)
f (T (Vector n b0) -> CodeGenFunction r (T (Vector n b1)))
-> T (Vector n b0) -> CodeGenFunction r (T (Vector n b1))
forall a b. (a -> b) -> a -> b
$ Repr (Vector n b0) -> T (Vector n b0)
forall a. Repr a -> T a
MultiValue.Cons Repr (Vector n b0)
Repr n b0
b0
         (Repr n a, Repr n b1) -> CodeGenFunction r (Repr n a, Repr n b1)
forall a. a -> CodeGenFunction r a
forall (m :: * -> *) a. Monad m => a -> m a
return (Repr n a
a,Repr (Vector n b1)
Repr n b1
b1))


fst3 ::
   (LLVM.Positive n, MultiVector.C a, MultiVector.C b, MultiVector.C c) =>
   Exp (LLVM.Vector n (a,b,c)) -> Exp (LLVM.Vector n a)
fst3 :: forall n a b c.
(Positive n, C a, C b, C c) =>
Exp (Vector n (a, b, c)) -> Exp (Vector n a)
fst3 = (T (Vector n (a, b, c)) -> T (Vector n a))
-> Exp (Vector n (a, b, c)) -> Exp (Vector n a)
forall a b. (T a -> T b) -> Exp a -> Exp b
forall (val :: * -> *) a b.
Value val =>
(T a -> T b) -> val a -> val b
Expr.lift1 T (Vector n (a, b, c)) -> T (Vector n a)
forall n a b c. MVVector n (a, b, c) -> MVVector n a
MultiValueVec.fst3

snd3 ::
   (LLVM.Positive n, MultiVector.C a, MultiVector.C b, MultiVector.C c) =>
   Exp (LLVM.Vector n (a,b,c)) -> Exp (LLVM.Vector n b)
snd3 :: forall n a b c.
(Positive n, C a, C b, C c) =>
Exp (Vector n (a, b, c)) -> Exp (Vector n b)
snd3 = (T (Vector n (a, b, c)) -> T (Vector n b))
-> Exp (Vector n (a, b, c)) -> Exp (Vector n b)
forall a b. (T a -> T b) -> Exp a -> Exp b
forall (val :: * -> *) a b.
Value val =>
(T a -> T b) -> val a -> val b
Expr.lift1 T (Vector n (a, b, c)) -> T (Vector n b)
forall n a b c. MVVector n (a, b, c) -> MVVector n b
MultiValueVec.snd3

thd3 ::
   (LLVM.Positive n, MultiVector.C a, MultiVector.C b, MultiVector.C c) =>
   Exp (LLVM.Vector n (a,b,c)) -> Exp (LLVM.Vector n c)
thd3 :: forall n a b c.
(Positive n, C a, C b, C c) =>
Exp (Vector n (a, b, c)) -> Exp (Vector n c)
thd3 = (T (Vector n (a, b, c)) -> T (Vector n c))
-> Exp (Vector n (a, b, c)) -> Exp (Vector n c)
forall a b. (T a -> T b) -> Exp a -> Exp b
forall (val :: * -> *) a b.
Value val =>
(T a -> T b) -> val a -> val b
Expr.lift1 T (Vector n (a, b, c)) -> T (Vector n c)
forall n a b c. MVVector n (a, b, c) -> MVVector n c
MultiValueVec.thd3


zip ::
   (LLVM.Positive n, MultiVector.C a, MultiVector.C b) =>
   Exp (LLVM.Vector n a) -> Exp (LLVM.Vector n b) ->
   Exp (LLVM.Vector n (a,b))
zip :: forall n a b.
(Positive n, C a, C b) =>
Exp (Vector n a) -> Exp (Vector n b) -> Exp (Vector n (a, b))
zip = (T (Vector n a) -> T (Vector n b) -> T (Vector n (a, b)))
-> Exp (Vector n a) -> Exp (Vector n b) -> Exp (Vector n (a, b))
forall a b c. (T a -> T b -> T c) -> Exp a -> Exp b -> Exp c
forall (val :: * -> *) a b c.
Value val =>
(T a -> T b -> T c) -> val a -> val b -> val c
Expr.lift2 T (Vector n a) -> T (Vector n b) -> T (Vector n (a, b))
forall n a b. MVVector n a -> MVVector n b -> MVVector n (a, b)
MultiValueVec.zip

zip3 ::
   (LLVM.Positive n, MultiVector.C a, MultiVector.C b, MultiVector.C c) =>
   Exp (LLVM.Vector n a) -> Exp (LLVM.Vector n b) -> Exp (LLVM.Vector n c) ->
   Exp (LLVM.Vector n (a,b,c))
zip3 :: forall n a b c.
(Positive n, C a, C b, C c) =>
Exp (Vector n a)
-> Exp (Vector n b) -> Exp (Vector n c) -> Exp (Vector n (a, b, c))
zip3 = (T (Vector n a)
 -> T (Vector n b) -> T (Vector n c) -> T (Vector n (a, b, c)))
-> Exp (Vector n a)
-> Exp (Vector n b)
-> Exp (Vector n c)
-> Exp (Vector n (a, b, c))
forall (val :: * -> *) a b c d.
Value val =>
(T a -> T b -> T c -> T d) -> val a -> val b -> val c -> val d
Expr.lift3 T (Vector n a)
-> T (Vector n b) -> T (Vector n c) -> T (Vector n (a, b, c))
forall n a b c.
MVVector n a
-> MVVector n b -> MVVector n c -> MVVector n (a, b, c)
MultiValueVec.zip3


replicate ::
   (LLVM.Positive n, MultiVector.C a) =>
   Exp a -> Exp (LLVM.Vector n a)
replicate :: forall n a. (Positive n, C a) => Exp a -> Exp (Vector n a)
replicate = (forall r. T a -> CodeGenFunction r (T (Vector n a)))
-> Exp a -> Exp (Vector n a)
forall ae am b.
Aggregate ae am =>
(forall r. am -> CodeGenFunction r (T b)) -> ae -> Exp b
Expr.liftM T a -> CodeGenFunction r (T (Vector n a))
forall r. T a -> CodeGenFunction r (T (Vector n a))
forall n a r.
(Positive n, C a) =>
T a -> CodeGenFunction r (MVVector n a)
MultiValueVec.replicate

iterate ::
   (LLVM.Positive n, MultiVector.C a) =>
   (Exp a -> Exp a) -> Exp a -> Exp (LLVM.Vector n a)
iterate :: forall n a.
(Positive n, C a) =>
(Exp a -> Exp a) -> Exp a -> Exp (Vector n a)
iterate Exp a -> Exp a
f = (forall r. T a -> CodeGenFunction r (T (Vector n a)))
-> Exp a -> Exp (Vector n a)
forall ae am b.
Aggregate ae am =>
(forall r. am -> CodeGenFunction r (T b)) -> ae -> Exp b
Expr.liftM ((T a -> CodeGenFunction r (T a))
-> T a -> CodeGenFunction r (T (Vector n a))
forall n a r.
(Positive n, C a) =>
(T a -> CodeGenFunction r (T a))
-> T a -> CodeGenFunction r (MVVector n a)
MultiValueVec.iterate ((Exp a -> Exp a) -> T a -> CodeGenFunction r (T a)
forall ae am be bm r.
(Aggregate ae am, Aggregate be bm) =>
(ae -> be) -> am -> CodeGenFunction r bm
Expr.unliftM1 Exp a -> Exp a
f))

take ::
   (LLVM.Positive n, LLVM.Positive m, MultiVector.Select a) =>
   Exp (LLVM.Vector n a) -> Exp (LLVM.Vector m a)
take :: forall n m a.
(Positive n, Positive m, Select a) =>
Exp (Vector n a) -> Exp (Vector m a)
take = (forall r. MVVector n a -> CodeGenFunction r (T (Vector m a)))
-> Exp (Vector n a) -> Exp (Vector m a)
forall ae am b.
Aggregate ae am =>
(forall r. am -> CodeGenFunction r (T b)) -> ae -> Exp b
Expr.liftM MVVector n a -> CodeGenFunction r (T (Vector m a))
forall r. MVVector n a -> CodeGenFunction r (T (Vector m a))
forall n m a r.
(Positive n, Positive m, C a) =>
MVVector n a -> CodeGenFunction r (MVVector m a)
MultiValueVec.take

takeRev ::
   (LLVM.Positive n, LLVM.Positive m, MultiVector.Select a) =>
   Exp (LLVM.Vector n a) -> Exp (LLVM.Vector m a)
takeRev :: forall n m a.
(Positive n, Positive m, Select a) =>
Exp (Vector n a) -> Exp (Vector m a)
takeRev = (forall r. MVVector n a -> CodeGenFunction r (T (Vector m a)))
-> Exp (Vector n a) -> Exp (Vector m a)
forall ae am b.
Aggregate ae am =>
(forall r. am -> CodeGenFunction r (T b)) -> ae -> Exp b
Expr.liftM MVVector n a -> CodeGenFunction r (T (Vector m a))
forall r. MVVector n a -> CodeGenFunction r (T (Vector m a))
forall n m a r.
(Positive n, Positive m, C a) =>
MVVector n a -> CodeGenFunction r (MVVector m a)
MultiValueVec.takeRev


cumulate ::
   (LLVM.Positive n, MultiVector.Additive a) =>
   Exp a -> Exp (LLVM.Vector n a) -> (Exp a, Exp (LLVM.Vector n a))
cumulate :: forall n a.
(Positive n, Additive a) =>
Exp a -> Exp (Vector n a) -> (Exp a, Exp (Vector n a))
cumulate Exp a
a0 Exp (Vector n a)
v0 =
   Exp (a, Vector n a) -> (Exp a, Exp (Vector n a))
forall (val :: * -> *) a b.
Value val =>
val (a, b) -> (val a, val b)
Expr.unzip (Exp (a, Vector n a) -> (Exp a, Exp (Vector n a)))
-> Exp (a, Vector n a) -> (Exp a, Exp (Vector n a))
forall a b. (a -> b) -> a -> b
$
   (forall r.
 T a -> MVVector n a -> CodeGenFunction r (T (a, Vector n a)))
-> Exp a -> Exp (Vector n a) -> Exp (a, Vector n a)
forall ae am be bm c.
(Aggregate ae am, Aggregate be bm) =>
(forall r. am -> bm -> CodeGenFunction r (T c))
-> ae -> be -> Exp c
Expr.liftM2
      (\T a
a MVVector n a
v ->
         ((T a, T n a) -> T (a, Vector n a))
-> CodeGenFunction r (T a, T n a)
-> CodeGenFunction r (T (a, Vector n a))
forall a b. (a -> b) -> CodeGenFunction r a -> CodeGenFunction r b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((T a -> MVVector n a -> T (a, Vector n a))
-> (T a, MVVector n a) -> T (a, Vector n a)
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry T a -> MVVector n a -> T (a, Vector n a)
forall a b. T a -> T b -> T (a, b)
MultiValue.zip ((T a, MVVector n a) -> T (a, Vector n a))
-> ((T a, T n a) -> (T a, MVVector n a))
-> (T a, T n a)
-> T (a, Vector n a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
               (T n a -> MVVector n a) -> (T a, T n a) -> (T a, MVVector n a)
forall b c a. (b -> c) -> (a, b) -> (a, c)
Tuple.mapSnd T n a -> MVVector n a
forall n a. T n a -> MVVector n a
MultiVectorInst.toMultiValue) (CodeGenFunction r (T a, T n a)
 -> CodeGenFunction r (T (a, Vector n a)))
-> CodeGenFunction r (T a, T n a)
-> CodeGenFunction r (T (a, Vector n a))
forall a b. (a -> b) -> a -> b
$
         T a -> T n a -> CodeGenFunction r (T a, T n a)
forall n a r.
(Positive n, Additive a) =>
T a -> T n a -> CodeGenFunction r (T a, T n a)
MultiVector.cumulate T a
a (T n a -> CodeGenFunction r (T a, T n a))
-> T n a -> CodeGenFunction r (T a, T n a)
forall a b. (a -> b) -> a -> b
$ MVVector n a -> T n a
forall n a. MVVector n a -> T n a
MultiVectorInst.fromMultiValue MVVector n a
v)
      Exp a
a0 Exp (Vector n a)
v0


cmp ::
   (LLVM.Positive n, MultiVector.Comparison a) =>
   LLVM.CmpPredicate ->
   Exp (LLVM.Vector n a) -> Exp (LLVM.Vector n a) -> Exp (LLVM.Vector n Bool)
cmp :: forall n a.
(Positive n, Comparison a) =>
CmpPredicate
-> Exp (Vector n a) -> Exp (Vector n a) -> Exp (Vector n Bool)
cmp CmpPredicate
ord = (forall r.
 MVVector n a
 -> MVVector n a -> CodeGenFunction r (T (Vector n Bool)))
-> Exp (Vector n a) -> Exp (Vector n a) -> Exp (Vector n Bool)
forall ae am be bm c.
(Aggregate ae am, Aggregate be bm) =>
(forall r. am -> bm -> CodeGenFunction r (T c))
-> ae -> be -> Exp c
Expr.liftM2 (CmpPredicate
-> MVVector n a
-> MVVector n a
-> CodeGenFunction r (T (Vector n Bool))
forall n a r.
(Positive n, Comparison a) =>
CmpPredicate
-> MVVector n a
-> MVVector n a
-> CodeGenFunction r (MVVector n Bool)
MultiValueVec.cmp CmpPredicate
ord)

select ::
   (LLVM.Positive n, MultiVector.Select a) =>
   Exp (LLVM.Vector n Bool) ->
   Exp (LLVM.Vector n a) -> Exp (LLVM.Vector n a) -> Exp (LLVM.Vector n a)
select :: forall n a.
(Positive n, Select a) =>
Exp (Vector n Bool)
-> Exp (Vector n a) -> Exp (Vector n a) -> Exp (Vector n a)
select = (forall r.
 MVVector n Bool
 -> MVVector n a
 -> MVVector n a
 -> CodeGenFunction r (MVVector n a))
-> Exp (Vector n Bool)
-> Exp (Vector n a)
-> Exp (Vector n a)
-> Exp (Vector n a)
forall ae am be bm ce cm d.
(Aggregate ae am, Aggregate be bm, Aggregate ce cm) =>
(forall r. am -> bm -> cm -> CodeGenFunction r (T d))
-> ae -> be -> ce -> Exp d
Expr.liftM3 MVVector n Bool
-> MVVector n a -> MVVector n a -> CodeGenFunction r (MVVector n a)
forall r.
MVVector n Bool
-> MVVector n a -> MVVector n a -> CodeGenFunction r (MVVector n a)
forall n a r.
(Positive n, Select a) =>
MVVector n Bool
-> MVVector n a -> MVVector n a -> CodeGenFunction r (MVVector n a)
MultiValueVec.select


min, max ::
   (LLVM.Positive n, MultiVector.Real a) =>
   Exp (LLVM.Vector n a) -> Exp (LLVM.Vector n a) -> Exp (LLVM.Vector n a)
min :: forall n a.
(Positive n, Real a) =>
Exp (Vector n a) -> Exp (Vector n a) -> Exp (Vector n a)
min = (forall r.
 T (Vector n a)
 -> T (Vector n a) -> CodeGenFunction r (T (Vector n a)))
-> Exp (Vector n a) -> Exp (Vector n a) -> Exp (Vector n a)
forall ae am be bm c.
(Aggregate ae am, Aggregate be bm) =>
(forall r. am -> bm -> CodeGenFunction r (T c))
-> ae -> be -> Exp c
Expr.liftM2 T (Vector n a)
-> T (Vector n a) -> CodeGenFunction r (T (Vector n a))
forall a r. Real a => a -> a -> CodeGenFunction r a
forall r.
T (Vector n a)
-> T (Vector n a) -> CodeGenFunction r (T (Vector n a))
A.min
max :: forall n a.
(Positive n, Real a) =>
Exp (Vector n a) -> Exp (Vector n a) -> Exp (Vector n a)
max = (forall r.
 T (Vector n a)
 -> T (Vector n a) -> CodeGenFunction r (T (Vector n a)))
-> Exp (Vector n a) -> Exp (Vector n a) -> Exp (Vector n a)
forall ae am be bm c.
(Aggregate ae am, Aggregate be bm) =>
(forall r. am -> bm -> CodeGenFunction r (T c))
-> ae -> be -> Exp c
Expr.liftM2 T (Vector n a)
-> T (Vector n a) -> CodeGenFunction r (T (Vector n a))
forall a r. Real a => a -> a -> CodeGenFunction r a
forall r.
T (Vector n a)
-> T (Vector n a) -> CodeGenFunction r (T (Vector n a))
A.max

limit ::
   (LLVM.Positive n, MultiVector.Real a) =>
   (Exp (LLVM.Vector n a), Exp (LLVM.Vector n a)) ->
   Exp (LLVM.Vector n a) -> Exp (LLVM.Vector n a)
limit :: forall n a.
(Positive n, Real a) =>
(Exp (Vector n a), Exp (Vector n a))
-> Exp (Vector n a) -> Exp (Vector n a)
limit (Exp (Vector n a)
l,Exp (Vector n a)
u) = Exp (Vector n a) -> Exp (Vector n a) -> Exp (Vector n a)
forall n a.
(Positive n, Real a) =>
Exp (Vector n a) -> Exp (Vector n a) -> Exp (Vector n a)
max Exp (Vector n a)
l (Exp (Vector n a) -> Exp (Vector n a))
-> (Exp (Vector n a) -> Exp (Vector n a))
-> Exp (Vector n a)
-> Exp (Vector n a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Exp (Vector n a) -> Exp (Vector n a) -> Exp (Vector n a)
forall n a.
(Positive n, Real a) =>
Exp (Vector n a) -> Exp (Vector n a) -> Exp (Vector n a)
min Exp (Vector n a)
u


fromIntegral ::
   (MultiValueVec.NativeInteger i ir, MultiValueVec.NativeFloating a ar,
    LLVM.ShapeOf ir ~ LLVM.ShapeOf ar) =>
   Exp i -> Exp a
fromIntegral :: forall i ir a ar.
(NativeInteger i ir, NativeFloating a ar,
 ShapeOf ir ~ ShapeOf ar) =>
Exp i -> Exp a
fromIntegral = (forall r. T i -> CodeGenFunction r (T a)) -> Exp i -> Exp a
forall ae am b.
Aggregate ae am =>
(forall r. am -> CodeGenFunction r (T b)) -> ae -> Exp b
Expr.liftM T i -> CodeGenFunction r (T a)
forall r. T i -> CodeGenFunction r (T a)
forall i ir a ar r.
(NativeInteger i ir, NativeFloating a ar,
 ShapeOf ir ~ ShapeOf ar) =>
T i -> CodeGenFunction r (T a)
MultiValueVec.fromIntegral

truncateToInt ::
   (MultiValueVec.NativeInteger i ir, MultiValueVec.NativeFloating a ar,
    LLVM.ShapeOf ir ~ LLVM.ShapeOf ar) =>
   Exp a -> Exp i
truncateToInt :: forall i ir a ar.
(NativeInteger i ir, NativeFloating a ar,
 ShapeOf ir ~ ShapeOf ar) =>
Exp a -> Exp i
truncateToInt = (forall r. T a -> CodeGenFunction r (T i)) -> Exp a -> Exp i
forall ae am b.
Aggregate ae am =>
(forall r. am -> CodeGenFunction r (T b)) -> ae -> Exp b
Expr.liftM T a -> CodeGenFunction r (T i)
forall r. T a -> CodeGenFunction r (T i)
forall i ir a ar r.
(NativeInteger i ir, NativeFloating a ar,
 ShapeOf ir ~ ShapeOf ar) =>
T a -> CodeGenFunction r (T i)
MultiValueVec.truncateToInt

splitFractionToInt ::
   (MultiValueVec.NativeInteger i ir, MultiValueVec.NativeFloating a ar,
    LLVM.ShapeOf ir ~ LLVM.ShapeOf ar) =>
   Exp a -> (Exp i, Exp a)
splitFractionToInt :: forall i ir a ar.
(NativeInteger i ir, NativeFloating a ar,
 ShapeOf ir ~ ShapeOf ar) =>
Exp a -> (Exp i, Exp a)
splitFractionToInt = Exp (i, a) -> (Exp i, Exp a)
forall (val :: * -> *) a b.
Value val =>
val (a, b) -> (val a, val b)
Expr.unzip (Exp (i, a) -> (Exp i, Exp a))
-> (Exp a -> Exp (i, a)) -> Exp a -> (Exp i, Exp a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall r. T a -> CodeGenFunction r (T (i, a)))
-> Exp a -> Exp (i, a)
forall ae am b.
Aggregate ae am =>
(forall r. am -> CodeGenFunction r (T b)) -> ae -> Exp b
Expr.liftM T a -> CodeGenFunction r (T (i, a))
forall r. T a -> CodeGenFunction r (T (i, a))
forall i ir a ar r.
(NativeInteger i ir, NativeFloating a ar,
 ShapeOf ir ~ ShapeOf ar) =>
T a -> CodeGenFunction r (T (i, a))
MultiValueVec.splitFractionToInt