Group actions

Group actions represent actions of a given group on a specified manifold. The following operations are available:

  • action_side: whether action acts from the LeftSide or RightSide (not to be confused with action direction).
  • apply: performs given action of an element of the group on an object of compatible type.
  • apply_diff: differential of apply with respect to the object it acts upon.
  • direction: tells whether a given action is LeftAction, RightAction.
  • inverse_apply: performs given action of the inverse of an element of the group on an object of compatible type. By default inverts the element and calls apply but it may be have a faster implementation for some actions.
  • inverse_apply_diff: counterpart of apply_diff for inverse_apply.
  • optimal_alignment: determine the element of a group that, when it acts upon a point, produces the element closest to another given point in the metric of the G-manifold.

Furthermore, group operation action features the following:

The following group actions are available:

Manifolds.adjoint_apply_diff_group โ€” Method
adjoint_apply_diff_group(A::AbstractGroupAction, a, X, p)

Pullback with respect to group element of group action A.

\[(\mathrm{d}ฯ„^{p,*}) : T_{ฯ„_{a} p} \mathcal M โ†’ T_{a} \mathcal G\]

source
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.apply โ€” Method
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_diff โ€” Method
apply_diff(A::AbstractGroupAction, a, p, X)

For 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.apply_diff_group โ€” Method
apply_diff_group(A::AbstractGroupAction, a, X, p)

Compute the value of differential of action AbstractGroupAction A on vector X, where element a is acting on p, with respect to the group element.

Let $\mathcal G$ be the group acting on manifold $\mathcal M$ by the action A. The action is of element $g โˆˆ \mathcal G$ on a point $p โˆˆ \mathcal M$. The differential transforms vector X from the tangent space at a โˆˆ \mathcal G, $X โˆˆ T_a \mathcal G$ into a tangent space of the manifold $\mathcal M$. When action on element p is written as $\mathrm{d}ฯ„^p$, with the specified left or right convention, the differential transforms vectors

\[(\mathrm{d}ฯ„^p) : T_{a} \mathcal G โ†’ T_{ฯ„_a p} \mathcal M\]

See also

apply, apply_diff

source
Manifolds.center_of_orbit โ€” Function
center_of_orbit(
    A::AbstractGroupAction,
    pts,
    p,
    mean_method::AbstractApproximationMethod = GradientDescentEstimation(),
)

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_apply โ€” Method
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_diff โ€” Method
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_alignment โ€” Method
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

Group operation action

Manifolds.GroupOperationAction โ€” Type
GroupOperationAction{AD<:ActionDirection,AS<:GroupActionSide,G<:AbstractDecoratorManifold} <: AbstractGroupAction{AD}

Action of a group upon itself via left or right translation, either from left or right side. An element p of the group can act upon another another element by either:

  • left action from the left side: $L_p: q โ†ฆ p \circ q$,
  • right action from the left side: $L'_p: q โ†ฆ p^{-1} \circ q$,
  • right action from the right side: $R_p: q โ†ฆ q \circ p$,
  • left action from the right side: $R'_p: q โ†ฆ q \circ p^{-1}$.

Constructor

GroupOperationAction(group::AbstractDecoratorManifold, AD::ActionDirectionAndSide = LeftForwardAction())
source
Manifolds.apply_diff_group โ€” Method
apply_diff_group(A::GroupOperationAction, a, X, p)

Compute differential of GroupOperationAction A with respect to group element at tangent vector X:

\[(\mathrm{d}ฯ„^p) : T_{a} \mathcal G โ†’ T_{ฯ„_a p} \mathcal G\]

There are four cases:

  • left action from the left side: $L_a: p โ†ฆ a \circ p$, where

\[(\mathrm{d}L_a) : T_{a} \mathcal G โ†’ T_{a \circ p} \mathcal G.\]

  • right action from the left side: $L'_a: p โ†ฆ a^{-1} \circ p$, where

