module Linear.Class
( AbelianGroup(..) , vecSum
, MultSemiGroup(..) , Ring , semigroupProduct
, LeftModule(..) , RightModule(..)
, Vector(..) , DotProd(..) , Norm(..) , CrossProd(..)
, normalize , distance , angle , angle'
, UnitVector(..)
, Pointwise(..)
, Extend(..) , Dimension(..) , Transpose(..)
, SquareMatrix(..) , Tensor(..) , Diagonal (..) , Determinant(..)
, Orthogonal(..) , Projective(..) , MatrixNorms(..)
, project , project' , projectUnsafe , flipNormal
, householder, householderOrtho
)
where
class AbelianGroup g where
(&+) :: g -> g -> g
(&-) :: g -> g -> g
neg :: g -> g
zero :: g
infixl 6 &+
infixl 6 &-
vecSum :: AbelianGroup g => [g] -> g
vecSum l = foldl (&+) zero l
class MultSemiGroup r where
(.*.) :: r -> r -> r
one :: r
class (AbelianGroup r, MultSemiGroup r) => Ring r
infixl 7 .*.
semigroupProduct :: MultSemiGroup r => [r] -> r
semigroupProduct l = foldl (.*.) one l
class LeftModule r m where
lmul :: r -> m -> m
(*.) :: r -> m -> m
(*.) = lmul
class RightModule m r | m -> r, r -> m where
rmul :: m -> r -> m
(.*) :: m -> r -> m
(.*) = rmul
infixr 7 *.
infixl 7 .*
class AbelianGroup (v a) => Vector a v where
mapVec :: (a -> a) -> v a -> v a
scalarMul :: a -> v a -> v a
(*&) :: a -> v a -> v a
(&*) :: v a -> a -> v a
(*&) s v = scalarMul s v
(&*) v s = scalarMul s v
infixr 7 *&
infixl 7 &*
class Num a => DotProd a v where
(&.) :: v a -> v a -> a
dotprod :: v a -> v a -> a
dotprod = (&.)
normsqr :: v a -> a
normsqr v = (v &. v)
lensqr :: v a -> a
lensqr = normsqr
class (Floating a, DotProd a v) => Norm a v where
norm :: v a -> a
norm = sqrt . lensqr
vlen :: v a -> a
vlen = norm
infix 7 &.
normalize :: (Vector a v, Norm a v) => v a -> v a
normalize v = scalarMul (recip (vlen v)) v
distance :: (Vector a v, Norm a v) => v a -> v a -> a
distance x y = norm (x &- y)
angle :: (Vector a v, Norm a v) => v a -> v a -> a
angle x y = acos $ (x &. y) / (norm x * norm y)
angle' :: (Floating a, Vector a v, UnitVector a v u, DotProd a v) => u a -> u a -> a
angle' x y = acos (fromNormal x &. fromNormal y)
class (Vector a v, Norm a v) => UnitVector a v u | u -> v, v -> u where
mkNormal :: v a -> u a
toNormalUnsafe :: v a -> u a
fromNormal :: u a -> v a
fromNormalRadius :: a -> u a -> v a
fromNormalRadius t n = t *& fromNormal n
project' :: (Vector a v, UnitVector a v u, Norm a v) => v a -> u a -> v a
project' what dir = projectUnsafe what (fromNormal dir)
projectUnsafe :: (Vector a v, DotProd a v) => v a -> v a -> v a
projectUnsafe what dir = what &- dir &* (what &. dir)
project :: (Fractional a, Vector a v, DotProd a v) => v a -> v a -> v a
project what dir = what &- dir &* ((what &. dir) / (dir &. dir))
flipNormal :: UnitVector a v n => n a -> n a
flipNormal = toNormalUnsafe . neg . fromNormal
class CrossProd v where
crossprod :: v -> v -> v
(&^) :: v -> v -> v
(&^) = crossprod
class Pointwise v where
pointwise :: v -> v -> v
(&!) :: v -> v -> v
(&!) = pointwise
infix 7 &^
infix 7 &!
class Extend a u v where
extendZero :: u a -> v a
extendWith :: a -> u a -> v a
trim :: v a -> u a
class Diagonal s t | t->s where
diag :: s -> t
class Transpose m n | m -> n, n -> m where
transpose :: m -> n
class SquareMatrix m where
inverse :: m -> m
idmtx :: m
class SquareMatrix (m a) => Orthogonal a m o | m -> o, o -> m where
fromOrtho :: o a -> m a
toOrthoUnsafe :: m a -> o a
class (AbelianGroup m, SquareMatrix m) => MatrixNorms a m where
frobeniusNorm :: m -> a
matrixDistance :: m -> m -> a
operatorNorm :: m -> a
matrixDistance m n = frobeniusNorm (n &- m)
operatorNorm = error "operatorNorm: not implemented yet"
class Tensor t v | t -> v where
outer :: v -> v -> t
class Determinant a m where
det :: m -> a
class Dimension a where
dim :: a -> Int
householder :: (Vector a v, UnitVector a v u, SquareMatrix (m a), Vector a m, Tensor (m a) (v a)) => u a -> m a
householder u = idmtx &- (2 *& outer v v)
where v = fromNormal u
householderOrtho :: (Vector a v, UnitVector a v u, SquareMatrix (m a), Vector a m, Tensor (m a) (v a), Orthogonal a m o) => u a -> o a
householderOrtho = toOrthoUnsafe . householder
class (Vector a v, Orthogonal a n o, Diagonal (v a) (n a)) => Projective a v n o m p | m -> p, p -> m, p -> o, o -> p, p -> n, n -> p, p -> v, v -> p, n -> o, n -> v, v -> n where
fromProjective :: p a -> m a
toProjectiveUnsafe :: m a -> p a
orthogonal :: o a -> p a
linear :: n a -> p a
translation :: v a -> p a
scaling :: v a -> p a