Group manifolds

Lie groups, groups that are Riemannian manifolds with a smooth binary group operation AbstractGroupOperation, are implemented as AbstractDecoratorManifold and specifying the group operation using the IsGroupManifold or by decorating an existing manifold with a group operation using GroupManifold.

The common addition and multiplication group operations of AdditionOperation and MultiplicationOperation are provided, though their behavior may be customized for a specific group.

There are short introductions at the beginning of each subsection. They briefly mention what is available with links to more detailed descriptions.

Contents

Groups

The following operations are available for group manifolds:

  • Identity: an allocation-free representation of the identity element of the group.
  • inv: get the inverse of a given element.
  • compose: compose two given elements of a group.
  • identity_element get the identity element of the group, in the representation used by other points from the group.

Group manifold

GroupManifold adds a group structure to the wrapped manifold. It does not affect metric (or connection) structure of the wrapped manifold, however it can to be further wrapped in MetricManifold to get invariant metrics, or in a ConnectionManifold to equip it with a Cartan-Schouten connection.

Manifolds.AbstractGroupOperation โ€” Type
AbstractGroupOperation

Abstract type for smooth binary operations $โˆ˜$ on elements of a Lie group $\mathcal{G}$:

\[โˆ˜ : \mathcal{G} ร— \mathcal{G} โ†’ \mathcal{G}\]

An operation can be either defined for a specific group manifold over number system ๐”ฝ or in general, by defining for an operation Op the following methods:

identity_element!(::AbstractDecoratorManifold, q, q)
inv!(::AbstractDecoratorManifold, q, p)
_compose!(::AbstractDecoratorManifold, x, p, q)

Note that a manifold is connected with an operation by wrapping it with a decorator, AbstractDecoratorManifold using the IsGroupManifold to specify the operation. For a concrete case the concrete wrapper GroupManifold can be used.

source
Manifolds.GroupExponentialRetraction โ€” Type
GroupExponentialRetraction{D<:ActionDirectionAndSide} <: AbstractRetractionMethod

Retraction using the group exponential exp_lie "translated" to any point on the manifold.

For more details, see retract.

Constructor

GroupExponentialRetraction(conv::ActionDirectionAndSide = LeftAction())
source
Manifolds.GroupLogarithmicInverseRetraction โ€” Type
GroupLogarithmicInverseRetraction{D<:ActionDirectionAndSide} <: AbstractInverseRetractionMethod

Retraction using the group logarithm log_lie "translated" to any point on the manifold.

For more details, see inverse_retract.

Constructor

GroupLogarithmicInverseRetraction(conv::ActionDirectionAndSide = LeftForwardAction())
source
Manifolds.Identity โ€” Type
Identity{O<:AbstractGroupOperation}

Represent the group identity element $e โˆˆ \mathcal{G}$ on a Lie group $\mathcal G$ with AbstractGroupOperation of type O.

Similar to the philosophy that points are agnostic of their group at hand, the identity does not store the group g it belongs to. However it depends on the type of the AbstractGroupOperation used.

See also identity_element on how to obtain the corresponding AbstractManifoldPoint or array representation.

Constructors

Identity(G::AbstractDecoratorManifold{๐”ฝ})
Identity(o::O)
Identity(::Type{O})

create the identity of the corresponding subtype O<:AbstractGroupOperation

source
Manifolds.IsGroupManifold โ€” Type
IsGroupManifold{O<:AbstractGroupOperation} <: AbstractTrait

A trait to declare an AbstractManifold as a manifold with group structure with operation of type O.

Using this trait you can turn a manifold that you implement implicitly into a Lie group. If you wish to decorate an existing manifold with one (or different) AbstractGroupActions, see GroupManifold.

Constructor

IsGroupManifold(op::AbstractGroupOperation, vectors::AbstractGroupVectorRepresentation)
source
Manifolds.LeftAction โ€” Type
LeftAction()

Left action of a group on a manifold. For a forward action $ฮฑ: Gร—X โ†’ X$ it is characterized by

\[ฮฑ(g, ฮฑ(h, x)) = ฮฑ(gh, x)\]

for all $g, h โˆˆ G$ and $x โˆˆ X$.

source
Manifolds.LeftSide โ€” Type
LeftSide()

An action of a group on a manifold that acts from the left side, i.e. $ฮฑ: Gร—X โ†’ X$.

source
Manifolds.RightAction โ€” Type
RightAction()

Right action of a group on a manifold. For a forward action $ฮฑ: Gร—X โ†’ X$ it is characterized by

\[ฮฑ(g, ฮฑ(h, x)) = ฮฑ(hg, x)\]

for all $g, h โˆˆ G$ and $x โˆˆ X$.

Note that a right action may act from either left or right side in an expression.

source
Manifolds.RightSide โ€” Type
RightSide()

An action of a group on a manifold that acts from the right side, i.e. $ฮฑ: Xร—G โ†’ X$.

source
Manifolds.TangentVectorRepresentation โ€” Type
TangentVectorRepresentation

Specify that tangent vectors in a group are stored in a non-invariant way, corresponding to the storage implied by the underlying manifold.

source
Base.inv โ€” Method
inv(G::AbstractDecoratorManifold, p)

Inverse $p^{-1} โˆˆ \mathcal{G}$ of an element $p โˆˆ \mathcal{G}$, such that $p \circ p^{-1} = p^{-1} \circ p = e โˆˆ \mathcal{G}$, where $e$ is the Identity element of $\mathcal{G}$.

source
Manifolds.adjoint_action โ€” Method
adjoint_action(G::AbstractDecoratorManifold, p, X, dir=LeftAction())

Adjoint action of the element p of the Lie group G on the element X of the corresponding Lie algebra.

If dir is LeftAction(), it is defined as the differential of the group automorphism $ฮจ_p(q) = pqpโปยน$ at the identity of G.

The formula reads

\[\operatorname{Ad}_p(X) = dฮจ_p(e)[X]\]

where $e$ is the identity element of G.

If dir is RightAction(), then the formula is

\[\operatorname{Ad}_p(X) = dฮจ_{p^{-1}}(e)[X]\]

Note that the adjoint representation of a Lie group isn't generally faithful. Notably the adjoint representation of SO(2) is trivial.

source
Manifolds.adjoint_inv_diff โ€” Method
adjoint_inv_diff(G::AbstractDecoratorManifold, p, X)

Compute the value of pullback of inverse $p^{-1} โˆˆ \mathcal{G}$ of an element $p โˆˆ \mathcal{G}$ at tangent vector X at $p^{-1}$. The result is a tangent vector at $p$.

source
Manifolds.adjoint_matrix โ€” Function
adjoint_matrix(G::AbstractManifold, p, B::AbstractBasis=DefaultOrthonormalBasis())

Compute the adjoint matrix related to conjugation of vectors by element p of Lie group G for basis B. It is the matrix $A$ such that for each element X of the Lie algebra with coefficients $c$ in basis B, $Ac$ is the vector of coefficients of X conjugated by p in basis B.

source
Manifolds.compose โ€” Method
compose(G::AbstractDecoratorManifold, p, q)

Compose elements $p,q โˆˆ \mathcal{G}$ using the group operation $p \circ q$.

For implementing composition on a new group manifold, please overload _compose instead so that methods with Identity arguments are not ambiguous.

source
Manifolds.exp_inv โ€” Function
exp_inv(G::AbstractManifold, p, X, t::Number=1)

Compute exponential map on a Lie group G invariant to group operation. For groups with a bi-invariant metric or a Cartan-Schouten connection, this is the same as exp but for other groups it may differ.

source
Manifolds.exp_lie โ€” Method
exp_lie(G, X)
exp_lie!(G, q, X)

Compute the group exponential of the Lie algebra element X. It is equivalent to the exponential map defined by the CartanSchoutenMinus connection.