\[(\mathrm{d}L'_a) : T_{a} \mathcal G โ†’ T_{a^{-1} \circ p} \mathcal G.\]

  • right action from the right side: $R_a: p โ†ฆ p \circ a$, where

\[(\mathrm{d}R_a) : T_{a} \mathcal G โ†’ T_{p \circ a} \mathcal G.\]

  • left action from the right side: $R'_a: p โ†ฆ p \circ a^{-1}$, where

\[(\mathrm{d}R'_a) : T_{a} \mathcal G โ†’ T_{p \circ a^{-1}} \mathcal G.\]

source

Rotation action

Manifolds.ColumnwiseMultiplicationAction โ€” Type
ColumnwiseMultiplicationAction{
    TAD<:ActionDirection,
    TM<:AbstractManifold,
    TO<:GeneralUnitaryMultiplicationGroup,
} <: AbstractGroupAction{TAD}

Action of the (special) unitary or orthogonal group GeneralUnitaryMultiplicationGroup of type On columns of points on a matrix manifold M.

Constructor

ColumnwiseMultiplicationAction(
    M::AbstractManifold,
    On::GeneralUnitaryMultiplicationGroup,
    AD::ActionDirection = LeftAction(),
)
source
Manifolds.RotationAction โ€” Type
RotationAction(
    M::AbstractManifold,
    SOn::SpecialOrthogonal,
    AD::ActionDirection = LeftAction(),
)

Space of actions of the SpecialOrthogonal group $\mathrm{SO}(n)$ on a Euclidean-like manifold M of dimension n.

source
Manifolds.RowwiseMultiplicationAction โ€” Type
RowwiseMultiplicationAction{
    TAD<:ActionDirection,
    TM<:AbstractManifold,
    TO<:GeneralUnitaryMultiplicationGroup,
} <: AbstractGroupAction{TAD}

Action of the (special) unitary or orthogonal group GeneralUnitaryMultiplicationGroup of type On columns of points on a matrix manifold M.

Constructor

RowwiseMultiplicationAction(
    M::AbstractManifold,
    On::GeneralUnitaryMultiplicationGroup,
    AD::ActionDirection = LeftAction(),
)
source
Manifolds.apply โ€” Method
apply(A::RotationAroundAxisAction, ฮธ, p)

Rotate point p from Euclidean(3) manifold around axis A.axis by angle ฮธ. The formula reads

\[p_{rot} = (\cos(ฮธ))p + (kร—p) \sin(ฮธ) + k (kโ‹…p) (1-\cos(ฮธ)),\]

where $k$ is the vector A.axis and โ‹… is the dot product.

source
Manifolds.optimal_alignment โ€” Method
optimal_alignment(A::LeftColumnwiseMultiplicationAction, p, q)

Compute optimal alignment for the left ColumnwiseMultiplicationAction, i.e. the group element $O^{*}$ that, when it acts on p, returns the point closest to q. Details of computation are described in Section 2.2.1 of [SK16].

The formula reads

\[O^{*} = \begin{cases} UV^T & \text{if } \operatorname{det}(p q^{\mathrm{T}}) \geq 0\\ U K V^{\mathrm{T}} & \text{otherwise} \end{cases}\]

where $U \Sigma V^{\mathrm{T}}$ is the SVD decomposition of $p q^{\mathrm{T}}$ and $K$ is the unit diagonal matrix with the last element on the diagonal replaced with -1.

source

Translation action

Manifolds.TranslationAction โ€” Type
TranslationAction(
    M::AbstractManifold,
    Rn::TranslationGroup,
    AD::ActionDirection = LeftAction(),
)

Space of actions of the TranslationGroup $\mathrm{T}(n)$ on a Euclidean-like manifold M.

The left and right actions are equivalent.

source

Rotation-translation action (special Euclidean)

Manifolds.ColumnwiseSpecialEuclideanAction โ€” Type
ColumnwiseSpecialEuclideanAction{
    TM<:AbstractManifold,
    TSE<:SpecialEuclidean,
    TAD<:ActionDirection,
} <: AbstractGroupAction{TAD}

Action of the special Euclidean group SpecialEuclidean of type SE columns of points on a matrix manifold M.

Constructor

ColumnwiseSpecialEuclideanAction(
    M::AbstractManifold,
    SE::SpecialEuclidean,
    AD::ActionDirection = LeftAction(),
)
source
Manifolds.RotationTranslationAction โ€” Type
RotationTranslationAction(
    M::AbstractManifold,
    SOn::SpecialEuclidean,
    AD::ActionDirection = LeftAction(),
)

Space of actions of the SpecialEuclidean group $\mathrm{SE}(n)$ on a Euclidean-like manifold M of dimension n.

Left actions corresponds to active transformations while right actions can be identified with passive transformations for a particular choice of a basis.

source
Manifolds.apply โ€” Method
apply(::RotationTranslationActionOnVector{LeftAction}, a::ArrayPartition, p)

Rotate point p by a.x[2] and translate it by a.x[1].

source
Manifolds.apply โ€” Method
apply(::RotationTranslationActionOnVector{RightAction}, a::ArrayPartition, p)

Translate point p by -a.x[1] and rotate it by inverse of a.x[2].

source
Manifolds.inverse_apply โ€” Method
inverse_apply(::RotationTranslationActionOnVector{LeftAction}, a::ArrayPartition, p)

Translate point p by -a.x[1] and rotate it by inverse of a.x[2].

source
Manifolds.inverse_apply โ€” Method
inverse_apply(::RotationTranslationActionOnVector{RightAction}, a::ArrayPartition, p)

Rotate point p by a.x[2] and translate it by a.x[1].

source