-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/
-- | Vector & affine spaces, linear maps, and derivatives (requires ghc 6.9 or better)
--
-- vector-space provides classes and generic operations for vector
-- spaces and affine spaces. It also defines a type of infinite towers of
-- generalized derivatives. A generalized derivative is a linear
-- transformation rather than one of the common concrete representations
-- (scalars, vectors, matrices, ...).
--
-- Warning: this package depends on type families working fairly
-- well, and requires ghc version at least 6.9.
--
-- Project wiki page: http://haskell.org/haskellwiki/vector-space
--
-- © 2008-2010 by Conal Elliott; BSD3 license.
@package vector-space
@version 0.6.2
-- | Number class instances for functions and tuples
module Data.NumInstances
instance (Floating a, Floating b, Floating c, Floating d) => Floating (a, b, c, d)
instance (Fractional a, Fractional b, Fractional c, Fractional d) => Fractional (a, b, c, d)
instance (Num a, Num b, Num c, Num d) => Num (a, b, c, d)
instance (Floating a, Floating b, Floating c) => Floating (a, b, c)
instance (Fractional a, Fractional b, Fractional c) => Fractional (a, b, c)
instance (Num a, Num b, Num c) => Num (a, b, c)
instance (Floating a, Floating b) => Floating (a, b)
instance (Fractional a, Fractional b) => Fractional (a, b)
instance (Num a, Num b) => Num (a, b)
instance (Floating b) => Floating (a -> b)
instance (Fractional b) => Fractional (a -> b)
instance (Num b) => Num (a -> b)
instance Show (a -> b)
instance (Ord b) => Ord (a -> b)
instance Eq (a -> b)
-- | Groups: zero, addition, and negation (additive inverse)
module Data.AdditiveGroup
-- | Additive group v.
class AdditiveGroup v
zeroV :: (AdditiveGroup v) => v
(^+^) :: (AdditiveGroup v) => v -> v -> v
negateV :: (AdditiveGroup v) => v -> v
-- | Group subtraction
(^-^) :: (AdditiveGroup v) => v -> v -> v
-- | Sum over several vectors
sumV :: (AdditiveGroup v) => [v] -> v
-- | Monoid under group addition. Alternative to the Sum in
-- Data.Monoid, which uses Num instead of
-- AdditiveGroup.
newtype Sum a
Sum :: a -> Sum a
getSum :: Sum a -> a
-- | Application a unary function inside a Sum
inSum :: (a -> b) -> (Sum a -> Sum b)
-- | Application a binary function inside a Sum
inSum2 :: (a -> b -> c) -> (Sum a -> Sum b -> Sum c)
instance (Eq a) => Eq (Sum a)
instance (Ord a) => Ord (Sum a)
instance (Read a) => Read (Sum a)
instance (Show a) => Show (Sum a)
instance (Bounded a) => Bounded (Sum a)
instance (AdditiveGroup a) => AdditiveGroup (Sum a)
instance (AdditiveGroup a) => Monoid (Sum a)
instance Applicative Sum
instance Functor Sum
instance (HasTrie u, AdditiveGroup v) => AdditiveGroup (u :->: v)
instance (AdditiveGroup a) => AdditiveGroup (Maybe a)
instance (AdditiveGroup v) => AdditiveGroup (a -> v)
instance (AdditiveGroup u, AdditiveGroup v, AdditiveGroup w, AdditiveGroup x) => AdditiveGroup (u, v, w, x)
instance (AdditiveGroup u, AdditiveGroup v, AdditiveGroup w) => AdditiveGroup (u, v, w)
instance (AdditiveGroup u, AdditiveGroup v) => AdditiveGroup (u, v)
instance (RealFloat v, AdditiveGroup v) => AdditiveGroup (Complex v)
instance AdditiveGroup Double
instance AdditiveGroup Float
instance AdditiveGroup Integer
instance AdditiveGroup Int
instance AdditiveGroup ()
-- | Vector spaces
--
-- This version uses associated types instead of fundeps and requires
-- ghc-6.10 or later
module Data.VectorSpace
-- | Vector space v.
class (AdditiveGroup v) => VectorSpace v where { type family Scalar v :: *; }
(*^) :: (VectorSpace v) => Scalar v -> v -> v
-- | Vector divided by scalar
(^/) :: (VectorSpace v, s ~ (Scalar v), Fractional s) => v -> s -> v
-- | Vector multiplied by scalar
(^*) :: (VectorSpace v, s ~ (Scalar v)) => v -> s -> v
-- | Adds inner (dot) products.
class (VectorSpace v) => InnerSpace v
(<.>) :: (InnerSpace v) => v -> v -> Scalar v
-- | Linear interpolation between a (when t==0) and
-- b (when t==1).
lerp :: (VectorSpace v) => v -> v -> Scalar v -> v
-- | Square of the length of a vector. Sometimes useful for efficiency. See
-- also magnitude.
magnitudeSq :: (InnerSpace v, s ~ (Scalar v)) => v -> s
-- | Length of a vector. See also magnitudeSq.
magnitude :: (InnerSpace v, s ~ (Scalar v), Floating s) => v -> s
-- | Vector in same direction as given one but with length of one. If given
-- the zero vector, then return it.
normalized :: (InnerSpace v, s ~ (Scalar v), Floating s) => v -> v
instance (InnerSpace a, AdditiveGroup (Scalar a)) => InnerSpace (Maybe a)
instance (HasTrie a, VectorSpace v) => VectorSpace (a :->: v)
instance (InnerSpace v) => InnerSpace (a -> v)
instance (VectorSpace v) => VectorSpace (a -> v)
instance (VectorSpace v) => VectorSpace (Maybe v)
instance (s ~ Scalar u, s ~ Scalar v, s ~ Scalar w, s ~ Scalar x, InnerSpace u, InnerSpace v, InnerSpace w, InnerSpace x, AdditiveGroup s) => InnerSpace (u, v, w, x)
instance (s ~ Scalar u, s ~ Scalar v, s ~ Scalar w, s ~ Scalar x, VectorSpace u, VectorSpace v, VectorSpace w, VectorSpace x) => VectorSpace (u, v, w, x)
instance (s ~ Scalar u, s ~ Scalar v, s ~ Scalar w, InnerSpace u, InnerSpace v, InnerSpace w, AdditiveGroup s) => InnerSpace (u, v, w)
instance (s ~ Scalar u, s ~ Scalar v, s ~ Scalar w, VectorSpace u, VectorSpace v, VectorSpace w) => VectorSpace (u, v, w)
instance (s ~ Scalar u, s ~ Scalar v, InnerSpace u, InnerSpace v, AdditiveGroup (Scalar v)) => InnerSpace (u, v)
instance (s ~ Scalar u, s ~ Scalar v, VectorSpace u, VectorSpace v) => VectorSpace (u, v)
instance (s ~ Scalar v, RealFloat v, InnerSpace v, AdditiveGroup s) => InnerSpace (Complex v)
instance (RealFloat v, VectorSpace v) => VectorSpace (Complex v)
instance InnerSpace Float
instance VectorSpace Float
instance InnerSpace Double
instance VectorSpace Double
-- | Basis of a vector space, as an associated type This module requires
-- ghc-6.10 or later
module Data.Basis
class (VectorSpace v) => HasBasis v where { type family Basis v :: *; }
basisValue :: (HasBasis v) => Basis v -> v
decompose :: (HasBasis v) => v -> [(Basis v, Scalar v)]
decompose' :: (HasBasis v) => v -> (Basis v -> Scalar v)
-- | Linear combination
linearCombo :: (VectorSpace v) => [(v, Scalar v)] -> v
recompose :: (HasBasis v) => [(Basis v, Scalar v)] -> v
instance (s ~ Scalar u, s ~ Scalar v, s ~ Scalar w, HasBasis u, HasBasis v, HasBasis w) => HasBasis (u, v, w)
instance (s ~ Scalar u, s ~ Scalar v, HasBasis u, HasBasis v) => HasBasis (u, v)
instance HasBasis Double
instance HasBasis Float
-- | Affine spaces.
module Data.AffineSpace
class (AdditiveGroup (Diff p)) => AffineSpace p where { type family Diff p; }
(.-.) :: (AffineSpace p) => p -> p -> Diff p
(.+^) :: (AffineSpace p) => p -> Diff p -> p
-- | Point minus vector
(.-^) :: (AffineSpace p) => p -> Diff p -> p
-- | Square of the distance between two points. Sometimes useful for
-- efficiency. See also distance.
distanceSq :: (AffineSpace p, v ~ (Diff p), InnerSpace v) => p -> p -> Scalar v
-- | Distance between two points. See also distanceSq.
distance :: (AffineSpace p, v ~ (Diff p), InnerSpace v, s ~ (Scalar v), Floating (Scalar v)) => p -> p -> s
-- | Affine linear interpolation. Varies from p to p' as
-- s varies from 0 to 1. See also lerp (on vector
-- spaces).
alerp :: (AffineSpace p, VectorSpace (Diff p)) => p -> p -> Scalar (Diff p) -> p
instance (AffineSpace p) => AffineSpace (a -> p)
instance (AffineSpace p, AffineSpace q, AffineSpace r) => AffineSpace (p, q, r)
instance (AffineSpace p, AffineSpace q) => AffineSpace (p, q)
instance AffineSpace Float
instance AffineSpace Double
-- | Linear maps
module Data.LinearMap
-- | Linear map, represented as an optional memo-trie from basis to values,
-- where Nothing means the zero map (an optimization).
type :-* u v = MSum (Basis u :->: v)
-- | Function (assumed linear) as linear map.
linear :: (HasBasis u, HasTrie (Basis u)) => (u -> v) -> (u :-* v)
-- | Apply a linear map to a vector.
lapply :: (VectorSpace v, (Scalar u) ~ (Scalar v), HasBasis u, HasTrie (Basis u)) => (u :-* v) -> (u -> v)
-- | Evaluate a linear map on a basis element. I've loosened the type to
-- work around a typing problem in derivAtBasis. atBasis ::
-- (AdditiveGroup v, HasTrie (Basis u)) => (u :-* v) -> Basis u
-- -> v
atBasis :: (HasTrie a, AdditiveGroup b) => MSum (a :->: b) -> a -> b
idL :: (HasBasis u, HasTrie (Basis u)) => u :-* u
-- | Compose linear maps
(*.*) :: (HasBasis u, HasTrie (Basis u), HasBasis v, HasTrie (Basis v), VectorSpace w, (Scalar v) ~ (Scalar w)) => (v :-* w) -> (u :-* v) -> (u :-* w)
liftMS :: (AdditiveGroup a) => (a -> b) -> (MSum a -> MSum b)
liftMS2 :: (AdditiveGroup a, AdditiveGroup b) => (a -> b -> c) -> (MSum a -> MSum b -> MSum c)
liftMS3 :: (AdditiveGroup a, AdditiveGroup b, AdditiveGroup c) => (a -> b -> c -> d) -> (MSum a -> MSum b -> MSum c -> MSum d)
-- | Apply a linear function to each element of a linear map. liftL f l
-- == linear f *.* l, but works more efficiently.
liftL :: (Functor f, AdditiveGroup (f a)) => (a -> b) -> MSum (f a) -> MSum (f b)
-- | Apply a linear binary function (not to be confused with a bilinear
-- function) to each element of a linear map.
liftL2 :: (Applicative f, AdditiveGroup (f a), AdditiveGroup (f b)) => (a -> b -> c) -> (MSum (f a) -> MSum (f b) -> MSum (f c))
-- | Apply a linear ternary function (not to be confused with a trilinear
-- function) to each element of a linear map.
liftL3 :: (Applicative f, AdditiveGroup (f a), AdditiveGroup (f b), AdditiveGroup (f c)) => (a -> b -> c -> d) -> (MSum (f a) -> MSum (f b) -> MSum (f c) -> MSum (f d))
-- | Infinite derivative towers via linear maps, using the Maclaurin
-- representation. See blog posts
-- http://conal.net/blog/tag/derivatives/.
module Data.Maclaurin
-- | Tower of derivatives.
data (:>) a b
D :: b -> a :-* (a :> b) -> :> a b
powVal :: :> a b -> b
derivative :: :> a b -> a :-* (a :> b)
-- | Sample the derivative at a basis element. Optimized for partial
-- application to save work for non-scalar derivatives.
derivAtBasis :: (HasTrie (Basis a), HasBasis a, AdditiveGroup b) => (a :> b) -> (Basis a -> (a :> b))
-- | Infinitely differentiable functions
type :~> a b = a -> (a :> b)
-- | Constant derivative tower.
pureD :: (AdditiveGroup b, HasBasis a, HasTrie (Basis a)) => b -> a :> b
fmapD :: (HasBasis a, HasTrie (Basis a), AdditiveGroup b) => (b -> c) -> (a :> b) -> (a :> c)
-- | Map a linear function over a derivative tower.
(<$>>) :: (HasBasis a, HasTrie (Basis a), AdditiveGroup b) => (b -> c) -> (a :> b) -> (a :> c)
-- | Apply a linear binary function over derivative towers.
liftD2 :: (HasBasis a, HasTrie (Basis a), AdditiveGroup b, AdditiveGroup c) => (b -> c -> d) -> (a :> b) -> (a :> c) -> (a :> d)
-- | Apply a linear ternary function over derivative towers.
liftD3 :: (HasBasis a, HasTrie (Basis a), AdditiveGroup b, AdditiveGroup c, AdditiveGroup d) => (b -> c -> d -> e) -> (a :> b) -> (a :> c) -> (a :> d) -> (a :> e)
-- | Differentiable identity function. Sometimes called the derivation
-- variable or similar, but it's not really a variable.
idD :: (VectorSpace u, s ~ (Scalar u), VectorSpace (u :> u), VectorSpace s, HasBasis u, HasTrie (Basis u)) => u :~> u
-- | Differentiable version of fst
fstD :: (HasBasis a, HasTrie (Basis a), HasBasis b, HasTrie (Basis b), (Scalar a) ~ (Scalar b)) => (a, b) :~> a
-- | Differentiable version of snd
sndD :: (HasBasis a, HasTrie (Basis a), HasBasis b, HasTrie (Basis b), (Scalar a) ~ (Scalar b)) => (a, b) :~> b
-- | Every linear function has a constant derivative equal to the function
-- itself (as a linear map).
linearD :: (HasBasis u, HasTrie (Basis u), AdditiveGroup v) => (u -> v) -> (u :~> v)
-- | Derivative tower for applying a binary function that distributes over
-- addition, such as multiplication. A bit weaker assumption than
-- bilinearity. Is bilinearity necessary for correctness here?
distrib :: (HasBasis a, HasTrie (Basis a), AdditiveGroup b, AdditiveGroup c, AdditiveGroup u) => (b -> c -> u) -> (a :> b) -> (a :> c) -> (a :> u)
-- | Specialized chain rule. See also '(@.)'
(>-<) :: (HasBasis a, HasTrie (Basis a), VectorSpace u, AdditiveGroup (Scalar u)) => (u -> u) -> ((a :> u) -> (a :> Scalar u)) -> (a :> u) -> (a :> u)
pairD :: (HasBasis a, HasTrie (Basis a), VectorSpace b, VectorSpace c, (Scalar b) ~ (Scalar c)) => (a :> b, a :> c) -> a :> (b, c)
unpairD :: (HasBasis a, HasTrie (Basis a), VectorSpace a, VectorSpace b, VectorSpace c, (Scalar b) ~ (Scalar c)) => (a :> (b, c)) -> (a :> b, a :> c)
tripleD :: (HasBasis a, HasTrie (Basis a), VectorSpace b, VectorSpace c, VectorSpace d, (Scalar b) ~ (Scalar c), (Scalar c) ~ (Scalar d)) => (a :> b, a :> c, a :> d) -> a :> (b, c, d)
untripleD :: (HasBasis a, HasTrie (Basis a), VectorSpace a, VectorSpace b, VectorSpace c, VectorSpace d, (Scalar b) ~ (Scalar c), (Scalar c) ~ (Scalar d)) => (a :> (b, c, d)) -> (a :> b, a :> c, a :> d)
instance (s ~ Scalar a, Scalar s ~ s, HasBasis a, HasTrie (Basis a), Floating s, VectorSpace s) => Floating (a :> s)
instance (s ~ Scalar a, Scalar s ~ s, HasBasis a, HasTrie (Basis a), Fractional s, VectorSpace s) => Fractional (a :> s)
instance (s ~ Scalar a, Scalar s ~ s, HasBasis a, HasTrie (Basis a), Num s, VectorSpace s) => Num (a :> s)
instance (s ~ Scalar u, InnerSpace u, AdditiveGroup s, HasBasis a, HasTrie (Basis a)) => InnerSpace (a :> u)
instance (HasBasis a, HasTrie (Basis a), VectorSpace u, AdditiveGroup (Scalar u)) => VectorSpace (a :> u)
instance (HasBasis a, HasTrie (Basis a), AdditiveGroup u) => AdditiveGroup (a :> u)
instance (AdditiveGroup b, HasBasis a, HasTrie (Basis a), OrdB bool b, IfB bool b, Ord b) => Ord (a :> b)
instance (AdditiveGroup v, HasBasis u, HasTrie (Basis u), OrdB b v) => OrdB b (u :> v)
instance (AdditiveGroup v, HasBasis u, HasTrie (Basis u), IfB b v) => IfB b (u :> v)
instance (Eq b) => Eq (a :> b)
instance (Show b) => Show (a :> b)
-- | Module indirection module. For Maclaurin- vs Horner-based derivative
-- towers.
module Data.Derivative
-- | Cross products and normals
module Data.Cross
-- | Thing with a normal vector (not necessarily normalized).
class HasNormal v
normalVec :: (HasNormal v) => v -> v
-- | Normalized normal vector. See also cross.
normal :: (HasNormal v, InnerSpace v, Floating (Scalar v)) => v -> v
-- | Singleton
type One s = s
-- | Homogeneous pair
type Two s = (s, s)
-- | Homogeneous triple
type Three s = (s, s, s)
-- | Cross product of various forms of 2D vectors
class HasCross2 v
cross2 :: (HasCross2 v) => v -> v
-- | Cross product of various forms of 3D vectors
class HasCross3 v
cross3 :: (HasCross3 v) => v -> v -> v
instance (Num s, VectorSpace s, HasBasis s, HasTrie (Basis s), HasNormal (Two s :> Three s)) => HasNormal (Three (Two s :> s))
instance (Basis s ~ (), Num s, HasTrie (Basis (s, s)), HasBasis s) => HasNormal (Two s :> Three s)
instance (HasBasis a, HasTrie (Basis a), VectorSpace v, HasCross3 v) => HasCross3 (a :> v)
instance (Num s) => HasCross3 (s, s, s)
instance (Basis s ~ (), Num s, VectorSpace s, HasBasis s, HasTrie (Basis s)) => HasNormal (Two (One s :> s))
instance (Basis s ~ (), HasBasis s, HasTrie (Basis s)) => HasNormal (One s :> Two s)
instance (HasBasis a, HasTrie (Basis a), VectorSpace v, HasCross2 v) => HasCross2 (a :> v)
instance (AdditiveGroup u) => HasCross2 (u, u)