Given an element $X โˆˆ ๐”ค = T_e \mathcal{G}$, where $e$ is the Identity element of the group $\mathcal{G}$, and $๐”ค$ is its Lie algebra, the group exponential is the map

\[\exp : ๐”ค โ†’ \mathcal{G},\]

such that for $t,s โˆˆ โ„$, $ฮณ(t) = \exp (t X)$ defines a one-parameter subgroup with the following properties. Note that one-parameter subgroups are commutative (see [Suh13], section 3.5), even if the Lie group itself is not commutative.

\[\begin{aligned} ฮณ(t) &= ฮณ(-t)^{-1}\\ ฮณ(t + s) &= ฮณ(t) \circ ฮณ(s) = ฮณ(s) \circ ฮณ(t)\\ ฮณ(0) &= e\\ \lim_{t โ†’ 0} \frac{d}{dt} ฮณ(t) &= X. \end{aligned}\]

Note

In general, the group exponential map is distinct from the Riemannian exponential map exp.

For example for the MultiplicationOperation and either Number or AbstractMatrix the Lie exponential is the numeric/matrix exponential.

\[\exp X = \operatorname{Exp} X = \sum_{n=0}^โˆž \frac{1}{n!} X^n.\]

Since this function also depends on the group operation, make sure to implement the corresponding trait version exp_lie(::TraitList{<:IsGroupManifold}, G, X).

source
Manifolds.get_vector_lie โ€” Method
get_vector_lie(G::AbstractDecoratorManifold, a, B::AbstractBasis)

Reconstruct a tangent vector from the Lie algebra of G from coordinates a of a basis B. This is similar to calling get_vector at the p=Identity(G).

source
Manifolds.identity_element โ€” Method
identity_element(G::AbstractDecoratorManifold)

Return a point representation of the Identity on the IsGroupManifold G. By default this representation is the default array or number representation. It should return the corresponding default representation of $e$ as a point on G if points are not represented by arrays.

source
Manifolds.inv_diff โ€” Method
inv_diff(G::AbstractDecoratorManifold, p, X)

Compute the value of differential of inverse $p^{-1} โˆˆ \mathcal{G}$ of an element $p โˆˆ \mathcal{G}$ at tangent vector X at p. The result is a tangent vector at $p^{-1}$.

Note: the default implementation of inv_diff and inv_diff! assumes that the tangent vector $X$ is stored at the point $p โˆˆ \mathcal{G}$ as the vector $Y โˆˆ \mathfrak{g}$ where $X = pY$.

source
Manifolds.inverse_translate โ€” Method
inverse_translate(G::AbstractDecoratorManifold, p, q, conv::ActionDirectionAndSide=LeftForwardAction())

