An interface for Lie groups

LieGroups.LieGroup β€” Type
LieGroup{𝔽, O<:AbstractGroupOperation, M<:AbstractManifold{𝔽}} <: AbstractManifold{𝔽}

Represent a Lie Group $\mathcal G$.

A Lie Group $\mathcal G$ is a group endowed with the structure of a manifold such that the group operations $∘: \mathcal GΓ—\mathcal G β†’ \mathcal G$, see compose and the inverse operation $β‹…^{-1}: \mathcal G β†’ \mathcal G$, see inv are smooth, see for example [HN12, Definition 9.1.1].

Lie groups are named after the Norwegian mathematician Marius Sophus Lie (1842–1899).

Fields

Constructor

LieGroup(M::AbstractManifold, op::AbstractGroupOperation)

Generate a Lie group based on a manifold M and a group operation op, where vectors by default are stored in the Lie Algebra.

source

Functions on Lie groups

Base.adjoint β€” Method
adjoint(G::LieGroup, g X)
adjoint!(G::LieGroup, Y, g, X)

Compute the adjoint $\mathrm{Ad}(g): \mathfrak g β†’ \mathfrak g$, which is defined as the differential diff_conjugate of the conjugate $c_g(h) = g∘h∘g^{-1}$ evaluated at the Identity $h=\mathrm{e}$. The operation can be performed in-place of Y.

\[ \mathrm{Ad}(g)[X] = D c_g(\mathrm{e}) [X], \qquad X ∈ \mathfrak g.\]

see [HN12, Section 9.2.3].

On matrix Lie groups the adjoint reads $\mathrm{Ad}(g)[X] = g∘X∘g^{-1}$.

source
Base.exp β€” Function
exp(G::LieGroup, g, X, t::Number=1)
exp!(G::LieGroup, h, g, X, t::Number=1)

Compute the Lie group exponential map given by

\[\exp_g X = g∘\exp_{\mathcal G}(X)\]

where X can be scaled by t, the computation can be performed in-place of h, and $\exp_{\mathcal G}$ denotes the Lie group exponential function.

Note

If g is the Identity the Lie group exponential function is computed directly. Implementing the Lie group exponential function introduces a default implementation for this function.

Note

The Lie group exponential map is usually different from the exponential map with respect to the metric of the underlying Riemannian manifold $\mathcal M$. To access the (Riemannian) exponential map, use exp(base_manifold(G), g, X).

source
Base.exp β€” Method
exp(G::LieGroup, e::Identity, X)
exp!(G::LieGroup, h, e::Identity, X)

Compute the (Lie group) exponential function

\[\exp_{\mathcal G}: \mathfrak g β†’ \mathcal G,\qquad \exp_{\mathcal G}(X) = Ξ³_X(1),\]

where $Ξ³_X$ is the unique solution of the initial value problem

