{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances #-}
module Algebra.AffineSpace where
import qualified Algebra.PrincipalIdealDomain as PID
import qualified Algebra.Additive as Additive
import qualified Algebra.Module as Module
import qualified Number.Ratio as Ratio
import qualified Number.Complex as Complex
import Control.Applicative (Applicative(pure, (<*>)), )
import NumericPrelude.Numeric hiding (zero, )
import NumericPrelude.Base
import Prelude ()
class Zero v => C a v where
multiplyAccumulate :: (a,v) -> v -> v
class Zero v where
zero :: v
instance Zero Float where
{-# INLINE zero #-}
zero :: Float
zero = Float
forall a. C a => a
Additive.zero
instance Zero Double where
{-# INLINE zero #-}
zero :: Double
zero = Double
forall a. C a => a
Additive.zero
instance (Zero a) => Zero (Complex.T a) where
{-# INLINE zero #-}
zero :: T a
zero = a
forall v. Zero v => v
zero a -> a -> T a
forall a. a -> a -> T a
Complex.+: a
forall v. Zero v => v
zero
instance (PID.C a) => Zero (Ratio.T a) where
{-# INLINE zero #-}
zero :: T a
zero = T a
forall a. C a => a
Additive.zero
instance C Float Float where
{-# INLINE multiplyAccumulate #-}
multiplyAccumulate :: (Float, Float) -> Float -> Float
multiplyAccumulate (Float
a,Float
x) Float
y = Float
aFloat -> Float -> Float
forall a. C a => a -> a -> a
*Float
xFloat -> Float -> Float
forall a. C a => a -> a -> a
+Float
y
instance C Double Double where
{-# INLINE multiplyAccumulate #-}
multiplyAccumulate :: (Double, Double) -> Double -> Double
multiplyAccumulate (Double
a,Double
x) Double
y = Double
aDouble -> Double -> Double
forall a. C a => a -> a -> a
*Double
xDouble -> Double -> Double
forall a. C a => a -> a -> a
+Double
y
instance (C a v) => C a (Complex.T v) where
{-# INLINE multiplyAccumulate #-}
multiplyAccumulate :: (a, T v) -> T v -> T v
multiplyAccumulate =
(v -> v -> T v)
-> (T v -> v) -> (T v -> v) -> (a, T v) -> T v -> T v
forall a x y v.
(C a x, C a y) =>
(x -> y -> v) -> (v -> x) -> (v -> y) -> (a, v) -> v -> v
makeMac2 v -> v -> T v
forall a. a -> a -> T a
(Complex.+:) T v -> v
forall a. T a -> a
Complex.real T v -> v
forall a. T a -> a
Complex.imag
instance (PID.C a) => C (Ratio.T a) (Ratio.T a) where
{-# INLINE multiplyAccumulate #-}
multiplyAccumulate :: (T a, T a) -> T a -> T a
multiplyAccumulate (T a
a,T a
x) T a
y = T a
aT a -> T a -> T a
forall a. C a => a -> a -> a
*T a
xT a -> T a -> T a
forall a. C a => a -> a -> a
+T a
y
infixl 6 *.+
{-# INLINE (*.+) #-}
(*.+) :: C a v => v -> (a,v) -> v
*.+ :: v -> (a, v) -> v
(*.+) = ((a, v) -> v -> v) -> v -> (a, v) -> v
forall a b c. (a -> b -> c) -> b -> a -> c
flip (a, v) -> v -> v
forall a v. C a v => (a, v) -> v -> v
multiplyAccumulate
{-# INLINE multiplyAccumulateModule #-}
multiplyAccumulateModule ::
Module.C a v =>
(a,v) -> v -> v
multiplyAccumulateModule :: (a, v) -> v -> v
multiplyAccumulateModule (a
a,v
x) v
y =
a
a a -> v -> v
forall a v. C a v => a -> v -> v
*> v
x v -> v -> v
forall a. C a => a -> a -> a
+ v
y
newtype MAC a v x = MAC {MAC a v x -> (a, v) -> v -> x
runMac :: (a,v) -> v -> x}
{-# INLINE element #-}
element ::
(C a x) =>
(v -> x) -> MAC a v x
element :: (v -> x) -> MAC a v x
element v -> x
f =
((a, v) -> v -> x) -> MAC a v x
forall a v x. ((a, v) -> v -> x) -> MAC a v x
MAC (\(a
a,v
x) v
y -> (a, x) -> x -> x
forall a v. C a v => (a, v) -> v -> v
multiplyAccumulate (a
a, v -> x
f v
x) (v -> x
f v
y))
instance Functor (MAC a v) where
{-# INLINE fmap #-}
fmap :: (a -> b) -> MAC a v a -> MAC a v b
fmap a -> b
f (MAC (a, v) -> v -> a
x) =
((a, v) -> v -> b) -> MAC a v b
forall a v x. ((a, v) -> v -> x) -> MAC a v x
MAC (((a, v) -> v -> b) -> MAC a v b)
-> ((a, v) -> v -> b) -> MAC a v b
forall a b. (a -> b) -> a -> b
$ \(a, v)
av v
v -> a -> b
f (a -> b) -> a -> b
forall a b. (a -> b) -> a -> b
$ (a, v) -> v -> a
x (a, v)
av v
v
instance Applicative (MAC a v) where
{-# INLINE pure #-}
{-# INLINE (<*>) #-}
pure :: a -> MAC a v a
pure a
x = ((a, v) -> v -> a) -> MAC a v a
forall a v x. ((a, v) -> v -> x) -> MAC a v x
MAC (((a, v) -> v -> a) -> MAC a v a)
-> ((a, v) -> v -> a) -> MAC a v a
forall a b. (a -> b) -> a -> b
$ \ (a, v)
_av v
_v -> a
x
MAC (a, v) -> v -> a -> b
f <*> :: MAC a v (a -> b) -> MAC a v a -> MAC a v b
<*> MAC (a, v) -> v -> a
x =
((a, v) -> v -> b) -> MAC a v b
forall a v x. ((a, v) -> v -> x) -> MAC a v x
MAC (((a, v) -> v -> b) -> MAC a v b)
-> ((a, v) -> v -> b) -> MAC a v b
forall a b. (a -> b) -> a -> b
$ \(a, v)
av v
v -> (a, v) -> v -> a -> b
f (a, v)
av v
v (a -> b) -> a -> b
forall a b. (a -> b) -> a -> b
$ (a, v) -> v -> a
x (a, v)
av v
v
{-# INLINE makeMac #-}
makeMac ::
(C a x) =>
(x -> v) ->
(v -> x) ->
(a,v) -> v -> v
makeMac :: (x -> v) -> (v -> x) -> (a, v) -> v -> v
makeMac x -> v
cons v -> x
x =
MAC a v v -> (a, v) -> v -> v
forall a v x. MAC a v x -> (a, v) -> v -> x
runMac (MAC a v v -> (a, v) -> v -> v) -> MAC a v v -> (a, v) -> v -> v
forall a b. (a -> b) -> a -> b
$ (x -> v) -> MAC a v (x -> v)
forall (f :: * -> *) a. Applicative f => a -> f a
pure x -> v
cons MAC a v (x -> v) -> MAC a v x -> MAC a v v
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (v -> x) -> MAC a v x
forall a x v. C a x => (v -> x) -> MAC a v x
element v -> x
x
{-# INLINE makeMac2 #-}
makeMac2 ::
(C a x, C a y) =>
(x -> y -> v) ->
(v -> x) -> (v -> y) ->
(a,v) -> v -> v
makeMac2 :: (x -> y -> v) -> (v -> x) -> (v -> y) -> (a, v) -> v -> v
makeMac2 x -> y -> v
cons v -> x
x v -> y
y =
MAC a v v -> (a, v) -> v -> v
forall a v x. MAC a v x -> (a, v) -> v -> x
runMac (MAC a v v -> (a, v) -> v -> v) -> MAC a v v -> (a, v) -> v -> v
forall a b. (a -> b) -> a -> b
$ (x -> y -> v) -> MAC a v (x -> y -> v)
forall (f :: * -> *) a. Applicative f => a -> f a
pure x -> y -> v
cons MAC a v (x -> y -> v) -> MAC a v x -> MAC a v (y -> v)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (v -> x) -> MAC a v x
forall a x v. C a x => (v -> x) -> MAC a v x
element v -> x
x MAC a v (y -> v) -> MAC a v y -> MAC a v v
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (v -> y) -> MAC a v y
forall a x v. C a x => (v -> x) -> MAC a v x
element v -> y
y
{-# INLINE makeMac3 #-}
makeMac3 ::
(C a x, C a y, C a z) =>
(x -> y -> z -> v) ->
(v -> x) -> (v -> y) -> (v -> z) ->
(a,v) -> v -> v
makeMac3 :: (x -> y -> z -> v)
-> (v -> x) -> (v -> y) -> (v -> z) -> (a, v) -> v -> v
makeMac3 x -> y -> z -> v
cons v -> x
x v -> y
y v -> z
z =
MAC a v v -> (a, v) -> v -> v
forall a v x. MAC a v x -> (a, v) -> v -> x
runMac (MAC a v v -> (a, v) -> v -> v) -> MAC a v v -> (a, v) -> v -> v
forall a b. (a -> b) -> a -> b
$ (x -> y -> z -> v) -> MAC a v (x -> y -> z -> v)
forall (f :: * -> *) a. Applicative f => a -> f a
pure x -> y -> z -> v
cons MAC a v (x -> y -> z -> v) -> MAC a v x -> MAC a v (y -> z -> v)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (v -> x) -> MAC a v x
forall a x v. C a x => (v -> x) -> MAC a v x
element v -> x
x MAC a v (y -> z -> v) -> MAC a v y -> MAC a v (z -> v)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (v -> y) -> MAC a v y
forall a x v. C a x => (v -> x) -> MAC a v x
element v -> y
y MAC a v (z -> v) -> MAC a v z -> MAC a v v
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (v -> z) -> MAC a v z
forall a x v. C a x => (v -> x) -> MAC a v x
element v -> z
z