Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
2.0.0 (02/10/2025)
While this release should be mostly backward compatible, especially when using defined manifolds from Manifolds.jl
, some breaking changes were introduced. To be precise, defining and using traits e.g. to dispatch functions to the embedding changed internally. If you defined your own manifolds and used traits, please check the documentation of the new trait
Added
- an interface for quotient manifolds. this also unified the naming a bit. Formerly
differential_canonical_project
is nowdiff_canonical_project
.
Changed
- refactor the trait system to no longer use a list of traits but single traits separately for the metric and the embedding specification
- Switch to using Runic.jl as code formatter
Removed
ODEExponentialRetraction
was removed in favor ofsolve_chart_exp_ode
implemented inManifolds.jl
.
1.2.0 (08/05/2025)
Added
tangent_vector_type
for converting point types to matching tangent vector types.
1.1.0 (29/04/2025)
Added
default_basis(M)
to be more flexible than a fixedDefaultOrthonormalBasis
default.StabilizedRetraction
, a retraction that improves numerical stability of another retraction by projecting the resulting point.
1.0.3 (08/04/2025)
Changed
VectorSpaceFiber
no longer requires the number system to be consistent with the wrapped manifold.
1.0.2 (07/04/2025)
Changed
Fiber
no longer requires the number system to be consistent with the wrapped manifold.
Added
allocate
method that works with numeric scalars.
1.0.1 (05/02/2025)
Fixed
- An issue with allocation type promotion in
exp_fused
.
[1.0] 05/02/2025
Changed
- to avoid logical ambiguities to the forthcoming
LieGroups.jl
, the “fusing” variantexp(M, p, X, t)
has been moved to its own nameexp_fused(M, p, X, t)
and similarlyexp!(M, q, p, X, t)
has been moved to its own nameexp_fused!(M, q, p, X, t)
. Note that the newexp_fused!
method is not exported and by default falls back to callingexp!
witht*X
. Actions to take- if you just implemented an own
exp(M, p, X)
orexp!(M, q, p, X)
everything works as before. - if you implemented a fused variant
exp!(M, q, p, X, t)
you have to adapt two things- move that implementation to
ManifoldsBase.exp_fused!(M, q, p, X, t)
- Implement the default
exp!(M, q, p, X) = ManifoldBase.exp_fused!(M, q, p, one(eltype(p)), X)
,
- move that implementation to
- if you just implemented an own
- Similar to
exp
, the “fusing” variantretract(M, p, X, t, m)
has been moved to its own nameretract_fused(M, p, X, t, m)
and similarlyretract!(M, q, p, X, t, m)
has been moved to its own nameretract_fused!(M, q, p, X, t, m)
. Note that the newretract_fused!
method is not exported and by default falls back to callingretract!
witht*X
. Actions to take- if you just implemented an own
retract(M, p, X, m)
orretract!(M, q, p, X, m)
everything works as before. - if you implemented a fused variant
retract!(M, q, p, X, t)
you have to adapt two things- move that implementation to
ManifoldsBase.retract_fused!(M, q, p, X, t, m)
- Implement the default
retract!(M, q, p, X, m) = ManifoldBase.retract_fused!(M, q, p, one(eltype(p)), X)
, or an own specific implementation for the non-fused variant.
- move that implementation to
- if you just implemented an own
- the
TVector
type has been renamed toAbstractTangentVector
- the
CoTVector
type has been renamed toAbstractCotangentVector
Removed
parallel_transport_along(M, p, X, c)
,vector_transport_along(M, p, X, c, m)
as well as their mutating variants are removed from the API for now. It was never specified how to actually specify a curvec
and the method was only implemented forEuclidean
inManifolds.jl
, where it is the identity.
0.15.24 (17/01/2025)
Added
- extended support for
allocate_on
withArrayPartition
.
0.15.23 (09/12/2024)
Added
- a field
point
toValidationFibreVector
to potentially store the point of the vector. - a field
store_base_point
toValidationManifold
to indicate whether for new fibre vectors the base point should be stored. - a keyword
ignore_contexts
toValidationManifold
to ignore certain contexts from validation, such as:Input
,:Output
,:Point
, or:Vector
. - a keyword
ignore_functions
toValidationFibreVector
to ignore certain contexts within a single function. This is provided as a dictionary with the key being the (allocating) function and the value is a context or vector of contexts.
Changed
- the internal function
array_value
was renamed tointernal_value
and is now exported, since it can be also used on elements that store values different from arrays,
e.g. a ValidationMPoint
storing a subtype of a ManifoldPoint
. array_value
is hence deprecated.
- Minimum Julia version is now 1.10 (the LTS which replaced 1.6)
0.15.22 (15/11/2024)
Added
DefaultOrthonormalBasis()
is now the default basis forget_vector
,get_vector!
,get_vectors
,get_coordinates
andget_coordinates!
.
0.15.21 (12/11/2024)
Fixed
- Coordinate allocation was improved to be more friendly with automatic differentiation.
0.15.20 (24/10/2024)
Changed
norm
function onVectorSpaceFiber
(such asTangentSpace
) now needs to be called without the point. The passed point was already ignored before.
0.15.19 (20/10/2024)
Changed
- make
has_components
introduced in the last version a decorator trait function.
0.15.18 (18/10/2024)
Added
distance(M, p, q, r)
to computer
-norms on manifolds that have components.distance(M, p, q, m, r)
to compute (approximate)r
-norms on manifolds that have components using anAbstractInverseRetractionMethod m
within every (inner) distance call.norm(M, p, X, r)
to computer
-norms on manifolds that have components.
0.15.17 (04/10/2024)
Changed
- Mildly breaking: the number system parameter now corresponds to the coefficients standing in front of basis vectors in a linear combination instead of components of a vector. For example,
DefaultOrthonormalBasis() == DefaultOrthonormalBasis(ℝ)
ofDefaultManifold(3, field=ℂ)
now has 6 vectors, andDefaultOrthonormalBasis(ℂ)
of the same manifold has 3 basis vectors.
0.15.16 (13/09/2024)
Changed
- Adapt the traits, so that they also can be used when only
using ManifoldsBase
,
without importing internal struct
s like EmptyTrait
and TraitList
0.15.15 (29/08/2024)
Changed
- Refactored error message code when
ProductManifold
is used withoutRecursiveArrayTools.jl
.
0.15.14 (27/08/2024)
Added
- A helpful error message when
ProductManifold
is used withoutRecursiveArrayTools.jl
.
Changed
representation_size
forProductManifold
now returnsnothing
instead of a one-element tuple. This change makes it easier to notice errors caused by not havingRecursiveArrayTools.jl
loaded.
0.15.13 (10/08/2024)
Changed
- Fixed a small bug that caused calling
get_vectors
on PowerManifolds
to sometimes cause an error, cf #199.
0.15.12 (03/08/2024)
Changed
- Improved performance of power manifold creation and some cases of
get_component
on product manifold.
0.15.11 (28/07/2024)
Added
- Function
allocate_on
to generically allocate point and tangent vectors on a manifold without a pre-existing instance but of a particular type. - Function
default_type
to get the default type of points and tangent vectors for a manifold. - Package extension for the
Quaternions.jl
package that handles allocation.
Changed
- Default allocation method was made more robust to custom promotion functions.
0.15.10 (19/05/2024)
Added
- Functions
fill(p, N)
andfill!(P, p, N)
to fill values into a point on a power manifoldN
. - introduce a
base_point(TpM)
to access the base point of a tangent space - introduce
TpM[i]
to access tangent spaces of factors from anAbstractPowerManifold
or aProductManifold
.
0.15.9 (02/05/2024)
Added
- Tests now also use
Aqua.jl
to spot problems in the code such as ambiguities. - introduce a
check_inverse_retraction
function to numerically check whether an inverse retraction method is a (correct) inverse retraction. - introduce a
check_retraction
function to numerically check whether a retraction method is a (correct) retraction. - introduce a
check_vector_transport
function to numerically check whether a vector transport is a (correct) vector transport.
Changed
- introduced a
ManifoldsBaseTestUtils
module to encapsulate common types and function definitions in different parts of the tests.
0.15.8 (13/03/2024)
Added
sectional_curvature
,sectional_curvature_max
andsectional_curvature_min
functions for obtaining information about sectional curvature of a manifold.
0.15.7 (24/01/2024)
Fixed
is_point
andis_vector
can now more stably:info
or:warn
when they return false, since they emplyshowerror
for these displays.
0.15.6 (15/12/2023)
Added
- An
AbstractApproximationMethod
to specify estimation methods for other more general functions,
as well as a default_approximation_method
to specify defaults on manifolds.
- An
EmbeddedVectorTransport
to use a vector transport in the embedding and a final projection.
Fixed
number_eltype
correctly returns scalar type for nested array types likenumber_eltype(Vector{Vector{Float64}})
.
0.15.5 (13/12/2023)
Added
- Compatibility with
RecursiveArrayTools
v3.
0.15.4 (25/11/2023)
Fixed
- Fixed a bug reported in Manopt#330.
0.15.3 (17/11/2023)
Fixed
- Pass kwargs in
rand!
forAbstractPowerManifold
to appropriate methods on the wrapped manifold.
0.15.2 (8/11/2023)
Fixed
vee
andhat
now use real coefficient basis for complex manifolds.
0.15.1 (30/10/2023)
Added
zero_vector(TpM)
to generate a zero vector in the tangent space- a GitHub CI action that errors, when this file was not updated on a PR
Fixed
is_point
andis_vector
for the tangent space now correctly forward to vector checks on the corresponding manifold. The same for bothcheck_size
s- add
[compat]
entries for the standard libraries.
0.15.0 (21/10/2023)
Added
ProductManifold
type was migrated from Manifolds.jl.Fiber
,VectorSpaceFiber
andTangentSpace
types.TangentSpace
is a generalized version ofTangentSpaceAtPoint
from Manifolds.jl.- A keyword to
ValidationManifold
whicherror=
mode to use. This is by default the previous:error
mode. change_representer!
,change_metric!
andWeingarten!
methods added toPowerManifold
.×
now also works for retractions, inverse retractions, and vector transports to create their product versionsretract
,inverse_retract
, andvector_transport_to
(and_dir
) now also accept arbirtrary retractions on the product manifold. These act the same as the n-fold product of a retraction.
Changed
retract
now behaves likeexp
in the sense that it allocates early, which reduces the amount of code to dispatch through levels 1-3 twiceinverse_retract
now behaves likelog
in the sense that it allocates earlyRequires.jl
is added as a dependency to facilitate loading some methods related toProductManifolds
on Julia 1.6 to 1.8. Later versions rely on package extensions.Documenter.jl
was updated to 1.0.PowerManifold
can now store its size either in a field or in a type, similarly toDefaultManifold
. By default the size is stored in a field.- The signature of
is_point
was changed to be consistent withisapprox.
. The error positional symbol (third argument) is now a keyword argument. We left the boolean shortcut in place. That meansis_point(M, p, true)
works the same as before (false
is the default anyways)is_point(M, p, :warn)
has to be changed tois_point(M, p; error=:warn)
- The signature of
is_vector
was changed to be consistent withisapprox
andis_point
. The error positional symbol (fourth argument) is now a keyword argument. The error positional boolean (fourth argument) hence moved to fifth place (aftercheck_base_point
) This meansis_vector(M, p, X, true)
should now beis_vector(M, p, X; error=:error)
is_vector(M, p, X, err, base)
for two booleanserr, base
should now beis_vector(M, p, X, base, err)
is_vector(M, p, X, err, base)
for a symbolerr
should now beis_vector(M, p, X, base; error=err)
Removed
- Julia 1.0 is no longer supported. From now on, the earliest supported Julia version is 1.6.
0.14.12 (23/09/2023)
Changed
- Introduce a thorough way to allocate tangent vectors for
rand
0.14.11 (25/08/2023)
Added
- Make the
Weingarten
map a decorator capable function.
0.14.10 (17/08/2023)
Added
- introduce the
Weingarten
map and its in place variantWeingarten!
.
0.14.9 (03/08/2023)
Added
- Introduce an interface that allows the static size of a manifold to be a field as well.
0.14.8 (07/07/2023)
Changed
- Improve
show
for cached bases and make it more robust
0.14.7 (07/07/2023)
Changed
- the tutorial is now written in Quarto.
0.14.6 (10/06/2023)
Added
- export the inplace random function
rand!
0.14.5 (03/05/2023)
Added
- Allow to specify an
AbstractManifold
when converting points or tangent vector types.
0.14.4 (10/04/2023)
Changed
- Fix
copy
to work properly when copyingNumber
s
0.14.3 (16/03/2023)
Changed
- Fix an allocation bug in nested power manifolds
0.14.2 (16/03/2023)
Added
- adds a DependaBot workflow.
Changed
- Fix an allocation issue with
exp(M, p, X, t)
that did not respect the type oft
.
0.14.1 (18/02/2023)
Note that this release did not trigger a TagBot, so it appears within 0.14.2 in the tagged/created releases
Added
- Introduce
change_representer
already inManifoldsBase
.
0.14.0 (– 15/02/2023)
Added
- Type restriction for
t
in scaled retractions relaxed toNumber
. embed_project(M::AbstractManifold, p)
andembed_project(M::AbstractManifold, p, X)
that are like projections onto a manifold or a tangent space but are guaranteed to be idempotent.
Changed
- Retractions for scaled vectors no longer dispatch to non-scaled retractions. It is now reversed for performance reasons. Please either just define
exp!(::MyManifold, q, p, X, t::Number)
or both this andexp!(::MyManifold, q, p, X)
. DefaultManifold
now stores size in a field instead of the type itself to reduce the amount of compilation needed.- Fixed typo in
inverse_retract_caley
(nowinverse_retract_cayley
) andretract_caley
(nowretract_cayley
). retract_pade
andretract_pade!
now receivePadeRetraction
objects instead of justn
.