\[Ξ³(0) = \mathrm{e}, \quad Ξ³'(t) = Ξ³(t)β‹…X.\]

The computation can be performed in-place of h.

See also [HN12, Definition 9.2.2].

source
Base.inv β€” Method
inv(G::LieGroup, g)
inv!(G::LieGroup, h, g)

Compute the inverse group element $g^{-1}$ with respect to the AbstractGroupOperation $∘$ on the LieGroup $\mathcal G$, that is, return the unique element $h=g^{-1}$ such that $h∘g=\mathrm{e}$, where $\mathrm{e}$ denotes the Identity.

This can be done in-place of h, without side effects, that is you can do inv!(G, g, g).

source
Base.isapprox β€” Method
isapprox(M::LieGroup, g, h; kwargs...)

Check if points g and h from LieGroup are approximately equal. this function calls the corresponding isapprox on the AbstractManifold after handling the cases where one or more of the points are the Identity. All keyword argments are passed to this function as well.

source
Base.log β€” Method
log(G::LieGroup, g, h)
log!(G::LieGroup, X, g, h)

Compute the Lie group logarithmic map

\[\log_g h = \log_{\mathcal G}(g^{-1}∘h)\]

where $\log_{\mathcal G}$ denotes the Lie group logarithmic function The computation can be performed in-place of X.

Note

If g is the Identity the Lie group logarithmic function is computed directly. Implementing the Lie group logarithmic function introduces a default implementation for this function.

Note

The Lie group logarithmic map is usually different from the logarithmic map with respect to the metric of the underlying Riemannian manifold $\mathcal M$. To access the (Riemannian) logarithmic map, use log(base_manifoldG, g, h).

source
Base.log β€” Method
log(G::LieGroup, e::Identity, g)
log!(G::LieGroup, X, e::Identity, g)

Compute the (Lie group) logarithmic function $\log_{\mathcal G}: \mathcal G β†’ \mathfrak g$, which is the inverse of the Lie group exponential function The compuation can be performed in-place of X.

source
Base.rand β€” Method
rand(::LieGroup; vector_at=nothing, Οƒ::Real=1.0, kwargs...)
rand(::LieAlgebra; Οƒ::Real=1.0, kwargs...)
rand!(::LieGroup, gX; vector_at=nothing, Οƒ::Real=1.0, kwargs...)
rand!(::LieAlgebra, X; Οƒ::Real=1.0, 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, see also rand(::LieAlgebra; kwargs...)

source
LieGroups.adjoint! β€” Method
adjoint(G::LieGroup, g X)
adjoint!(G::LieGroup, Y, g, X)

Compute the adjoint $\mathrm{Ad}(g): \mathfrak g β†’ \mathfrak g$, which is defined as the differential diff_conjugate of the conjugate $c_g(h) = g∘h∘g^{-1}$ evaluated at the Identity $h=\mathrm{e}$. The operation can be performed in-place of Y.

\[ \mathrm{Ad}(g)[X] = D c_g(\mathrm{e}) [X], \qquad X ∈ \mathfrak g.\]

see [HN12, Section 9.2.3].

On matrix Lie groups the adjoint reads $\mathrm{Ad}(g)[X] = g∘X∘g^{-1}$.

source
LieGroups.compose! β€” Method
compose(G::LieGroup, g, h)
compose!(G::LieGroup, k, g, h)

Perform the group oepration $g ∘ h$ for two $g, h ∈ \mathcal G$ on the LieGroup G. This can also be done in-place of h.

Info

This function also handles the case where g or/and h are the Identity(G). Since this would lead to ambiguities when implementing a new group operations, this function calls _compose and _compose!, respectively, which is meant for the actual computation of group operations on (non-Identity` but maybe its numerical representation) elements.

source
LieGroups.conjugate! β€” Method
conjugate(G::LieGroup, g, h)
conjugate!(G::LieGroup, k, g, h)

Compute the conjugation map $c_g: \mathcal G β†’ \mathcal G$ given by $c_g(h) = g∘h∘g^{-1}$. This can be done in-place of k.

source
LieGroups.conjugate β€” Method
conjugate(G::LieGroup, g, h)
conjugate!(G::LieGroup, k, g, h)

Compute the conjugation map $c_g: \mathcal G β†’ \mathcal G$ given by $c_g(h) = g∘h∘g^{-1}$. This can be done in-place of k.

source
LieGroups.diff_conjugate! β€” Method
diff_conjugate(G::LieGroup, g, h, X)
diff_conjugate!(G::LieGroup, Y, g, h, X)

Compute the differential of the conjugate $c_g(h) = g∘h∘g^{-1}$, which can be performed in-place of Y.

\[ D(c_g(h))[X], \qquad X ∈ \mathfrak g.\]

source
LieGroups.diff_conjugate β€” Method
diff_conjugate(G::LieGroup, g, h, X)
diff_conjugate!(G::LieGroup, Y, g, h, X)

Compute the differential of the conjugate $c_g(h) = g∘h∘g^{-1}$, which can be performed in-place of Y.

\[ D(c_g(h))[X], \qquad X ∈ \mathfrak g.\]

source
LieGroups.diff_inv! β€” Method
diff_inv(G::LieGroup, g, X)
diff_inv!(G::LieGroup, Y, g, X)

Compute the differential of the function $ΞΉ_{\mathcal G}(g) = g^{-1}$, where $DΞΉ_{\mathcal G}(g): \mathfrak g β†’ \mathfrak g$. This can be done in-place of Y.

source
LieGroups.diff_inv β€” Method
diff_inv(G::LieGroup, g, X)
diff_inv!(G::LieGroup, Y, g, X)

Compute the differential of the function $ΞΉ_{\mathcal G}(g) = g^{-1}$, where $DΞΉ_{\mathcal G}(g): \mathfrak g β†’ \mathfrak g$. This can be done in-place of Y.

source
LieGroups.diff_left_compose! β€” Method
diff_left_compose(G::LieGroup, g, h, X)
diff_left_compose!(G::LieGroup, Y, g, h, X)

Compute the differential of the left group multiplication $Ξ»_g(h) = g∘h$, on the LieGroup G, that is Compute $DΞ»_g(h)[X]$, $X ∈ 𝔀$. This can be done in-place of Y.

source
LieGroups.diff_left_compose β€” Method
diff_left_compose(G::LieGroup, g, h, X)
diff_left_compose!(G::LieGroup, Y, g, h, X)

Compute the differential of the left group multiplication $Ξ»_g(h) = g∘h$, on the LieGroup G, that is Compute $DΞ»_g(h)[X]$, $X ∈ 𝔀$. This can be done in-place of Y.

source
LieGroups.diff_right_compose! β€” Method
diff_right_compose(G::LieGroup, h, g, X)
diff_right_compose!(G::LieGroup, Y, h, g, X)

Compute the differential of the right group multiplication $ρ_g(h) = h∘g$, on the LieGroup G, that is Compute $Dρ_g(h)[X]$, $X ∈ 𝔀$ This can be done in-place of Y.

source
LieGroups.diff_right_compose β€” Method
diff_right_compose(G::LieGroup, h, g, X)
diff_right_compose!(G::LieGroup, Y, h, g, X)

Compute the differential of the right group multiplication $ρ_g(h) = h∘g$, on the LieGroup G, that is Compute $Dρ_g(h)[X]$, $X ∈ 𝔀$ This can be done in-place of Y.

source
LieGroups.identity_element! β€” Method
identity_element(G::LieGroup)
identity_element!(G::LieGroup, e)

Return a point representation of the Identity on the LieGroup 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. This can be performed in-place of e.

source
LieGroups.inv! β€” Method
inv(G::LieGroup, g)
inv!(G::LieGroup, h, g)

Compute the inverse group element $g^{-1}$ with respect to the AbstractGroupOperation $∘$ on the LieGroup $\mathcal G$, that is, return the unique element $h=g^{-1}$ such that $h∘g=\mathrm{e}$, where $\mathrm{e}$ denotes the Identity.

This can be done in-place of h, without side effects, that is you can do inv!(G, g, g).

source
LieGroups.inv_left_compose! β€” Method
compose(G::LieGroup, g, h)
compose!(G::LieGroup, k, g, h)

Perform the group oepration $g ∘ h$ for two $g, h ∈ \mathcal G$ on the LieGroup G. This can also be done in-place of h.

Info

This function also handles the case where g or/and h are the Identity(G). Since this would lead to ambiguities when implementing a new group operations, this function calls _compose and _compose!, respectively, which is meant for the actual computation of group operations on (non-Identity` but maybe its numerical representation) elements.

source
LieGroups.inv_left_compose β€” Method
inv_left_compose(G::LieGroup, g, h)
inv_left_compose!(G::LieGroup, k, g, h)

Compute the inverse of the left group operation $λ_g(h) = g∘h$, on the LieGroup G, that is, compute $λ_g^{-1}(h) = g^{-1}∘h$. This can be done in-place of k.

source
LieGroups.inv_right_compose! β€” Method
inv_right_compose(G::LieGroup, h, g)
inv_right_compose!(G::LieGroup, k, h, g)

Compute the inverse of the right group operation $ρ_g(h) = h∘g$, on the LieGroup G, that is compute $ρ_g^{-1}(h) = h∘g^{-1}$. This can be done in-place of k.

source
LieGroups.inv_right_compose β€” Method
inv_right_compose(G::LieGroup, h, g)
inv_right_compose!(G::LieGroup, k, h, g)

Compute the inverse of the right group operation $ρ_g(h) = h∘g$, on the LieGroup G, that is compute $ρ_g^{-1}(h) = h∘g^{-1}$. This can be done in-place of k.

source
Manifolds.compose β€” Method
compose(G::LieGroup, g, h)
compose!(G::LieGroup, k, g, h)

Perform the group oepration $g ∘ h$ for two $g, h ∈ \mathcal G$ on the LieGroup G. This can also be done in-place of h.

Info

This function also handles the case where g or/and h are the Identity(G). Since this would lead to ambiguities when implementing a new group operations, this function calls _compose and _compose!, respectively, which is meant for the actual computation of group operations on (non-Identity` but maybe its numerical representation) elements.

source
Manifolds.identity_element β€” Method
identity_element(G::LieGroup)
identity_element!(G::LieGroup, e)

Return a point representation of the Identity on the LieGroup 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. This can be performed in-place of e.

source
ManifoldsBase.exp! β€” Function
exp(G::LieGroup, g, X, t::Number=1)
exp!(G::LieGroup, h, g, X, t::Number=1)

Compute the Lie group exponential map given by

\[\exp_g X = g∘\exp_{\mathcal G}(X)\]

where X can be scaled by t, the computation can be performed in-place of h, and $\exp_{\mathcal G}$ denotes the Lie group exponential function.

Note

If g is the Identity the Lie group exponential function is computed directly. Implementing the Lie group exponential function introduces a default implementation for this function.

Note

The Lie group exponential map is usually different from the exponential map with respect to the metric of the underlying Riemannian manifold $\mathcal M$. To access the (Riemannian) exponential map, use exp(base_manifold(G), g, X).

source
ManifoldsBase.exp! β€” Method
exp(G::LieGroup, e::Identity, X)
exp!(G::LieGroup, h, e::Identity, X)

Compute the (Lie group) exponential function

\[\exp_{\mathcal G}: \mathfrak g β†’ \mathcal G,\qquad \exp_{\mathcal G}(X) = Ξ³_X(1),\]

where $Ξ³_X$ is the unique solution of the initial value problem

\[Ξ³(0) = \mathrm{e}, \quad Ξ³'(t) = Ξ³(t)β‹…X.\]

The computation can be performed in-place of h.

See also [HN12, Definition 9.2.2].

source
ManifoldsBase.get_coordinates! β€” Method
exp(G::LieGroup, e::Identity, X)
exp!(G::LieGroup, h, e::Identity, X)

Compute the (Lie group) exponential function

\[\exp_{\mathcal G}: \mathfrak g β†’ \mathcal G,\qquad \exp_{\mathcal G}(X) = Ξ³_X(1),\]

where $Ξ³_X$ is the unique solution of the initial value problem

\[Ξ³(0) = \mathrm{e}, \quad Ξ³'(t) = Ξ³(t)β‹…X.\]

The computation can be performed in-place of h.

See also [HN12, Definition 9.2.2].

source
ManifoldsBase.get_coordinates β€” Method
get_coordinates(G::LieGroup, g, X, B::AbstractBasis)
get_coordinates(𝔀::LieAlgebra, X, B::AbstractBasis)
get_coordinates!(G::LieGroup, c, g, X, B::AbstractBasis)
get_coordinates!(𝔀::LieAlgebra, c, X, B::AbstractBasis)

Return the vector of coordinates to the decomposition of X with respect to an AbstractBasis of the LieAlgebra 𝔀. Since all tangent vectors are assumed to be represented in the Lie algebra, both signatures are equivalent. The operation can be performed in-place of c.

By default this function requires identity_element(G) and calls the corresponding get_coordinates function of the Riemannian manifold the Lie group is build on.

The inverse operation is get_vector.

See also vee.

source
ManifoldsBase.get_vector! β€” Method
exp(G::LieGroup, e::Identity, X)
exp!(G::LieGroup, h, e::Identity, X)

Compute the (Lie group) exponential function

\[\exp_{\mathcal G}: \mathfrak g β†’ \mathcal G,\qquad \exp_{\mathcal G}(X) = Ξ³_X(1),\]

where $Ξ³_X$ is the unique solution of the initial value problem

\[Ξ³(0) = \mathrm{e}, \quad Ξ³'(t) = Ξ³(t)β‹…X.\]

The computation can be performed in-place of h.

See also [HN12, Definition 9.2.2].

source
ManifoldsBase.get_vector β€” Method
get_vector(G::LieGroup, g, c, B::AbstractBasis)
get_vector(𝔀::LieAlgebra, c, B::AbstractBasis)
get_vector!(G::LieGroup, X, g, c, B::AbstractBasis)
get_vector!(𝔀::LieAlgebra, X, c, B::AbstractBasis)

Return the vector corresponding to a set of coefficients in an AbstractBasis of the LieAlgebra 𝔀. Since all tangent vectors are assumed to be represented in the Lie algebra, both signatures are equivalend. The operation can be performed in-place of a tangent vector X.

By default this function requires identity_element(G) and calls the corresponding get_vector function of the Riemannian manifold the Lie group is build on.

The inverse operation is get_coordinates.

See also hat

source
ManifoldsBase.hat! β€” Method
hat(G::LieGroup, c)
hat!(G::LieGroup, X, c)

Compute the hat map $(β‹…)^Μ‚$ that maps a vector of coordinates $c_i$ with respect to a certain basis to a tangent vector in the Lie algebra

\[X = \sum_{i∈\mathcal I} c_iB_i,\]

where $\{ B_i \}_{i∈\mathcal I}$ is a basis of the Lie algebra and $\mathcal I$ a corresponding index set, which is usually $\mathcal I=\{ 1,\ldots,n \}$.

The computation can be performed in-place of X. The inverse of hat is vee.

Technically, hat is a specific case of get_vector and is implemented using the LieAlgebraOrthogonalBasis

source
ManifoldsBase.hat β€” Method
hat(G::LieGroup, c)
hat!(G::LieGroup, X, c)

Compute the hat map $(β‹…)^Μ‚$ that maps a vector of coordinates $c_i$ with respect to a certain basis to a tangent vector in the Lie algebra

\[X = \sum_{i∈\mathcal I} c_iB_i,\]

where $\{ B_i \}_{i∈\mathcal I}$ is a basis of the Lie algebra and $\mathcal I$ a corresponding index set, which is usually $\mathcal I=\{ 1,\ldots,n \}$.

The computation can be performed in-place of X. The inverse of hat is vee.

Technically, hat is a specific case of get_vector and is implemented using the LieAlgebraOrthogonalBasis

source
ManifoldsBase.is_point β€” Method
is_point(G::LieGroup, g; kwargs...)

Check whether g is a valid point on the Lie Group G. This falls back to checking whether g is a valid point on G.manifold, unless g is an Identity. Then, it is checked whether it is the identity element corresponding to G.

source
ManifoldsBase.log! β€” Method
log(G::LieGroup, g, h)
log!(G::LieGroup, X, g, h)

Compute the Lie group logarithmic map

\[\log_g h = \log_{\mathcal G}(g^{-1}∘h)\]

where $\log_{\mathcal G}$ denotes the Lie group logarithmic function The computation can be performed in-place of X.

Note

If g is the Identity the Lie group logarithmic function is computed directly. Implementing the Lie group logarithmic function introduces a default implementation for this function.

Note

The Lie group logarithmic map is usually different from the logarithmic map with respect to the metric of the underlying Riemannian manifold $\mathcal M$. To access the (Riemannian) logarithmic map, use log(base_manifoldG, g, h).

source
ManifoldsBase.vee! β€” Method
vee(G::LieGroup, X)
vee!(G::LieGroup, c, X)

Compute the vee map $(β‹…)^∨$ that maps a tangent vector X from the LieAlgebra to its coordinates with respect to the LieAlgebraOrthogonalBasis basis in the Lie algebra

\[X = \sum_{i∈\mathcal I} c_iB_i,\]

where $\{ B_i \}_{i∈\mathcal I}$ is a basis of the Lie algebra and $\mathcal I$ a corresponding index set, which is usually $\mathcal I=\{ 1,\ldots,n \}$.

The computation can be performed in-place of c. The inverse of vee is hat.

Technically, vee is a specific case of get_coordinates and is implemented using the LieAlgebraOrthogonalBasis

source
ManifoldsBase.vee β€” Method
vee(G::LieGroup, X)
vee!(G::LieGroup, c, X)

Compute the vee map $(β‹…)^∨$ that maps a tangent vector X from the LieAlgebra to its coordinates with respect to the LieAlgebraOrthogonalBasis basis in the Lie algebra

\[X = \sum_{i∈\mathcal I} c_iB_i,\]

where $\{ B_i \}_{i∈\mathcal I}$ is a basis of the Lie algebra and $\mathcal I$ a corresponding index set, which is usually $\mathcal I=\{ 1,\ldots,n \}$.

The computation can be performed in-place of c. The inverse of vee is hat.

Technically, vee is a specific case of get_coordinates and is implemented using the LieAlgebraOrthogonalBasis

source
Random.rand! β€” Method
rand(::LieGroup; vector_at=nothing, Οƒ::Real=1.0, kwargs...)
rand(::LieAlgebra; Οƒ::Real=1.0, kwargs...)
rand!(::LieGroup, gX; vector_at=nothing, Οƒ::Real=1.0, kwargs...)
rand!(::LieAlgebra, X; Οƒ::Real=1.0, 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, see also rand(::LieAlgebra; kwargs...)

source

Literature

[HN12]
J.Β Hilgert and K.-H.Β Neeb. Structure and Geometry of Lie Groups (Springer Monographs in Mathematics, 2012).