# Group manifolds and actions

Lie groups, groups that are Manifolds with a smooth binary group operation AbstractGroupOperation, are implemented as subtypes of AbstractGroupManifold 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.

## Groups

### Group manifold

Manifolds.AbstractGroupOperationType
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 AbstractGroupManifold over number system 𝔽 or in general, by defining for an operation Op the following methods:

identity!(::AbstractGroupManifold{𝔽,Op}, q, q)
identity(::AbstractGroupManifold{𝔽,Op}, p)
inv!(::AbstractGroupManifold{𝔽,Op}, q, p)
inv(::AbstractGroupManifold{𝔽,Op}, p)
compose(::AbstractGroupManifold{𝔽,Op}, p, q)
compose!(::AbstractGroupManifold{𝔽,Op}, x, p, q)

Note that a manifold is connected with an operation by wrapping it with a decorator, AbstractGroupManifold. In typical cases the concrete wrapper GroupManifold can be used.

source
Manifolds.GroupManifoldType
GroupManifold{𝔽,M<:Manifold{𝔽},O<:AbstractGroupOperation} <: AbstractGroupManifold{𝔽,O}

Decorator for a smooth manifold that equips the manifold with a group operation, thus making it a Lie group. See AbstractGroupManifold for more details.

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

Constructor

GroupManifold(manifold, op)
source
Manifolds.IdentityType
Identity(G::AbstractGroupManifold, p)

The group identity element $e ∈ \mathcal{G}$ represented by point p.

source
Base.identityMethod
identity(G::AbstractGroupManifold, p)

Identity element $e ∈ \mathcal{G}$, such that for any element $p ∈ \mathcal{G}$, $p \circ e = e \circ p = p$. The returned element is of a similar type to p.

source
Base.invMethod
inv(G::AbstractGroupManifold, 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.composeMethod
compose(G::AbstractGroupManifold, p, q)

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

source
Manifolds.group_expMethod
group_exp(G::AbstractGroupManifold, X)

Compute the group exponential of the Lie algebra element X.

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:

\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.

group_exp(G::AbstractGroupManifold{𝔽,AdditionOperation}, X) where {𝔽}

Compute $q = X$.

group_exp(G::AbstractGroupManifold{𝔽,MultiplicationOperation}, X) where {𝔽}

For Number and AbstractMatrix types of X, compute the usual numeric/matrix exponential,

$\exp X = \operatorname{Exp} X = \sum_{n=0}^∞ \frac{1}{n!} X^n.$
source
Manifolds.group_logMethod
group_log(G::AbstractGroupManifold, q)

Compute the group logarithm of the group element q.

Given an element $q ∈ \mathcal{G}$, compute the right inverse of the group exponential map group_exp, 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.

group_log(G::AbstractGroupManifold{𝔽,AdditionOperation}, q) where {𝔽}

Compute $X = q$.

group_log(G::AbstractGroupManifold{𝔽,MultiplicationOperation}, q) where {𝔽}

For Number and AbstractMatrix types of q, compute the usual numeric/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}$.

source
Manifolds.inverse_translateMethod
inverse_translate(G::AbstractGroupManifold, p, q)
inverse_translate(G::AbstractGroupManifold, p, q, conv::ActionDirection=LeftAction())

Inverse translate group element $q$ by $p$ with the inverse translation $τ_p^{-1}$ with the specified convention, either left ($L_p^{-1}$) or right ($R_p^{-1}$), defined as

\begin{aligned} L_p^{-1} &: q ↦ p^{-1} \circ q\\ R_p^{-1} &: q ↦ q \circ p^{-1}. \end{aligned}
source
Manifolds.inverse_translate_diffMethod
inverse_translate_diff(G::AbstractGroupManifold, p, q, X)
inverse_translate_diff(G::AbstractGroupManifold, p, q, X, conv::ActionDirection=LeftAction())

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.translateMethod
translate(G::AbstractGroupManifold, p, q)
translate(G::AbstractGroupManifold, p, q, conv::ActionDirection=LeftAction()])

Translate group element $q$ by $p$ with the translation $τ_p$ with the specified convention, either left ($L_p$) or right ($R_p$), defined as