Inverse translate group element $q$ by $p$ with the translation $ฯ„_p^{-1}$ with the specified convention, either left forward ($L_p^{-1}$), left backward ($R'_p^{-1}$), right backward ($R_p^{-1}$) or right forward ($L'_p^{-1}$), defined as ```math \begin{aligned} Lp^{-1} &: q โ†ฆ p^{-1} \circ q\ L'p^{-1} &: q โ†ฆ p \circ q\ Rp^{-1} &: q โ†ฆ q \circ p^{-1}\ R'p^{-1} &: q โ†ฆ q \circ p. \end{aligned}

source
Manifolds.inverse_translate_diff โ€” Method
inverse_translate_diff(G::AbstractDecoratorManifold, p, q, X, conv::ActionDirectionAndSide=LeftForwardAction())

For group elements $p, q โˆˆ \mathcal{G}$ and tangent vector $X โˆˆ T_q \mathcal{G}$, compute the action on $X$ of the differential of the inverse translation $ฯ„_p$ by $p$, with the specified left or right convention. The differential transports vectors:

\[(\mathrm{d}ฯ„_p^{-1})_q : T_q \mathcal{G} โ†’ T_{ฯ„_p^{-1} q} \mathcal{G}\\\]

source
Manifolds.lie_bracket โ€” Method
lie_bracket(G::AbstractDecoratorManifold, X, Y)

Lie bracket between elements X and Y of the Lie algebra corresponding to the Lie group G, cf. IsGroupManifold.

This can be used to compute the adjoint representation of a Lie algebra. Note that this representation isn't generally faithful. Notably the adjoint representation of ๐”ฐ๐”ฌ(2) is trivial.

source
Manifolds.log_inv โ€” Method
log_inv(G::AbstractManifold, p, q)

Compute logarithmic map on a Lie group G invariant to group operation. For groups with a bi-invariant metric or a Cartan-Schouten connection, this is the same as log but for other groups it may differ.

source
Manifolds.log_lie โ€” Method
log_lie(G, q)
log_lie!(G, X, q)

Compute the Lie group logarithm of the Lie group element q. It is equivalent to the logarithmic map defined by the CartanSchoutenMinus connection.

Given an element $q โˆˆ \mathcal{G}$, compute the right inverse of the group exponential map exp_lie, that is, the element $\log q = X โˆˆ ๐”ค = T_e \mathcal{G}$, such that $q = \exp X$

Note

In general, the group logarithm map is distinct from the Riemannian logarithm map log.

For matrix Lie groups this is equal to the (matrix) logarithm:

\[\log q = \operatorname{Log} q = \sum_{n=1}^โˆž \frac{(-1)^{n+1}}{n} (q - e)^n,\]

where $e$ here is the Identity element, that is, $1$ for numeric $q$ or the identity matrix $I_m$ for matrix $q โˆˆ โ„^{mร—m}$.

Since this function also depends on the group operation, make sure to implement either

  • _log_lie(G, q) and _log_lie!(G, X, q) for the points not being the Identity
  • the trait version log_lie(::TraitList{<:IsGroupManifold}, G, e), log_lie(::TraitList{<:IsGroupManifold}, G, X, e) for own implementations of the identity case.
source
Manifolds.translate โ€” Method
translate(G::AbstractDecoratorManifold, p, q, conv::ActionDirectionAndSide=LeftForwardAction()])

Translate group element $q$ by $p$ with the translation $ฯ„_p$ with the specified convention, either

  • left forward $ฯ„_p(q) = p \circ q$
  • left backward $ฯ„_p(q) = q \circ p^{-1}$
  • right backward $ฯ„_p(q) = q \circ p$
  • right forward $ฯ„_p(q) = p^{-1} \circ q$
source
Manifolds.translate_diff โ€” Method
translate_diff(G::AbstractDecoratorManifold, p, q, X, conv::ActionDirectionAndSide=LeftForwardAction())

For group elements $p, q โˆˆ \mathcal{G}$ and tangent vector $X โˆˆ T_q \mathcal{G}$, compute the action of the differential of the translation $ฯ„_p$ by $p$ on $X$, with the specified left or right convention. The differential transports vectors:

\[(\mathrm{d}ฯ„_p)_q : T_q \mathcal{G} โ†’ T_{ฯ„_p q} \mathcal{G}\\\]

Note: the default implementation of translate_diff and translate_diff! assumes that a tangent vector $X$ at a point $q โˆˆ \mathcal{G}$ is stored as the vector $Y โˆˆ \mathfrak{g}$ where $X = qY$. The implementation at q = Identity is independent of the storage choice.

source
ManifoldsBase.hat โ€” Method
hat(M::AbstractDecoratorManifold{๐”ฝ,O}, ::Identity{O}, Xโฑ) where {๐”ฝ,O<:AbstractGroupOperation}

Given a basis $e_i$ on the tangent space at a the Identity and tangent component vector $X^i$, compute the equivalent vector representation ``X=X^i e_i**, where Einstein summation notation is used:

\[โˆง : X^i โ†ฆ X^i e_i\]

For array manifolds, this converts a vector representation of the tangent vector to an array representation. The vee map is the hat map's inverse.

source
ManifoldsBase.inverse_retract โ€” Method
inverse_retract(
    G::AbstractDecoratorManifold,
    p,
    X,
    method::GroupLogarithmicInverseRetraction,
)

Compute the inverse retraction using the group logarithm log_lie "translated" to any point on the manifold. With a group translation (translate) $ฯ„_p$ in a specified direction, the retraction is

\[\operatorname{retr}_p^{-1} = (\mathrm{d}ฯ„_p)_e \circ \log \circ ฯ„_p^{-1},\]

where $\log$ is the group logarithm (log_lie), and $(\mathrm{d}ฯ„_p)_e$ is the action of the differential of translation $ฯ„_p$ evaluated at the identity element $e$ (see translate_diff).

source
ManifoldsBase.retract โ€” Method
retract(
    G::AbstractDecoratorManifold,
    p,
    X,
    method::GroupExponentialRetraction,
)

Compute the retraction using the group exponential exp_lie "translated" to any point on the manifold. With a group translation (translate) $ฯ„_p$ in a specified direction, the retraction is

\[\operatorname{retr}_p = ฯ„_p \circ \exp \circ (\mathrm{d}ฯ„_p^{-1})_p,\]

where $\exp$ is the group exponential (exp_lie), and $(\mathrm{d}ฯ„_p^{-1})_p$ is the action of the differential of inverse translation $ฯ„_p^{-1}$ evaluated at $p$ (see inverse_translate_diff).

source
ManifoldsBase.vee โ€” Method
vee(M::AbstractManifold, p, X)

Given a basis $e_i$ on the tangent space at a point p and tangent vector X, compute the vector components $X^i$, such that $X = X^i e_i$, where Einstein summation notation is used:

\[\vee : X^i e_i โ†ฆ X^i\]

For array manifolds, this converts an array representation of the tangent vector to a vector representation. The hat map is the vee map's inverse.

source

GroupManifold

As a concrete wrapper for manifolds (e.g. when the manifold per se is a group manifold but another group structure should be implemented), there is the GroupManifold

Manifolds.GroupManifold โ€” Type
GroupManifold{๐”ฝ,M<:AbstractManifold{๐”ฝ},O<:AbstractGroupOperation} <: AbstractDecoratorManifold{๐”ฝ}

Concrete decorator for a smooth manifold that equips the manifold with a group operation, thus making it a Lie group. See IsGroupManifold for more details.

Group manifolds by default forward metric-related operations to the wrapped manifold.

Constructor

GroupManifold(
    manifold::AbstractManifold,
    op::AbstractGroupOperation,
    vectors::AbstractGroupVectorRepresentation=LeftInvariantRepresentation(),
)

Define the group operation op acting on the manifold manifold, hence if op acts smoothly, this forms a Lie group.

source
Base.rand โ€” Method
rand(::GroupManifold; vector_at=nothing, ฯƒ=1.0)
rand!(::GroupManifold, pX; vector_at=nothing, kwargs...)
rand(::TraitList{<:IsGroupManifold}, M; vector_at=nothing, ฯƒ=1.0)
rand!(TraitList{<:IsGroupManifold}, M, pX; vector_at=nothing, kwargs...)

Compute a random point or tangent vector on a Lie group.

For points this just means to generate a random point on the underlying manifold itself.

For tangent vectors, an element in the Lie Algebra is generated.

source

Default Representation of Tangent Vectors

In most groups, the representation of a tangent vector $X$ at the point $p โˆˆ \mathcal{G}$ is stored as a vector $Y โˆˆ \mathfrak{g}$. This helps to compute the derivatives of the composition and inverse.

To explain this, let us assume that the group consists of matrices (this is always possible). The representation of a tangent vector $X$ at the point $p โˆˆ \mathcal{G}$ is stored as the vector $Y โˆˆ \mathfrak{g}$ given by

\[X = pY\]

Derivative of the Group Composition on the Left

The derivative of the composition $pq$ with respect to $p$ in the direction $X$, tangent at $p$ is given by

\[Xq = pYq = pq(q^{-1}Yq)\]

We see that with this representation convention, this derivative is just the adjoint action of $q^{-1}$ on the vector $Y$.

Derivative of the Group Composition on the Right

For the derivative with respect to $q$ of the composition $pq$ at a tangent vector $X$ at $q$ stored as $Y$ with $X = qY$, we have similarly

\[pX = pqY\]

With the representation convention above, this derivative is just the identity.

Derivative of the Group Inverse

Finally, we look at the derivative of the inverse $p^{-1}$ at a point $p$ in a tangent direction $X$ at $p$ with $X = pY$. The result is a tangent vector at $p^{-1}$ given by

\[-p^{-1}Xp^{-1} = - Yp^{-1} = -p^{-1}(p Y p^{-1})\]

With the representation convention above, this derivative is thus $-pYp^{-1}$, that is, the opposite of the adjoint action of $p$ on the vector $Y$.

Implication for Creating New Groups

When you create a new group, defining the adjoint action alone (adjoint_action) automatically defines all the relevant derivatives above.

Generic Operations

For groups based on an addition operation or a group operation, several default implementations are provided.

Addition Operation

Manifolds.adjoint_inv_diff โ€” Method
adjoint_inv_diff(::AdditionGroupTrait, G::AbstractDecoratorManifold, p, X)

Compute the value of pullback of additive matrix inversion $p โ†ฆ -p$ at $X$, i.e. $-X$.

source
Manifolds.inv_diff โ€” Method
inv_diff(::AdditionGroupTrait, G::AbstractDecoratorManifold, p, X)

Compute the value of differential of additive matrix inversion $p โ†ฆ -p$ at $X$, i.e. $-X$.

source

Multiplication Operation

Manifolds.adjoint_inv_diff โ€” Method
adjoint_inv_diff(::MultiplicationGroupTrait, G::AbstractDecoratorManifold, p, X)

Compute the value of differential of matrix inversion $p โ†ฆ p^{-1}$ at $X$. When tangent vectors are represented in Lie algebra in a left-invariant way, the formula reads $-p^\mathrm{T}X(p^{-1})^\mathrm{T}$. For matrix groups with ambient space tangent vectors, the formula would read $-(p^{-1})^\mathrm{T}X(p^{-1})^\mathrm{T}$. See the section about matrix inverse in [Gil08].

source
Manifolds.inv_diff โ€” Method
inv_diff(::MultiplicationGroupTrait, G::AbstractDecoratorManifold, p, X)

Compute the value of differential of matrix inversion $p โ†ฆ p^{-1}$ at $X$. When tangent vectors are represented in Lie algebra in a left-invariant way, the formula reads $-pXp^{-1}$. For matrix groups with ambient space tangent vectors, the formula would read $-p^{-1}Xp^{-1}$. See the section about matrix inverse in [Gil08].

source

Circle group

General linear group

Manifolds.GeneralLinear โ€” Type
GeneralLinear{T,๐”ฝ} <: AbstractDecoratorManifold{๐”ฝ}

The general linear group, that is, the group of all invertible matrices in $๐”ฝ^{nร—n}$.

The default metric is the left-$\mathrm{GL}(n)$-right-$\mathrm{O}(n)$-invariant metric whose inner product is

\[โŸจX_p,Y_pโŸฉ_p = โŸจp^{-1}X_p,p^{-1}Y_pโŸฉ_\mathrm{F} = โŸจX_e, Y_eโŸฉ_\mathrm{F},\]

where $X_p, Y_p โˆˆ T_p \mathrm{GL}(n, ๐”ฝ)$, $X_e = p^{-1}X_p โˆˆ ๐”ค๐”ฉ(n) = T_e \mathrm{GL}(n, ๐”ฝ) = ๐”ฝ^{nร—n}$ is the corresponding vector in the Lie algebra, and $โŸจโ‹…,โ‹…โŸฉ_\mathrm{F}$ denotes the Frobenius inner product.

By default, tangent vectors $X_p$ are represented with their corresponding Lie algebra vectors $X_e = p^{-1}X_p$.

source
Base.exp โ€” Method
exp(G::GeneralLinear, p, X)

Compute the exponential map on the GeneralLinear group.

The exponential map is

\[\exp_p \colon X โ†ฆ p \operatorname{Exp}(X^\mathrm{H}) \operatorname{Exp}(X - X^\mathrm{H}),\]

where $\operatorname{Exp}(โ‹…)$ denotes the matrix exponential, and $โ‹…^\mathrm{H}$ is the conjugate transpose [ALRV14] [NM16].

source
Base.log โ€” Method
log(G::GeneralLinear, p, q)

Compute the logarithmic map on the GeneralLinear(n) group.

The algorithm proceeds in two stages. First, the point $r = p^{-1} q$ is projected to the nearest element (under the Frobenius norm) of the direct product subgroup $\mathrm{O}(n) ร— S^+$, whose logarithmic map is exactly computed using the matrix logarithm. This initial tangent vector is then refined using the NLSolveInverseRetraction.

For GeneralLinear(n, โ„‚), the logarithmic map is instead computed on the realified supergroup GeneralLinear(2n) and the resulting tangent vector is then complexified.

Note that this implementation is experimental.

source
Base.rand โ€” Method
Random.rand(G::GeneralLinear; vector_at=nothing, kwargs...)

If vector_at is nothing, return a random point on the GeneralLinear group G by using rand in the embedding.

If vector_at is not nothing, return a random tangent vector from the tangent space of the point vector_at on the GeneralLinear by using by using rand in the embedding.

source

Heisenberg group

Manifolds.HeisenbergGroup โ€” Type
HeisenbergGroup{T} <: AbstractDecoratorManifold{โ„}

Heisenberg group HeisenbergGroup(n) is the group of $(n+2)ร—(n+2)$ matrices [BP08]

\[\begin{bmatrix} 1 & \mathbf{a} & c \\ \mathbf{0} & I_n & \mathbf{b} \\ 0 & \mathbf{0} & 1 \end{bmatrix}\]

where $I_n$ is the $nร—n$ unit matrix, $\mathbf{a}$ is a row vector of length $n$, $\mathbf{b}$ is a column vector of length $n$ and $c$ is a real number. The group operation is matrix multiplication.

The left-invariant metric on the manifold is used.

source
Base.exp โ€” Method
exp(M::HeisenbergGroup, p, X)

Exponential map on the HeisenbergGroup M with the left-invariant metric. The expression reads

\[\exp_{\begin{bmatrix} 1 & \mathbf{a}_p & c_p \\ \mathbf{0} & I_n & \mathbf{b}_p \\ 0 & \mathbf{0} & 1 \end{bmatrix}}\left(\begin{bmatrix} 0 & \mathbf{a}_X & c_X \\ \mathbf{0} & 0_n & \mathbf{b}_X \\ 0 & \mathbf{0} & 0 \end{bmatrix}\right) = \begin{bmatrix} 1 & \mathbf{a}_p + \mathbf{a}_X & c_p + c_X + \mathbf{a}_Xโ‹…\mathbf{b}_X/2 + \mathbf{a}_pโ‹…\mathbf{b}_X \\ \mathbf{0} & I_n & \mathbf{b}_p + \mathbf{b}_X \\ 0 & \mathbf{0} & 1 \end{bmatrix}\]

where $I_n$ is the $nร—n$ identity matrix, $0_n$ is the $nร—n$ zero matrix and $\mathbf{a}โ‹…\mathbf{b}$ is dot product of vectors.

source
Base.log โ€” Method
log(G::HeisenbergGroup, p, q)

Compute the logarithmic map on the HeisenbergGroup group. The formula reads

\[\log_{\begin{bmatrix} 1 & \mathbf{a}_p & c_p \\ \mathbf{0} & I_n & \mathbf{b}_p \\ 0 & \mathbf{0} & 1 \end{bmatrix}}\left(\begin{bmatrix} 1 & \mathbf{a}_q & c_q \\ \mathbf{0} & I_n & \mathbf{b}_q \\ 0 & \mathbf{0} & 1 \end{bmatrix}\right) = \begin{bmatrix} 0 & \mathbf{a}_q - \mathbf{a}_p & c_q - c_p + \mathbf{a}_pโ‹…\mathbf{b}_p - \mathbf{a}_qโ‹…\mathbf{b}_q - (\mathbf{a}_q - \mathbf{a}_p)โ‹…(\mathbf{b}_q - \mathbf{b}_p) / 2 \\ \mathbf{0} & 0_n & \mathbf{b}_q - \mathbf{b}_p \\ 0 & \mathbf{0} & 0 \end{bmatrix}\]

where $I_n$ is the $nร—n$ identity matrix, $0_n$ is the $nร—n$ zero matrix and $\mathbf{a}โ‹…\mathbf{b}$ is dot product of vectors.

source
Base.rand โ€” Method
Random.rand(M::HeisenbergGroup; vector_at = nothing, ฯƒ::Real=1.0)

If vector_at is nothing, return a random point on the HeisenbergGroup M by sampling elements of the first row and the last column from the normal distribution with mean 0 and standard deviation ฯƒ.

If vector_at is not nothing, return a random tangent vector from the tangent space of the point vector_at on the HeisenbergGroup by using a normal distribution with mean 0 and standard deviation ฯƒ.

source
Manifolds.exp_lie โ€” Method
exp_lie(M::HeisenbergGroup, X)

Lie group exponential for the HeisenbergGroup M of the vector X. The formula reads

\[\exp\left(\begin{bmatrix} 0 & \mathbf{a} & c \\ \mathbf{0} & 0_n & \mathbf{b} \\ 0 & \mathbf{0} & 0 \end{bmatrix}\right) = \begin{bmatrix} 1 & \mathbf{a} & c + \mathbf{a}โ‹…\mathbf{b}/2 \\ \mathbf{0} & I_n & \mathbf{b} \\ 0 & \mathbf{0} & 1 \end{bmatrix}\]

where $I_n$ is the $nร—n$ identity matrix, $0_n$ is the $nร—n$ zero matrix and $\mathbf{a}โ‹…\mathbf{b}$ is dot product of vectors.

source
Manifolds.log_lie โ€” Method
log_lie(M::HeisenbergGroup, p)

Lie group logarithm for the HeisenbergGroup M of the point p. The formula reads

\[\log\left(\begin{bmatrix} 1 & \mathbf{a} & c \\ \mathbf{0} & I_n & \mathbf{b} \\ 0 & \mathbf{0} & 1 \end{bmatrix}\right) = \begin{bmatrix} 0 & \mathbf{a} & c - \mathbf{a}โ‹…\mathbf{b}/2 \\ \mathbf{0} & 0_n & \mathbf{b} \\ 0 & \mathbf{0} & 0 \end{bmatrix}\]

where $I_n$ is the $nร—n$ identity matrix, $0_n$ is the $nร—n$ zero matrix and $\mathbf{a}โ‹…\mathbf{b}$ is dot product of vectors.

source
ManifoldsBase.get_coordinates โ€” Method
get_coordinates(M::HeisenbergGroup, p, X, ::DefaultOrthonormalBasis{โ„,TangentSpaceType})

Get coordinates of tangent vector X at point p from the HeisenbergGroup M. Given a matrix

\[\begin{bmatrix} 1 & \mathbf{a} & c \\ \mathbf{0} & I_n & \mathbf{b} \\ 0 & \mathbf{0} & 1 \end{bmatrix}\]

the coordinates are concatenated vectors $\mathbf{a}$, $\mathbf{b}$, and number $c$.

source
ManifoldsBase.get_vector โ€” Method
get_vector(M::HeisenbergGroup, p, Xโฑ, ::DefaultOrthonormalBasis{โ„,TangentSpaceType})

Get tangent vector with coordinates Xโฑ at point p from the HeisenbergGroup M. Given a vector of coordinates $\begin{bmatrix}\mathbb{a} & \mathbb{b} & c\end{bmatrix}$ the tangent vector is equal to

\[\begin{bmatrix} 1 & \mathbf{a} & c \\ \mathbf{0} & I_n & \mathbf{b} \\ 0 & \mathbf{0} & 1 \end{bmatrix}\]

source
ManifoldsBase.project โ€” Method
project(M::HeisenbergGroup, p, X)

Project a matrix X in the Euclidean embedding onto the Lie algebra of HeisenbergGroup M. Sets the diagonal elements to 0 and all non-diagonal elements except the first row and the last column to 0.

source
ManifoldsBase.project โ€” Method
project(M::HeisenbergGroup, p)

Project a matrix p in the Euclidean embedding onto the HeisenbergGroup M. Sets the diagonal elements to 1 and all non-diagonal elements except the first row and the last column to 0.

source

(Special) Orthogonal and (Special) Unitary group

Since the orthogonal, unitary and special orthogonal and special unitary groups share many common functions, these are also implemented on a common level.

Common functions

Manifolds.exp_lie โ€” Method
 exp_lie(G::Orthogonal{TypeParameter{Tuple{2}}}, X)
 exp_lie(G::SpecialOrthogonal{TypeParameter{Tuple{2}}}, X)

Compute the Lie group exponential map on the Orthogonal(2) or SpecialOrthogonal(2) group. Given $X = \begin{pmatrix} 0 & -ฮธ \\ ฮธ & 0 \end{pmatrix}$, the group exponential is

\[\exp_e \colon X โ†ฆ \begin{pmatrix} \cos ฮธ & -\sin ฮธ \\ \sin ฮธ & \cos ฮธ \end{pmatrix}.\]

source
Manifolds.exp_lie โ€” Method
 exp_lie(G::Orthogonal{TypeParameter{Tuple{4}}}, X)
 exp_lie(G::SpecialOrthogonal{TypeParameter{Tuple{4}}}, X)

Compute the group exponential map on the Orthogonal(4) or the SpecialOrthogonal group. The algorithm used is a more numerically stable form of those proposed in [GX02], [AR13].

source

Orthogonal group

Manifolds.Orthogonal โ€” Type
Orthogonal{T} = GeneralUnitaryMultiplicationGroup{T,โ„,AbsoluteDeterminantOneMatrices}

Orthogonal group $\mathrm{O}(n)$ represented by OrthogonalMatrices.

Constructor

Orthogonal(n::Int; parameter::Symbol=:type)
source

Special orthogonal group

Manifolds.SpecialOrthogonal โ€” Type
SpecialOrthogonal{T} = GeneralUnitaryMultiplicationGroup{T,โ„,DeterminantOneMatrices}

Special orthogonal group $\mathrm{SO}(n)$ represented by rotation matrices, see Rotations.

Constructor

SpecialOrthogonal(n)
source

Special unitary group

Manifolds.SpecialUnitary โ€” Type
SpecialUnitary{n} = GeneralUnitaryMultiplicationGroup{n,โ„,GeneralUnitaryMatrices{n,โ„‚,DeterminantOneMatrices}}

The special unitary group $\mathrm{SU}(n)$ represented by unitary matrices of determinant +1.

The tangent spaces are of the form

\[T_p\mathrm{SU}(x) = \bigl\{ X \in \mathbb C^{nร—n} \big| X = pY \text{ where } Y = -Y^{\mathrm{H}} \bigr\}\]

and we represent tangent vectors by just storing the SkewHermitianMatrices $Y$, or in other words we represent the tangent spaces employing the Lie algebra $\mathfrak{su}(n)$.

Constructor

SpecialUnitary(n)

Generate the Lie group of $nร—n$ unitary matrices with determinant +1.

source
ManifoldsBase.project โ€” Method
project(G::SpecialUnitary, p)

Project p to the nearest point on the SpecialUnitary group G.

Given the singular value decomposition $p = U S V^\mathrm{H}$, with the singular values sorted in descending order, the projection is

\[\operatorname{proj}_{\mathrm{SU}(n)}(p) = U\operatorname{diag}\left[1,1,โ€ฆ,\det(U V^\mathrm{H})\right] V^\mathrm{H}.\]

The diagonal matrix ensures that the determinant of the result is $+1$.

source

Unitary group

Manifolds.Unitary โ€” Type
 Unitary{n,๐”ฝ} = GeneralUnitaryMultiplicationGroup{n,๐”ฝ,AbsoluteDeterminantOneMatrices}

The group of unitary matrices $\mathrm{U}(n, ๐”ฝ)$, either complex (when ๐”ฝ=โ„‚) or quaternionic (when ๐”ฝ=โ„)

The group consists of all points $p โˆˆ ๐”ฝ^{nร—n}$ where $p^{\mathrm{H}}p = pp^{\mathrm{H}} = I$.

The tangent spaces are if the form

\[T_p\mathrm{U}(n) = \bigl\{ X \in ๐”ฝ^{nร—n} \big| X = pY \text{ where } Y = -Y^{\mathrm{H}} \bigr\}\]

and we represent tangent vectors by just storing the SkewHermitianMatrices $Y$, or in other words we represent the tangent spaces employing the Lie algebra $\mathfrak{u}(n, ๐”ฝ)$.

Quaternionic unitary group is isomorphic to the compact symplectic group of the same dimension.

Constructor

Unitary(n, ๐”ฝ::AbstractNumbers=โ„‚)

Construct $\mathrm{U}(n, ๐”ฝ)$. See also Orthogonal(n) for the real-valued case.

source
Manifolds.exp_lie โ€” Method
exp_lie(G::Unitary{TypeParameter{Tuple{2}},โ„‚}, X)

Compute the group exponential map on the Unitary(2) group, which is

\[\exp_e \colon X โ†ฆ e^{\operatorname{tr}(X) / 2} \left(\cos ฮธ I + \frac{\sin ฮธ}{ฮธ} \left(X - \frac{\operatorname{tr}(X)}{2} I\right)\right),\]

where $ฮธ = \frac{1}{2} \sqrt{4\det(X) - \operatorname{tr}(X)^2}$.

source

Power group

Manifolds.PowerGroup โ€” Method
PowerGroup{๐”ฝ,T} <: GroupManifold{๐”ฝ,<:AbstractPowerManifold{๐”ฝ,M,RPT},ProductOperation}

Decorate a power manifold with a ProductOperation.

Constituent manifold of the power manifold must also have a IsGroupManifold or a decorated instance of one. This type is mostly useful for equipping the direct product of group manifolds with an Identity element.

Constructor

PowerGroup(manifold::AbstractPowerManifold)
source

Product group

Manifolds.ProductGroup โ€” Method
ProductGroup{๐”ฝ,T} <: GroupManifold{๐”ฝ,ProductManifold{T},ProductOperation}

Decorate a product manifold with a ProductOperation.

Each submanifold must also have a IsGroupManifold or a decorated instance of one. This type is mostly useful for equipping the direct product of group manifolds with an Identity element.

Constructor

ProductGroup(manifold::ProductManifold)
source

Semidirect product group

Manifolds.SemidirectProductGroup โ€” Method
SemidirectProductGroup(N::GroupManifold, H::GroupManifold, A::AbstractGroupAction)

A group that is the semidirect product of a normal group $\mathcal{N}$ and a subgroup $\mathcal{H}$, written $\mathcal{G} = \mathcal{N} โ‹Š_ฮธ \mathcal{H}$, where $ฮธ: \mathcal{H} ร— \mathcal{N} โ†’ \mathcal{N}$ is an automorphism action of $\mathcal{H}$ on $\mathcal{N}$. The group $\mathcal{G}$ has the composition rule

\[g \circ g' = (n, h) \circ (n', h') = (n \circ ฮธ_h(n'), h \circ h')\]

and the inverse

\[g^{-1} = (n, h)^{-1} = (ฮธ_{h^{-1}}(n^{-1}), h^{-1}).\]

source
Manifolds.SemidirectProductOperation โ€” Type
SemidirectProductOperation(action::AbstractGroupAction)

Group operation of a semidirect product group. The operation consists of the operation opN on a normal subgroup N, the operation opH on a subgroup H, and an automorphism action of elements of H on N. Only the action is stored.

source
Manifolds.translate_diff โ€” Method
translate_diff(G::SemidirectProductGroupHVR, p, q, X, conX::LeftForwardAction)

Perform differential of the left translation on the semidirect product group G with HybridTangentRepresentation.

Since the left translation is defined as (cf. SemidirectProductGroup):

\[L_{(n', h')} (n, h) = ( L_{n'} ฮธ_{h'}(n), L_{h'} h)\]

then its differential can be computed as

\[\mathrm{d}L_{(n', h')}(X_n, X_h) = ( \mathrm{d}L_{n'} (\mathrm{d}ฮธ_{h'}(X_n)), \mathrm{d}L_{h'} X_h).\]

source

Special Euclidean group

Manifolds.SpecialEuclidean โ€” Type
SpecialEuclidean(
    n::Int;
    vectors::AbstractGroupVectorRepresentation=LeftInvariantRepresentation()
)

Special Euclidean group $\mathrm{SE}(n)$, the group of rigid motions.

$\mathrm{SE}(n)$ is the semidirect product of the TranslationGroup on $โ„^n$ and SpecialOrthogonal(n)

\[\mathrm{SE}(n) โ‰ \mathrm{T}(n) โ‹Š_ฮธ \mathrm{SO}(n),\]

where $ฮธ$ is the canonical action of $\mathrm{SO}(n)$ on $\mathrm{T}(n)$ by vector rotation.

This constructor is equivalent to calling

Tn = TranslationGroup(n)
SOn = SpecialOrthogonal(n)
SemidirectProductGroup(Tn, SOn, RotationAction(Tn, SOn), vectors)

Points on $\mathrm{SE}(n)$ may be represented as points on the underlying product manifold $\mathrm{T}(n) ร— \mathrm{SO}(n)$. For group-specific functions, they may also be represented as affine matrices with size (n + 1, n + 1) (see affine_matrix), for which the group operation is MultiplicationOperation.

There are two supported conventions for tangent vector storage, which can be selected using the vectors keyword argument:

source
Manifolds.SpecialEuclideanInGeneralLinear โ€” Type
SpecialEuclideanInGeneralLinear

An explicit isometric and homomorphic embedding of $\mathrm{SE}(n)$ in $\mathrm{GL}(n+1)$ and $๐”ฐ๐”ข(n)$ in $๐”ค๐”ฉ(n+1)$. Note that this is not a transparently isometric embedding.

Constructor

SpecialEuclideanInGeneralLinear(
    n::Int;
    se_vectors::AbstractGroupVectorRepresentation=LeftInvariantVectorRepresentation(),
)

Where se_vectors is the tangent vector representation of the SpecialEuclidean group to be used.

source
Manifolds._get_parameter โ€” Method
_get_parameter(M::AbstractManifold)

Similar to get_parameter but it can be specialized for manifolds without breaking manifolds being parametrized by other manifolds.

source
Manifolds.adjoint_action โ€” Method
adjoint_action(
    ::SpecialEuclidean{TypeParameter{Tuple{3}},<:HybridTangentRepresentation},
    p,
    fX::TFVector{<:Any,VeeOrthogonalBasis{โ„}},
)

Adjoint action of the SpecialEuclidean group on the vector with coefficients fX tangent at point p.

The formula for the coefficients reads $tร—(Rโ‹…ฯ‰) + Rโ‹…r$ for the translation part and $Rโ‹…ฯ‰$ for the rotation part, where t is the translation part of p, R is the rotation matrix part of p, r is the translation part of fX and ฯ‰ is the rotation part of fX, $ร—$ is the cross product and $โ‹…$ is the matrix product.

source
Manifolds.adjoint_matrix โ€” Method
adjoint_matrix(::SpecialEuclidean{TypeParameter{Tuple{2}}}, p)

Compute the adjoint matrix for the group SpecialEuclidean(2) at point p in default coordinates. The formula follows Section 10.6.2 in [Chi12] but with additional scaling by $\sqrt{2}$ due to a different choice of inner product. The formula reads

\[\begin{pmatrix} R_{1,1} & R_{1,2} & t_2 \\ R_{2,1} & R_{2,2} & -t_1 \\ 0 & 0 & 1 \end{pmatrix},\]

where $R$ is the rotation matrix part of p and $[t_1, t_2]$ is the translation part of p.

source
Manifolds.adjoint_matrix โ€” Method
adjoint_matrix(::SpecialEuclidean{TypeParameter{Tuple{3}}}, p)

Compute the adjoint matrix for the group SpecialEuclidean(3) at point p in default coordinates. The formula follows Section 10.6.9 in [Chi12] with changes due to different conventions. The formula reads

\[\begin{pmatrix} R & UR/\sqrt{2} \\ 0_{3ร—3} & R \end{pmatrix}.\]

where $R$ is the rotation matrix of p and $U$ is the matrix

\[\begin{pmatrix} 0 & -t_3 & t_2 \\ t_3 & 0 & -t_1 \\ -t_2 & t_1 & 0 \end{pmatrix}\]

where $[t_1, t_2, t_3]$ is the translation vector of p.

source
Manifolds.affine_matrix โ€” Method
affine_matrix(G::SpecialEuclidean, p) -> AbstractMatrix

Represent the point $p โˆˆ \mathrm{SE}(n)$ as an affine matrix. For $p = (t, R) โˆˆ \mathrm{SE}(n)$, where $t โˆˆ \mathrm{T}(n), R โˆˆ \mathrm{SO}(n)$, the affine representation is the $n + 1 ร— n + 1$ matrix

\[\begin{pmatrix} R & t \\ 0^\mathrm{T} & 1 \end{pmatrix}.\]

This function embeds $\mathrm{SE}(n)$ in the general linear group $\mathrm{GL}(n+1)$. It is an isometric embedding and group homomorphism [Ric88].

See also screw_matrix for matrix representations of the Lie algebra.

source
Manifolds.exp_lie โ€” Method
exp_lie(G::SpecialEuclidean{TypeParameter{Tuple{2}}}, X)

Compute the group exponential of $X = (b, ฮฉ) โˆˆ ๐”ฐ๐”ข(2)$, where $b โˆˆ ๐”ฑ(2)$ and $ฮฉ โˆˆ ๐”ฐ๐”ฌ(2)$:

\[\exp X = (t, R) = (U(ฮธ) b, \exp ฮฉ),\]

where $t โˆˆ \mathrm{T}(2)$, $R = \exp ฮฉ$ is the group exponential on $\mathrm{SO}(2)$,

\[U(ฮธ) = \frac{\sin ฮธ}{ฮธ} I_2 + \frac{1 - \cos ฮธ}{ฮธ^2} ฮฉ,\]

and $ฮธ = \frac{1}{\sqrt{2}} \lVert ฮฉ \rVert_e$ (see norm) is the angle of the rotation.

source
Manifolds.exp_lie โ€” Method
exp_lie(G::SpecialEuclidean{TypeParameter{Tuple{3}}}, X)

Compute the group exponential of $X = (b, ฮฉ) โˆˆ ๐”ฐ๐”ข(3)$, where $b โˆˆ ๐”ฑ(3)$ and $ฮฉ โˆˆ ๐”ฐ๐”ฌ(3)$:

\[\exp X = (t, R) = (U(ฮธ) b, \exp ฮฉ),\]

where $t โˆˆ \mathrm{T}(3)$, $R = \exp ฮฉ$ is the group exponential on $\mathrm{SO}(3)$,

\[U(ฮธ) = I_3 + \frac{1 - \cos ฮธ}{ฮธ^2} ฮฉ + \frac{ฮธ - \sin ฮธ}{ฮธ^3} ฮฉ^2,\]

and $ฮธ = \frac{1}{\sqrt{2}} \lVert ฮฉ \rVert_e$ (see norm) is the angle of the rotation.

source
Manifolds.exp_lie โ€” Method
exp_lie(G::SpecialEuclidean{n}, X)

Compute the group exponential of $X = (b, ฮฉ) โˆˆ ๐”ฐ๐”ข(n)$, where $b โˆˆ ๐”ฑ(n)$ and $ฮฉ โˆˆ ๐”ฐ๐”ฌ(n)$:

\[\exp X = (t, R),\]

where $t โˆˆ \mathrm{T}(n)$ and $R = \exp ฮฉ$ is the group exponential on $\mathrm{SO}(n)$.

In the screw_matrix representation, the group exponential is the matrix exponential (see exp_lie).

source
Manifolds.jacobian_exp_inv_argument โ€” Method
jacobian_exp_inv_argument(
    M::SpecialEuclidean{TypeParameter{Tuple{2}}},
    p,
    X,
)

Compute Jacobian matrix of the invariant exponential map on SpecialEuclidean(2). The formula reads

\[\begin{pmatrix} \frac{1}{ฮธ}\sin(ฮธ) & \frac{1}{ฮธ} (1-\cos(ฮธ)) & \frac{1}{\sqrt{2} ฮธ^2}(t_1(\sin(ฮธ) - ฮธ) + t_2(\cos(ฮธ) - 1)) \\ \frac{1}{ฮธ}(-1+\cos(ฮธ)) & \frac{1}{ฮธ}\sin(ฮธ) & \frac{1}{\sqrt{2} ฮธ^2}(t_2(\sin(ฮธ) - ฮธ) + t_1(-\cos(ฮธ) + 1)) \\ 0 & 0 & 1 \end{pmatrix}.\]

where $ฮธ$ is the norm of X and $[t_1, t_2]$ is the translation part of X. It is adapted from [Chi12], Section 10.6.2, to Manifolds.jl conventions.

source
Manifolds.jacobian_exp_inv_argument โ€” Method
jacobian_exp_inv_argument(
    M::SpecialEuclidean{TypeParameter{Tuple{3}}},
    p,
    X,
)

Compute Jacobian matrix of the invariant exponential map on SpecialEuclidean(3). The formula reads

\[\begin{pmatrix} R & Q \\ 0_{3ร—3} & R \end{pmatrix},\]

where $R$ is the Jacobian of exponential map on Rotations(3) with respect to the argument, and $Q$ is

\[\begin{align*} Q = &\frac{1}{2} T \\ &- \frac{ฮธ - \sin(ฮธ)}{ฮธ^3} (X_r T + T X_r + X_r T X_r) \\ & + \frac{1 - \frac{ฮธ^2}{2} - \cos(ฮธ)}{ฮธ^4} (X_r^2 T + T X_r^2 - 3 X_r T X_r)\\ & + \frac{1}{2}\left(\frac{1 - \frac{ฮธ^2}{2} - \cos(ฮธ)}{ฮธ^4} - 3 \frac{ฮธ - \sin(ฮธ) - \frac{ฮธ^3}{6}}{ฮธ^5}\right) (X_r T X_r^2 + X_r^2 T X_r) \end{align*}\]

where $X_r$ is the rotation part of $X$ and $T$ is

\[\frac{1}{\sqrt{2}}\begin{pmatrix} 0 & -t_3 & t_2 \\ t_3 & 0 & -t_1 \\ -t_2 & t_1 & 0 \end{pmatrix},\]

where $[t_1, t_2, t_3]$ is the translation part of X. It is adapted from [BF14], Eq. (102), to Manifolds.jl conventions.

source
Manifolds.lie_bracket โ€” Method
lie_bracket(G::SpecialEuclidean, X::ArrayPartition, Y::ArrayPartition)
lie_bracket(G::SpecialEuclidean, X::AbstractMatrix, Y::AbstractMatrix)

Calculate the Lie bracket between elements X and Y of the special Euclidean Lie algebra. For the matrix representation (which can be obtained using screw_matrix) the formula is $[X, Y] = XY-YX$, while in the ArrayPartition representation the formula reads $[X, Y] = [(t_1, R_1), (t_2, R_2)] = (R_1 t_2 - R_2 t_1, R_1 R_2 - R_2 R_1)$.

source
Manifolds.log_lie โ€” Method
log_lie(G::SpecialEuclidean{TypeParameter{Tuple{2}}}, p)

Compute the group logarithm of $p = (t, R) โˆˆ \mathrm{SE}(2)$, where $t โˆˆ \mathrm{T}(2)$ and $R โˆˆ \mathrm{SO}(2)$:

\[\log p = (b, ฮฉ) = (U(ฮธ)^{-1} t, \log R),\]

where $b โˆˆ ๐”ฑ(2)$, $ฮฉ = \log R โˆˆ ๐”ฐ๐”ฌ(2)$ is the group logarithm on $\mathrm{SO}(2)$,

\[U(ฮธ) = \frac{\sin ฮธ}{ฮธ} I_2 + \frac{1 - \cos ฮธ}{ฮธ^2} ฮฉ,\]

and $ฮธ = \frac{1}{\sqrt{2}} \lVert ฮฉ \rVert_e$ (see norm) is the angle of the rotation.

source
Manifolds.log_lie โ€” Method
log_lie(G::SpecialEuclidean{TypeParameter{Tuple{3}}}, p)

Compute the group logarithm of $p = (t, R) โˆˆ \mathrm{SE}(3)$, where $t โˆˆ \mathrm{T}(3)$ and $R โˆˆ \mathrm{SO}(3)$:

\[\log p = (b, ฮฉ) = (U(ฮธ)^{-1} t, \log R),\]

where $b โˆˆ ๐”ฑ(3)$, $ฮฉ = \log R โˆˆ ๐”ฐ๐”ฌ(3)$ is the group logarithm on $\mathrm{SO}(3)$,

\[U(ฮธ) = I_3 + \frac{1 - \cos ฮธ}{ฮธ^2} ฮฉ + \frac{ฮธ - \sin ฮธ}{ฮธ^3} ฮฉ^2,\]

and $ฮธ = \frac{1}{\sqrt{2}} \lVert ฮฉ \rVert_e$ (see norm) is the angle of the rotation.

source
Manifolds.log_lie โ€” Method
log_lie(G::SpecialEuclidean, p)

Compute the group logarithm of $p = (t, R) โˆˆ \mathrm{SE}(n)$, where $t โˆˆ \mathrm{T}(n)$ and $R โˆˆ \mathrm{SO}(n)$:

\[\log p = (b, ฮฉ),\]

where $b โˆˆ ๐”ฑ(n)$ and $ฮฉ = \log R โˆˆ ๐”ฐ๐”ฌ(n)$ is the group logarithm on $\mathrm{SO}(n)$.

In the affine_matrix representation, the group logarithm is the matrix logarithm (see log_lie):

source
Manifolds.screw_matrix โ€” Method
screw_matrix(G::SpecialEuclidean, X) -> AbstractMatrix

Represent the Lie algebra element $X โˆˆ ๐”ฐ๐”ข(n) = T_e \mathrm{SE}(n)$ as a screw matrix. For $X = (b, ฮฉ) โˆˆ ๐”ฐ๐”ข(n)$, where $ฮฉ โˆˆ ๐”ฐ๐”ฌ(n) = T_e \mathrm{SO}(n)$, the screw representation is the $n + 1 ร— n + 1$ matrix

\[\begin{pmatrix} ฮฉ & b \\ 0^\mathrm{T} & 0 \end{pmatrix}.\]

This function embeds $๐”ฐ๐”ข(n)$ in the general linear Lie algebra $๐”ค๐”ฉ(n+1)$ but it's not a homomorphic embedding (see SpecialEuclideanInGeneralLinear for a homomorphic one).

See also affine_matrix for matrix representations of the Lie group.

source
Manifolds.translate_diff โ€” Method
translate_diff(G::SpecialEuclidean, p, q, X, ::RightBackwardAction)

Differential of the right action of the SpecialEuclidean group on itself. The formula for the rotation part is the differential of the right rotation action, while the formula for the translation part reads

\[R_qโ‹…X_Rโ‹…t_p + X_t\]

where $R_q$ is the rotation part of q, $X_R$ is the rotation part of X, $t_p$ is the translation part of p and $X_t$ is the translation part of X.

source
ManifoldsBase.embed โ€” Method
embed(M::SpecialEuclideanInGeneralLinear, p, X)

Embed the tangent vector Xat pointpon [SpecialEuclidean](@ref) in the [GeneralLinear](@ref) group. Pointpcan use any representation valid forSpecialEuclidean. The embedding is similar from the one defined by [screw_matrix`](@ref).

