{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Synthesizer.LLVM.Frame.SerialVector.Code (
   T(Cons), Value, size,
   fromOrdinary, toOrdinary,
   fromMultiVector, toMultiVector,
   extract, insert, modify,
   assemble, dissect,
   assemble1, dissect1,
   upsample, subsample, last,
   reverse, shiftUp, shiftUpMultiZero, shiftDown,
   cumulate, iterate,
   scale,
   ) where

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

import qualified LLVM.Core as LLVM

import qualified Type.Data.Num.Decimal as TypeNum

import qualified Foreign.Storable as Store
import Foreign.Storable (Storable)
import Foreign.Ptr (castPtr)

import Control.Applicative ((<$>))

import qualified Data.NonEmpty as NonEmpty
import Data.Word (Word32)
import Data.Tuple.HT (mapSnd)

import Prelude as P hiding (last, reverse, iterate)


newtype T n a = Cons (LLVM.Vector n a)
   deriving (T n a -> T n a -> Bool
(T n a -> T n a -> Bool) -> (T n a -> T n a -> Bool) -> Eq (T n a)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall n a. (Eq a, Positive n) => T n a -> T n a -> Bool
$c== :: forall n a. (Eq a, Positive n) => T n a -> T n a -> Bool
== :: T n a -> T n a -> Bool
$c/= :: forall n a. (Eq a, Positive n) => T n a -> T n a -> Bool
/= :: T n a -> T n a -> Bool
Eq, Integer -> T n a
T n a -> T n a
T n a -> T n a -> T n a
(T n a -> T n a -> T n a)
-> (T n a -> T n a -> T n a)
-> (T n a -> T n a -> T n a)
-> (T n a -> T n a)
-> (T n a -> T n a)
-> (T n a -> T n a)
-> (Integer -> T n a)
-> Num (T n a)
forall a.
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (Integer -> a)
-> Num a
forall n a. (Num a, Positive n) => Integer -> T n a
forall n a. (Num a, Positive n) => T n a -> T n a
forall n a. (Num a, Positive n) => T n a -> T n a -> T n a
$c+ :: forall n a. (Num a, Positive n) => T n a -> T n a -> T n a
+ :: T n a -> T n a -> T n a
$c- :: forall n a. (Num a, Positive n) => T n a -> T n a -> T n a
- :: T n a -> T n a -> T n a
$c* :: forall n a. (Num a, Positive n) => T n a -> T n a -> T n a
* :: T n a -> T n a -> T n a
$cnegate :: forall n a. (Num a, Positive n) => T n a -> T n a
negate :: T n a -> T n a
$cabs :: forall n a. (Num a, Positive n) => T n a -> T n a
abs :: T n a -> T n a
$csignum :: forall n a. (Num a, Positive n) => T n a -> T n a
signum :: T n a -> T n a
$cfromInteger :: forall n a. (Num a, Positive n) => Integer -> T n a
fromInteger :: Integer -> T n a
Num)

type Value n a = MultiValue.T (T n a)

instance (TypeNum.Positive n, MultiVector.C a) => MultiValue.C (T n a) where
   type Repr (T n a) = MultiVector.Repr n a
   cons :: T n a -> T (T n a)
cons (Cons Vector n a
v) = T (Vector n a) -> T (T n a)
forall n a. T (Vector n a) -> Value n a
fromOrdinary (T (Vector n a) -> T (T n a)) -> T (Vector n a) -> T (T n a)
forall a b. (a -> b) -> a -> b
$ Vector n a -> T (Vector n a)
forall a. C a => a -> T a
MultiValue.cons Vector n a
v
   undef :: T (T n a)
undef = T (Vector n a) -> T (T n a)
forall n a. T (Vector n a) -> Value n a
fromOrdinary T (Vector n a)
forall a. C a => T a
MultiValue.undef
   zero :: T (T n a)
zero = T (Vector n a) -> T (T n a)
forall n a. T (Vector n a) -> Value n a
fromOrdinary T (Vector n a)
forall a. C a => T a
MultiValue.zero
   phi :: forall r. BasicBlock -> T (T n a) -> CodeGenFunction r (T (T n a))
phi BasicBlock
bb = (T (Vector n a) -> T (T n a))
-> CodeGenFunction r (T (Vector n a))
-> CodeGenFunction r (T (T 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 (Vector n a) -> T (T n a)
forall n a. T (Vector n a) -> Value n a
fromOrdinary (CodeGenFunction r (T (Vector n a))
 -> CodeGenFunction r (T (T n a)))
-> (T (T n a) -> CodeGenFunction r (T (Vector n a)))
-> T (T n a)
-> CodeGenFunction r (T (T n a))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BasicBlock -> T (Vector n a) -> CodeGenFunction r (T (Vector n a))
forall a r. C a => BasicBlock -> T a -> CodeGenFunction r (T a)
forall r.
BasicBlock -> T (Vector n a) -> CodeGenFunction r (T (Vector n a))
MultiValue.phi BasicBlock
bb (T (Vector n a) -> CodeGenFunction r (T (Vector n a)))
-> (T (T n a) -> T (Vector n a))
-> T (T n a)
-> CodeGenFunction r (T (Vector n a))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T (T n a) -> T (Vector n a)
forall n a. Value n a -> T (Vector n a)
toOrdinary
   addPhi :: forall r.
BasicBlock -> T (T n a) -> T (T n a) -> CodeGenFunction r ()
addPhi BasicBlock
bb T (T n a)
a T (T n a)
b = BasicBlock
-> T (Vector n a) -> T (Vector n a) -> CodeGenFunction r ()
forall a r. C a => BasicBlock -> T a -> T a -> CodeGenFunction r ()
forall r.
BasicBlock
-> T (Vector n a) -> T (Vector n a) -> CodeGenFunction r ()
MultiValue.addPhi BasicBlock
bb (T (T n a) -> T (Vector n a)
forall n a. Value n a -> T (Vector n a)
toOrdinary T (T n a)
a) (T (T n a) -> T (Vector n a)
forall n a. Value n a -> T (Vector n a)
toOrdinary T (T n a)
b)

instance (Marshal.Vector n a) => Marshal.C (T n a) where
   pack :: T n a -> Struct (T n a)
pack (Cons Vector n a
v) = Vector n a -> Struct (Vector n a)
forall a. C a => a -> Struct a
Marshal.pack Vector n a
v
   unpack :: Struct (T n a) -> T n a
unpack = Vector n a -> T n a
forall n a. Vector n a -> T n a
Cons (Vector n a -> T n a)
-> (VectorStruct n a -> Vector n a) -> VectorStruct n a -> T n a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Struct (Vector n a) -> Vector n a
VectorStruct n a -> Vector n a
forall a. C a => Struct a -> a
Marshal.unpack

instance (TypeNum.Positive n, Storable a) => Storable (T n a) where
   sizeOf :: T n a -> Int
sizeOf (Cons Vector n a
v) = Vector n a -> Int
forall a. Storable a => a -> Int
Store.sizeOf Vector n a
v
   alignment :: T n a -> Int
alignment (Cons Vector n a
v) = Vector n a -> Int
forall a. Storable a => a -> Int
Store.alignment Vector n a
v
   poke :: Ptr (T n a) -> T n a -> IO ()
poke Ptr (T n a)
ptr (Cons Vector n a
v) = Ptr (Vector n a) -> Vector n a -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
Store.poke (Ptr (T n a) -> Ptr (Vector n a)
forall a b. Ptr a -> Ptr b
castPtr Ptr (T n a)
ptr) Vector n a
v
   peek :: Ptr (T n a) -> IO (T n a)
peek Ptr (T n a)
ptr = Vector n a -> T n a
forall n a. Vector n a -> T n a
Cons (Vector n a -> T n a) -> IO (Vector n a) -> IO (T n a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr (Vector n a) -> IO (Vector n a)
forall a. Storable a => Ptr a -> IO a
Store.peek (Ptr (T n a) -> Ptr (Vector n a)
forall a b. Ptr a -> Ptr b
castPtr Ptr (T n a)
ptr)

instance
   (TypeNum.Positive n, Storable.Vector a, MultiVector.C a) =>
      Storable.C (T n a) where
   load :: forall r. Value (Ptr (T n a)) -> CodeGenFunction r (T (T n a))
load Value (Ptr (T n a))
ptr = (T (Vector n a) -> T (T n a))
-> CodeGenFunction r (T (Vector n a))
-> CodeGenFunction r (T (T 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 (Vector n a) -> T (T n a)
forall n a. T (Vector n a) -> Value n a
fromOrdinary (CodeGenFunction r (T (Vector n a))
 -> CodeGenFunction r (T (T n a)))
-> CodeGenFunction r (T (Vector n a))
-> CodeGenFunction r (T (T n a))
forall a b. (a -> b) -> a -> b
$ Value (Ptr (Vector n a)) -> CodeGenFunction r (T (Vector n a))
forall a r. C a => Value (Ptr a) -> CodeGenFunction r (T a)
forall r.
Value (Ptr (Vector n a)) -> CodeGenFunction r (T (Vector n a))
Storable.load (Value (Ptr (Vector n a)) -> CodeGenFunction r (T (Vector n a)))
-> CodeGenFunction r (Value (Ptr (Vector n a)))
-> CodeGenFunction r (T (Vector n a))
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Value (Ptr (T n a)) -> CodeGenFunction r (Value (Ptr (Vector n a)))
forall (value :: * -> *) a b r.
(ValueCons value, IsSized a, IsSized b, SizeOf a ~ SizeOf b) =>
value a -> CodeGenFunction r (value b)
LLVM.bitcast Value (Ptr (T n a))
ptr
   store :: forall r. T (T n a) -> Value (Ptr (T n a)) -> CodeGenFunction r ()
store T (T n a)
v Value (Ptr (T n a))
ptr = T (Vector n a) -> Value (Ptr (Vector n a)) -> CodeGenFunction r ()
forall r.
T (Vector n a) -> Value (Ptr (Vector n a)) -> CodeGenFunction r ()
forall a r. C a => T a -> Value (Ptr a) -> CodeGenFunction r ()
Storable.store (T (T n a) -> T (Vector n a)
forall n a. Value n a -> T (Vector n a)
toOrdinary T (T n a)
v) (Value (Ptr (Vector n a)) -> CodeGenFunction r ())
-> CodeGenFunction r (Value (Ptr (Vector n a)))
-> CodeGenFunction r ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Value (Ptr (T n a)) -> CodeGenFunction r (Value (Ptr (Vector n a)))
forall (value :: * -> *) a b r.
(ValueCons value, IsSized a, IsSized b, SizeOf a ~ SizeOf b) =>
value a -> CodeGenFunction r (value b)
LLVM.bitcast Value (Ptr (T n a))
ptr

instance
   (TypeNum.Positive n, MultiVector.IntegerConstant a) =>
      MultiValue.IntegerConstant (T n a) where
   fromInteger' :: Integer -> T (T n a)
fromInteger' = T n a -> T (T n a)
forall n a. T n a -> Value n a
fromMultiVector (T n a -> T (T n a)) -> (Integer -> T n a) -> Integer -> T (T n a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> T n a
forall a n. (IntegerConstant a, Positive n) => Integer -> T n a
forall n. Positive n => Integer -> T n a
MultiVector.fromInteger'

instance
   (TypeNum.Positive n, MultiVector.RationalConstant a) =>
      MultiValue.RationalConstant (T n a) where
   fromRational' :: Rational -> T (T n a)
fromRational' = T n a -> T (T n a)
forall n a. T n a -> Value n a
fromMultiVector (T n a -> T (T n a))
-> (Rational -> T n a) -> Rational -> T (T n a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rational -> T n a
forall a n. (RationalConstant a, Positive n) => Rational -> T n a
forall n. Positive n => Rational -> T n a
MultiVector.fromRational'

instance
   (TypeNum.Positive n, MultiVector.Additive a) =>
      MultiValue.Additive (T n a) where
   add :: forall r. T (T n a) -> T (T n a) -> CodeGenFunction r (T (T n a))
add = (T n a -> T n a -> CodeGenFunction r (T n a))
-> T (T n a) -> T (T n a) -> CodeGenFunction r (T (T n a))
forall (f :: * -> *) n a m b k c.
Functor f =>
(T n a -> T m b -> f (T k c))
-> Value n a -> Value m b -> f (Value k c)
lift2 T n a -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(Additive a, Positive n) =>
T n a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
T n a -> T n a -> CodeGenFunction r (T n a)
MultiVector.add
   sub :: forall r. T (T n a) -> T (T n a) -> CodeGenFunction r (T (T n a))
sub = (T n a -> T n a -> CodeGenFunction r (T n a))
-> T (T n a) -> T (T n a) -> CodeGenFunction r (T (T n a))
forall (f :: * -> *) n a m b k c.
Functor f =>
(T n a -> T m b -> f (T k c))
-> Value n a -> Value m b -> f (Value k c)
lift2 T n a -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(Additive a, Positive n) =>
T n a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
T n a -> T n a -> CodeGenFunction r (T n a)
MultiVector.sub
   neg :: forall r. T (T n a) -> CodeGenFunction r (T (T n a))
neg = (T n a -> CodeGenFunction r (T n a))
-> T (T n a) -> CodeGenFunction r (T (T n a))
forall (f :: * -> *) n a m b.
Functor f =>
(T n a -> f (T m b)) -> Value n a -> f (Value m b)
lift1 T n a -> CodeGenFunction r (T n a)
forall a n r.
(Additive a, Positive n) =>
T n a -> CodeGenFunction r (T n a)
forall n r. Positive n => T n a -> CodeGenFunction r (T n a)
MultiVector.neg

instance
   (TypeNum.Positive n, MultiVector.PseudoRing a) =>
      MultiValue.PseudoRing (T n a) where
   mul :: forall r. T (T n a) -> T (T n a) -> CodeGenFunction r (T (T n a))
mul = (T n a -> T n a -> CodeGenFunction r (T n a))
-> T (T n a) -> T (T n a) -> CodeGenFunction r (T (T n a))
forall (f :: * -> *) n a m b k c.
Functor f =>
(T n a -> T m b -> f (T k c))
-> Value n a -> Value m b -> f (Value k c)
lift2 T n a -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(PseudoRing a, Positive n) =>
T n a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
T n a -> T n a -> CodeGenFunction r (T n a)
MultiVector.mul

scale ::
   (TypeNum.Positive n, MultiVector.PseudoRing a) =>
   MultiValue.T a -> Value n a -> LLVM.CodeGenFunction r (Value n a)
scale :: forall n a r.
(Positive n, PseudoRing a) =>
T a -> Value n a -> CodeGenFunction r (Value n a)
scale = (T n a -> CodeGenFunction r (T n a))
-> Value n a -> CodeGenFunction r (Value n a)
forall (f :: * -> *) n a m b.
Functor f =>
(T n a -> f (T m b)) -> Value n a -> f (Value m b)
lift1 ((T n a -> CodeGenFunction r (T n a))
 -> Value n a -> CodeGenFunction r (Value n a))
-> (T a -> T n a -> CodeGenFunction r (T n a))
-> T a
-> Value n a
-> CodeGenFunction r (Value n a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T a -> T n a -> CodeGenFunction r (T n a)
forall n a r.
(Positive n, PseudoRing a) =>
T a -> T n a -> CodeGenFunction r (T n a)
MultiVector.scale

instance
   (TypeNum.Positive n, MultiVector.Real a) =>
      MultiValue.Real (T n a) where
   min :: forall r. T (T n a) -> T (T n a) -> CodeGenFunction r (T (T n a))
min = (T n a -> T n a -> CodeGenFunction r (T n a))
-> T (T n a) -> T (T n a) -> CodeGenFunction r (T (T n a))
forall (f :: * -> *) n a m b k c.
Functor f =>
(T n a -> T m b -> f (T k c))
-> Value n a -> Value m b -> f (Value k c)
lift2 T n a -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(Real a, Positive n) =>
T n a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
T n a -> T n a -> CodeGenFunction r (T n a)
MultiVector.min
   max :: forall r. T (T n a) -> T (T n a) -> CodeGenFunction r (T (T n a))
max = (T n a -> T n a -> CodeGenFunction r (T n a))
-> T (T n a) -> T (T n a) -> CodeGenFunction r (T (T n a))
forall (f :: * -> *) n a m b k c.
Functor f =>
(T n a -> T m b -> f (T k c))
-> Value n a -> Value m b -> f (Value k c)
lift2 T n a -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(Real a, Positive n) =>
T n a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
T n a -> T n a -> CodeGenFunction r (T n a)
MultiVector.max
   abs :: forall r. T (T n a) -> CodeGenFunction r (T (T n a))
abs = (T n a -> CodeGenFunction r (T n a))
-> T (T n a) -> CodeGenFunction r (T (T n a))
forall (f :: * -> *) n a m b.
Functor f =>
(T n a -> f (T m b)) -> Value n a -> f (Value m b)
lift1 T n a -> CodeGenFunction r (T n a)
forall a n r.
(Real a, Positive n) =>
T n a -> CodeGenFunction r (T n a)
forall n r. Positive n => T n a -> CodeGenFunction r (T n a)
MultiVector.abs
   signum :: forall r. T (T n a) -> CodeGenFunction r (T (T n a))
signum = (T n a -> CodeGenFunction r (T n a))
-> T (T n a) -> CodeGenFunction r (T (T n a))
forall (f :: * -> *) n a m b.
Functor f =>
(T n a -> f (T m b)) -> Value n a -> f (Value m b)
lift1 T n a -> CodeGenFunction r (T n a)
forall a n r.
(Real a, Positive n) =>
T n a -> CodeGenFunction r (T n a)
forall n r. Positive n => T n a -> CodeGenFunction r (T n a)
MultiVector.signum

instance
   (TypeNum.Positive n, MultiVector.Fraction a) =>
      MultiValue.Fraction (T n a) where
   truncate :: forall r. T (T n a) -> CodeGenFunction r (T (T n a))
truncate = (T n a -> CodeGenFunction r (T n a))
-> T (T n a) -> CodeGenFunction r (T (T n a))
forall (f :: * -> *) n a m b.
Functor f =>
(T n a -> f (T m b)) -> Value n a -> f (Value m b)
lift1 T n a -> CodeGenFunction r (T n a)
forall a n r.
(Fraction a, Positive n) =>
T n a -> CodeGenFunction r (T n a)
forall n r. Positive n => T n a -> CodeGenFunction r (T n a)
MultiVector.truncate
   fraction :: forall r. T (T n a) -> CodeGenFunction r (T (T n a))
fraction = (T n a -> CodeGenFunction r (T n a))
-> T (T n a) -> CodeGenFunction r (T (T n a))
forall (f :: * -> *) n a m b.
Functor f =>
(T n a -> f (T m b)) -> Value n a -> f (Value m b)
lift1 T n a -> CodeGenFunction r (T n a)
forall a n r.
(Fraction a, Positive n) =>
T n a -> CodeGenFunction r (T n a)
forall n r. Positive n => T n a -> CodeGenFunction r (T n a)
MultiVector.fraction

instance
   (TypeNum.Positive n, MultiVector.Field a) =>
      MultiValue.Field (T n a) where
   fdiv :: forall r. T (T n a) -> T (T n a) -> CodeGenFunction r (T (T n a))
fdiv = (T n a -> T n a -> CodeGenFunction r (T n a))
-> T (T n a) -> T (T n a) -> CodeGenFunction r (T (T n a))
forall (f :: * -> *) n a m b k c.
Functor f =>
(T n a -> T m b -> f (T k c))
-> Value n a -> Value m b -> f (Value k c)
lift2 T n a -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(Field a, Positive n) =>
T n a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
T n a -> T n a -> CodeGenFunction r (T n a)
MultiVector.fdiv

instance
   (TypeNum.Positive n, MultiVector.Algebraic a) =>
      MultiValue.Algebraic (T n a) where
   sqrt :: forall r. T (T n a) -> CodeGenFunction r (T (T n a))
sqrt = (T n a -> CodeGenFunction r (T n a))
-> T (T n a) -> CodeGenFunction r (T (T n a))
forall (f :: * -> *) n a m b.
Functor f =>
(T n a -> f (T m b)) -> Value n a -> f (Value m b)
lift1 T n a -> CodeGenFunction r (T n a)
forall a n r.
(Algebraic a, Positive n) =>
T n a -> CodeGenFunction r (T n a)
forall n r. Positive n => T n a -> CodeGenFunction r (T n a)
MultiVector.sqrt

instance
   (TypeNum.Positive n, MultiVector.Transcendental a) =>
      MultiValue.Transcendental (T n a) where
   pi :: forall r. CodeGenFunction r (T (T n a))
pi  = (T n a -> T (T n a))
-> CodeGenFunction r (T n a) -> CodeGenFunction r (T (T 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 n a -> T (T n a)
forall n a. T n a -> Value n a
fromMultiVector CodeGenFunction r (T n a)
forall a n r.
(Transcendental a, Positive n) =>
CodeGenFunction r (T n a)
forall n r. Positive n => CodeGenFunction r (T n a)
MultiVector.pi
   sin :: forall r. T (T n a) -> CodeGenFunction r (T (T n a))
sin = (T n a -> CodeGenFunction r (T n a))
-> T (T n a) -> CodeGenFunction r (T (T n a))
forall (f :: * -> *) n a m b.
Functor f =>
(T n a -> f (T m b)) -> Value n a -> f (Value m b)
lift1 T n a -> CodeGenFunction r (T n a)
forall a n r.
(Transcendental a, Positive n) =>
T n a -> CodeGenFunction r (T n a)
forall n r. Positive n => T n a -> CodeGenFunction r (T n a)
MultiVector.sin
   log :: forall r. T (T n a) -> CodeGenFunction r (T (T n a))
log = (T n a -> CodeGenFunction r (T n a))
-> T (T n a) -> CodeGenFunction r (T (T n a))
forall (f :: * -> *) n a m b.
Functor f =>
(T n a -> f (T m b)) -> Value n a -> f (Value m b)
lift1 T n a -> CodeGenFunction r (T n a)
forall a n r.
(Transcendental a, Positive n) =>
T n a -> CodeGenFunction r (T n a)
forall n r. Positive n => T n a -> CodeGenFunction r (T n a)
MultiVector.log
   exp :: forall r. T (T n a) -> CodeGenFunction r (T (T n a))
exp = (T n a -> CodeGenFunction r (T n a))
-> T (T n a) -> CodeGenFunction r (T (T n a))
forall (f :: * -> *) n a m b.
Functor f =>
(T n a -> f (T m b)) -> Value n a -> f (Value m b)
lift1 T n a -> CodeGenFunction r (T n a)
forall a n r.
(Transcendental a, Positive n) =>
T n a -> CodeGenFunction r (T n a)
forall n r. Positive n => T n a -> CodeGenFunction r (T n a)
MultiVector.exp
   cos :: forall r. T (T n a) -> CodeGenFunction r (T (T n a))
cos = (T n a -> CodeGenFunction r (T n a))
-> T (T n a) -> CodeGenFunction r (T (T n a))
forall (f :: * -> *) n a m b.
Functor f =>
(T n a -> f (T m b)) -> Value n a -> f (Value m b)
lift1 T n a -> CodeGenFunction r (T n a)
forall a n r.
(Transcendental a, Positive n) =>
T n a -> CodeGenFunction r (T n a)
forall n r. Positive n => T n a -> CodeGenFunction r (T n a)
MultiVector.cos
   pow :: forall r. T (T n a) -> T (T n a) -> CodeGenFunction r (T (T n a))
pow = (T n a -> T n a -> CodeGenFunction r (T n a))
-> T (T n a) -> T (T n a) -> CodeGenFunction r (T (T n a))
forall (f :: * -> *) n a m b k c.
Functor f =>
(T n a -> T m b -> f (T k c))
-> Value n a -> Value m b -> f (Value k c)
lift2 T n a -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(Transcendental a, Positive n) =>
T n a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
T n a -> T n a -> CodeGenFunction r (T n a)
MultiVector.pow

instance
   (TypeNum.Positive n, n ~ m,
    MultiVector.NativeInteger n a ar,
    MultiValue.NativeInteger a ar) =>
      MultiValueVec.NativeInteger (T n a) (LLVM.Vector m ar) where

instance
   (TypeNum.Positive n, n ~ m,
    MultiVector.NativeFloating n a ar,
    MultiValue.NativeFloating a ar) =>
      MultiValueVec.NativeFloating (T n a) (LLVM.Vector m ar) where

lift1 ::
   (Functor f) =>
   (MultiVector.T n a -> f (MultiVector.T m b)) ->
   (Value n a -> f (Value m b))
lift1 :: forall (f :: * -> *) n a m b.
Functor f =>
(T n a -> f (T m b)) -> Value n a -> f (Value m b)
lift1 T n a -> f (T m b)
f Value n a
a = T m b -> Value m b
forall n a. T n a -> Value n a
fromMultiVector (T m b -> Value m b) -> f (T m b) -> f (Value m b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> T n a -> f (T m b)
f (Value n a -> T n a
forall n a. Value n a -> T n a
toMultiVector Value n a
a)

lift2 ::
   (Functor f) =>
   (MultiVector.T n a -> MultiVector.T m b -> f (MultiVector.T k c)) ->
   (Value n a -> Value m b -> f (Value k c))
lift2 :: forall (f :: * -> *) n a m b k c.
Functor f =>
(T n a -> T m b -> f (T k c))
-> Value n a -> Value m b -> f (Value k c)
lift2 T n a -> T m b -> f (T k c)
f Value n a
a Value m b
b = T k c -> Value k c
forall n a. T n a -> Value n a
fromMultiVector (T k c -> Value k c) -> f (T k c) -> f (Value k c)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> T n a -> T m b -> f (T k c)
f (Value n a -> T n a
forall n a. Value n a -> T n a
toMultiVector Value n a
a) (Value m b -> T m b
forall n a. Value n a -> T n a
toMultiVector Value m b
b)


extract ::
   (TypeNum.Positive n,
    MultiVector.C x, MultiValue.T x ~ a, Value n x ~ v) =>
   LLVM.Value Word32 -> v -> LLVM.CodeGenFunction r a
extract :: forall n x a v r.
(Positive n, C x, T x ~ a, Value n x ~ v) =>
Value Word32 -> v -> CodeGenFunction r a
extract Value Word32
i v
v = Value Word32 -> T n x -> CodeGenFunction r (T x)
forall a n r.
(C a, Positive n) =>
Value Word32 -> T n a -> CodeGenFunction r (T a)
forall n r.
Positive n =>
Value Word32 -> T n x -> CodeGenFunction r (T x)
MultiVector.extract Value Word32
i (Value n x -> T n x
forall n a. Value n a -> T n a
toMultiVector v
Value n x
v)

insert ::
   (TypeNum.Positive n,
    MultiVector.C x, MultiValue.T x ~ a, Value n x ~ v) =>
   LLVM.Value Word32 -> a -> v -> LLVM.CodeGenFunction r v
insert :: forall n x a v r.
(Positive n, C x, T x ~ a, Value n x ~ v) =>
Value Word32 -> a -> v -> CodeGenFunction r v
insert Value Word32
i a
a v
v =
    T n x -> v
T n x -> Value n x
forall n a. T n a -> Value n a
fromMultiVector (T n x -> v) -> CodeGenFunction r (T n x) -> CodeGenFunction r v
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Value Word32 -> T x -> T n x -> CodeGenFunction r (T n x)
forall a n r.
(C a, Positive n) =>
Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
Value Word32 -> T x -> T n x -> CodeGenFunction r (T n x)
MultiVector.insert Value Word32
i a
T x
a (Value n x -> T n x
forall n a. Value n a -> T n a
toMultiVector v
Value n x
v)

modify ::
   (TypeNum.Positive n,
    MultiVector.C x, MultiValue.T x ~ a, Value n x ~ v) =>
   LLVM.Value Word32 ->
   (a -> LLVM.CodeGenFunction r a) ->
   v -> LLVM.CodeGenFunction r v
modify :: forall n x a v r.
(Positive n, C x, T x ~ a, Value n x ~ v) =>
Value Word32
-> (a -> CodeGenFunction r a) -> v -> CodeGenFunction r v
modify Value Word32
k a -> CodeGenFunction r a
f v
v = (a -> v -> CodeGenFunction r v) -> v -> a -> CodeGenFunction r v
forall a b c. (a -> b -> c) -> b -> a -> c
flip (Value Word32 -> a -> v -> CodeGenFunction r v
forall n x a v r.
(Positive n, C x, T x ~ a, Value n x ~ v) =>
Value Word32 -> a -> v -> CodeGenFunction r v
insert Value Word32
k) v
v (a -> CodeGenFunction r v)
-> CodeGenFunction r a -> CodeGenFunction r v
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< a -> CodeGenFunction r a
f (a -> CodeGenFunction r a)
-> CodeGenFunction r a -> CodeGenFunction r a
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Value Word32 -> v -> CodeGenFunction r a
forall n x a v r.
(Positive n, C x, T x ~ a, Value n x ~ v) =>
Value Word32 -> v -> CodeGenFunction r a
extract Value Word32
k v
v


assemble ::
   (TypeNum.Positive n, MultiVector.C a) =>
   [MultiValue.T a] ->
   LLVM.CodeGenFunction r (Value n a)
assemble :: forall n a r.
(Positive n, C a) =>
[T a] -> CodeGenFunction r (Value n a)
assemble = (T n a -> Value n a)
-> CodeGenFunction r (T n a) -> CodeGenFunction r (Value 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 n a -> Value n a
forall n a. T n a -> Value n a
fromMultiVector (CodeGenFunction r (T n a) -> CodeGenFunction r (Value n a))
-> ([T a] -> CodeGenFunction r (T n a))
-> [T a]
-> CodeGenFunction r (Value n a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [T a] -> CodeGenFunction r (T n a)
forall n a r.
(Positive n, C a) =>
[T a] -> CodeGenFunction r (T n a)
MultiVector.assemble

dissect ::
   (TypeNum.Positive n, MultiVector.C a) =>
   Value n a ->
   LLVM.CodeGenFunction r [MultiValue.T a]
dissect :: forall n a r.
(Positive n, C a) =>
Value n a -> CodeGenFunction r [T a]
dissect = T n a -> CodeGenFunction r [T a]
forall n a r. (Positive n, C a) => T n a -> CodeGenFunction r [T a]
MultiVector.dissect (T n a -> CodeGenFunction r [T a])
-> (Value n a -> T n a) -> Value n a -> CodeGenFunction r [T a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Value n a -> T n a
forall n a. Value n a -> T n a
toMultiVector

assemble1 ::
   (TypeNum.Positive n, MultiVector.C a) =>
   NonEmpty.T [] (MultiValue.T a) ->
   LLVM.CodeGenFunction r (Value n a)
assemble1 :: forall n a r.
(Positive n, C a) =>
T [] (T a) -> CodeGenFunction r (Value n a)
assemble1 = (T n a -> Value n a)
-> CodeGenFunction r (T n a) -> CodeGenFunction r (Value 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 n a -> Value n a
forall n a. T n a -> Value n a
fromMultiVector (CodeGenFunction r (T n a) -> CodeGenFunction r (Value n a))
-> (T [] (T a) -> CodeGenFunction r (T n a))
-> T [] (T a)
-> CodeGenFunction r (Value n a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T [] (T a) -> CodeGenFunction r (T n a)
forall n a r.
(Positive n, C a) =>
T [] (T a) -> CodeGenFunction r (T n a)
MultiVector.assemble1

dissect1 ::
   (TypeNum.Positive n, MultiVector.C a) =>
   Value n a ->
   LLVM.CodeGenFunction r (NonEmpty.T [] (MultiValue.T a))
dissect1 :: forall n a r.
(Positive n, C a) =>
Value n a -> CodeGenFunction r (T [] (T a))
dissect1 = T n a -> CodeGenFunction r (T [] (T a))
forall n a r.
(Positive n, C a) =>
T n a -> CodeGenFunction r (T [] (T a))
MultiVector.dissect1 (T n a -> CodeGenFunction r (T [] (T a)))
-> (Value n a -> T n a)
-> Value n a
-> CodeGenFunction r (T [] (T a))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Value n a -> T n a
forall n a. Value n a -> T n a
toMultiVector


sizeS :: TypeNum.Positive n => Value n a -> TypeNum.Singleton n
sizeS :: forall n a. Positive n => Value n a -> Singleton n
sizeS Value n a
_ = Singleton n
forall x. Integer x => Singleton x
TypeNum.singleton

size :: (TypeNum.Positive n, P.Integral i) => Value n a -> i
size :: forall n i a. (Positive n, Integral i) => Value n a -> i
size = Singleton n -> i
forall n a. (Integer n, Num a) => Singleton n -> a
TypeNum.integralFromSingleton (Singleton n -> i) -> (Value n a -> Singleton n) -> Value n a -> i
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Value n a -> Singleton n
forall n a. Positive n => Value n a -> Singleton n
sizeS


last ::
   (TypeNum.Positive n, MultiVector.C a) =>
   Value n a -> LLVM.CodeGenFunction r (MultiValue.T a)
last :: forall n a r.
(Positive n, C a) =>
Value n a -> CodeGenFunction r (T a)
last Value n a
v = Value Word32 -> Value n a -> CodeGenFunction r (T a)
forall n x a v r.
(Positive n, C x, T x ~ a, Value n x ~ v) =>
Value Word32 -> v -> CodeGenFunction r a
extract (Word32 -> Value Word32
forall a. IsConst a => a -> Value a
LLVM.valueOf (Value n a -> Word32
forall n i a. (Positive n, Integral i) => Value n a -> i
size Value n a
v Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
- Word32
1 :: Word32)) Value n a
v

subsample ::
   (TypeNum.Positive n, MultiVector.C a) =>
   Value n a -> LLVM.CodeGenFunction r (MultiValue.T a)
subsample :: forall n a r.
(Positive n, C a) =>
Value n a -> CodeGenFunction r (T a)
subsample = Value Word32 -> Value n a -> CodeGenFunction r (T a)
forall n x a v r.
(Positive n, C x, T x ~ a, Value n x ~ v) =>
Value Word32 -> v -> CodeGenFunction r a
extract (Value Word32
forall a. Additive a => a
A.zero :: LLVM.Value Word32)

upsample ::
   (TypeNum.Positive n, MultiVector.C a) =>
   MultiValue.T a -> LLVM.CodeGenFunction r (Value n a)
upsample :: forall n a r.
(Positive n, C a) =>
T a -> CodeGenFunction r (Value n a)
upsample = (T (Vector n a) -> Value n a)
-> CodeGenFunction r (T (Vector n a))
-> CodeGenFunction r (Value 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 (Vector n a) -> Value n a
forall n a. T (Vector n a) -> Value n a
fromOrdinary (CodeGenFunction r (T (Vector n a))
 -> CodeGenFunction r (Value n a))
-> (T a -> CodeGenFunction r (T (Vector n a)))
-> T a
-> CodeGenFunction r (Value n a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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


reverse ::
   (TypeNum.Positive n, MultiVector.C a) =>
   Value n a -> LLVM.CodeGenFunction r (Value n a)
reverse :: forall n a r.
(Positive n, C a) =>
Value n a -> CodeGenFunction r (Value n a)
reverse =
   (T n a -> Value n a)
-> CodeGenFunction r (T n a) -> CodeGenFunction r (Value 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 n a -> Value n a
forall n a. T n a -> Value n a
fromMultiVector (CodeGenFunction r (T n a) -> CodeGenFunction r (Value n a))
-> (Value n a -> CodeGenFunction r (T n a))
-> Value n a
-> CodeGenFunction r (Value n a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T n a -> CodeGenFunction r (T n a)
forall n a r.
(Positive n, C a) =>
T n a -> CodeGenFunction r (T n a)
MultiVector.reverse (T n a -> CodeGenFunction r (T n a))
-> (Value n a -> T n a) -> Value n a -> CodeGenFunction r (T n a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Value n a -> T n a
forall n a. Value n a -> T n a
toMultiVector

shiftUp ::
   (TypeNum.Positive n, MultiVector.C x,
    MultiValue.T x ~ a, Value n x ~ v) =>
   a -> v -> LLVM.CodeGenFunction r (a, v)
shiftUp :: forall n x a v r.
(Positive n, C x, T x ~ a, Value n x ~ v) =>
a -> v -> CodeGenFunction r (a, v)
shiftUp a
a v
v =
   (T n x -> v) -> (a, T n x) -> (a, v)
forall b c a. (b -> c) -> (a, b) -> (a, c)
mapSnd T n x -> v
T n x -> Value n x
forall n a. T n a -> Value n a
fromMultiVector ((a, T n x) -> (a, v))
-> CodeGenFunction r (a, T n x) -> CodeGenFunction r (a, v)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> T x -> T n x -> CodeGenFunction r (T x, T n x)
forall n a r.
(Positive n, C a) =>
T a -> T n a -> CodeGenFunction r (T a, T n a)
MultiVector.shiftUp a
T x
a (Value n x -> T n x
forall n a. Value n a -> T n a
toMultiVector v
Value n x
v)

shiftUpMultiZero ::
   (TypeNum.Positive n, MultiVector.C x, Value n x ~ v) =>
   Int -> v -> LLVM.CodeGenFunction r v
shiftUpMultiZero :: forall n x v r.
(Positive n, C x, Value n x ~ v) =>
Int -> v -> CodeGenFunction r v
shiftUpMultiZero Int
k v
v =
   T n x -> v
T n x -> Value n x
forall n a. T n a -> Value n a
fromMultiVector (T n x -> v) -> CodeGenFunction r (T n x) -> CodeGenFunction r v
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> T n x -> CodeGenFunction r (T n x)
forall n a r.
(Positive n, C a) =>
Int -> T n a -> CodeGenFunction r (T n a)
MultiVector.shiftUpMultiZero Int
k (Value n x -> T n x
forall n a. Value n a -> T n a
toMultiVector v
Value n x
v)

shiftDown ::
   (TypeNum.Positive n, MultiVector.C x,
    MultiValue.T x ~ a, Value n x ~ v) =>
   a -> v -> LLVM.CodeGenFunction r (a, v)
shiftDown :: forall n x a v r.
(Positive n, C x, T x ~ a, Value n x ~ v) =>
a -> v -> CodeGenFunction r (a, v)
shiftDown a
a v
v =
   (T n x -> v) -> (a, T n x) -> (a, v)
forall b c a. (b -> c) -> (a, b) -> (a, c)
mapSnd T n x -> v
T n x -> Value n x
forall n a. T n a -> Value n a
fromMultiVector ((a, T n x) -> (a, v))
-> CodeGenFunction r (a, T n x) -> CodeGenFunction r (a, v)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> T x -> T n x -> CodeGenFunction r (T x, T n x)
forall n a r.
(Positive n, C a) =>
T a -> T n a -> CodeGenFunction r (T a, T n a)
MultiVector.shiftDown a
T x
a (Value n x -> T n x
forall n a. Value n a -> T n a
toMultiVector v
Value n x
v)


iterate ::
   (TypeNum.Positive n, MultiVector.C a) =>
   (MultiValue.T a -> LLVM.CodeGenFunction r (MultiValue.T a)) ->
   MultiValue.T a -> LLVM.CodeGenFunction r (Value n a)
iterate :: forall n a r.
(Positive n, C a) =>
(T a -> CodeGenFunction r (T a))
-> T a -> CodeGenFunction r (Value n a)
iterate T a -> CodeGenFunction r (T a)
f = (T (Vector n a) -> Value n a)
-> CodeGenFunction r (T (Vector n a))
-> CodeGenFunction r (Value 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 (Vector n a) -> Value n a
forall n a. T (Vector n a) -> Value n a
fromOrdinary (CodeGenFunction r (T (Vector n a))
 -> CodeGenFunction r (Value n a))
-> (T a -> CodeGenFunction r (T (Vector n a)))
-> T a
-> CodeGenFunction r (Value n a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (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 T a -> CodeGenFunction r (T a)
f

cumulate ::
   (TypeNum.Positive n, MultiVector.Additive a) =>
   MultiValue.T a -> Value n a ->
   LLVM.CodeGenFunction r (MultiValue.T a, Value n a)
cumulate :: forall n a r.
(Positive n, Additive a) =>
T a -> Value n a -> CodeGenFunction r (T a, Value n a)
cumulate T a
a =
   ((T a, T n a) -> (T a, Value n a))
-> CodeGenFunction r (T a, T n a)
-> CodeGenFunction r (T a, Value 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 n a -> Value n a) -> (T a, T n a) -> (T a, Value n a)
forall b c a. (b -> c) -> (a, b) -> (a, c)
mapSnd T n a -> Value n a
forall n a. T n a -> Value n a
fromMultiVector) (CodeGenFunction r (T a, T n a)
 -> CodeGenFunction r (T a, Value n a))
-> (Value n a -> CodeGenFunction r (T a, T n a))
-> Value n a
-> CodeGenFunction r (T a, Value n a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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))
-> (Value n a -> T n a)
-> Value n a
-> CodeGenFunction r (T a, T n a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Value n a -> T n a
forall n a. Value n a -> T n a
toMultiVector


fromOrdinary :: MultiValue.T (LLVM.Vector n a) -> Value n a
fromOrdinary :: forall n a. T (Vector n a) -> Value n a
fromOrdinary = T (Vector n a) -> T (T n a)
forall a b. (Repr a ~ Repr b) => T a -> T b
MultiValue.cast

toOrdinary :: Value n a -> MultiValue.T (LLVM.Vector n a)
toOrdinary :: forall n a. Value n a -> T (Vector n a)
toOrdinary = T (T n a) -> T (Vector n a)
forall a b. (Repr a ~ Repr b) => T a -> T b
MultiValue.cast

fromMultiVector :: MultiVector.T n a -> Value n a
fromMultiVector :: forall n a. T n a -> Value n a
fromMultiVector = T (Vector n a) -> Value n a
forall n a. T (Vector n a) -> Value n a
fromOrdinary (T (Vector n a) -> Value n a)
-> (T n a -> T (Vector n a)) -> T n a -> Value n a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T n a -> T (Vector n a)
forall n a. T n a -> MVVector n a
MultiVectorInst.toMultiValue

toMultiVector :: Value n a -> MultiVector.T n a
toMultiVector :: forall n a. Value n a -> T n a
toMultiVector = MVVector n a -> T n a
forall n a. MVVector n a -> T n a
MultiVectorInst.fromMultiValue (MVVector n a -> T n a)
-> (Value n a -> MVVector n a) -> Value n a -> T n a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Value n a -> MVVector n a
forall n a. Value n a -> T (Vector n a)
toOrdinary