Product manifold
Product manifold $\mathcal M = \mathcal{M}_1 × \mathcal{M}_2 × … × \mathcal{M}_n$ of manifolds $\mathcal{M}_1, \mathcal{M}_2, …, \mathcal{M}_n$. Points on the product manifold can be constructed using ProductRepr
with canonical projections $Π_i : \mathcal{M} → \mathcal{M}_i$ for $i ∈ 1, 2, …, n$ provided by submanifold_component
.
Manifolds.InverseProductRetraction
— TypeInverseProductRetraction(retractions::AbstractInverseRetractionMethod...)
Product inverse retraction of inverse retractions
. Works on ProductManifold
.
Manifolds.ProductBasisData
— TypeProductBasisData
A typed tuple to store tuples of data of stored/precomputed bases for a ProductManifold
.
Manifolds.ProductFVectorDistribution
— TypeProductFVectorDistribution([type::VectorBundleFibers], [x], distrs...)
Generates a random vector at point x
from vector space (a fiber of a tangent bundle) of type type
using the product distribution of given distributions.
Vector space type and x
can be automatically inferred from distributions distrs
.
Manifolds.ProductManifold
— TypeProductManifold{𝔽,TM<:Tuple} <: Manifold{𝔽}
Product manifold $M_1 × M_2 × … × M_n$ with product geometry.
Constructor
ProductManifold(M_1, M_2, ..., M_n)
generates the product manifold $M_1 × M_2 × … × M_n$. Alternatively, the same manifold can be contructed using the ×
operator: M_1 × M_2 × M_3
.
Manifolds.ProductMetric
— TypeProductMetric <: Metric
A type to represent the product of metrics for a ProductManifold
.
Manifolds.ProductPointDistribution
— TypeProductPointDistribution(M::ProductManifold, distributions)
Product distribution on manifold M
, combined from distributions
.
Manifolds.ProductRetraction
— TypeProductRetraction(retractions::AbstractRetractionMethod...)
Product retraction of retractions
. Works on ProductManifold
.
Manifolds.ProductVectorTransport
— TypeProductVectorTransport(methods::AbstractVectorTransportMethod...)
Product vector transport type of methods
. Works on ProductManifold
.
Base.exp
— Methodexp(M::ProductManifold, p, X)
compute the exponential map from p
in the direction of X
on the ProductManifold
M
, which is the elementwise exponential map on the internal manifolds that build M
.
Base.getindex
— Methodgetindex(p, M::ProductManifold, i::Union{Integer,Colon,AbstractVector})
p[M::ProductManifold, i]
Access the element(s) at index i
of a point p
on a ProductManifold
M
by linear indexing. See also Array Indexing in Julia.
Base.log
— Methodlog(M::ProductManifold, p, q)
Compute the logarithmic map from p
to q
on the ProductManifold
M
, which can be computed using the logarithmic maps of the manifolds elementwise.
Base.setindex!
— Methodsetindex!(q, p, M::ProductManifold, i::Union{Integer,Colon,AbstractVector})
q[M::ProductManifold,i...] = p
set the element [i...]
of a point q
on a ProductManifold
by linear indexing to q
. See also Array Indexing in Julia.
LinearAlgebra.cross
— Methodcross(M,N)
cross(M1, M2, M3,...)
Return the ProductManifold
For two Manifold
s M
and N
, where for the case that one of them is a ProductManifold
itself, the other is either prepended (if N
is a product) or appenden (if M
) is. If both are product manifold, they are combined into one product manifold, keeping the order.
For the case that more than one is a product manifold of these is build with the same approach as above
LinearAlgebra.norm
— Methodnorm(M::ProductManifold, p, X)
Compute the norm of X
from the tangent space of p
on the ProductManifold
, i.e. from the element wise norms the 2-norm is computed.
Manifolds.flat
— Methodflat(M::ProductManifold, p, X::FVector{TangentSpaceType})
use the musical isomorphism to transform the tangent vector X
from the tangent space at p
on the ProductManifold
M
to a cotangent vector. This can be done elementwise for every entry of X
(with respect to the corresponding entry in p
) separately.
Manifolds.get_component
— Methodget_component(M::ProductManifold, p, i)
Get the i
th component of a point p
on a ProductManifold
M
.
Manifolds.number_of_components
— Methodnumber_of_components(M::ProductManifold{<:NTuple{N,Any}}) where {N}
Calculate the number of manifolds multiplied in the given ProductManifold
M
.
Manifolds.set_component!
— Methodset_component!(M::ProductManifold, q, p, i)
Set the i
th component of a point q
on a ProductManifold
M
to p
, where p
is a point on the Manifold
this factor of the product manifold consists of.
Manifolds.sharp
— Methodsharp(M::ProductManifold, p, ξ::FVector{CotangentSpaceType})
Use the musical isomorphism to transform the cotangent vector ξ
from the tangent space at p
on the ProductManifold
M
to a tangent vector. This can be done elementwise for every entry of ξ
(and p
) separately
Manifolds.submanifold
— Methodsubmanifold(M::ProductManifold, i::Integer)
Extract the i
th factor of the product manifold M
.
Manifolds.submanifold
— Methodsubmanifold(M::ProductManifold, i::Val)
submanifold(M::ProductManifold, i::AbstractVector)
Extract the factor of the product manifold M
indicated by indices in i
. For example, for i
equal to Val((1, 3))
the product manifold constructed from the first and the third factor is returned.
The version with AbstractVector
is not type-stable, for better preformance use Val
.
ManifoldsBase.check_manifold_point
— Methodcheck_manifold_point(M::ProductManifold, p; kwargs...)
Check whether p
is a valid point on the ProductManifold
M
. If p
is not a point on M
a CompositeManifoldError
consisting of all error messages of the components, for which the tests fail is returned.
The tolerance for the last test can be set using the kwargs...
.
ManifoldsBase.check_tangent_vector
— Methodcheck_tangent_vector(M::ProductManifold, p, X; check_base_point = true, kwargs... )
Check whether X
is a tangent vector to p
on the ProductManifold
M
, i.e. after check_manifold_point
(M, p)
, and all projections to base manifolds must be respective tangent vectors. If X
is not a tangent vector to p
on M
a CompositeManifoldError
consisting of all error messages of the components, for which the tests fail is returned.
The tolerance for the last test can be set using the kwargs...
.
ManifoldsBase.distance
— Methoddistance(M::ProductManifold, p, q)
Compute the distance between two points p
and q
on the ProductManifold
M
, which is the 2-norm of the elementwise distances on the internal manifolds that build M
.
ManifoldsBase.injectivity_radius
— Methodinjectivity_radius(M::ProductManifold)
injectivity_radius(M::ProductManifold, x)
Compute the injectivity radius on the ProductManifold
, which is the minimum of the factor manifolds.
ManifoldsBase.inner
— Methodinner(M::ProductManifold, p, X, Y)
compute the inner product of two tangent vectors X
, Y
from the tangent space at p
on the ProductManifold
M
, which is just the sum of the internal manifolds that build M
.
ManifoldsBase.inverse_retract
— Methodinverse_retract(M::ProductManifold, p, q, m::InverseProductRetraction)
Compute the inverse retraction from p
with respect to q
on the ProductManifold
M
using an InverseProductRetraction
, which by default encapsulates a inverse retraction for each manifold of the product. Then this method is performed elementwise, so the encapsulated inverse retraction methods have to be available per factor.
ManifoldsBase.manifold_dimension
— Methodmanifold_dimension(M::ProductManifold)
Return the manifold dimension of the ProductManifold
, which is the sum of the manifold dimensions the product is made of.
ManifoldsBase.retract
— Methodretract(M::ProductManifold, p, X, m::ProductRetraction)
Compute the retraction from p
with tangent vector X
on the ProductManifold
M
using an ProductRetraction
, which by default encapsulates retractions of the base manifolds. Then this method is performed elementwise, so the encapsulated retractions method has to be one that is available on the manifolds.
ManifoldsBase.vector_transport_to
— Methodvector_transport_to(M::ProductManifold, p, X, q, m::ProductVectorTransport)
Compute the vector transport the tangent vector X
at p
to q
on the ProductManifold
M
using an ProductVectorTransport
m
. This method is performed elementwise, i.e. the method m
has to be implemented on the base manifold.