source

Special linear group

Manifolds.SpecialLinear โ€” Type
SpecialLinear{T,๐”ฝ} <: AbstractDecoratorManifold

The special linear group $\mathrm{SL}(n,๐”ฝ)$ that is, the group of all invertible matrices with unit determinant in $๐”ฝ^{nร—n}$.

The Lie algebra $๐”ฐ๐”ฉ(n, ๐”ฝ) = T_e \mathrm{SL}(n,๐”ฝ)$ is the set of all matrices in $๐”ฝ^{nร—n}$ with trace of zero. By default, tangent vectors $X_p โˆˆ T_p \mathrm{SL}(n,๐”ฝ)$ for $p โˆˆ \mathrm{SL}(n,๐”ฝ)$ are represented with their corresponding Lie algebra vector $X_e = p^{-1}X_p โˆˆ ๐”ฐ๐”ฉ(n, ๐”ฝ)$.

The default metric is the same left-$\mathrm{GL}(n)$-right-$\mathrm{O}(n)$-invariant metric used for GeneralLinear(n, ๐”ฝ). The resulting geodesic on $\mathrm{GL}(n,๐”ฝ)$ emanating from an element of $\mathrm{SL}(n,๐”ฝ)$ in the direction of an element of $๐”ฐ๐”ฉ(n, ๐”ฝ)$ is a closed subgroup of $\mathrm{SL}(n,๐”ฝ)$. As a result, most metric functions forward to GeneralLinear.

