Changelog

All notable changes to Manifolds.jl will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

0.11.34 (2026-10-22)

Changed

  • Tensor contractions are now computed using TensorOperations.jl instead of Tullio.jl to support CUDA.jl v6.0.

0.11.33 (2026-10-21)

This release is based on an LLM based report, that was then carefully reviewed, refined and eventually applied to fix inconsistencies, typos, a few missing functions and bugs. The changes are also generated by the LLM, so they might be a bit verbose. We decided to keep that for completeness. The initial report, all work through the items found, and the final report are also part of the PR (#931). The hope is, that now the package is more consistent and has less bugs we do hope, that this did not disturb anyone's workflow.

Added

  • distance and inner on the Grassmann manifold for ProjectorPoints and ProjectorTangentVectors.
  • Chart-based gaussian_curvature, equal to half of ricci_curvature.
  • get_basis, get_coordinates and get_vector on the EssentialManifold with an orthonormal basis of its five-dimensional horizontal space.
  • CenteredMatrices provide get_coordinates and get_vector in their default orthonormal basis, for real and complex matrices.
  • is_flat for the Lorentz manifold with the MinkowskiMetric.
  • is_flat for the SymplecticGrassmann manifold.
  • log on the ProbabilitySimplex with the EuclideanMetric.
  • manifold_dimension and is_flat for MultinomialSymmetricPositiveDefinite.
  • PolarInverseRetraction on the GeneralizedGrassmann manifold.
  • PolarRetraction, QRRetraction, CayleyRetraction, PolarInverseRetraction and QRInverseRetraction on the real GeneralizedStiefel manifold.
  • project on the HamiltonianMatrices, for points and for tangent vectors.
  • project onto HeisenbergMatrices and onto their tangent spaces.
  • project(M, p) projects a point onto the hyperboloid of the Hyperbolic space.
  • project onto the tangent spaces of InvertibleMatrices.
  • warn_nonconvergence keyword for project on the doubly stochastic multinomial manifolds, which allows disabling the warning issued when Sinkhorn's algorithm does not converge.
  • ProjectionRetraction on the MultinomialSymmetricPositiveDefinite manifold.
  • QRInverseRetraction and PolarInverseRetraction on the real GeneralUnitaryMatrices, in particular on OrthogonalMatrices, previously only available on Rotations. On OrthogonalMatrices they throw a DomainError for points from different connected components.
  • rand now works on ProjectiveSpace.
  • rand and rand! on the SpecialUnitaryMatrices, which draw points of determinant one and tangent vectors of trace zero.
  • rand and rand! for SphereSymmetricMatrices.
  • rand generates random points on the SymplecticGrassmann manifold.
  • riemann_tensor, sectional_curvature, sectional_curvature_max and sectional_curvature_min on HamiltonianMatrices, InvertibleMatrices, HeisenbergMatrices, CholeskySpace, Circle and SymmetricPositiveDefinite under the LogCholeskyMetric, the last two also on SymmetricMatrices, SkewHermitianMatrices and CenteredMatrices.
  • riemann_tensor and sectional_curvature on SymmetricMatrices, SkewHermitianMatrices and CenteredMatrices.
  • riemann_tensor, sectional_curvature, sectional_curvature_max and sectional_curvature_min on SymmetricPositiveDefinite with the LogEuclideanMetric return zero.
  • the test suite runs JET.jl on the whole package with all extensions loaded, in its own environment test/jet and its own CI job, on released Julia versions.
  • @tfvector_inner_via_get_vector and @tfvector_norm_via_get_vector macros that define inner and norm of TFVectors on a metric manifold with a closed-form inner or norm by converting them with get_vector.

Changed

  • Basis-based methods of christoffel_symbols_first, christoffel_symbols_second, christoffel_symbols_second_jacobian, det_local_metric, einstein_tensor, gaussian_curvature, inverse_local_metric, local_metric, local_metric_jacobian, log_local_metric_density, ricci_curvature, ricci_tensor, riemann_tensor and solve_exp_ode (taking a point p and an AbstractBasis B) are deprecated. Use their chart-based variants taking an atlas A, chart index i and parameters a instead, for example ricci_curvature(M, A, i, a); solve_exp_ode is replaced by solve_chart_exp_ode, while local_metric_jacobian and christoffel_symbols_second_jacobian have no direct replacements and are covered by the chart-based christoffel_symbols_first, christoffel_symbols_second and riemann_tensor.
  • The default retraction and inverse retraction of FixedRankMatrices are OrthographicRetraction and OrthographicInverseRetraction.
  • The default retraction of the Hyperbolic space in the hyperboloid model is the StabilizedRetraction of the exponential map, which projects onto the hyperboloid afterwards.
  • default_retraction_method on the doubly stochastic multinomial manifolds is now the

ProjectionRetraction.

  • embedding of the MultinomialSymmetricPositiveDefinite manifold is changed from MultinomialMatrices to MultinomialSymmetric, and is marked as IsometricallyEmbeddedManifoldType instead of EmbeddedManifoldType. Consequently, inner, norm and riemannian_gradient are now also available.
  • estimated_sectional_curvature_matrix takes the number of points as the keyword N, as its docstring says; the keyword N_pts still works and issues a deprecation warning.
  • project onto the tangent space of MultinomialMatrices is now orthogonal with respect to the Fisher–Rao metric instead of subtracting the mean of each column.

Fixed

  • Two generalized Stiefel, generalized Grassmann or graph manifolds, and two generalized Bures–Wasserstein metrics, with equal contents compare equal and hash alike.
  • Two Hyperrectangles with equal bounds compare equal and hash alike.
  • Circle(ℂ)^n returns the power manifold of the complex circle.
  • AbstractAffineConnection is available when only Manifolds is loaded.
  • change_metric for a metric given by its local matrix keeps inner products also when that matrix does not commute with the local matrix of the manifold's metric.
  • change_metric on the GeneralizedGrassmann manifold returns a tangent vector whose length in the manifold's metric equals the Euclidean length of the given one.
  • change_representer for a metric given by its local matrix reproduces the inner products of that metric also when its local matrix does not commute with the local matrix of the manifold's metric.
  • The chart solvers for geodesics and Jacobi fields continue from the point reached when an atlas asks for a chart switch but keeps its chart.
  • The point check of CenteredMatrices takes a relative tolerance rtol and accepts the large points the manifold produces.
  • check_point and check_vector on a FiberBundle check the base part and the fiber part and report the errors of both.
  • check_point and check_vector on HeisenbergMatrices use the tolerances passed to them and report the size of the deviation they found.
  • check_point on Hyperbolic now also tests if the last entry is positive.
  • check_point on SPDFixedDeterminant passes its keyword arguments, such as atol and rtol, to the check of the determinant.
  • check_vector on the CholeskySpace rejects a matrix with a nonzero strictly upper triangular part with the same default tolerance as check_point.
  • check_vector on DeterminantOneMatrices accepts a trace that vanishes up to rounding, with the tolerance keyword atol.
  • check_vector on a Flag in the orthogonal representation accepts tangent vectors whose blocks vanish up to rounding, with the tolerance keyword atol.
  • check_vector and is_vector on MultinomialSymmetric apply a given atol and rtol also to the row sums.
  • check_vector and the tangent projection of SPDFixedDeterminant use the condition that the trace of p \ X vanishes, so that a geodesic in an accepted direction keeps the determinant, and the tangent check takes a relative tolerance rtol.
  • The tangent checks of the sphere, the projective space, the probability simplex, the hyperbolic space, the centered matrices, the elliptope and the spectrahedron take a relative tolerance rtol and accept tangent vectors of any length.
  • connected_by_geodesic on the Segre manifold with a WarpedMetric takes the warping factor into account.
  • Constructors of manifolds throw a DomainError for sizes at which the manifold would be empty or have a negative dimension, such as Sphere(-1), Stiefel(2, 3), SpecialUnitaryMatrices(0), Spectrahedron(0, 0) or Segre(2, 0). Flag and Tucker throw a DomainError instead of an ErrorException and an AssertionError for invalid sizes. This affects the following manifolds:
    • ArrayProjectiveSpace
    • ArraySphere
    • CenteredMatrices
    • CholeskySpace
    • DeterminantOneMatrices
    • Elliptope
    • Euclidean
    • FixedRankMatrices
    • Flag
    • GeneralizedGrassmann
    • GeneralizedStiefel
    • GeneralUnitaryMatrices
    • Grassmann
    • HamiltonianMatrices
    • HeisenbergMatrices
    • Hyperbolic
    • InvertibleMatrices
    • KendallsPreShapeSpace
    • KendallsShapeSpace
    • Lorentz
    • MultinomialDoubleStochastic
    • MultinomialMatrices
    • MultinomialSymmetric
    • MultinomialSymmetricPositiveDefinite
    • Oblique
    • OrthogonalMatrices
    • ProbabilitySimplex
    • ProjectiveSpace
    • Rotations
    • Segre
    • SkewHermitianMatrices
    • SPDFixedDeterminant
    • SpecialUnitaryMatrices
    • Spectrahedron
    • Sphere
    • SphereSymmetricMatrices
    • Stiefel
    • SymmetricMatrices
    • SymmetricPositiveDefinite
    • SymmetricPositiveSemidefiniteFixedRank
    • SymplecticGrassmann
    • SymplecticMatrices
    • SymplecticStiefel
    • Torus
    • Tucker
    • UnitaryMatrices
  • SymplecticGrassmann throws an ArgumentError for odd matrix sizes, as SymplecticStiefel does, instead of rounding them down.
  • copy of an SVDMPoint or a TuckerPoint returns a point with its own arrays.
  • diff_canonical_project and diff_canonical_project! on the Grassmann manifold compute the differential of the canonical projection from Stiefel points onto projectors.
  • distance and log on the unsigned EssentialManifold choose the closest of the four sign flips, so that they are the same for every representative of a point.
  • distance and log on the EssentialManifold return a number when a turn about the z axis puts one of the two cameras in place.
  • distance on a complex Euclidean space returns a real number.
  • distance and log on the GeneralizedGrassmann manifold use the metric given by B, and distance returns π/2 for a right principal angle.
  • distance on the Grassmann manifold returns π/2 for a right principal angle instead of throwing a SingularException.
  • distance on the hyperboloid model of the Hyperbolic space keeps the number type of its points, so that single precision points give a single precision distance.
  • Increased accuracy of distance on Hyperbolic for distant points.
  • distance on the ProbabilitySimplex returns a number for every pair of points, also for a point and itself.
  • distance, log and connected_by_geodesic on the Segre manifold, also with a WarpedMetric, leave the points they are given unchanged.
  • distance on the SymmetricPositiveDefinite manifold returns zero only for equal points, also when their eigenvalues differ by many orders of magnitude.
  • distance under the BuresWassersteinMetric and the GeneralizedBuresWassersteinMetric returns a real number also when rounding makes the squared distance negative or complex, for example for a point and itself.
  • embed and embed! of a tangent vector on the Segre manifold return the embedded tangent vector, and embed! writes it into the given array.
  • The embedding of an ArrayProjectiveSpace that stores its size in a field stores its size in a field as well.
  • embedding of the Flag manifold is now marked as EmbeddedManifoldType instead of IsometricallyEmbeddedManifoldType.
  • estimated_sectional_curvature accepts any pair of tangent vectors spanning the plane, as sectional_curvature does.
  • estimated_sectional_curvature works on manifolds whose points are arrays of arrays, such as Segre.
  • exp on the GeneralizedGrassmann manifold follows the geodesic in the direction of the given tangent vector.
  • exp, log, mid_point, the retractions and the inverse retractions on Grassmann and Stiefel accept points and tangent vectors given as StiefelPoint and StiefelTangentVector.
  • exp on ProbabilitySimplex(n; boundary = :closed) follows the geodesic within the face at points with zero entries.
  • The exponential map and the parallel transport on Rotations(3) and OrthogonalMatrices(3) return finite values for tangent vectors shorter than 1e-162.
  • exp!, and with it the in-place retract! and mid_point!, on the Segre manifold and under its WarpedMetric return the correct point when the result is the starting point itself.
  • exp and exp_fused on the sphere can be differentiated with forward-mode automatic differentiation at the zero tangent vector, so that ManifoldDiff.gradient and ManifoldDiff.hessian with a forward-mode TangentDiffBackend work on the sphere.
  • exp! on the Stiefel manifold with the CanonicalMetric can write its result into its own starting point.
  • exp! into an SPDPoint stores an orthonormal eigen decomposition, so the resulting point is correct also when it does not store its matrix, and equals the result of exp.
  • FiberBundleProductRetraction on a VectorBundle transports the fiber part with the vertical vector transport method, the one FiberBundleInverseProductRetraction uses.
  • flat and sharp on a MetricManifold apply the local metric to coefficients in an induced basis, as flat! and sharp! do.
  • The basis vectors of a FiberBundle along the base manifold have a fiber part of the size of the fiber elements instead of the base manifold elements.
  • charts of the DefaultTorusAtlas are now correctly switched according to the distance of the point from the chart centre (get_chart_index, check_chart_switch).
  • get_coordinates on the CholeskySpace divides the diagonal entries by the diagonal of the point, so that the coordinates are those of the orthonormal basis and invert get_vector.
  • get_coordinates on the number-valued Euclidean space accepts a tangent vector given as a number, for real and for complex coefficients.
  • get_coordinates, get_coordinates!, get_vector and get_vector! in the cotangent DefaultOrthonormalBasis work on every FiberBundle, including tangent bundles with ArrayPartition points.
  • get_coordinates! and get_vector! on the real Grassmann manifold and the differentiated retraction vector transports on Stiefel accept points and tangent vectors given as StiefelPoint and StiefelTangentVector.
  • get_coordinates and get_vector on the Hyperbolic space accept a diagonalizing basis whose direction is a HyperboloidTangentVector.
  • get_coordinates, get_vector and get_basis on the complex InvertibleMatrices work for real and for complex coefficients, in the basis of the embedding.
  • get_coordinates and get_vector on KendallsPreShapeSpace use an orthonormal basis of its tangent space.
  • get_coordinates, get_coordinates!, get_vector and get_vector! in the cotangent DefaultOrthonormalBasis work on a MetricManifold.
  • get_coordinates! on the Segre manifold and under its WarpedMetric writes the coordinates into the given vector.
  • The manifold of complex SkewHermitianMatrices now correctly supports the real orthonormal basis (DefaultOrthonormalBasis(ℝ)) of its tangent space instead of mistakenly implementing the complex coefficient basis (DefaultOrthonormalBasis(ℂ)).
  • get_coordinates and get_vector on the sphere and the projective space, and parallel_transport_to on the projective space, accept points with integer entries.
  • get_coordinates! on the Tucker manifold writes the coordinates of the default orthonormal basis into the given vector.
  • get_coordinates on the Tucker manifold works in the DefaultOrthogonalBasis and the DefaultBasis.
  • get_embedding on an ArraySphere created with parameter = :field returns a Euclidean space that stores its size in a field as well.
  • get_embedding on the Oblique and MultinomialMatrices manifolds returns the space of matrices of their size, so that the extrinsic mean and embed on a ValidationManifold work for them.
  • get_point on a ProductManifold accepts parameters given as an ArrayPartition.
  • get_vector in the orthonormal basis of the number-valued Euclidean space returns a number when the point is a number.
  • get_vector on HeisenbergMatrices returns the tangent vector for every size n, as its in-place variant does.
  • get_vector on complex SymmetricMatrices returns a Hermitian matrix, so that it inverts get_coordinates.
  • get_vector under the LogCholeskyMetric on SymmetricPositiveDefinite uses the Cholesky factor of the point, so that it inverts get_coordinates and its basis vectors are orthonormal at every point.
  • Indexing and view of points on a PowerManifold work when the point is a VectorOfArray from RecursiveArrayTools.jl.
  • Indexing and view of points on a PowerManifold work for arrays from NamedDims.jl and FillArrays.jl.
  • horizontal_component, and with it exp, inner and norm, on KendallsShapeSpace return a value when the landmarks span fewer dimensions than the space, such as collinear points in the plane.
  • incident_log! on a GraphManifold overwrites the tangent vector it is given, so that it returns the same result as incident_log instead of adding the logarithm to the existing tangent vector.
  • inner of two TFVectors works on the Lorentz manifold and for the canonical and submersion metrics on Stiefel, the Bures-Wasserstein, generalized Bures-Wasserstein and log-Cholesky metrics on SymmetricPositiveDefinite, and the warped metric on Segre.
  • inner and norm of TFVectors work on a MetricManifold with the EuclideanMetric.
  • inner under the BuresWassersteinMetric on SymmetricPositiveDefinite returns a number of the element type of its arguments.
  • inverse_retract with NLSolveInverseRetraction now correctly applies tangent space projections.
  • inverse_retract with QRInverseRetraction on a complex Stiefel manifold returns a tangent vector and inverts retract with QRRetraction.
  • is_flat on DeterminantOneMatrices returns false for sizes two and larger.
  • is_flat on MultinomialSymmetric(2) returns true.
  • is_flat on SymmetricPositiveDefinite with the LogEuclideanMetric returns true.
  • is_point on FixedRankMatrices accepts a plain matrix of rank k for every k and requires the rank to be exactly k, also for an SVDMPoint.
  • is_point on the complex Grassmann manifold accepts points in the projector representation and rejects projectors that are not Hermitian.
  • is_point on the Hyperrectangle checks the bounds also when keyword arguments such as atol are given.
  • is_point on SymmetricPositiveDefinite accepts a matrix that is symmetric up to rounding, such as a result of exp; the tolerance can be set with the keywords of isapprox.
  • is_point on SymmetricPositiveSemidefiniteFixedRank checks the rank of q*q', so that it accepts a point of rank k with a small last singular value.
  • is_vector on FixedRankMatrices returns false for a tangent vector whose Vt factor is not orthogonal to the point.
  • is_vector on the GeneralizedStiefel and GeneralizedGrassmann manifolds accepts complex tangent vectors and those with p'BX = 0, with a tolerance relative to the length of the vector.
  • is_vector on Grassmann requires p'X = 0 relative to the size of X with the keywords atol and rtol, so that vectors that only rotate the basis of the point are rejected.
  • is_vector and project on the SpecialUnitaryMatrices require and return tangent vectors of trace zero.
  • is_vector on Stiefel checks that p'X is skew-Hermitian with isapprox and an absolute tolerance scaled by the size of X, so that it accepts complex tangent vectors and the tangent vectors of Stiefel(n, 1).
  • is_vector on the Tucker manifold checks that the factor matrices of a tangent vector are orthogonal to those of the point, and it accepts the keywords atol and rtol.
  • isapprox on the EssentialManifold reports two representatives of the same point as equal.
  • isapprox for tangent vectors on a FiberBundle compares the base part as a tangent vector at the base point.
  • isapprox on a Flag accepts points in the orthogonal representation.
  • isapprox on Grassmann, GeneralizedGrassmann and KendallsShapeSpace finds every point approximately equal to itself, also with atol = 0.
  • jacobi_field and adjoint_Jacobi_field on the Circle and on the number-valued Euclidean space apply the weight function they are given.
  • kretschmann_scalar now correctly uses the metric instead of the inverse for one of the contractions.
  • local_metric on the real Sphere in the StereographicAtlas returns a Diagonal matrix of the size of the parameters instead of a UniformScaling, so that chart-based curvature functions such as ricci_curvature work in that atlas.
  • log on the complex Circle returns a tangent vector for every pair of opposite points and nearly opposite points.
  • log and inverse_retract work on a PowerManifold of complex Circles.
  • log on SpecialUnitaryMatrices returns the tangent vector of minimal norm, which has trace zero.
  • log on Sphere and ArraySphere returns a tangent vector for every pair of opposite points and is more accurate.
  • The logarithmic map of the Stiefel manifold with the CanonicalMetric also works for two coinciding or nearly coinciding points when 2k > n.
  • log on SymmetricPositiveDefinite with the BuresWassersteinMetric takes the square roots of the products of the two points, so that it inverts exp also for points that do not commute.
  • log on the SymmetricPositiveDefinite manifold returns a tangent vector whose length is the distance also when q is more than sixteen orders of magnitude smaller than p, such as q = 1e-9 * I and p = 1e9 * I.
  • manifold_dimension on DeterminantOneMatrices over the complex numbers counts the determinant condition as the two real conditions it is.
  • manifold_dimension on the HamiltonianMatrices returns the dimension of the manifold, over the real and over the complex numbers.
  • manifold_volume of OrthogonalMatrices, Rotations, UnitaryMatrices and SpecialUnitaryMatrices is the volume with respect to the metric of inner.
  • manifold_volume, volume_density and riemann_tensor on the ProbabilitySimplex return the correct values for every point and tangent vector (sphere radius was incorrectly set to 1 instead of 2 for the diffeomorphism).
  • Manifolds.Test.test_default_retraction and Manifolds.Test.test_default_vector_transport_method compare with an expected value only when one is given.
  • Manifolds.Test.test_geodesic compares the speed of the geodesic with norm(M, p, X), so that it passes for end times other than one.
  • Manifolds.Test.test_manifold compares the expected result of log when one is given.
  • Manifolds.Test.test_manifold compares the expected sectional curvature and its expected minimum and maximum when they are given.
  • The :Seed property of Manifolds.Test.test_manifold and the seed keyword of Manifolds.Test.test_rand seed the random number generator before sampling.
  • Manifolds.Test.test_mid_point, and with it Manifolds.Test.test_manifold, compare the mid-points of both argument orders by default and skip this comparison for test_symmetry = false or the property :TestMidpointSymmetry => false.
  • Manifolds.Test.test_parallel_transport and Manifolds.Test.test_vector_transport compare the transported vector in the tangent space at the point it is transported to.
  • Manifolds.Test.test_retract, test_sectional_curvature, test_sharp, test_shortest_geodesic and test_vector_transport compare their result with a supplied expected value.
  • mean!(M, y, x) uses the default estimation method for the type of the points, as mean(M, x) does.
  • mean(M, x) and mean(M, x, w) pass their keyword arguments to the estimation method, also on decorator manifolds.
  • mean with GeodesicInterpolation and a shuffling generator shuffle_rng skips exactly the points of weight zero.
  • mean_and_var with GeodesicInterpolation returns the weighted mean and variance also when the first points have weight zero.
  • median(M, x) and median(M, x, w) pass their keyword arguments to the estimation method.
  • median with WeiszfeldEstimation returns the point itself for a single point and for coinciding points.
  • metric returns EuclideanMetric() on the projective spaces, Elliptope, Spectrahedron, SymmetricPositiveSemidefiniteFixedRank, KendallsShapeSpace and ParametricSurface, so that riemannian_gradient converts a Euclidean gradient on them.
  • mid_point on the complex Circle returns the midpoint of the shortest geodesic for every pair of points.
  • NLSolveInverseRetraction with project_point = true leaves the point it is given unchanged.
  • norm in the orthogonal representation of a flag manifold is fixed (it had wrong scaling).
  • parallel_transport_direction on the Grassmann manifold allocates its result directly instead of computing a geodesic for it.
  • parallel_transport_to on the CholeskySpace (and hence under the log-Cholesky metric) keeps the strictly lower part of the tangent vector, so that the transport is an isometry.
  • parallel_transport_to and parallel_transport_direction work on OrthogonalMatrices, UnitaryMatrices and SpecialUnitaryMatrices as they do on Rotations.
  • Parallel transport on the SymmetricPositiveDefinite matrices returns the vector unchanged when both points are equal.
  • The plotting recipe of Sphere(2) draws the solid surface with the resolution surface_resolution also when it differs from wires.
  • power_dimensions on the Oblique manifold returns a one-element tuple, like the other power manifolds.
  • project and project! work for the real Circle and hence for the Torus.
  • project onto the tangent space of the Elliptope removes the vertical part with the right sign, so that it is a projection onto the horizontal space.
  • project from a Euclidean embedding into a Euclidean manifold of fewer array dimensions returns the corresponding entries.
  • project, embed, zero_vector and is_vector on a complex FixedRankMatrices manifold work with complex tangent vectors.
  • project onto the tangent space of the GeneralizedGrassmann manifold removes the whole part along the columns of the point, so that it and rand return tangent vectors X with p'BX = 0.
  • project onto a complex GeneralizedStiefel manifold, and its default retraction, return a point of the manifold also when the weight matrix is the identity.
  • project! on all three models of Hyperbolic and zero_vector! on the Poincaré ball and half space return the tangent vector they fill.
  • project and rand on KendallsShapeSpace return horizontal tangent vectors, so that the basis from ProjectedOrthonormalBasis is orthonormal.
  • project of a matrix onto the multinomial doubly stochastic manifolds runs Sinkhorn's algorithm for up to 1000 iterations, stops once every column sum is within tolerance of one, and warns when it does not get there.
  • project onto the tangent space of MultinomialDoubleStochastic returns a tangent vector at every point, also at the uniform matrix of two or four rows.
  • project! onto the multinomial doubly stochastic manifolds accepts a matrix with integer entries when the result is a floating point matrix.
  • project onto the tangent space of MultinomialSymmetric, and with it riemannian_gradient and riemannian_Hessian, use the symmetric part of a nonsymmetric input, so that they return the correct tangent vector.
  • Point project! onto the SPDFixedDeterminant returns the projected point.
  • project onto the tangent space of the complex SymmetricMatrices returns the Hermitian part, so that its result is a tangent vector.
  • project onto the tangent space of the Tucker manifold also works in its allocating form and returns a TuckerTangentVector.
  • project onto a tangent space and embed of a tangent vector on the quaternionic UnitaryMatrices(1, ℍ) take the point into account, so that they and the default vector transport follow the Lie algebra representation of tangent vectors.
  • rand draws random points and tangent vectors on CenteredMatrices, Elliptope, Spectrahedron and SPDFixedDeterminant.
  • rand on DeterminantOneMatrices draws tangent vectors from the whole tangent space, and is_vector there takes a relative tolerance rtol and accepts tangent vectors of any length.
  • rand on the EssentialManifold draws tangent vectors in the horizontal space, so that they have no part along the equivalence class.
  • Random tangent vectors of a FiberBundle are drawn in the fiber over the base point of vector_at.
  • rand on a complex FixedRankMatrices manifold returns complex points and tangent vectors, and its keyword σ scales the singular values of a point and the factors of a tangent vector.
  • rand with vector_at on a Flag manifold with an orthogonal representation returns an OrthogonalTangentVector instead of OrthogonalPoint.
  • rand on a complex GeneralizedGrassmann manifold returns a point, and project onto it returns a point also when the weight matrix is the identity.
  • rand on a complex GeneralizedStiefel manifold returns a point or, with vector_at, a tangent vector.
  • rand on the HamiltonianMatrices draws its two off-diagonal blocks independently, as documented.
  • rand and rand! on the Hyperbolic space accept points and tangent vectors of the hyperboloid, the Poincaré ball and the Poincaré half space types.
  • rand on the Hyperbolic space draws tangent vectors whose coordinates in an orthonormal basis are independent normal with standard deviation σ at every base point.
  • rand on KendallsPreShapeSpace and KendallsShapeSpace draws in the number type of the array it fills, so that random points in BigFloat pass is_point.
  • rand on MultinomialSymmetric passes its keyword arguments other than σ to the projection onto the manifold, as documented.
  • rand on the MultinomialSymmetricPositiveDefinite manifold rejects samples for which Sinkhorn's algorithm did not converge, so that it no longer occasionally returns points whose rows do not sum to one.
  • rand on MultinomialSymmetricPositiveDefinite returns a random point, and with vector_at a random tangent vector drawn as on MultinomialSymmetric.
  • rand on OrthogonalMatrices with vector_at draws the projection of a normally distributed matrix with standard deviation σ.
  • rand with vector_at and change_metric on the ProbabilitySimplex and the MultinomialMatrices work at points with small entries (near the boundary).
  • rand and rand! on the Segre manifold draw from a given random number generator.
  • rand on the quaternionic Stiefel and Grassmann manifolds returns a point.
  • rand with vector_at on Stiefel, GeneralizedStiefel, Grassmann and GeneralizedGrassmann scales the random tangent vector by σ, as documented.
  • rand on SymmetricPositiveDefinite draws Gaussian tangent vectors whose coordinates in an orthonormal basis at the base point have standard deviation σ, by default 1/sqrt(n), the :Rician draw accepts an SPDPoint, and rand! into an SPDPoint stores the matrix square roots of the drawn point.
  • rand with a vector_at on the SymplecticMatrices uses the generator it is given, so seeded draws repeat.
  • retract with the OrthographicRetraction on FixedRankMatrices returns the point of its documented formula.
  • retract, retract_fused and inverse_retract with the OrthographicRetraction and the OrthographicInverseRetraction on FixedRankMatrices accept keyword arguments.
  • retract on a Flag without a retraction method uses the QR retraction for points in the orthogonal representation.
  • retract with QRRetraction on Grassmann multiplies each column by the sign of its own diagonal entry of the triangular factor, as documented.
  • retract with the default ProjectionRetraction on the Hyperrectangle returns a point inside the box.
  • retract with SoftmaxRetraction on the ProbabilitySimplex applies correct scaling by p, keeps zero entries of a point on the closed simplex and does not overflow for large exponents.
  • retract, retract_fused and inverse_retract with the PolarLightRetraction and the PolarLightInverseRetraction on Stiefel accept keyword arguments.
  • riemann_tensor on the real Grassmann manifold adds the second term of its documented formula, so that sectional_curvature there is never negative.
  • riemann_tensor on the Segre manifold, also under a WarpedMetric, returns the element type of the point instead of always Float64.
  • riemannian_gradient on the Hyperbolic space changes the representer before it projects onto the tangent space, so that it returns the Riemannian gradient.
  • riemannian_gradient on MultinomialMatrices returns the Riemannian gradient with respect to the Fisher–Rao metric.
  • riemannian_gradient on PositiveNumbers accepts a point and a Euclidean gradient given as numbers.
  • riemannian_gradient on a PowerManifold with the array or the nested representation computes the gradient factor by factor, with the gradient of the factor manifold.
  • riemannian_gradient on the SymplecticGrassmann manifold returns the gradient given in its documentation.
  • riemannian_gradient on SymplecticMatrices returns the gradient with respect to the RealSymplecticMetric, the metric that inner implements.
  • riemannian_gradient on the SymplecticStiefel manifold accepts the embedding_metric keyword in its allocating form and returns the same result with it as without it.
  • riemannian_Hessian on FixedRankMatrices works for matrices with more columns than the rank.
  • riemannian_Hessian on the Hyperbolic space follows its documented formula and leaves the Euclidean Hessian it is given unchanged.
  • riemannian_Hessian on OrthogonalMatrices and UnitaryMatrices returns the correct Hessian at every point.
  • riemannian_Hessian works on PositiveVectors, PositiveMatrices and PositiveArrays.
  • riemannian_Hessian on the Stiefel manifold with the CanonicalMetric or a StiefelSubmersionMetric applies the inverse of the metric, so it returns the Hessian with respect to that metric.
  • sectional_curvature_matrix and estimated_sectional_curvature_matrix return their result in the floating-point number type of the point.
  • sectional_curvature_min on SymmetricPositiveDefinite returns -0.5, the smallest sectional curvature of the affine invariant metric.
  • The Oblique manifold prints its number system as the positional argument its constructor takes, so that its printed form evaluates back to it.
  • show method for SpecialUnitaryMatrices for nicer printing.
  • skewness(M, x[, w]) and kurtosis(M, x[, w]) return the same values as with the precomputed mean mean(M, x[, w]), also where the mean is computed by geodesic interpolation. This avoids using the Welford's algorithm by default, which is very inaccurate on non-flat manifolds.
  • vector_transport_direction and vector_transport_to with DifferentiatedRetractionVectorTransport(QRRetraction()) on Stiefel compute the derivative of the QR retraction.
  • vector_transport_direction! on a VectorBundle moves the fiber part with the transport of the fiber, as vector_transport_direction does.
  • vector_transport_to on the GeneralizedGrassmann manifold uses ProjectionTransport by default.
  • vector_transport_to with ProjectionTransport is available on the Segre manifold with a WarpedMetric.
  • vector_transport_to! with ProjectionTransport on the Segre manifold returns the transported vector also when the result is the tangent vector being transported.
  • vector_transport_to with ProjectionTransport on a complex Tucker manifold returns the projection onto the tangent space at the target point.
  • volume_density on the Hyperbolic space measures the tangent vector with its Riemannian norm, so that it is the determinant of the differential of the exponential map at every point.
  • volume_density on a PowerManifold in a nested representation returns the product of the volume densities of its components.
  • volume_density on Rotations and OrthogonalMatrices returns the determinant of the differential of the exponential map.
  • volume_density on SymmetricPositiveDefinite uses the eigenvalues of p^(-1/2) X p^(-1/2) and half their differences, so that it is the determinant of the differential of the exponential map at p.
  • Weingarten is available on every AbstractSphere, so also on ArraySphere, KendallsPreShapeSpace and SphereSymmetricMatrices, and uses the real part of the inner product for complex and quaternionic points.
  • Weingarten on Rotations, OrthogonalMatrices and UnitaryMatrices returns a tangent vector in the Lie algebra, like its tangent vector argument.
  • WeiszfeldEstimation is exported, like the other estimation methods for mean and median.

0.11.32 (2026-09-30)

Added

  • The Veronese manifold of nonzero symmetric rank-one tensors. (#924)

0.11.31 (2026-09-25)

Fixed

  • Forwarding of statistics-related functions through decorators.

0.11.30 (2026-09-22)

Added

  • Chart-based solvers for Jacobi fields, exponential- and logarithmic map differentials and their adjoints, as well as exponential map volume density: solve_chart_jacobi_field,

solve_chart_volume_density, solve_chart_differential_exp_basepoint, solve_chart_differential_exp_argument,solve_chart_differential_log_basepoint,solve_chart_differential_log_argument,solve_chart_adjoint_differential_exp_basepoint,solve_chart_adjoint_differential_exp_argument,solve_chart_adjoint_differential_log_basepoint,solve_chart_adjoint_differential_log_argument.

  • GrassmannAtlas and StiefelAtlas (with StiefelChart) for real Grassmann and Stiefel manifolds.
  • Chart operations and induced-basis support for the stereographic atlas on spheres.
  • Extended the "Working in Charts" tutorial covering new additions.
  • PowerAtlas and ProductAtlas for PowerManifold and ProductManifold, respectively, with induced-basis support.
  • ParametricSurface manifold for handling parametric surfaces (with or without boundaries and corners) in Euclidean space with the metric induced by the embedding.

Changed

  • The documentation now uses DocumenterCodeBlocks.jl
  • The documentation now has a landing page using DocumenterLandingPage.jl
  • DocumenterCitations.jl was bumped to version 1.5.
  • Several docstrings were rewritten to start with a short summary sentence, such that DocumenterCodeBlocks.jl can display them in tooltips.
  • More atlas and chart-related operations are now exported: get_chart_index, transition_map, transition_map!, transition_map_diff and transition_map_diff!.
  • Chart-based geodesic and parallel-transport ODE solvers use in-place problem definitions for performance.
  • get_default_atlas for PowerManifold and ProductManifold now return PowerAtlas and ProductAtlas of default atlases of wrapped manifolds instead of the RetractionAtlas.

Fixed

  • Edited several doc strings to have a first sentence / line with less than 200 characters to fit the new Doc string tooltips.
  • ricci_tensor now uses the correct contraction for the Ricci tensor in terms of the Riemann curvature tensor, fixing a bug in the ricci_tensor that could lead to wrong sign of the result.

0.11.29 (2026-07-22)

Added

  • vector_transport_to_project! for Tucker manifold. (#909)

Changed

  • SciML-related extensions now import interfaces and solvers from their owner packages and explicitly trigger on the required SciML weak dependencies.

Fixed

  • PythonPlot was replaced with GR to fix documentation building on CI.

0.11.28 (2026-06-15)

Added

  • change_metric, change_representer extended to all GeneralUnitaryMatrices.
  • get_coordinates and get_vector on the UnitaryMatrices manifold.

0.11.27 (2026-06-06)

Added

  • a DefaultOrthonormalBasis for the Grassmann manifold in Stiefel representation. (#904)
  • improved documentation of the tangent space.

0.11.26 (2026-05-22)

Changed

  • Update the function of vector_transport_to(::Segre, p, X, q, ::ProjectionTransport) for Segre Manifold (#898)

0.11.25 (2026-05-20)

Added

  • An allocating variant of levi_civita_affine_connection!

Changed

  • Argument name for christoffel_symbols_second!, from i to index. The previous i overlapped with a for loop index, also named i, later in the function, thus resulting in incorrect behavior.

0.11.24 (2026-05-19)

Added

  • vector_transport_to(::Segre, p, X, q, ::ProjectionTransport) for Segre Manifold (#893)

0.11.23 (2026-04-29)

Changed

  • Bumped RecursiveArrayTools compat to 2, 3, 4 and OrdinaryDiffEq compat to 6.31, 7, allowing the SciMLBase 3 ecosystem (RAT 4 / OrdinaryDiffEqCore 4 / SciMLBase 3).
  • ManifoldsOrdinaryDiffEqDiffEqCallbacksExt now uses Rodas5P instead of the removed Rodas5 re-export from OrdinaryDiffEq, and SciMLBase.terminate! instead of the removed OrdinaryDiffEq.terminate!. The default solver for solve_chart_exp_ode / solve_chart_parallel_transport_ode is now AutoVern9(Rodas5P()).

Fixed

  • ManifoldsBoundaryValueDiffEqExt now triggers on BoundaryValueDiffEqMIRK (the only subpackage actually used) and requires version 1.17, avoiding a transitive resolver picking BoundaryValueDiffEqCore 2.1 with BoundaryValueDiffEqMIRK / BoundaryValueDiffEqFIRK 1.13, a combination whose precompile workload fails (SciML/DifferentialEquations.jl#1136). The 1.17 lower bound also includes the upstream fix for SciML/BoundaryValueDiffEq.jl#484 (UndefRefError in MIRK adaptive mesh refinement on nonlinear BVPs under the SciMLBase 3 / RAT 4 stack), so solve_chart_log_bvp works with default adaptive = true.
  • solve_chart_log_bvp now uses a function-valued initial guess (linear interpolation between a1 and a2) and the callable bc!(residual, u, p, t) API (u(tspan[1]), u(tspan[2])) compatible with EvalSol. kwargs... are now forwarded to solve (previously silently dropped), so callers can pass through adaptive and other solver options.

0.11.22 (2026-04-24)

Added

Changed

  • Improved performance of embed for embedding tangent vectors of FixedRankMatrices (#885).

0.11.21 (2026-04-03)

Changed

  • bump compat of RecursiveArrayTools to 4
  • introduce a Project.toml workspace and a separate Project.toml for the test/ folder
  • move julia package dependency checks from CompatHelper to dependabot, since that one can group PRs.

0.11.20 (2026-03-31)

Added

Changed

  • Improved formatting of the references in the Readme.md (#869)

Fixed

  • get_vectors on Stiefel no longer returns incorrect vectors in certain cases.

0.11.19 (2026-03-21)

Added

  • recursive_bottom_eltype methods for TuckerTangentVector and TuckerPoint for better compatibility with RecursiveArrayTools.jl.

Changed

  • default_inverse_retraction_method, default_retraction_method and default_vector_transport_method for Tucker manifold are now ProjectionRetraction, ProjectionRetraction and ProjectionTransport, respectively, since the previous defaults were not available for the manifold.

Fixed

  • Fixed broadcasting of TuckerTangentVector inside ArrayPartition.

0.11.18 (2026-03-20)

Added

  • Random point and tangent vector generation on the Tucker manifold.

0.11.17 (2026-03-13)

Fixed

  • Fixed polar retraction on UnitaryMatrices.

0.11.16 (2026-03-11)

Fixed

  • Fixed embed! on Segre manifold.

0.11.15 (2026-03-04)

Fixed

  • fixed a missing transpose in the inverse polar light retraction.

0.11.14 (2026-03-02)

Added

  • a new retraction and its inverse on the Stiefel manifold (#858)
  • similar to Manopt.jl, we now do typechecking with crate-ci/typos (#858)

Fixed

  • fixed a bug where the second vector in the test suite had to be both in the first and the second points tangent space added a new :SecondVector to provide the second tangent vector in the first points tangent space (e.g. for inner) (#858)

0.11.13 (2026-02-24)

Changed

  • rand! on UnitaryMatrices and the QR retraction methods were rewritten to be faster and more GPU array-compatible.

0.11.12 (2026-02-04)

Added

  • Chart-based variants of christoffel_symbols_first, einstein_tensor, det_local_metric and log_local_metric_density.

Changed

  • Deprecated variants of det_local_metric, einstein_tensor, inverse_local_metric, local_metric, local_metric_jacobian, ricci_curvature that receive a point and a basis as arguments. New variants that work in charts should be used instead.

0.11.11 (2026-01-24)

Changed

  • Hyperrectangle now has has_components defined to true, as well as r-norm support for norm and distance.

0.11.10 (2026-01-07)

Added

  • change_representer and change_metric for Rotations manifold from EuclideanMetric.

0.11.9 (2025-12-15)

Fixed

  • project for tangent vectors on Hyperrectangle no longer truncates unnecessarily to the domain of exp (#851).
  • DefaultMetric is now internally imported from ManifoldsBase.jl.

0.11.8 (2025-12-09)

Changed

  • MetricManifold and ConnectionManifold were moved to ManifoldsBase.jl (#848).

0.11.7 (2025-11-27)

Added

  • added a more structured version for the extension with Test.jl that now introduces (#839)
    • a complete test suite Manifolds.Test.test_manifold(M; kwargs...) it follows the structure of the one recently written for LieGroups.jl.
    • a lot of small test functions like Manifolds.Test.test_exp(M, p, X; kwargs...) with the goal of providing one test for each individual API function
  • New methods and functions for working in a chart: local_metric, inverse_local_metric, levi_civita_affine_connection!, christoffel_symbols_second.
  • Default implementation of get_vector! and get_coordinates! for InducedBasis using automatic differentiation.
  • A new tutorial that describes working with the Levi-Civita connection for a Riemannian metric defined through inner in a chart.

Fixed

  • the circle represented in angles (Circle()) had a wrong default and provided a project and embed method while not being an embedded manifold, this is now fixed, but might cause errors for some users. To fix the errors, note that the old behavior of embed(M, p) was just returning p, and the old behavior of project(M, p) was Manifolds.sym_rem(p). (#839)

0.11.6 (2025-11-19)

Changed

  • rand on Hyperrectangle returns valid points in the presence of -Inf and Inf.
  • check_point on Hyperrectangle checks that there are no NaNs.

0.11.5 (2025-11-13)

Added

  • rand for SkewHermitianMatrices

0.11.4 (2025-11-07)

Changed

  • Random tangent vectors on Hyperbolic are now much shorter (their norm is on the order of 1) to guide users away from numerical issues with long vectors.

0.11.3 (2025-11-04)

Fixed

  • fixes a few inconsistencies regarding get_embedding, which now consistently uses a point type as positional second argument.

0.11.2 (2025-10-30)

Fixed

  • fixed the default_retraction_method for AbstractSphere to be the stabilized exponential map to avoid accumulations of rounding errors when the tangent vector is not exactly tangent.
  • fixed the contributing.md to mention runic as the code formatter.

0.11.1 (2025-10-24)

Fixed

  • fix a few small errors regarding the forwarding of retract, retract_fused, and inverse_retract when using a MetricManifold.jl (cf (#823))
  • document why we kept that vector_transport_direction and vector_transport_to are not automatically forwarded in MetricManifold.jl

0.11.0 (2025-10-02)

Added

  • a function metric(M) analogous to get_embedding(M) and connection(M) that returns the metric of the manifold M.
  • a DefaultMetric() type to specify that the manifold uses some specific metric, that is not further named.

Changed

  • Switch to using Runic.jl as code formatter
  • refactored all manifolds to use a parameter order of {𝔽, T} where 𝔽 is the number type and T the type of size parameter (either a TypeParameter or a Tuple). this changed internally
    • ArraySphere{T<:Tuple,𝔽} to ArraySphere{𝔽, T<:Tuple}
    • CenteredMatrices{T, 𝔽} to CenteredMatrices{𝔽, T}
    • Euclidean{T, 𝔽} to Euclidean{𝔽, T}
    • FixedRankMatrices{T, 𝔽} to FixedRankMatrices{𝔽, T}
    • GeneralizedGrassmann{T, 𝔽, B} to GeneralizedGrassmann{𝔽, T, B}
    • GeneralizedStiefel{T, 𝔽, B} to GeneralizedStiefel{𝔽, T, B}
    • Grassmann{T, 𝔽, B} to Grassmann{𝔽, T, B}
    • GeneralUnitaryMatrices{T, 𝔽, S} to GeneralUnitaryMatrices{𝔽, T, S}
    • GraphManifold{G <: AbstractGraph, 𝔽, TM, T <: GraphManifoldType} to GraphManifold{𝔽, G <: AbstractGraph, TM, T <: GraphManifoldType}
    • Grassmann{T, 𝔽} to Grassmann{𝔽, T}
    • HamiltonianMatrices{T, 𝔽} to HamiltonianMatrices{𝔽, T}
    • Oblique{T, 𝔽, S} to Oblique{𝔽, T, S}
    • SkewHermitianMatrices{T, 𝔽} to SkewHermitianMatrices{𝔽, T}
    • Sphere{T, 𝔽} to Sphere{𝔽, T}
    • SphereSymmetricMatrices{T, 𝔽} to SphereSymmetricMatrices{𝔽, T}
    • Stiefel{T, 𝔽} to Stiefel{𝔽, T}
    • SymmetricMatrices{T, 𝔽} to SymmetricMatrices{𝔽, T}
    • SymplecticGrassmann{T, 𝔽} to SymplecticGrassmann{𝔽, T}
    • SymplecticStiefel{T, 𝔽} to SymplecticStiefel{𝔽, T}
    • Tucker{T, D, 𝔽} to Tucker{𝔽, T, D}
    • UnitaryMatrices{T, 𝔽} to UnitaryMatrices{𝔽, T}
  • the functions canonical_project, differential_canonical_project, horizontal_lift, horizontal_component, get_total_space, and vertical_component have been moved upstream to ManifoldsBase.jl

Removed

  • the trait system that was present additionally to the wrapper types for metric, embedding and connections. Those were moved to default_X functions and the dispatch was adapted to still obtain the same logic/behaviour.
  • the QuotientManifold type, since it was not really used and its proper definition would require functionality from LieGroups.jl
  • all functions related to the GroupManifolds type and corresponding traits using the old trait system have been removed here after being deprecated for a while now. These have been redesigned and introduced in the new package LieGroups.jl, see their How to transition from GroupManifolds tutorial for all details.
  • all deprecated tangent vector types that had TVector in their name
    • instead of HyperboloidTVectoruseHyperboloidTangentVector
    • instead of OrthogonalTVector useOrthogonalTangentVector
    • instead of PoincareBallTVector use PoincareBallTangentVector
    • instead of PoincareHalfSpaceTVector use PoincareHalfSpaceTangentVector
    • instead of ProjectorTVector use ProjectorTangentVector
    • instead of StiefelTVector use StiefelTangentVector
    • instead of TuckerTVector use TuckerTangentVector
    • instead of UMVTVector use UMVTangentVector
  • The QuotientManifold type has been removed, the API for general (implicit) quotient manifolds is now already in ManifoldsBase.jl.
  • The retract_exp_ode! and retract_exp_ode_fused! functions were removed. The cases in which they were correct are covered by solve_chart_exp_ode, and it was too easy to use retract_exp_ode! incorrectly.

0.10.23 (2025-07-19)

Fixed

  • fix a small bug in the point checks of general unitary matrices.

0.10.22 (2025-06-25)

Fixed

  • Support for ForwardDiff.jl v1

0.10.21 (2025-06-24)

Added

  • Support for ForwardDiff.jl v1

0.10.20 (2025-06-16)

Fixed

  • Fix in-place computation of exp! for GeneralLinear.

0.10.19 (2025-06-14)

Added

  • riemannian_gradient for the GeneralLinear manifold
  • riemannian_gradient method for ProductManifold.

Fixed

  • Fix the projection and embedding of tangent vectors on GeneralLinear.

0.10.18 (2025-05-29)

Fixed

  • Fix the supertype of PoincareBallTangentVector to be AbstractTangentVector
  • Fix the supertype of StiefelTangentVector to be AbstractTangentVector
  • Fix riemannian_gradient for fixed rank matrices, which did not work due to a small bug in the default fallback and a missing metric specification.

0.10.17 (2025-04-21)

Changed

Note that while it is currently not so easy to use Manifolds.jl and LieGroups.jl together due to the common definitions that are here now deprecated, it might still take a reasonable time to do a breaking release here, since we do not have a very good reason to yet.

0.10.16 (2025-04-08)

Changed

  • Added all [compat] entries also for the docs/ and tutorials/ environments
  • get_vector on Circle no longer returns SArray when no static arrays are passed as arguments.

Fixed

  • a copy paste error in the new determinant one manifold from the last release.

0.10.15 (2025-03-28)

Added

  • a DeterminantOneMatrices manifold of matrices of determinant one.

Changed

  • the following internal types were renamed since their super type also uses the singular
    • AbsoluteDeterminantOneMatrices to AbsoluteDeterminantOneMatrixType
    • DeterminantOneMatrices to DeterminantOneMatrixType

Fixed

  • fix rand! to also work on the Circle(ℂ)

0.10.14 (2025-02-18)

Changed

  • Introduced new implementation of parallel transport on Rotations(3) based on Rodrigues' rotation

formula.

0.10.13 (2025-02-10)

Changed

  • Bumped dependency of ManifoldsBase.jl to 1.0, split exp into exp (without optional argument t) and exp_fused (with argument t) and similarly retract to retract and retract_fused.
  • ManifoldsBase.jl 1.0 also moved from TVector to TangentVectors in type names. The following names are adapted
    • Renamed HyperboloidTVector (now deprecated) to HyperboloidTangentVector
    • Renamed OrthogonalTVector (now deprecated) to OrthogonalTangentVector
    • Renamed PoincareBallTVector (now deprecated) to PoincareBallTangentVector
    • Renamed PoincareHalfSpaceTVector (now deprecated) to PoincareHalfSpaceTangentVector
    • Renamed ProjectorTVector (now deprecated) to ProjectorTangentVector
    • Renamed StiefelTVector (now deprecated) to StiefelTangentVector
    • Renamed TuckerTVector (now deprecated) to TuckerTangentVector
    • Renamed UMVTVector (now deprecated) to UMVTangentVector
  • The internal access array_value is now called internal_value, compare to its renaming in ManifoldsBase

0.10.12 (2025-01-10)

Added

  • Orthonormal bases for CholeskySpace and LogCholesky metric for SymmetricPositiveDefinite.
  • rand for CholeskySpace.

Changed

  • Improved performance of selected get_vector and get_coordinates methods for complex Euclidean manifold.

0.10.11 (2025-01-02)

Added

  • Bases and rand for HeisenbergMatrices and InvertibleMatrices.

0.10.10 (2024-12-20)

Added

  • the Segre manifold
  • the WarpedMetric for the Segremanifold

0.10.9 (2024-12-16)

Added

  • the Segre manifold
  • the WarpedMetric for the Segremanifold
  • The manifold HeisenbergMatrices as the underlying manifold of HeisenbergGroup.

Changed

  • about.md now also lists contributors of manifolds and a very short history of the package.

0.10.8 (2024-11-27)

Changed

  • Some methods related to get_vector for GeneralUnitaryMatrices now have AbstractVector upper bound for coefficients.
  • Minimum Julia version is now 1.10 (the LTS which replaced 1.6)
  • The dependency ManifoldDiff.jl has been upgraded from v0.3 to v0.4, to bring compatibility with DifferentiationInterface.jl.

0.10.7 (2024-11-16)

Added

  • adjoint_matrix for Lie groups, with optimized implementations for SO(2), SO(3), SE(2) and SE(3).

0.10.6 (2024-11-06)

Added

  • Two new actions: ComplexPlanarRotation, QuaternionRotation.
  • New function quaternion_rotation_matrix for converting quaternions to rotation matrices.
  • make.jl script now has more command line arguments, for example --exclude-tutorials when you do not want to build the tutorials but still look at the docs. See make.jl --help for more information.

0.10.5 (2024-10-24)

Added

  • the manifold InvertibleMatrices of invertible matrices

Changed

  • rewrote the CONTRIBUTING.md and adapt it to today's links and references.

0.10.4 (2024-10-20)

Added

  • uniform_distribution now has an error hint explaining what has to be done to make it work.
  • Euclidean now follows the new has_components function from ManifoldsBase.jl (0.15.18) and can handle also the r-norms now.
  • Union type MatrixGroup
  • Columnwise group action with arbitrary matrix groups
  • uniform_distribution now has an error hint explaining what has to be done to make it work.
  • lie_bracket is exactly zero on orthogonal Lie algebra in 2D

0.10.3 (2024-10-04)

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(ℝ) of Euclidean(3, field=ℂ) now has 6 vectors, and DefaultOrthonormalBasis(ℂ) of the same manifold has 3 basis vectors.

Fixed

  • Fixed solve_exp_ode only returning the starting position (#744)
  • Fixed documentation of solve_exp_ode function signature (#740)

0.10.2 (2024-09-24)

Added

  • GroupManifold can now be called with two arguments, the third one defaulting to LeftInvariantRepresentation.

Changed

  • fixes a few typographical errors.

0.10.1 (2024-08-29)

Changed

  • identity_element on ProductManifold without RecursiveArrayTools.jl now prints a useful error message.

0.10.0 (2024-08-24)

Changed

  • Distributions.jl, RecursiveArrayTools.jl and HybridArrays.jl were moved to weak dependencies to reduce load time and improve extensibility.
  • translate_diff, inv_diff and thus apply_diff_group, are available for all the groups with invariant tangent vector storage.
  • 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.
  • adjoint_action takes a direction argument; by default it is LeftAction.
  • adjoint_action! is the necessary method to implement in groups with left-invariant tangent vector representation.
  • Fixed a few typos in the doc string of the SPD fixed determinant description.
  • Random point on the MultinomialSymmetricPositiveDefinite manifold was improved to make it more robust.

Added

  • Introduced exp_inv and log_inv based on exp_lie and log_lie. They are invariant to the group operation.
  • A tutorial about usage of group-related functionality.

Removed

  • Deprecated bindings:
    • ExtrinsicEstimation() (should be replaced with ExtrinsicEstimation(EfficientEstimator())),
    • Symplectic (renamed to SymplecticMatrices),
    • SymplecticMatrix (renamed to SymplecticElement).
    • AbstractEstimationMethod (renamed to AbstractApproximationMethod).
    • VectorBundleVectorTransport (renamed to FiberBundleProductVectorTransport).
    • rand on SymplecticMatrices and SymplecticStiefel no longer accepts hamiltonian_norm as an alias for σ.
    • mean! and median! no longer accept extrinsic_method (should be replaced with e = ExtrinsicEstimation(extrinsic_method)).
  • 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.
    • ArrayPartition (RecursiveArrayTools.jl needs to be explicitly imported),
    • ProjectedPointDistribution (not exported),
    • normal_tvector_distribution (not exported),
    • projected_distribution (not exported),
    • uniform_distribution (not exported).
  • Ability to create non-real SymplecticStiefel and SymplecticGrassmann manifolds; essential functionality was missing so it was removed until a more developed version is developed.

0.9.20 (2024-06-17)

Added

  • implemented parallel transport on the Grassmann manifold with respect to Stiefel representation

Changed

  • since now all exp/log/parallel transport are available for all representations of Grassmann, these are now also set as defaults, since they are more exact.

0.9.19 (2024-06-12)

Changed

  • Updated Project.toml compatibility entries.
  • Updated CI for Julia 1.11-beta

Fixed

  • a few typos in the doc string of the SPD fixed determinant description
  • several other typographical errors throughout the documentation

0.9.18 (2024-05-07)

Added

  • added the injectivity radius for the Stiefel manifold with Euclidean metric

0.9.17 (2024-04-23)

Added

  • Hyperrectangle manifold with boundary.

0.9.16 (2024-04-01)

Changed

  • NonlinearSolve.jl and PythonCall.jl are no longer an upper bounded dependency (bugs were fixed).

0.9.15 (2024-03-24)

Added

  • using DocumenterInterLinks for links to other Julia packages documentation.
  • Implementation of sectional_curvature, sectional_curvature_min and sectional_curvature_max for several manifolds.
  • sectional_curvature_matrix function and a tutorial on coordinate-free curvature.

Changed

  • default_vector_transport_method for GeneralUnitaryMatrices other than Rotations was changed to ProjectionTransport.

Fixed

  • typographical errors in tutorials/working-in-charts.jl.
  • several typographical errors in the docs
  • unifies to use two backticks `` for math instead of $ further in the docs

0.9.14 (2024-01-31)

Added

  • rand on UnitaryMatrices
  • rand on arbitrary GroupManifolds and manifolds with IsGroupManifold trait generating points and elements from the Lie algebra, respectively

0.9.13 (2024-01-24)

Added

  • added the real symplectic Grassmann manifold SymplecticGrassmann
  • Introduce the manifold of HamiltonianMatrices and a wrapper for Hamiltonian matrices
  • introduce rand(:HamiltonianMatrices)
  • extend rand to also rand! for HamiltonianMatrices, SymplecticMatrices and SymplecticStiefel
  • implement riemannian_gradient conversion for SymplecticMatrices and SymplecticGrassmann
  • the new manifold of MultinomialSymmetricPositiveDefinite matrices
  • rand! for MultinomialDoublyStochastic and MultinomialSymmetric

Deprecated

  • Rename Symplectic to SimplecticMatrices in order to have a Symplectic wrapper for such matrices as well in the future for the next breaking change.
  • Rename SymplecticMatrix to SymplecticElement to clarify that it is the special matrix $J_{2n}$ and not an arbitrary symplectic matrix.

Fixed

  • a bug that cause project for tangent vectors to return wrong results on MultinomialDoublyStochastic

0.9.12 (2024-01-21)

Fixed

  • Fixed var on TranslationGroup.

0.9.11 (2023-12-27)

Fixed

  • Fixed mixed array index number in-place parallel_transport_to! on zero-index Euclidean, on Julia 1.6.

0.9.10 (2023-12-27)

Added

  • Compatibility with RecursiveArrayTools v3.

Fixed

  • Fixed mixed array index number in-place parallel_transport_to! on real Circle, on Julia 1.6.
  • Violations of MD004 lint rule in this file.

0.9.9 (2023-12-25)

Fixed

  • introduced a nonzero atol for all point and vector checks that compare to zero. This makes those checks a bit more relaxed by default and resolves #630.
  • default_estimation_method(M, f) is deprecated, use default_approximation_method(M, f) for your specific method f on the manifold M.
  • AbstractEstimationMethod is deprecated, use AbstractApproximationMethod instead.

0.9.8 (2023-11-17)

Fixed

  • Improved distribution of random vector generation for rotation matrices and complex circle.

0.9.7 (2023-11-14)

Fixed

0.9.6 (2023-11-09)

Fixed

0.9.5 (2023-11-08)

Changed

  • identity_element now returns a complex matrix for unitary group.
  • number_of_coordinates is now exported.

0.9.4 (2023-11-06)

Added

  • Functions inv_diff, inv_diff!, adjoint_inv_diff and adjoint_inv_diff! that correspond to differentials and pullbacks of group inversion.
  • Julia 1.10-rc CI workflow.

Changed

  • Documentation project files are marked as compatible with BoundaryValueDiffEq v5.

Fixed

  • Fixed issue with incorrect implementation of apply_diff_group in GroupOperationAction with left backward and right forward action #669.

0.9.3 (2023-10-28)

Added

  • Support for BoundaryValueDiffEq v5.

0.9.2 (2023-10-27)

Added

  • rand(G; vector_at=Identity(G)) now works for translation, special orthogonal and special Euclidean groups G (issue #665).
  • get_embedding now works for GeneralUnitaryMultiplicationGroup.
  • Github action that checks for NEWS.md changes.

0.9.1 (2023-10-25)

Added

  • a new retraction and its inverse for the fixed Rank Manifolds, the orthographic retraction.

0.9.0 (2023-10-24)

Added

  • Vector bundles are generalized to fiber bundles. Old BundleFibers functionality was reworked to better match mathematical abstractions. Fiber bundle functionality is experimental and minor changes may happen without a breaking release, with the exception of TangentBundle which is considered to be stable.
  • RotationTranslationAction is introduced.

Changed

  • Sizes of all manifolds can now be either encoded in type or stored in a field to avoid over-specialization. The default is set to store the size in type parameter (except for PowerManifold and its variants), replicating the previous behavior. For field storage, pass the parameter=:field keyword argument to manifold constructor. For example statically sized CenteredMatrices{m,n} is now CenteredMatrices{TypeParameter{Tuple{m,n}}}, whereas the type of special Euclidean group with field-stored size is CenteredMatrices{Tuple{Int,Int}}. Similar change applies to:

    • CenteredMatrices{m,n},
    • CholeskySpace{N},
    • Elliptope{N,K},
    • Euclidean,
    • FixedRankMatrices{m,n,k},
    • KendallsPreShapeSpace{n,k},
    • KendallsShapeSpace{n,k},
    • GeneralLinear{n},
    • GeneralUnitaryMultiplicationGroup{n},
    • GeneralizedGrassmann{n,k},
    • GeneralizedStiefel{n,k},
    • Grassmann{n,k},
    • Heisenberg{n},
    • Hyperbolic{n},
    • MultinomialMatrices{N,M},
    • MultinomialDoublyStochastic{n},
    • MultinomialSymmetric{n},
    • Orthogonal{n},
    • PowerManifold,
    • PositiveArrays,
    • PositiveMatrices,
    • PositiveNumbers,
    • ProbabilitySimplex{n},
    • SPDFixedDeterminant{n},
    • SpecialLinear{n},
    • SpecialOrthogonal{n},
    • SpecialUnitary{n},
    • SpecialEuclidean{n},
    • SpecialEuclideanManifold{n},
    • Spectrahedron{n,k},
    • SphereSymmetricMatrices{N},
    • Stiefel{n,k},
    • SymmetricMatrices{N},
    • SymmetricPositiveDefinite{n},
    • SymmetricPositiveSemidefiniteFixedRank{n,k},
    • Symplectic{n},
    • SymplecticStiefel{n,k},
    • TranslationGroup,
    • Tucker.

    For example

    function Base.show(io::IO, ::CenteredMatrices{m, n}) where {m, n}
        return print(io, "CenteredMatrices($m, $n)")
    end

    needs to be replaced with

    function Base.show(io::IO, ::CenteredMatrices{TypeParameter{Tuple{m, n}}}) where {m, n}
        return print(io, "CenteredMatrices($m, $n)")
    end

    for statically-sized groups and

    function Base.show(io::IO, M::CenteredMatrices{Tuple{Int, Int}})
        m, n = get_parameter(M.size)
        return print(io, "CenteredMatrices($m, $n; parameter=:field)")
    end

    for groups with size stored in field. Alternatively, you can use a single generic method like this:

    function Base.show(io::IO, M::CenteredMatrices{T}) where {T}
        m, n = get_parameter(M.size)
        if T <: TypeParameter
            return print(io, "CenteredMatrices($m, $n)")
        else
            return print(io, "CenteredMatrices($m, $n; parameter=:field)")
        end
    end
  • Argument order for type aliases RotationActionOnVector and RotationTranslationActionOnVector: most often dispatched on argument is now first.

  • A more consistent handling of action direction was introduced. 4-valued ActionDirection was split into 2-valued ActionDirection (either left or right action) and GroupActionSide (action acting from the left or right side). See https://github.com/JuliaManifolds/Manifolds.jl/issues/637 for a design discussion.

Removed

  • ProductRepr is removed; please use ArrayPartition instead.
  • Default methods throwing "not implemented" ErrorException for some group-related operations. Standard MethodError is now thrown instead.
  • LinearAffineMetric was deprecated in a previous release and the symbol is now removed. Please use AffineInvariantMetric instead.