\begin{aligned} L_p &: q ↦ p \circ q\\ R_p &: q ↦ q \circ p. \end{aligned}
source
Manifolds.translate_diffMethod
translate_diff(G::AbstractGroupManifold, p, q, X)
translate_diff(G::AbstractGroupManifold, p, q, X, conv::ActionDirection=LeftAction())

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}\\$
source
ManifoldsBase.inverse_retractMethod
inverse_retract(
G::AbstractGroupManifold,
p,
X,
method::GroupLogarithmicInverseRetraction{<:ActionDirection},
)

Compute the inverse retraction using the group logarithm group_log "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 (group_log), 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.retractMethod
retract(
G::AbstractGroupManifold,
p,
X,
method::GroupExponentialRetraction{<:ActionDirection},
)

Compute the retraction using the group exponential group_exp "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 (group_exp), 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

### Product group

Manifolds.ProductGroupMethod
ProductGroup{𝔽,T} <: GroupManifold{𝔽,ProductManifold{T},ProductOperation}

Decorate a product manifold with a ProductOperation.

Each submanifold must also be an AbstractGroupManifold 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.SemidirectProductGroupMethod
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.SemidirectProductOperationType
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

### Special orthogonal group

Manifolds.SpecialOrthogonalType
SpecialOrthogonal{n} <: GroupManifold{ℝ,Rotations{n},MultiplicationOperation}

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

Constructor

SpecialOrthogonal(n)
source

### Translation group

Manifolds.TranslationGroupType
TranslationGroup{T<:Tuple,𝔽} <: GroupManifold{Euclidean{T,𝔽},AdditionOperation}

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

Constructor

TranslationGroup(n₁,...,nᵢ; field = 𝔽)

Generate the translation group on $𝔽^{n₁,…,nᵢ}$ = Euclidean(n₁,...,nᵢ; field = 𝔽), which is isomorphic to the group itself.

source

### Special Euclidean group

Manifolds.SpecialEuclideanType
SpecialEuclidean(n)

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))

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.

source
Manifolds.affine_matrixMethod
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}.$

See also screw_matrix for matrix representations of the Lie algebra.

