module Tower.Algebra (
Magma(..)
, Unital(..)
, Associative(..)
, Commutative(..)
, Invertible(..)
, Idempotent(..)
, Homomorphic(..)
, Monoidal(..)
, CMonoidal(..)
, Loop(..)
, Group(..)
, Abelian(..)
, AdditiveMagma(..)
, AdditiveUnital(..)
, AdditiveAssociative(..)
, AdditiveCommutative(..)
, AdditiveInvertible(..)
, AdditiveHomomorphic(..)
, AdditiveMonoidal(..)
, Additive(..)
, AdditiveGroup(..)
, MultiplicativeMagma(..)
, MultiplicativeUnital(..)
, MultiplicativeAssociative(..)
, MultiplicativeCommutative(..)
, MultiplicativeInvertible(..)
, MultiplicativeHomomorphic(..)
, MultiplicativeMonoidal(..)
, Multiplicative(..)
, MultiplicativeGroup(..)
, Distributive(..)
, Semiring(..)
, Ring(..)
, Field(..)
, AdditiveBasis(..)
, AdditiveGroupBasis(..)
, AdditiveModule(..)
, AdditiveGroupModule(..)
, MultiplicativeBasis(..)
, MultiplicativeGroupBasis(..)
, MultiplicativeModule(..)
, MultiplicativeGroupModule(..)
, Integral(..)
, Metric(..)
, Normed(..)
, abs
, Banach(..)
, BoundedField(..)
, infinity
, ExpRing(..)
, (^)
, ExpField(..)
, Hilbert(..)
, TensorAlgebra(..)
, squaredInnerProductNorm
, innerProductNorm
, innerProductDistance
) where
import qualified Protolude as P
import Protolude (Double, Float, Int)
class Magma a where (⊕) :: a -> a -> a
class Magma a => Unital a where unit :: a
class Magma a => Associative a
class Magma a => Commutative a
class Magma a => Invertible a where inv :: a -> a
class Magma a => Idempotent a
class ( Magma a
, Magma b) =>
Homomorphic a b where hom :: a -> b
instance Magma a => Homomorphic a a where hom a = a
class ( Associative a
, Unital a) =>
Monoidal a
class ( Commutative a
, Associative a
, Unital a) =>
CMonoidal a
class ( Unital a
, Invertible a) =>
Loop a
class ( Associative a
, Unital a
, Invertible a) =>
Group a
groupSwap :: (Group a) => (a,a) -> (a,a)
groupSwap (a,b) =
let a' = a ⊕ b
b' = a ⊕ inv b
a'' = inv b' ⊕ a'
in (a'',b')
class ( Associative a
, Unital a
, Invertible a
, Commutative a) =>
Abelian a
class AdditiveMagma a where plus :: a -> a -> a
instance AdditiveMagma Double where plus = (P.+)
instance AdditiveMagma Float where plus = (P.+)
instance AdditiveMagma Int where plus = (P.+)
class AdditiveMagma a => AdditiveUnital a where zero :: a
instance AdditiveUnital Double where zero = 0
instance AdditiveUnital Float where zero = 0
instance AdditiveUnital Int where zero = 0
class AdditiveMagma a => AdditiveAssociative a
instance AdditiveAssociative Double
instance AdditiveAssociative Float
instance AdditiveAssociative Int
class AdditiveMagma a => AdditiveCommutative a
instance AdditiveCommutative Double
instance AdditiveCommutative Float
instance AdditiveCommutative Int
class AdditiveMagma a => AdditiveInvertible a where negate :: a -> a
instance AdditiveInvertible Double where negate = P.negate
instance AdditiveInvertible Float where negate = P.negate
instance AdditiveInvertible Int where negate = P.negate
class ( AdditiveMagma a
, AdditiveMagma b) =>
AdditiveHomomorphic a b where
plushom :: a -> b
instance AdditiveMagma a => AdditiveHomomorphic a a where plushom a = a
class ( AdditiveUnital a
, AdditiveAssociative a) =>
AdditiveMonoidal a
class ( AdditiveCommutative a
, AdditiveUnital a
, AdditiveAssociative a) =>
Additive a where
infixr 6 +
(+) :: a -> a -> a
a + b = plus a b
instance Additive Double
instance Additive Float
instance Additive Int
class ( Additive a
, AdditiveInvertible a) =>
AdditiveGroup a where
infixr 6
() :: a -> a -> a
() a b = a `plus` negate b
instance AdditiveGroup Double
instance AdditiveGroup Float
instance AdditiveGroup Int
class MultiplicativeMagma a where times :: a -> a -> a
instance MultiplicativeMagma Double where times = (P.*)
instance MultiplicativeMagma Float where times = (P.*)
instance MultiplicativeMagma Int where times = (P.*)
class MultiplicativeMagma a => MultiplicativeUnital a where one :: a
instance MultiplicativeUnital Double where one = 1
instance MultiplicativeUnital Float where one = 1
instance MultiplicativeUnital Int where one = 1
class MultiplicativeMagma a => MultiplicativeCommutative a
instance MultiplicativeCommutative Double
instance MultiplicativeCommutative Float
instance MultiplicativeCommutative Int
class MultiplicativeMagma a => MultiplicativeAssociative a
instance MultiplicativeAssociative Double
instance MultiplicativeAssociative Float
instance MultiplicativeAssociative Int
class MultiplicativeMagma a => MultiplicativeInvertible a where recip :: a -> a
instance MultiplicativeInvertible Double where recip = P.recip
instance MultiplicativeInvertible Float where recip = P.recip
class ( MultiplicativeMagma a
, MultiplicativeMagma b) =>
MultiplicativeHomomorphic a b where
timeshom :: a -> b
instance MultiplicativeMagma a => MultiplicativeHomomorphic a a where
timeshom a = a
class ( MultiplicativeUnital a
, MultiplicativeAssociative a) =>
MultiplicativeMonoidal a
class ( MultiplicativeCommutative a
, MultiplicativeUnital a
, MultiplicativeAssociative a) =>
Multiplicative a where
infixr 7 *
(*) :: a -> a -> a
a * b = times a b
instance Multiplicative Double
instance Multiplicative Float
instance Multiplicative Int
class ( Multiplicative a
, MultiplicativeInvertible a) =>
MultiplicativeGroup a where
infixr 7 /
(/) :: a -> a -> a
(/) a b = a `times` recip b
instance MultiplicativeGroup Double
instance MultiplicativeGroup Float
class (
Additive a
, MultiplicativeMagma a
) => Distributive a
instance Distributive Double
instance Distributive Float
instance Distributive Int
class ( Additive a
, MultiplicativeAssociative a
, MultiplicativeUnital a
, Distributive a) =>
Semiring a
instance Semiring Double
instance Semiring Float
instance Semiring Int
class ( AdditiveGroup a
, MultiplicativeAssociative a
, MultiplicativeUnital a
, Distributive a) =>
Ring a
instance Ring Double
instance Ring Float
class ( AdditiveGroup a
, Multiplicative a
, Distributive a) =>
DivisionRing a
instance DivisionRing Double
instance DivisionRing Float
class ( AdditiveGroup a
, MultiplicativeGroup a
, Distributive a) =>
Field a
instance Field Double
instance Field Float
class ( Additive a
, AdditiveHomomorphic a a) =>
AdditiveBasis a where
infixr 7 .+.
(.+.) :: a -> a -> a
a .+. b = plushom a + plushom b
class ( AdditiveGroup a
, AdditiveHomomorphic a a) =>
AdditiveGroupBasis a where
infixr 7 .-.
(.-.) :: a -> a -> a
a .-. b = plushom a plushom b
class ( Additive a
, Additive s
, AdditiveHomomorphic s a) =>
AdditiveModule s a where
infixr 7 .+
(.+) :: AdditiveModule s a => s -> a -> a
s .+ a = plushom s + a
infixr 7 +.
(+.) :: AdditiveModule s a => a -> s -> a
a +. s = a + plushom s
class ( AdditiveModule s a
, AdditiveGroup a) =>
AdditiveGroupModule s a where
infixr 7 .-
(.-) :: AdditiveModule s a => s -> a -> a
s .- a = plushom s + a
infixr 7 -.
(-.) :: AdditiveModule s a => a -> s -> a
a -. s = a plushom s
class ( Multiplicative a
, MultiplicativeHomomorphic a a) =>
MultiplicativeBasis a where
infixr 7 .*.
(.*.) :: a -> a -> a
a .*. b = timeshom a * timeshom b
class ( MultiplicativeGroup a
, MultiplicativeHomomorphic a a) =>
MultiplicativeGroupBasis a where
infixr 7 ./.
(./.) :: a -> a -> a
a ./. b = timeshom a / timeshom b
class ( Multiplicative a
, Multiplicative s
, MultiplicativeHomomorphic s a) =>
MultiplicativeModule s a where
infixr 7 .*
(.*) :: MultiplicativeModule s a => s -> a -> a
s .* a = timeshom s * a
infixr 7 *.
(*.) :: MultiplicativeModule s a => a -> s -> a
a *. s = a * timeshom s
class ( MultiplicativeModule s a
, MultiplicativeGroup a) =>
MultiplicativeGroupModule s a where
infixr 7 ./
(./) :: MultiplicativeModule s a => s -> a -> a
s ./ a = timeshom s * a
infixr 7 /.
(/.) :: MultiplicativeModule s a => a -> s -> a
a /. s = a / timeshom s
class (Additive a, Multiplicative a) => Integral a where
toInteger :: a -> P.Integer
infixl 7 `div`, `mod`
div :: a -> a -> a
div a1 a2 = P.fst (divMod a1 a2)
mod :: a -> a -> a
mod a1 a2 = P.snd (divMod a1 a2)
divMod :: a -> a -> (a,a)
instance Integral Int where
toInteger = P.toInteger
divMod = P.divMod
class Metric r m where
d :: m -> m -> r
class Normed a where
size :: a -> a
abs :: Normed a => a -> a
abs = size
class ( MultiplicativeGroup a
, MultiplicativeModule a a
, MultiplicativeGroupModule a a
, MultiplicativeInvertible a
, Normed a) =>
Banach a where
normalize :: a -> a
normalize a = a ./ size a
class ( Field a
, P.Bounded a) =>
BoundedField a where
nan :: a
nan = zero/zero
instance P.Bounded Float where
maxBound = one/zero
minBound = negate (one/zero)
instance BoundedField Float
instance P.Bounded Double where
maxBound = one/zero
minBound = negate (one/zero)
instance BoundedField Double
infinity :: BoundedField a => a
infinity = P.maxBound
class Ring a => ExpRing a where
logBase :: a -> a -> a
(**) :: ExpRing a => a -> a -> a
(**) = P.undefined
(^) :: ExpRing a => a -> a -> a
(^) = (**)
class ( Field a
, ExpRing a ) =>
ExpField a where
sqrt :: a -> a
sqrt a = a**(one/one+one)
exp :: a -> a
log :: a -> a
infixr 8 ><
type family (><) (a::k1) (b::k2) :: *
class TensorAlgebra a where
(><) :: a -> a -> (a><a)
timesleft :: a -> (a><a) -> a
timesright :: (a><a) -> a -> a
class (Banach a, TensorAlgebra a, ExpField r, AdditiveGroup a) => Hilbert a r where
infix 8 <?>
(<?>) :: a -> a -> r
squaredInnerProductNorm :: Hilbert v r => v -> r
squaredInnerProductNorm v = v <?> v
innerProductNorm :: (Hilbert v r) => v -> r
innerProductNorm = sqrt P.. squaredInnerProductNorm
innerProductDistance :: Hilbert v r => v -> v -> r
innerProductDistance v1 v2 = innerProductNorm (v1 v2)