- TensorKitManifolds.jl now provides VectorInterface.jl compatibility for the tangent vectors on the manifolds.
- TensorKitManifolds.jl no longer exports any methods, and only exports the three manifold
types. All methods now need to be quantified as e.g.
Stiefel.project!,Grassmann.inneretc, or explicitly imported. - There is a difference between
VectorInterface.inner, which computes the complex inner product between two tangent vectors as vectors in a complex Euclidean space, and theinnermethod in TensorKitManifolds.jl or its submodules, which computes the Riemannian inner product (metric) on the manifold and is always real-valued.
There are three manifolds: Grassmann , Stiefel and Unitary , corresponding to submodules
of TensorKitManifolds, whose names are exported.
These modules have a number of public but non-exported methods, namely:
Δ = Grassmann.project(!)(X, W; metric = :euclidean): project an arbitrary tensorXonto the tangent space of the manifold at the pointW, returned as a tangent vectorΔof a specific type, that also stores the base pointW. The exclamation mark denotes thatXis destroyed in the process.W = Grassmann.base(Δ): return the base pointWof the tangent vectorΔ.s = Grassmann.inner(W, Δ₁, Δ₂; metric = :euclidean): Riemannian inner product (a.k.a. metric) between tangent vectorsΔ₁andΔ₂at the pointW, which is a real-valued scalars. For the default:euclideanmetric, this is equal to the real part of the complex inner product betweenΔ₁andΔ₂as vectors in a complex Euclidean space, but other metrics might also be available.W′, Δ′ = Grassmann.retract(W, Δ, α): retract the pointWin the direction of tangent vectorΔwith step lengthα, ending up in the pointW′, and return also the local directional derivative along the pathΔ′, which is a tangent vector atW′.Θ′ = Grassmann.transport(!)(Θ, W, Δ, α, W′): transport tangent vectorΘalong the retraction ofWin the direction ofΔwith step lengthα, which ends atW′. The resulting transported vectorΘ′is a tangent vector with base pointW′. The method with exclamation mark destroysΘin the process.
The same methods exist for the Stiefel and Unitary manifolds. When multiple implementations
or metrics are avaible, they are specified using a keyword argument to the above methods, or
explicitly as Stiefel.inner_euclidean , Stiefel.inner_canonical ,
Stiefel.project_euclidean(!) , Stiefel.project_canonical(!) , Stiefel.retract_exp ,
Stiefel.transport_exp(!) , Stiefel.retract_cayley , Stiefel.transport_cayley(!) ,
Unitary.transport_parallel(!) , Unitary.transport_stiefel(!) .
The tangent vectors Δ returned by project(!) are of specific types defined in the
submodules, e.g. GrassmannTangent , StiefelTangent , UnitaryTangent . The corresponding
TensorMap object can be obtained via an argumentless getindex , i.e. Δ[] returns the
corresponding TensorMap . However, you typically don't need those. The base point W is
also stored in Δ and can be returned using W = base(Δ) . Hence, Δ should be assumed to
be a point (W, Δ[]) on the tangent bundle of the manifold. Furthermore, these tangent vector
types satisfy the behavior of vectors, and support basic Base arithmic, as well as the full
set of methods from VectorInterface.jl