module Data.Array.Accelerate.Linear.V1 (
V1(..), R1(..), ex,
) where
import Data.Array.Accelerate as A
import Data.Array.Accelerate.Array.Sugar
import Data.Array.Accelerate.Product
import Data.Array.Accelerate.Smart
import Data.Array.Accelerate.Type
import Data.Array.Accelerate.Linear.Lift
import Data.Array.Accelerate.Linear.Metric
import Data.Array.Accelerate.Linear.Type
import Data.Array.Accelerate.Linear.Vector
import Control.Lens
import Linear.V1 ( V1(..) )
import qualified Linear.V1 as L
import Prelude as P
class L.R1 t => R1 t where
_x :: (Elt a, Box t a) => Lens' (Exp (t a)) (Exp a)
_x = liftLens (L._x :: Lens' (t (Exp a)) (Exp a))
ex :: R1 t => E t
ex = E _x
instance Metric V1
instance Additive V1
instance R1 V1
type instance EltRepr (V1 a) = ((), EltRepr a)
instance Elt a => Elt (V1 a) where
eltType _ = PairTuple UnitTuple (eltType (undefined :: a))
toElt ((), x) = V1 (toElt x)
fromElt (V1 x) = ((), fromElt x)
instance cst a => IsProduct cst (V1 a) where
type ProdRepr (V1 a) = ((), a)
fromProd _ (V1 x) = ((), x)
toProd _ ((), x) = V1 x
prod _ _ = ProdRsnoc ProdRunit
instance (Lift Exp a, Elt (Plain a)) => Lift Exp (V1 a) where
type Plain (V1 a) = V1 (Plain a)
lift (V1 x) = Exp . Tuple $ NilTup `SnocTup` lift x
instance Elt a => Unlift Exp (V1 (Exp a)) where
unlift t = V1 $ Exp $ ZeroTupIdx `Prj` t
instance A.Num a => P.Num (Exp (V1 a)) where
(+) = lift2 ((+) :: V1 (Exp a) -> V1 (Exp a) -> V1 (Exp a))
() = lift2 (() :: V1 (Exp a) -> V1 (Exp a) -> V1 (Exp a))
(*) = lift2 ((*) :: V1 (Exp a) -> V1 (Exp a) -> V1 (Exp a))
negate = lift1 (negate :: V1 (Exp a) -> V1 (Exp a))
signum = lift1 (signum :: V1 (Exp a) -> V1 (Exp a))
abs = lift1 (signum :: V1 (Exp a) -> V1 (Exp a))
fromInteger x = lift (fromInteger x :: V1 (Exp a))
instance A.Floating a => P.Fractional (Exp (V1 a)) where
(/) = lift2 ((/) :: V1 (Exp a) -> V1 (Exp a) -> V1 (Exp a))
recip = lift1 (recip :: V1 (Exp a) -> V1 (Exp a))
fromRational x = lift (fromRational x :: V1 (Exp a))
instance A.Floating a => P.Floating (Exp (V1 a)) where
pi = lift (pi :: V1 (Exp a))
log = lift1 (log :: V1 (Exp a) -> V1 (Exp a))
exp = lift1 (exp :: V1 (Exp a) -> V1 (Exp a))
sin = lift1 (sin :: V1 (Exp a) -> V1 (Exp a))
cos = lift1 (cos :: V1 (Exp a) -> V1 (Exp a))
tan = lift1 (tan :: V1 (Exp a) -> V1 (Exp a))
sinh = lift1 (sinh :: V1 (Exp a) -> V1 (Exp a))
cosh = lift1 (cosh :: V1 (Exp a) -> V1 (Exp a))
tanh = lift1 (tanh :: V1 (Exp a) -> V1 (Exp a))
asin = lift1 (asin :: V1 (Exp a) -> V1 (Exp a))
acos = lift1 (acos :: V1 (Exp a) -> V1 (Exp a))
atan = lift1 (atan :: V1 (Exp a) -> V1 (Exp a))
asinh = lift1 (asinh :: V1 (Exp a) -> V1 (Exp a))
acosh = lift1 (acosh :: V1 (Exp a) -> V1 (Exp a))
atanh = lift1 (atanh :: V1 (Exp a) -> V1 (Exp a))
instance (Elt a, Elt b) => Each (Exp (V1 a)) (Exp (V1 b)) (Exp a) (Exp b) where
each = liftLens (each :: Traversal (V1 (Exp a)) (V1 (Exp b)) (Exp a) (Exp b))