Skip to content

Commit

Permalink
Some work on making groups embedded (#251)
Browse files Browse the repository at this point in the history
* some work on making groups embedded

* additionally to just TransparentIsometric the AbstractGroupManifold should also be transparent wrt vector/coordinates.

* runs formatter.

* fixed special orthogonal test

* Update src/manifolds/Rotations.jl

Co-authored-by: Seth Axen <[email protected]>

* version bumped

Co-authored-by: Ronny Bergmann <[email protected]>
Co-authored-by: Seth Axen <[email protected]>
  • Loading branch information
3 people authored Nov 14, 2020
1 parent 29b1b01 commit 3ffe741
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 14 deletions.
2 changes: 1 addition & 1 deletion Project.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name = "Manifolds"
uuid = "1cead3c2-87b3-11e9-0ccd-23c62b72b94e"
authors = ["Seth Axen <[email protected]>", "Mateusz Baran <[email protected]>", "Ronny Bergmann <[email protected]>", "Antoine Levitt <[email protected]>"]
version = "0.4.5"
version = "0.4.6"

[deps]
Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f"
Expand Down
38 changes: 27 additions & 11 deletions src/groups/group.jl
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@ Abstract type for a Lie group, a group that is also a smooth manifold with an
implement at least [`inv`](@ref), [`identity`](@ref), [`compose`](@ref), and
[`translate_diff`](@ref).
"""
abstract type AbstractGroupManifold{𝔽,O<:AbstractGroupOperation} <:
AbstractDecoratorManifold{𝔽} end
abstract type AbstractGroupManifold{𝔽,O<:AbstractGroupOperation,T<:AbstractEmbeddingType} <:
AbstractEmbeddedManifold{𝔽,T} end

"""
GroupManifold{𝔽,M<:Manifold{𝔽},O<:AbstractGroupOperation} <: AbstractGroupManifold{𝔽,O}
Expand All @@ -45,7 +45,7 @@ Group manifolds by default forward metric-related operations to the wrapped mani
GroupManifold(manifold, op)
"""
struct GroupManifold{𝔽,M<:Manifold{𝔽},O<:AbstractGroupOperation} <:
AbstractGroupManifold{𝔽,O}
AbstractGroupManifold{𝔽,O,TransparentIsometricEmbedding}
manifold::M
op::O
end
Expand All @@ -67,11 +67,13 @@ function base_group(M::Manifold)
end
base_group(G::AbstractGroupManifold) = G

decorator_group_dispatch(M::Manifold) = Val(false)
base_manifold(G::GroupManifold) = G.manifold

decorator_group_dispatch(::Manifold) = Val(false)
function decorator_group_dispatch(M::AbstractDecoratorManifold)
return decorator_group_dispatch(decorated_manifold(M))
end
decorator_group_dispatch(M::AbstractGroupManifold) = Val(true)
decorator_group_dispatch(::AbstractGroupManifold) = Val(true)

function is_group_decorator(M::Manifold)
return _extract_val(decorator_group_dispatch(M))
Expand All @@ -85,6 +87,22 @@ if VERSION ≥ v"1.3"
(::Type{T})(M::Manifold) where {T<:AbstractGroupOperation} = GroupManifold(M, T())
end

function decorator_transparent_dispatch(
::typeof(get_coordinates!),
::AbstractGroupManifold,
args...,
)
return Val(:transparent)
end
function decorator_transparent_dispatch(
::typeof(get_vector!),
::AbstractGroupManifold,
args...,
)
return Val(:transparent)
end


###################
# Action directions
###################
Expand Down Expand Up @@ -322,14 +340,12 @@ for MT in GROUP_MANIFOLD_BASIS_DISAMBIGUATION
)
end

@decorator_transparent_fallback :transparent function check_manifold_point(
G::AbstractGroupManifold,
e::Identity;
kwargs...,
)
manifold_dimension(G::GroupManifold) = manifold_dimension(G.manifold)

function check_manifold_point(G::AbstractGroupManifold, e::Identity; kwargs...)
return DomainError(e, "The identity element $(e) does not belong to $(G).")
end
@decorator_transparent_fallback :transparent function check_manifold_point(
function check_manifold_point(
G::GT,
e::Identity{GT};
kwargs...,
Expand Down
5 changes: 4 additions & 1 deletion src/manifolds/Rotations.jl
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,10 @@ function check_manifold_point(M::Rotations{N}, p; kwargs...) where {N}
return DomainError(det(p), "The determinant of $p has to be +1 but it is $(det(p))")
end
if !isapprox(transpose(p) * p, one(p); kwargs...)
return DomainError(norm(p), "$p has to be orthogonal but it's not")
return DomainError(
norm(transpose(p) * p - one(p)),
"$p must be orthogonal but it's not at kwargs $kwargs",
)
end
return nothing
end
Expand Down
2 changes: 1 addition & 1 deletion test/groups/special_orthogonal.jl
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ include("group_utils.jl")
inverse_retraction_methods = inverse_retraction_methods,
exp_log_atol_multiplier = 20,
retraction_atol_multiplier = 12,
is_tangent_atol_multiplier = 1,
is_tangent_atol_multiplier = 1.2,
)

@test injectivity_radius(G) == injectivity_radius(M)
Expand Down

5 comments on commit 3ffe741

@mateuszbaran
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@mateuszbaran
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@mateuszbaran
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@mateuszbaran
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@JuliaRegistrator
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Registration pull request created: JuliaRegistries/General/24726

After the above pull request is merged, it is recommended that a tag is created on this repository for the registered package version.

This will be done automatically if the Julia TagBot GitHub Action is installed, or can be done manually through the github interface, or via:

git tag -a v0.4.6 -m "<description of version>" 3ffe741fdc9c435e4b67837dbbb67919752b4d43
git push origin v0.4.6

Please sign in to comment.