source
Manifolds.group_expMethod
group_exp(G::SpecialEuclidean{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.group_expMethod
group_exp(G::SpecialEuclidean{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.group_expMethod
group_exp(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 group_exp).

source
Manifolds.group_logMethod
group_log(G::SpecialEuclidean{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.group_logMethod
group_log(G::SpecialEuclidean{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.group_logMethod
group_log(G::SpecialEuclidean{n}, p) where {n}

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 group_log):

source
Manifolds.screw_matrixMethod
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}.$

See also affine_matrix for matrix representations of the Lie group.

source

## Group actions

Manifolds.apply!Method
apply!(A::AbstractGroupAction, q, a, p)

Apply action a to the point p with the rule specified by A. The result is saved in q.

source
Manifolds.applyMethod
apply(A::AbstractGroupAction, a, p)

Apply action a to the point p using map $τ_a$, specified by A. Unless otherwise specified, the right action is defined in terms of the left action:

$\mathrm{R}_a = \mathrm{L}_{a^{-1}}$
source
Manifolds.apply_diffMethod
apply_diff(A::AbstractGroupAction, a, p, X)

For group point $p ∈ \mathcal M$ and tangent vector $X ∈ T_p \mathcal M$, compute the action on $X$ of the differential of the action of $a ∈ \mathcal{G}$, specified by rule A. Written as $(\mathrm{d}τ_a)_p$, with the specified left or right convention, the differential transports vectors

$(\mathrm{d}τ_a)_p : T_p \mathcal M → T_{τ_a p} \mathcal M$
source
Manifolds.center_of_orbitFunction
center_of_orbit(
A::AbstractGroupAction,
pts,
p,
)

Calculate an action element $a$ of action A that is the mean element of the orbit of p with respect to given set of points pts. The mean is calculated using the method mean_method.

The orbit of $p$ with respect to the action of a group $\mathcal{G}$ is the set

$O = \{ τ_a p : a ∈ \mathcal{G} \}.$

This function is useful for computing means on quotients of manifolds by a Lie group action.

source
Manifolds.inverse_apply!Method
inverse_apply!(A::AbstractGroupAction, q, a, p)

Apply inverse of action a to the point p with the rule specified by A. The result is saved in q.

source
Manifolds.inverse_applyMethod
inverse_apply(A::AbstractGroupAction, a, p)

Apply inverse of action a to the point p. The action is specified by A.

source
Manifolds.inverse_apply_diffMethod
inverse_apply_diff(A::AbstractGroupAction, a, p, X)

For group point $p ∈ \mathcal M$ and tangent vector $X ∈ T_p \mathcal M$, compute the action on $X$ of the differential of the inverse action of $a ∈ \mathcal{G}$, specified by rule A. Written as $(\mathrm{d}τ_a^{-1})_p$, with the specified left or right convention, the differential transports vectors

$(\mathrm{d}τ_a^{-1})_p : T_p \mathcal M → T_{τ_a^{-1} p} \mathcal M$
source
Manifolds.optimal_alignment!Method
optimal_alignment!(A::AbstractGroupAction, x, p, q)

Calculate an action element of action A that acts upon p to produce the element closest to q. The result is written to x.

source
Manifolds.optimal_alignmentMethod
optimal_alignment(A::AbstractGroupAction, p, q)

Calculate an action element $a$ of action A that acts upon p to produce the element closest to q in the metric of the G-manifold:

$\arg\min_{a ∈ \mathcal{G}} d_{\mathcal M}(τ_a p, q)$

where $\mathcal{G}$ is the group that acts on the G-manifold $\mathcal M$.

source

## Invariant metrics

Manifolds.InvariantMetricType
InvariantMetric{G<:Metric,D<:ActionDirection} <: Metric

Extend a metric on the Lie algebra of an AbstractGroupManifold to the whole group via translation in the specified direction.

Given a group $\mathcal{G}$ and a left- or right group translation map $τ$ on the group, a metric $g$ is $τ$-invariant if it has the inner product

$g_p(X, Y) = g_{τ_q p}((\mathrm{d}τ_q)_p X, (\mathrm{d}τ_q)_p Y),$

for all $p,q ∈ \mathcal{G}$ and $X,Y ∈ T_p \mathcal{G}$, where $(\mathrm{d}τ_q)_p$ is the differential of translation by $q$ evaluated at $p$ (see translate_diff).

InvariantMetric constructs an (assumed) $τ$-invariant metric by extending the inner product of a metric $h_e$ on the Lie algebra to the whole group:

$g_p(X, Y) = h_e((\mathrm{d}τ_p^{-1})_p X, (\mathrm{d}τ_p^{-1})_p Y).$
Warning

The invariance condition is not checked and must be verified for the entire group. To verify the condition for a set of points numerically, use has_approx_invariant_metric.

The convenient aliases LeftInvariantMetric and RightInvariantMetric are provided.

Constructor

InvariantMetric(metric::Metric, conv::ActionDirection = LeftAction())
source
Manifolds.has_approx_invariant_metricMethod
has_approx_invariant_metric(
G::AbstractGroupManifold,
p,
X,
Y,
qs::AbstractVector,
conv::ActionDirection = LeftAction();
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
Manifolds.invariant_metric_dispatchMethod
invariant_metric_dispatch(G::AbstractGroupManifold, conv::ActionDirection) -> Val

Return Val(true) if the metric on the group $\mathcal{G}$ is invariant under translations by the specified direction, that is, given a group $\mathcal{G}$, a left- or right group translation map $τ$, and a metric $g_e$ on the Lie algebra, a $τ$-invariant metric at any point $p ∈ \mathcal{G}$ is defined as a metric with the inner product

$g_p(X, Y) = g_{τ_q p}((\mathrm{d}τ_q)_p X, (\mathrm{d}τ_q)_p Y),$

for $X,Y ∈ T_q \mathcal{G}$ and all $q ∈ \mathcal{G}$, where $(\mathrm{d}τ_q)_p$ is the differential of translation by $q$ evaluated at $p$ (see translate_diff).

source