source
ManifoldsBase.project โ€” Method
project(G::SpecialLinear, p, X)

Orthogonally project $X โˆˆ ๐”ฝ^{nร—n}$ onto the tangent space of $p$ to the SpecialLinear $G = \mathrm{SL}(n, ๐”ฝ)$. The formula reads

\[\operatorname{proj}_{p} = (\mathrm{d}L_p)_e โˆ˜ \operatorname{proj}_{๐”ฐ๐”ฉ(n, ๐”ฝ)} โˆ˜ (\mathrm{d}L_p^{-1})_p \colon X โ†ฆ X - \frac{\operatorname{tr}(X)}{n} I,\]

where the last expression uses the tangent space representation as the Lie algebra.

source
ManifoldsBase.project โ€” Method
project(G::SpecialLinear, p)

Project $p โˆˆ \mathrm{GL}(n, ๐”ฝ)$ to the SpecialLinear group $G=\mathrm{SL}(n, ๐”ฝ)$.

Given the singular value decomposition of $p$, written $p = U S V^\mathrm{H}$, the formula for the projection is

\[\operatorname{proj}_{\mathrm{SL}(n, ๐”ฝ)}(p) = U S D V^\mathrm{H},\]

where

\[D_{ij} = ฮด_{ij} \begin{cases} 1 & \text{ if } i โ‰  n \\ \det(p)^{-1} & \text{ if } i = n \end{cases}.\]

