# ManifoldsBase.jl

Basic interface for manifolds in Julia.

The project `Manifolds.jl`

is based on this interface and provides a variety of manifolds.

## Number system

A number system represents the field a manifold is based upon.
Most prominently, these are real-valued (`โ`

) and complex valued (`โ`

) fields that
parametrize certain manifolds.
A further type to represent the field of quaternions (`โ`

) can also be used.

## Bases

Several different types of bases for a tangent space at `p`

on a `AbstractManifold`

are provided.
Methods are provided to obtain such a basis, to represent a tangent vector in a basis and to reconstruct a tangent vector from coefficients with respect to a basis.
The last two can be performed without computing the complete basis.
Further a basis can be cached and hence be reused, see `CachedBasis`

.

`DecoratorManifold`

The decorator manifold enhances a manifold by certain, in most cases implicitly
assumed to have a standard case, properties, see for example the `EmbeddedManifold`

.
The decorator acts semi transparently, i.e. `:transparent`

for all functions not affected by that
decorator and `:intransparent`

otherwise. Another possibility is, that the decorator just
passes to `:parent`

in order to fill default values.

`DefaultManifold`

This interface includes a simple `DefaultManifold`

, which is a reduced version
of the `Euclidean`

manifold from `Manifolds.jl`

,
such that the interface functions can be tested.

`EmbeddedManifold`

The embedded manifold models the embedding of a manifold into another manifold.
This way a manifold can benefit from existing implementations.
One example is the `TransparentIsometricEmbeddingType`

where a manifold uses the metric,
`inner`

, from its embedding.

`ValidationManifold`

The `ValidationManifold`

further illustrates how one can also used types to
represent points on a manifold, tangent vectors, and cotangent vectors,
where values are encapsulated in a certain type.

In general, `ValidationManifold`

might be used for manifolds where these three types are represented
by more complicated data structures or when it is necessary to distinguish these
by type.

This adds a semantic layer to the interface, and the default implementation of
`ValidationManifold`

adds checks to all inputs and outputs of typed data.