# Ease of notation

The following terms introduce a nicer notation for some operations, for example using the ∈ operator, $p ∈ \mathcal M$, to determine whether $p$ is a point on the `AbstractManifold`

$\mathcal M$.

`Base.in`

— Function```
Base.in(p, M::AbstractManifold; kwargs...)
p ∈ M
```

Check, whether a point `p`

is a valid point (i.e. in) a `AbstractManifold`

`M`

. This method employs `is_point`

deactivating the error throwing option.

```
Base.in(p, TpM::TangentSpaceAtPoint; kwargs...)
X ∈ TangentSpaceAtPoint(M,p)
```

Check whether `X`

is a tangent vector from (in) the tangent space $T_p\mathcal M$, i.e. the `TangentSpaceAtPoint`

at `p`

on the `AbstractManifold`

`M`

. This method uses `is_vector`

deactivating the error throw option.

`ManifoldsBase.TangentSpace`

— Constant`TangentSpace(M::AbstractManifold, p)`

Return a `TangentSpaceAtPoint`

representing tangent space at `p`

on the `AbstractManifold`

`M`

.

# Fallback for the exponential map: Solving the corresponding ODE

When additionally loading `NLSolve.jl`

the following fallback for the exponential map is available.

`ManifoldsBase.inverse_retract`

— Method`inverse_retract(M, p, q method::NLSolveInverseRetraction; kwargs...)`

Approximate the inverse of the retraction specified by `method.retraction`

from `p`

with respect to `q`

on the `AbstractManifold`

`M`

using NLsolve. This inverse retraction is not guaranteed to succeed and probably will not unless `q`

is close to `p`

and the initial guess `X0`

is close.

If the solver fails to converge, an `OutOfInjectivityRadiusError`

is raised. See `NLSolveInverseRetraction`

for configurable parameters.

# Public documentation

The following functions are of interest for extending and using the `ProductManifold`

.

`Manifolds.submanifold_component`

— Function```
submanifold_component(M::AbstractManifold, p, i::Integer)
submanifold_component(M::AbstractManifold, p, ::Val(i)) where {i}
submanifold_component(p, i::Integer)
submanifold_component(p, ::Val(i)) where {i}
```

Project the product array `p`

on `M`

to its `i`

th component. A new array is returned.

`Manifolds.submanifold_components`

— Function```
submanifold_components(M::AbstractManifold, p)
submanifold_components(p)
```

Get the projected components of `p`

on the submanifolds of `M`

. The components are returned in a Tuple.

`Manifolds.ProductRepr`

— Type`ProductRepr(parts)`

A more general but slower representation of points and tangent vectors on a product manifold.

**Example:**

A product point on a product manifold `Sphere(2) × Euclidean(2)`

might be created as

`ProductRepr([1.0, 0.0, 0.0], [2.0, 3.0])`

where `[1.0, 0.0, 0.0]`

is the part corresponding to the sphere factor and `[2.0, 3.0]`

is the part corresponding to the euclidean manifold.

## Specific exception types

For some manifolds it is useful to keep an extra index, at which point on the manifold, the error occurred as well as to collect all errors that occurred on a manifold. This page contains the manifold-specific error messages this package introduces.