source

Translation group

Manifolds.TranslationGroup โ€” Type
TranslationGroup{T,๐”ฝ} <: GroupManifold{Euclidean{T,๐”ฝ},AdditionOperation,LeftInvariantRepresentation}

Translation group $\mathrm{T}(n)$ represented by translation arrays.

Constructor

TranslationGroup(nโ‚,...,nแตข; field=๐”ฝ, parameter::Symbol=:type)

Generate the translation group on $๐”ฝ^{nโ‚,โ€ฆ,nแตข}$ = Euclidean(nโ‚,...,nแตข; field=๐”ฝ), which is isomorphic to the group itself.

source

Metrics on groups

Lie groups by default typically forward all metric-related operations like exponential or logarithmic map to the underlying manifold, for example SpecialOrthogonal uses methods for Rotations (which is, incidentally, bi-invariant), or SpecialEuclidean uses product metric of the translation and rotation parts (which is not invariant under group operation).

It is, however, possible to change the metric used by a group by wrapping it in a MetricManifold decorator.

Invariant metrics

Manifolds.direction โ€” Method
direction(::AbstractDecoratorManifold) -> AD

Get the direction of the action a certain Lie group with its implicit metric has.

source
Manifolds.has_approx_invariant_metric โ€” Method
has_approx_invariant_metric(
    G::AbstractDecoratorManifold,
    p,
    X,
    Y,
    qs::AbstractVector,
    conv::ActionDirectionAndSide = LeftForwardAction();
    kwargs...,
) -> Bool

