Copyright | (c) Justus Sagemüller 2015 |
---|---|
License | GPL v3 |
Maintainer | (@) jsag $ hvl.no |
Stability | experimental |
Portability | portable |
Safe Haskell | Safe-Inferred |
Language | Haskell2010 |
Several commonly-used manifolds, represented in some simple way as Haskell
data types. All these are in the PseudoAffine
class.
Synopsis
- type Real0 = ℝ⁰
- type Real1 = ℝ
- type RealPlus = ℝay
- type Real2 = ℝ²
- type Real3 = ℝ³
- type Sphere0 = S⁰
- type Sphere1 = S¹
- type Sphere2 = S²
- type Projective0 = ℝP⁰
- type Projective1 = ℝP¹
- type Projective2 = ℝP²
- type Disk1 = D¹
- type Disk2 = D²
- type Cone = CD¹
- type OpenCone = Cℝay
- data FibreBundle b f = FibreBundle {
- baseSpace :: !b
- fibreSpace :: !f
- type TangentBundle m = FibreBundle m (Needle m)
- data EmptyMfd v
- data ZeroDim s = Origin
- type ℝ = Double
- type ℝ⁰ = ZeroDim ℝ
- type ℝ¹ = V1 ℝ
- type ℝ² = V2 ℝ
- type ℝ³ = V3 ℝ
- type ℝ⁴ = V4 ℝ
- newtype Stiefel1 v = Stiefel1 {
- getStiefel1N :: DualVector v
- stiefel1Project :: LinearSpace v => DualVector v -> Stiefel1 v
- stiefel1Embed :: (HilbertSpace v, RealFloat (Scalar v)) => Stiefel1 v -> v
- class (PseudoAffine v, InnerSpace v, NaturallyEmbedded (UnitSphere v) (DualVector v)) => HasUnitSphere v where
- type UnitSphere v :: *
- stiefel :: UnitSphere v -> Stiefel1 v
- unstiefel :: Stiefel1 v -> UnitSphere v
- type S⁰ = S⁰_ Double
- data S⁰_ r
- type S¹ = S¹_ Double
- newtype S¹_ r = S¹Polar {
- φParamS¹ :: r
- pattern S¹ :: Double -> S¹
- type S² = S²_ Double
- data S²_ r = S²Polar {}
- pattern S² :: Double -> Double -> S²
- type ℝP⁰ = ℝP⁰_ Double
- data ℝP⁰_ r = ℝPZero
- type ℝP¹ = ℝP¹_ Double
- newtype ℝP¹_ r = HemisphereℝP¹Polar {
- φParamℝP¹ :: r
- pattern ℝP¹ :: Double -> ℝP¹
- type ℝP² = ℝP²_ Double
- data ℝP²_ r = HemisphereℝP²Polar {}
- pattern ℝP² :: Double -> Double -> ℝP²
- type D¹ = D¹_ Double
- newtype D¹_ r = D¹ {
- xParamD¹ :: r
- type D² = D²_ Double
- data D²_ r = D²Polar {}
- pattern D² :: Double -> Double -> D²
- type ℝay = Cℝay ℝ⁰
- data CD¹ x = CD¹ {}
- data Cℝay x = Cℝay {
- hParamCℝay :: !(Scalar (Needle x))
- pParamCℝay :: !x
- data Line x = Line {
- lineHandle :: x
- lineDirection :: Stiefel1 (Needle' x)
- lineAsPlaneIntersection :: forall x. (WithField ℝ Manifold x, FiniteDimensional (Needle' x)) => Line x -> [Cutplane x]
- data Cutplane x = Cutplane {}
- normalPlane :: x -> Needle' x -> Cutplane x
- fathomCutDistance :: forall x. (WithField ℝ PseudoAffine x, LinearSpace (Needle x)) => Cutplane x -> Metric' x -> x -> Maybe ℝ
- sideOfCut :: (WithField ℝ PseudoAffine x, LinearSpace (Needle x)) => Cutplane x -> x -> Maybe S⁰
- cutPosBetween :: WithField ℝ Manifold x => Cutplane x -> (x, x) -> Maybe D¹
- data LinearMap s v w
- type LocalLinear x y = LinearMap (Scalar (Needle x)) (Needle x) (Needle y)
- type StiefelScalar s = (RealFloat s, Unbox s)
Index / ASCII names
type Projective0 = ℝP⁰ Source #
type Projective1 = ℝP¹ Source #
type Projective2 = ℝP² Source #
data FibreBundle b f #
A fibre bundle combines points in the base space b
with points in the fibre
f
. The type FibreBundle b f
is thus isomorphic to the tuple space (b,f)
, but
it can have a different topology, the prime example being TangentBundle
, where
nearby points may have differently-oriented tangent spaces.
FibreBundle | |
|
Instances
type TangentBundle m = FibreBundle m (Needle m) #
Points on a manifold, combined with vectors in the respective tangent space.
Trivial manifolds
The empty space can be considered a manifold with any sort of tangent space.
Instances
Instances
Linear manifolds
Hyperspheres
General form: Stiefel manifolds
Instances
Show (DualVector v) => Show (Stiefel1 v) Source # | |
(LinearSpace v, FiniteFreeSpace v, FiniteFreeSpace (DualVector v), StiefelScalar (Scalar v)) => PseudoAffine (Stiefel1 v) Source # | |
(LinearSpace v, FiniteFreeSpace v, FiniteFreeSpace (DualVector v), StiefelScalar (Scalar v)) => Semimanifold (Stiefel1 v) Source # | |
type Needle (Stiefel1 v) Source # | |
Defined in Data.Manifold.Types |
:: LinearSpace v | |
=> DualVector v | Must be nonzero. |
-> Stiefel1 v |
stiefel1Embed :: (HilbertSpace v, RealFloat (Scalar v)) => Stiefel1 v -> v Source #
Specific examples
class (PseudoAffine v, InnerSpace v, NaturallyEmbedded (UnitSphere v) (DualVector v)) => HasUnitSphere v where Source #
Nothing
type UnitSphere v :: * Source #
stiefel :: UnitSphere v -> Stiefel1 v Source #
unstiefel :: Stiefel1 v -> UnitSphere v Source #
Instances
HasUnitSphere ℝ² Source # | |
Defined in Data.Manifold.Cone type UnitSphere ℝ² Source # | |
HasUnitSphere ℝ³ Source # | |
Defined in Data.Manifold.Cone type UnitSphere ℝ³ Source # | |
HasUnitSphere ℝ Source # | |
Defined in Data.Manifold.Cone type UnitSphere ℝ Source # |
The zero-dimensional sphere is actually just two points. Implementation might
therefore change to ℝ⁰
: the disjoint sum of two
single-point spaces.+
ℝ⁰
Instances
Instances
Instances
Projective spaces
HemisphereℝP¹Polar | |
|
Instances
Arbitrary ℝP¹ Source # | |
Binary ℝP¹ Source # | |
Connected ℝP¹ Source # | |
Generic (ℝP¹_ r) | |
Show r => Show (ℝP¹_ r) | |
ℝeal r => PseudoAffine (ℝP¹_ r) | |
ℝeal r => Semimanifold (ℝP¹_ r) | |
type Rep (ℝP¹_ r) | |
Defined in Math.Manifold.Core.Types.Internal type Rep (ℝP¹_ r) = D1 ('MetaData "\8477P\185_" "Math.Manifold.Core.Types.Internal" "manifolds-core-0.6.1.0-KuNCXrWMCuy7Hkv7Og2ego" 'True) (C1 ('MetaCons "Hemisphere\8477P\185Polar" 'PrefixI 'True) (S1 ('MetaSel ('Just "\966Param\8477P\185") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 r))) | |
type Needle (ℝP¹_ r) | |
Defined in Math.Manifold.Core.PseudoAffine |
The two-dimensional real projective space, implemented as a disk with
opposing points on the rim glued together. Image this disk as the northern hemisphere
of a unit sphere; ℝP²
is the space of all straight lines passing through
the origin of ℝ³
, and each of these lines is represented by the point at which it
passes through the hemisphere.
Instances
Arbitrary ℝP² Source # | |
Binary ℝP² Source # | |
Connected ℝP² Source # | |
PseudoAffine ℝP² Source # | |
Semimanifold ℝP² Source # | |
Generic (ℝP²_ r) | |
Show r => Show (ℝP²_ r) | |
(RealFloat s, s' ~ s) => NaturallyEmbedded (ℝP²_ s) (V3 s') Source # | |
type Needle ℝP² Source # | |
Defined in Data.Manifold.PseudoAffine | |
type Rep (ℝP²_ r) | |
Defined in Math.Manifold.Core.Types.Internal type Rep (ℝP²_ r) = D1 ('MetaData "\8477P\178_" "Math.Manifold.Core.Types.Internal" "manifolds-core-0.6.1.0-KuNCXrWMCuy7Hkv7Og2ego" 'False) (C1 ('MetaCons "Hemisphere\8477P\178Polar" 'PrefixI 'True) (S1 ('MetaSel ('Just "\977Param\8477P\178") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 r) :*: S1 ('MetaSel ('Just "\966Param\8477P\178") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 r))) |
Intervals/disks/cones
The “one-dimensional disk” – really just the line segment between
the two points -1 and 1 of S⁰
, i.e. this is simply a closed interval.
Instances
Instances
Arbitrary D² Source # | |
Binary D² Source # | |
Generic (D²_ r) | |
Show r => Show (D²_ r) | |
type Rep (D²_ r) | |
Defined in Math.Manifold.Core.Types.Internal type Rep (D²_ r) = D1 ('MetaData "D\178_" "Math.Manifold.Core.Types.Internal" "manifolds-core-0.6.1.0-KuNCXrWMCuy7Hkv7Og2ego" 'False) (C1 ('MetaCons "D\178Polar" 'PrefixI 'True) (S1 ('MetaSel ('Just "rParamD\178") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 r) :*: S1 ('MetaSel ('Just "\966ParamD\178") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 r))) |
Better known as ℝ⁺ (which is not a legal Haskell name), the ray of positive numbers (including zero, i.e. closed on one end).
A (closed) cone over a space x
is the product of x
with the closed interval D¹
of “heights”,
except on its “tip”: here, x
is smashed to a single point.
This construct becomes (homeomorphic-to-) an actual geometric cone (and to D²
) in the
special case x =
.S¹
Instances
An open cone is homeomorphic to a closed cone without the “lid”,
i.e. without the “last copy” of x
, at the far end of the height
interval. Since that means the height does not include its supremum, it is actually
more natural to express it as the entire real ray, hence the name.
Cℝay | |
|
Instances
Affine subspaces
Lines
Line | |
|
lineAsPlaneIntersection :: forall x. (WithField ℝ Manifold x, FiniteDimensional (Needle' x)) => Line x -> [Cutplane x] Source #
Hyperplanes
Oriented hyperplanes, naïvely generalised to PseudoAffine
manifolds:
represents the set of all points Cutplane
p wq
such that
(q.-~.p) ^<.> w ≡ 0
.
In vector spaces this is indeed a hyperplane; for general manifolds it should behave locally as a plane, globally as an (n−1)-dimensional submanifold.
:: forall x. (WithField ℝ PseudoAffine x, LinearSpace (Needle x)) | |
=> Cutplane x | Hyperplane to measure the distance from. |
-> Metric' x | Metric to use for measuring that distance.
This can only be accurate if the metric
is valid both around the cut-plane's |
-> x | Point to measure the distance to. |
-> Maybe ℝ | A signed number, giving the distance from plane
to point with indication on which side the point lies.
|
sideOfCut :: (WithField ℝ PseudoAffine x, LinearSpace (Needle x)) => Cutplane x -> x -> Maybe S⁰ Source #
Linear mappings
The tensor product between one space's dual space and another space is the space spanned by vector–dual-vector pairs, in bra-ket notation written as
m = ∑ |w⟩⟨v|
Any linear mapping can be written as such a (possibly infinite) sum. The
TensorProduct
data structure only stores the linear independent parts
though; for simple finite-dimensional spaces this means e.g.
effectively boils down to an ordinary matrix type, namely an array of
column-vectors LinearMap
ℝ ℝ³ ℝ³|w⟩
.
(The ⟨v|
dual-vectors are then simply assumed to come from the canonical basis.)
For bigger spaces, the tensor product may be implemented in a more efficient
sparse structure; this can be defined in the TensorSpace
instance.
Instances
Misc
type StiefelScalar s = (RealFloat s, Unbox s) Source #
Orphan instances
(LinearSpace v, FiniteFreeSpace v, FiniteFreeSpace (DualVector v), StiefelScalar (Scalar v)) => PseudoAffine (Stiefel1 v) Source # | |
(LinearSpace v, FiniteFreeSpace v, FiniteFreeSpace (DualVector v), StiefelScalar (Scalar v)) => Semimanifold (Stiefel1 v) Source # | |