Skip to content

Commit c8258b9

Browse files
mateuszbaranolivierverdierkellertuer
authored
Manifolds.jl v0.10 (#732)
* Implement `translate_diff` and `inv_diff` for all groups (#679) * implement a general `inv_diff` * fixing the SpecialEuclidean case (mostly) what remains to be fixed is if it is wrapped in a `MetricManifold`, or a `ConnectionManifold`, for instance. In that case, the wrong `translate_diff` methods are called. * changelog * formatting * translate_diff for product/power groups * fix CircleGroup * adjoint_action fallback for all groups * translate_diff is always defined from adjoint_action A vanilla group has no adjoint_action defined * semidirect products: remove specific translate_diff implementations `translate_diff` is now always computed from adjoint_action instead * special_euclidean: implement adjoint action adjoint action was previously not available since not all translate_diff methods were implemented * fix trivial adjoint action for commutative groups implement for LeftAction direction, the other direction is automatic * left invariant storage for special_euclidean this ensures that all group methods are now defined * Generic implementation of exp and log for all groups This is the `exp` and `log` associated to any of the Cartan–Schouten connections. It uses the left-invariant storage of tangent vectors and the specific exp_lie/log_lie implementations. * special_euclidean: Remove specific log/exp implementations These implementations are the one from *group product*, so they are not invariant with respect to the semidirect product. One could put them back in the product_group layer instead. The proper way to invoke them is then `exp(base_manifold(G), ...)` instead of `exp(G, ...)`. Until this is fixed, `exp` now uses more allocations, even when calling it with `base_manifold`. * special_euclidean: Remove some failing tests The failing tests come from using matrices instead of `ArrayPartition`. Using the `ArrayPartition` type (the one returned by `identity_element`) works normally. * special_linear: tighter test points The invariant log fails when points are too far apart. * News update * Formatting * Update NEWS * adjoint_action: more tests more adjoint action methods for CircleGroup * Format * Test: more translate_diff tests * Test: inv_diff! * Tests: adjoint_action - at Identity - remove some unused adjoint_action! implementations * Fromat * Fixup to 402c49b * Redundant method * Doc: adjoint_action direction * Rewrite: avoid inv The implementation is still not optimal * Doc: move code comments to docstrings * Doc: remove allocate TODOs * Doc: storage of tangent vectors on Lie groups * Doc: tangent vector storage -> representation * moving to more weak dependencies * fixes * more fixes * even more fixes * fixes again * turn HybridArrays into an extension * fix path * fix SE exp, log * forgot to add a test dependency * fix for Julia 1.6 * fixing a really weird error * these shouldn't have been re-added * initial support for tangent vector representations in Lie groups * lots of fixes related to vector representation * fix product group * fixing special euclidean * increase coverage * polishing and removing remaining deprecated things * Update NEWS.md Co-authored-by: Ronny Bergmann <git@ronnybergmann.net> * fix a few tests * HybridTangentRepresentation for semidirect product groups, change default for SE(n) * fix allocation issue? * maybe we have fewer ambiguities now * restrict the default left-invariant log and exp on groups to semidirect products for now * improve coverage * rename gvr to vectors * improve coverage * start the group tutorial, remove two `exp` and `log` methods that shouldn't be there * stuff * updates to the group tutorial; exp_inv and log_inv * Update NEWS.md Co-authored-by: Ronny Bergmann <git@ronnybergmann.net> * expand tutorial * fix stuff, improve coverage * fixing tutorial issues and a reference * fixing stuff in groups.qmd * fix table in groups.qmd * remove non-real SymplecticStiefel for now * also remove non-real symplectic Grassmann * Fix qusrto setup and slightly fix alignment in table * yellow circle * Commonmark code stuff no longer necessary. * maybe also enable footnotes * Remove more deprecated things * improve coverage * tests for inv_diff on SE, more robust random point generation on multinomial SPD * exclude line from coverage * improve news and groups tutorial * bump version * would that fix tutorial building? * optimized defaults for inverse_translate_diff! of groups with left-invariant storage * let's solve these ambiguities later --------- Co-authored-by: Olivier Verdier <olivier.verdier@gmail.com> Co-authored-by: Ronny Bergmann <git@ronnybergmann.net>
1 parent 732ab72 commit c8258b9

81 files changed

Lines changed: 2754 additions & 1519 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

NEWS.md

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,41 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [0.10.0] – 2024-08-24
9+
10+
### Changed
11+
12+
* `Distributions.jl`, `RecursiveArrayTools.jl` and `HybridArrays.jl` were moved to weak dependencies to reduce load time and improve extensibility.
13+
* `translate_diff`, `inv_diff` and thus `apply_diff_group`, are available for all the groups with invariant tangent vector storage.
14+
* `SpecialEuclidean` group now has a different default tangent vector representation, the left-invariant one; to get the old representation pass `vectors=HybridTangentRepresentation()` to the constructor of `SpecialEuclidean`.
15+
* `adjoint_action` takes a direction argument; by default it is `LeftAction`.
16+
* `adjoint_action!` is the necessary method to implement in groups with left-invariant tangent vector representation.
17+
* Fixed a few typos in the doc string of the SPD fixed determinant description.
18+
* Random point on the `MultinomialSymmetricPositiveDefinite` manifold was improved to make it more robust.
19+
20+
### Added
21+
22+
* Introduced `exp_inv` and `log_inv` based on `exp_lie` and `log_lie`. They are invariant to the group operation.
23+
* A tutorial about usage of group-related functionality.
24+
25+
### Removed
26+
27+
* Deprecated bindings:
28+
* `ExtrinsicEstimation()` (should be replaced with `ExtrinsicEstimation(EfficientEstimator())`),
29+
* `Symplectic` (renamed to `SymplecticMatrices`),
30+
* `SymplecticMatrix` (renamed to `SymplecticElement`).
31+
* `AbstractEstimationMethod` (renamed to `AbstractApproximationMethod`).
32+
* `VectorBundleVectorTransport` (renamed to `FiberBundleProductVectorTransport`).
33+
* `rand` on `SymplecticMatrices` and `SymplecticStiefel` no longer accepts `hamiltonian_norm` as an alias for `σ`.
34+
* `mean!` and `median!` no longer accept `extrinsic_method` (should be replaced with `e = ExtrinsicEstimation(extrinsic_method)`).
35+
* As a result of making `Distributions.jl` and `RecursiveArrayTools.jl` weak dependencies the following symbols are no longer exported from `Manifolds.jl`. Essential functionality is still available but distribution-related features may change in the future without a breaking release.
36+
* `ArrayPartition` (`RecursiveArrayTools.jl` needs to be explicitly imported),
37+
* `ProjectedPointDistribution` (not exported),
38+
* `normal_tvector_distribution` (not exported),
39+
* `projected_distribution` (not exported),
40+
* `uniform_distribution` (not exported).
41+
* Ability to create non-real `SymplecticStiefel` and `SymplecticGrassmann` manifolds; essential functionality was missing so it was removed until a more developed version is developed.
42+
843
## [0.9.20] – 2024-06-17
944

1045
### Added

Project.toml

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
name = "Manifolds"
22
uuid = "1cead3c2-87b3-11e9-0ccd-23c62b72b94e"
33
authors = ["Seth Axen <seth.axen@gmail.com>", "Mateusz Baran <mateuszbaran89@gmail.com>", "Ronny Bergmann <manopt@ronnybergmann.net>", "Antoine Levitt <antoine.levitt@gmail.com>"]
4-
version = "0.9.20"
4+
version = "0.10.0"
55

66
[deps]
7-
Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f"
87
Einsum = "b7d42ee7-0b51-5a75-98ca-779d3107e4c0"
98
Graphs = "86223c79-3864-5bf0-83f7-82e725a168b6"
10-
HybridArrays = "1baab800-613f-4b0a-84e4-9cd3431bfbb9"
119
Kronecker = "2c470bb0-bcc8-11e8-3dad-c9649493f05e"
1210
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
1311
ManifoldDiff = "af67fdf4-a580-4b9f-bbec-742ef357defd"
@@ -16,7 +14,6 @@ Markdown = "d6f4376e-aef5-505a-96c1-9c027394607a"
1614
MatrixEquations = "99c1a7ee-ab34-5fd5-8076-27c950a045f4"
1715
Quaternions = "94ee1d12-ae83-5a48-8b1c-48b8ff168ae0"
1816
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
19-
RecursiveArrayTools = "731186ca-8d62-57ce-b412-fbd966d074cd"
2017
Requires = "ae029012-a4dd-5104-9daa-d747884805df"
2118
SimpleWeightedGraphs = "47aef6b3-ad0c-573a-a1e2-d07658019622"
2219
SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b"
@@ -28,17 +25,23 @@ StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91"
2825
BoundaryValueDiffEq = "764a87c0-6b3e-53db-9096-fe964310641d"
2926
Colors = "5ae59095-9a9b-59fe-a467-6f913c188581"
3027
DiffEqCallbacks = "459566f4-90b8-5000-8ac3-15dfb0a30def"
28+
Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f"
29+
HybridArrays = "1baab800-613f-4b0a-84e4-9cd3431bfbb9"
3130
NLsolve = "2774e3e8-f4cf-5e23-947b-6d7e65073b56"
3231
OrdinaryDiffEq = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed"
3332
RecipesBase = "3cdcf5f2-1ef4-517c-9805-6587b60abb01"
33+
RecursiveArrayTools = "731186ca-8d62-57ce-b412-fbd966d074cd"
3434
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
3535

3636
[extensions]
3737
ManifoldsBoundaryValueDiffEqExt = "BoundaryValueDiffEq"
38+
ManifoldsDistributionsExt = ["Distributions", "RecursiveArrayTools"]
39+
ManifoldsHybridArraysExt = "HybridArrays"
3840
ManifoldsNLsolveExt = "NLsolve"
39-
ManifoldsOrdinaryDiffEqDiffEqCallbacksExt = ["DiffEqCallbacks", "OrdinaryDiffEq"]
41+
ManifoldsOrdinaryDiffEqDiffEqCallbacksExt = ["DiffEqCallbacks", "OrdinaryDiffEq", "RecursiveArrayTools"]
4042
ManifoldsOrdinaryDiffEqExt = "OrdinaryDiffEq"
4143
ManifoldsRecipesBaseExt = ["Colors", "RecipesBase"]
44+
ManifoldsRecursiveArrayToolsExt = "RecursiveArrayTools"
4245
ManifoldsTestExt = "Test"
4346

4447
[compat]
@@ -76,9 +79,11 @@ julia = "1.6"
7679
BoundaryValueDiffEq = "764a87c0-6b3e-53db-9096-fe964310641d"
7780
Colors = "5ae59095-9a9b-59fe-a467-6f913c188581"
7881
DiffEqCallbacks = "459566f4-90b8-5000-8ac3-15dfb0a30def"
82+
Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f"
7983
DoubleFloats = "497a8b3b-efae-58df-a0af-a86822472b78"
8084
FiniteDifferences = "26cc04aa-876d-5657-8c51-4c34ba976000"
8185
Gtk = "4c0ca9eb-093a-5379-98c5-f87ac0bbbf44"
86+
HybridArrays = "1baab800-613f-4b0a-84e4-9cd3431bfbb9"
8287
ImageIO = "82e4d734-157c-48bb-816b-45c225c6df19"
8388
ImageMagick = "6218d12a-5da1-5696-b52f-db25d2ecc6d1"
8489
NLsolve = "2774e3e8-f4cf-5e23-947b-6d7e65073b56"
@@ -90,8 +95,9 @@ PythonPlot = "274fc56d-3b97-40fa-a1cd-1b4a50311bf9"
9095
QuartzImageIO = "dca85d43-d64c-5e67-8c65-017450d5d020"
9196
Quaternions = "94ee1d12-ae83-5a48-8b1c-48b8ff168ae0"
9297
RecipesBase = "3cdcf5f2-1ef4-517c-9805-6587b60abb01"
98+
RecursiveArrayTools = "731186ca-8d62-57ce-b412-fbd966d074cd"
9399
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
94100
VisualRegressionTests = "34922c18-7c2a-561c-bac1-01e79b2c4c92"
95101

96102
[targets]
97-
test = ["Test", "BoundaryValueDiffEq", "Colors", "DiffEqCallbacks", "DoubleFloats", "FiniteDifferences", "Gtk", "ImageIO", "ImageMagick", "OrdinaryDiffEq", "NLsolve", "Plots", "PythonPlot", "Quaternions", "QuartzImageIO", "RecipesBase"]
103+
test = ["Test", "BoundaryValueDiffEq", "Colors", "DiffEqCallbacks", "Distributions", "DoubleFloats", "FiniteDifferences", "Gtk", "HybridArrays", "ImageIO", "ImageMagick", "OrdinaryDiffEq", "NLsolve", "Plots", "PythonPlot", "Quaternions", "QuartzImageIO", "RecipesBase", "RecursiveArrayTools"]

docs/Project.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ OrdinaryDiffEq = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed"
1818
Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80"
1919
PythonPlot = "274fc56d-3b97-40fa-a1cd-1b4a50311bf9"
2020
RecipesBase = "3cdcf5f2-1ef4-517c-9805-6587b60abb01"
21+
RecursiveArrayTools = "731186ca-8d62-57ce-b412-fbd966d074cd"
2122
StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
2223
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
2324

@@ -36,4 +37,5 @@ ManifoldsBase = "0.15.0"
3637
OrdinaryDiffEq = "6"
3738
Plots = "1"
3839
PythonPlot = "1"
40+
RecursiveArrayTools = "3"
3941
StaticArrays = "1.0"

docs/make.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ if "--quarto" ∈ ARGS
2424
tutorials_folder = (@__DIR__) * "/../tutorials"
2525
# instantiate the tutorials environment if necessary
2626
Pkg.activate(tutorials_folder)
27+
Pkg.develop(PackageSpec(; path=(@__DIR__) * "/../"))
2728
Pkg.resolve()
2829
Pkg.instantiate()
2930
Pkg.activate(@__DIR__) # but return to the docs one before
@@ -110,6 +111,7 @@ makedocs(;
110111
"perform Hand gesture analysis" => "tutorials/hand-gestures.md",
111112
"integrate on manifolds and handle probability densities" => "tutorials/integration.md",
112113
"explore curvature without coordinates" => "tutorials/exploring-curvature.md",
114+
"work with groups" => "tutorials/groups.md",
113115
],
114116
"Manifolds" => [
115117
"Basic manifolds" => [

docs/src/manifolds/group.md

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,63 @@ Pages = ["groups/GroupManifold.jl"]
4343
Order = [:constant, :type, :function]
4444
```
4545

46+
### Default Representation of Tangent Vectors
47+
48+
In most groups, the representation of a tangent vector
49+
``X`` at the point ``p ∈ \mathcal{G}`` is stored
50+
as a vector ``Y ∈ \mathfrak{g}``.
51+
This helps to compute the derivatives of the composition and inverse.
52+
53+
To explain this, let us assume that *the group consists of matrices* (this is always possible).
54+
The representation of a tangent vector
55+
``X`` at the point ``p ∈ \mathcal{G}`` is stored
56+
as the vector ``Y ∈ \mathfrak{g}`` given by
57+
58+
```math
59+
X = pY
60+
```
61+
62+
#### Derivative of the Group Composition on the Left
63+
64+
The derivative of the composition ``pq`` with respect to ``p`` in
65+
the direction ``X``, tangent at ``p`` is given by
66+
67+
```math
68+
Xq = pYq = pq(q^{-1}Yq)
69+
```
70+
71+
We see that with this representation convention, this derivative is just the
72+
adjoint action of ``q^{-1}`` on the vector ``Y``.
73+
74+
#### Derivative of the Group Composition on the Right
75+
76+
For the derivative with respect to ``q`` of the composition ``pq`` at a tangent vector ``X`` at ``q``
77+
stored as ``Y`` with ``X = qY``, we have similarly
78+
79+
```math
80+
pX = pqY
81+
```
82+
83+
With the representation convention above, this derivative is just the identity.
84+
85+
#### Derivative of the Group Inverse
86+
87+
Finally, we look at the derivative of the inverse ``p^{-1}`` at a point ``p`` in a tangent direction ``X``
88+
at ``p`` with ``X = pY``.
89+
The result is a tangent vector at ``p^{-1}`` given by
90+
91+
```math
92+
-p^{-1}Xp^{-1} = - Yp^{-1} = -p^{-1}(p Y p^{-1})
93+
```
94+
95+
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``.
96+
97+
#### Implication for Creating New Groups
98+
99+
When you create a new group,
100+
defining the adjoint action alone ([`adjoint_action`](@ref))
101+
automatically defines all the relevant derivatives above.
102+
46103
### Generic Operations
47104

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

docs/src/manifolds/power.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ get_component(M, p, 4)
9090
The final representation is the [`NestedReplacingPowerRepresentation`](@extref `ManifoldsBase.NestedReplacingPowerRepresentation`). It is similar to the [`NestedPowerRepresentation`](@extref `ManifoldsBase.NestedPowerRepresentation`) but it does not perform in-place operations on the points on the underlying manifold. The example below uses this representation to store points on a power manifold of the [`SpecialEuclidean`](@ref) group in-line in an `Vector` for improved efficiency. When having a mixture of both, i.e. an array structure that is nested (like [´NestedPowerRepresentation](@ref)) in the sense that the elements of the main vector are immutable, then changing the elements can not be done in an in-place way and hence [`NestedReplacingPowerRepresentation`](@extref `ManifoldsBase.NestedReplacingPowerRepresentation`) has to be used.
9191

9292
```@example 4
93-
using Manifolds, StaticArrays
93+
using Manifolds, StaticArrays, RecursiveArrayTools
9494
R2 = Rotations(2)
9595
9696
G = SpecialEuclidean(2)

docs/src/manifolds/vector_bundle.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ Order = [:constant, :type, :function]
2626
The following code defines a point on the tangent bundle of the sphere ``S^2`` and a tangent vector to that point.
2727

2828
```@example tangent-bundle
29-
using Manifolds
29+
using Manifolds, RecursiveArrayTools
3030
M = Sphere(2)
3131
TB = TangentBundle(M)
3232
p = ArrayPartition([1.0, 0.0, 0.0], [0.0, 1.0, 3.0])

docs/src/references.bib

Lines changed: 57 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -195,22 +195,6 @@ @article{LeBrignantPuechmorel:2019
195195
# C
196196
# ----------------------------------------------------------------------------------------
197197
198-
@book{CheegerEbin:2008,
199-
address = {Providence, R.I},
200-
title = {Comparison {Theorems} in {Riemannian} {Geometry}},
201-
isbn = {978-0-8218-4417-5},
202-
publisher = {American Mathematical Society},
203-
author = {Cheeger, Jeffrey and Ebin, David G.},
204-
month = may,
205-
year = {2008},
206-
}
207-
@book{Chikuse:2003,
208-
DOI = {10.1007/978-0-387-21540-2},
209-
YEAR = {2003},
210-
AUTHOR = {Yasuko Chikuse},
211-
PUBLISHER = {Springer New York},
212-
TITLE = {Statistics on Special Manifolds}
213-
}
214198
@inproceedings{ChakrabortyVemuri:2015,
215199
AUTHOR = {Rudrasis Chakraborty and Baba C. Vemuri},
216200
BOOKTITLE = {2015 {IEEE} International Conference on Computer Vision (ICCV)},
@@ -229,6 +213,15 @@ @article{ChakrabortyVemuri:2019
229213
TITLE = {Statistics on the Stiefel manifold: Theory and applications},
230214
JOURNAL = {The Annals of Statistics}
231215
}
216+
@book{CheegerEbin:2008,
217+
address = {Providence, R.I},
218+
title = {Comparison {Theorems} in {Riemannian} {Geometry}},
219+
isbn = {978-0-8218-4417-5},
220+
publisher = {American Mathematical Society},
221+
author = {Cheeger, Jeffrey and Ebin, David G.},
222+
month = may,
223+
year = {2008},
224+
}
232225
@incollection{ChengHoSalehianVemuri:2016,
233226
AUTHOR = {Guang Cheng and Jeffrey Ho and Hesamoddin Salehian and Baba C. Vemuri},
234227
BOOKTITLE = {Riemannian Computing in Computer Vision},
@@ -255,6 +248,23 @@ @article{ChevallierLiLuDunson:2022
255248
URL = {https://doi.org/10.48550/arXiv.2009.01983},
256249
YEAR = {2022}
257250
}
251+
@book{Chikuse:2003,
252+
DOI = {10.1007/978-0-387-21540-2},
253+
YEAR = {2003},
254+
AUTHOR = {Yasuko Chikuse},
255+
PUBLISHER = {Springer New York},
256+
TITLE = {Statistics on Special Manifolds}
257+
}
258+
@book{Chirikjian:2012,
259+
edition = {1},
260+
series = {Applied and {Numerical} {Harmonic} {Analysis}},
261+
title = {Stochastic {Models}, {Information} {Theory}, and {Lie} {Groups}, {Volume} 2},
262+
volume = {2},
263+
url = {https://link.springer.com/book/10.1007/978-0-8176-4944-9},
264+
publisher = {Birkhäuser Boston, MA},
265+
author = {Chirikjian, Gregory S.},
266+
year = {2012},
267+
}
258268
#
259269
# D
260270
# ----------------------------------------------------------------------------------------
@@ -341,6 +351,21 @@ @article{GallierXu:2002
341351
URL = {http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.35.3205},
342352
YEAR = {2002}
343353
}
354+
355+
@book{GallierQuaintance:2020,
356+
address = {Cham},
357+
series = {Geometry and {Computing}},
358+
title = {Differential {Geometry} and {Lie} {Groups}: {A} {Computational} {Perspective}},
359+
volume = {12},
360+
isbn = {978-3-030-46039-6 978-3-030-46040-2},
361+
url = {http://link.springer.com/10.1007/978-3-030-46040-2},
362+
language = {en},
363+
publisher = {Springer International Publishing},
364+
author = {Gallier, Jean and Quaintance, Jocelyn},
365+
year = {2020},
366+
doi = {10.1007/978-3-030-46040-2},
367+
}
368+
344369
@article{GaoSonAbsilStykel:2021,
345370
DOI = {10.1137/20m1348522},
346371
YEAR = {2021},
@@ -733,11 +758,16 @@ @article{Sasaki:1958
733758
TITLE = {On the differential geometry of tangent bundles of Riemannian manifolds},
734759
JOURNAL = {Tohoku Math. J.}
735760
}
736-
@book{Suhubi:2013,
737-
AUTHOR = {Suhubi, E},
738-
PUBLISHER = {Academic Press},
739-
TITLE = {Exterior Analysis: Using Applications of Differential Forms},
740-
YEAR = {2013}
761+
@misc{SolaDerayAtchuthan:2021,
762+
title = {A micro {Lie} theory for state estimation in robotics},
763+
url = {http://arxiv.org/abs/1812.01537},
764+
author = {Solà, Joan and Deray, Jeremie and Atchuthan, Dinesh},
765+
month = dec,
766+
year = {2021},
767+
note = {arXiv: 1812.01537},
768+
eprint={1812.01537},
769+
archivePrefix={arXiv},
770+
primaryClass={cs.RO},
741771
}
742772
@book{SrivastavaKlassen:2016,
743773
AUTHOR = {Anuj Srivastava and Eric P. Klassen},
@@ -747,6 +777,12 @@ @book{SrivastavaKlassen:2016
747777
TITLE = {Functional and Shape Data Analysis},
748778
YEAR = {2016}
749779
}
780+
@book{Suhubi:2013,
781+
AUTHOR = {Suhubi, E},
782+
PUBLISHER = {Academic Press},
783+
TITLE = {Exterior Analysis: Using Applications of Differential Forms},
784+
YEAR = {2013}
785+
}
750786
#
751787
# T
752788
# ----------------------------------------------------------------------------------------
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
module ManifoldsDistributionsExt
2+
3+
if isdefined(Base, :get_extension)
4+
using Manifolds
5+
using Distributions
6+
using Random
7+
using LinearAlgebra
8+
9+
import Manifolds:
10+
normal_rotation_distribution,
11+
normal_tvector_distribution,
12+
projected_distribution,
13+
uniform_distribution
14+
15+
using Manifolds: get_iterator, get_parameter, _read, _write
16+
17+
using RecursiveArrayTools: ArrayPartition
18+
else
19+
# imports need to be relative for Requires.jl-based workflows:
20+
# https://github.com/JuliaArrays/ArrayInterface.jl/pull/387
21+
using ..Manifolds
22+
using ..Distributions
23+
using ..Random
24+
using ..LinearAlgebra
25+
26+
import ..Manifolds:
27+
normal_rotation_distribution,
28+
normal_tvector_distribution,
29+
projected_distribution,
30+
uniform_distribution
31+
32+
using ..Manifolds: get_iterator, get_parameter, _read, _write
33+
34+
using ..RecursiveArrayTools: ArrayPartition
35+
end
36+
37+
include("distributions.jl")
38+
include("distributions_for_manifolds.jl")
39+
include("projected_distribution.jl")
40+
41+
end

0 commit comments

Comments
 (0)