Check whether the metric on the group $\mathcal{G}$ is (approximately) invariant using a set of predefined points. Namely, for $p โˆˆ \mathcal{G}$, $X,Y โˆˆ T_p \mathcal{G}$, a metric $g$, and a translation map $ฯ„_q$ in the specified direction, check for each $q โˆˆ \mathcal{G}$ that the following condition holds:

\[g_p(X, Y) โ‰ˆ g_{ฯ„_q p}((\mathrm{d}ฯ„_q)_p X, (\mathrm{d}ฯ„_q)_p Y).\]

This is necessary but not sufficient for invariance.

Optionally, kwargs passed to isapprox may be provided.

source

Cartan-Schouten connections

Manifolds.CartanSchoutenMinus โ€” Type
CartanSchoutenMinus

The unique Cartan-Schouten connection such that all left-invariant vector fields are globally defined by their value at identity. It is biinvariant with respect to the group operation.

source
Manifolds.CartanSchoutenPlus โ€” Type
CartanSchoutenPlus

The unique Cartan-Schouten connection such that all right-invariant vector fields are globally defined by their value at identity. It is biinvariant with respect to the group operation.

source
Manifolds.CartanSchoutenZero โ€” Type
CartanSchoutenZero

The unique torsion-free Cartan-Schouten connection. It is biinvariant with respect to the group operation.

If the metric on the underlying manifold is bi-invariant then it is equivalent to the Levi-Civita connection of that metric.

source
Base.exp โ€” Method
exp(M::ConnectionManifold{๐”ฝ,<:AbstractDecoratorManifold{๐”ฝ},<:AbstractCartanSchoutenConnection}, p, X) where {๐”ฝ}

Compute the exponential map on the ConnectionManifold M with a Cartan-Schouten connection. See Sections 5.3.2 and 5.3.3 of [PL20] for details.

source
Base.log โ€” Method
log(M::ConnectionManifold{๐”ฝ,<:AbstractDecoratorManifold{๐”ฝ},<:AbstractCartanSchoutenConnection}, p, q) where {๐”ฝ}

Compute the logarithmic map on the ConnectionManifold M with a Cartan-Schouten connection. See Sections 5.3.2 and 5.3.3 of [PL20] for details.

source