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.

Guidelines for updating this changelog

When making changes to this project, please update the "Unreleased" section with your changes under the appropriate category:

  • Added for new features.
  • Changed for changes in existing functionality.
  • Deprecated for soon-to-be removed features.
  • Removed for now removed features.
  • Fixed for any bug fixes.
  • Performance for performance improvements.

When releasing a new version, move the "Unreleased" changes to a new version section with the release date.

Unreleased

Added

Changed

Deprecated

Removed

Fixed

Performance

0.6.12 - 2026-10-16

Added

Changed

  • The default SVD algorithm for ROCArray inputs (single matrices, 3D arrays and vectors of matrices) is QRIteration again, instead of Bisection (#308).
  • default_svd_algorithm for a vector of matrices now falls back to the default for its element type; for vectors of CuMatrix it uses Jacobi, the only algorithm CUSOLVER batches (#300).

Deprecated

Removed

Fixed

  • DiagonalAlgorithm no longer reports that it supports pointer or ragged batches with the rocSOLVER driver (#305).

Performance

  • Gauge fixing for svd_full, eig_full, eigh_full and gen_eig_full is now vectorized, so it no longer loops over columns and works efficiently on GPU arrays (#307).

0.6.11 - 2026-10-09

Added

Changed

Deprecated

Removed

Fixed

  • Bug in select_indices that lead to correctness errors for SVD pullbacks for some truncation schemes.

Performance

0.6.10 - 2026-10-08

Added

  • Batched SVD functions batched_svd_compact, batched_svd_full and batched_svd_vals (and their ! variants), accepting either a 3D array or a (possibly ragged) vector of matrices, with batched drivers for CUSOLVER and rocSOLVER (#275). Whether a driver accepts ragged batches is controlled by supports_ragged_batch, which is false by default (#297).
  • Forward-mode (pushforward) rules for the QR and LQ decompositions, through the Enzyme and Mooncake extensions.
  • Enzyme forward rule for truncate (#288).
  • MatrixAlgebraKit.CHECK_LIBRARY_CALLS[] = false disables the post-call info checks in the CUSOLVER and rocSOLVER drivers, which otherwise force device synchronization through an @allowscalar read (#270).
  • The Bisection SVD algorithm is now supported by the rocSOLVER driver, and by both LAPACK and rocSOLVER for svd_full (#281).

Changed

  • qr_compact!, qr_full!, lq_compact! and lq_full! now extract R (or L) before constructing Q, so that an inplace Q (supplying A itself as output for Q) can be combined with computing R (or L) and with positive = true (#267).
  • The CUSOLVER driver constructs Q with ungqr! instead of unmqr!, which is both faster and avoids the large workspace of ormqr, whose 32-bit size query fails altogether for large matrices (#267).

Deprecated

  • schur_vals and schur_vals! in favour of eig_vals and eig_vals!. LAPACK's gees balances without scaling, so the eigenvalues it returns are those of eig_vals(A; scale = false), which is considerably less accurate for badly scaled matrices and no faster. Note that eig_vals does not accept the expert keyword argument (#277).

Fixed

  • schur_full now supports Diagonal inputs through DiagonalAlgorithm (#276, #277).
  • LQ decompositions no longer gauge fix Q when positive = false and L is not computed (#267).
  • remove_svd_gauge_dependence! now handles rank-deficient SVDs correctly (#286).
  • The eig pushforward now keeps the eigenvector tangents consistent with the unit-norm normalization of V (#290).
  • Fixed overflow in the Sylvester iterations of eigh_trunc_pullback! (#282) and eig_trunc_pullback! (#294).
  • rocSOLVER's gesvdx returning no singular values when min(m, n) == 1 is now worked around (#284).
  • The svd_trunc, eig / eigh and LQ pullbacks now work on GPU arrays (#258, #271, #272, #273, #280).
  • The svd, eig and eigh pullbacks now instantiate their broadcasts, avoiding axes errors for some wrapped array types (#266).
  • Enzyme rules no longer store nothing in their caches (#256, #259).

Performance

  • svd_pullback! and eigh_pullback! now cost proportional to the number of cotangent columns supplied, rather than the full size of the decomposition (#292).
  • svd_trunc_pullback! sums only one Neumann series, and the truncated pullbacks share a doubling (accelerative Smith) iteration for their Sylvester equations (#287, #294).

0.6.9 - 2026-07-10

Added

  • Matrix exponential / exponential! function with selectable algorithms: MatrixFunctionViaLA (Padé via LinearAlgebra), MatrixFunctionViaEig / MatrixFunctionViaEigh (via eigendecomposition), and DiagonalAlgorithm for Diagonal inputs; supports the scaled exponential((τ, A)) form (#94, #251, #252, #253).
  • Native, LAPACK-free scaling-and-squaring Taylor algorithm MatrixFunctionViaTaylor, outperforming LinearAlgebra.jl and the default for dense matrices and the only path covering arbitrary-precision element types such as BigFloat (#243).
  • Forward-mode (pushforward) automatic-differentiation rules for the polar, eig / eigh, and SVD decompositions and the projection / orth–null functions, available through the Enzyme and Mooncake extensions (#242, #244, #245, #246, #247).

0.6.8 - 2026-05-20

Added

  • Add a MatrixAlgebraKit logo (#230).

Changed

  • Extended AD test coverage to CUDA arrays for the polar decomposition (#237) and the Mooncake projection rules (#240).

Fixed

  • Pullbacks of eig_trunc, eigh_trunc, and svd_trunc no longer error when the truncation strategy keeps no values; svd_pullback! also handles the zero-rank case where every singular value falls below rank_atol (#233).
  • svd_pullback! is now GPU-compatible (#232).
  • LQ pullback no longer modifies input cotangents (#226).
  • eigh pullback now works on CUDA arrays (#235).
  • eig pullback now works on CUDA arrays (#236).
  • Corrected the Enzyme rule's check for when the cached output argument must be copied (#239).

Performance

  • Improved svd gauge-fixing performance (#238).

0.6.7 - 2026-05-06

Changed

  • Test infrastructure: use a test setup matrix like TensorKit (#215).

Fixed

  • Improved consistency of gauge fixing in eigenvalue pullback functions (#221).
  • Ensure no sharing of data in LQ decomposition output (#219).
  • Mooncake and Enzyme AD rules for Diagonal inputs (#179).

Performance

  • Added a rudimentary precompile workload to reduce time-to-first-execution (#217).

0.6.6 - 2026-04-24

Added

  • Add equality comparison (==) for TruncationStrategy types (#211).

Changed

  • Reorganized pullback implementations and fixed pullback correctness for rank-degenerate SVD cases (#208).
  • Centralized QR/LQ gauge-fixing logic (#203).
  • Bumped CUDA compat to v6, dropping support for older versions (#209).
  • Replaced CompatHelper with dependabot for dependency updates (#212).

0.6.5 - 2026-03-24

Added

  • Add AD (ChainRules/Mooncake/Enzyme) pullback rules for (anti-)hermitian projection (#174).
  • Add TruncationUnion to support combining multiple truncation schemes by supplying minimal ranks (#183).
  • Add SafeDivideAndConquer algorithm variant for more robust singular value decompositions (#185).
  • Add DefaultAlgorithm type for explicit dispatch to the default algorithm (#195).

Changed

  • The default behavior of SVD-based nullspaces now includes some small tolerance (#172).
  • The Mooncake rules for truncated decompositions with TruncatedAlgorithm now use the pullbacks that make use of the full decomposition. (#171)
  • Default algorithms now defined for SubArray and ReshapedArray (#182).
  • Separated Algorithm and Driver concepts for QR/LQ, SVD, and Schur/Eig decompositions (#178, #189, #194, #196).

Fixed

  • QR and LQ decompositions were supposed to default to positive = true (#170).

0.6.4 - 2026-01-29

Added

  • Tests for randomized SVD algorithms (#159).

Changed

  • Bumped Mooncake to v0.5 (#164).
  • Test infrastructure: migrated AD tests to TestSuite (#126).

Deprecated

Removed

Fixed

  • Mooncake AD rules now correctly set/reset in and outputs (#158).
  • Storage type is now retained in _ind_intersect for GPU arrays (#161).

0.6.3 - 2026-01-23

Added

  • Reverse-mode automatic differentiation rules for Enzyme (#86).
  • Native algorithm implementations for QR and LQ decompositions (#90).
  • Pullbacks for Diagonal input matrices in eigenvalue and singular value decompositions (#156).

Changed

  • Test infrastructure: migrated to ParallelTestRunner for improved test execution (#155).

Deprecated

Removed

Fixed

  • Eigenvalue decompositions of diagonal inputs are sorted and have the same type as non-diagonal inputs (#151).
  • Consistent checksquare usage across codebase (#154).
  • Typos in error messages (#153).

0.6.2 - 2026-01-08

Added

Changed

  • Improved test infrastructure: migrated additional tests to the common TestSuite and added GPU/truncated-methods tests for SVD and related functionality (#137, #142, #146, #128).
  • Eigenvalue decompositions of diagonal inputs have the same sorting as non-diagonal inputs (#143

Deprecated

Removed

Fixed

  • Polar decompositions return exact hermitian factors (#143).
  • Fixed a small typo in TruncationByValue and related docstrings (#136).
  • YALAPACK fixes and test adjustments (#135).
  • Various truncation schemes are now supported on the GPU.

0.6.1 - 2025-12-28

Added

  • Support for null-space computation via Householder QR in the GenericLinearAlgebra extension (#132).
  • New truncated-eigensolver variants: eig_trunc_no_error and eigh_trunc_no_error (#117).
  • New truncated-singular value variant: svd_trunc_no_error to improve GPU synchronization and AD support (#116).
  • AD: ChainRules support for svd_vals, eig_vals, eigh_vals, and diagonal (#107).

Changed

  • Improved GPU compatibility for some wrapper arrays (#100).
  • Test infrastructure migrated to a common TestSuite to reduce duplication (#119, #130, #131, #127, #125, #123, #124).

Deprecated

Removed

Fixed

  • ishermitian now correctly handles all-zero matrices (#121).

0.6.0 - 2025-11-14

Added

  • New project_isometric function for projecting matrices onto isometric manifold (#67)
  • New PolarNewton algorithm for polar decomposition (#67)
  • New matrix property functions: ishermitian, isantihermitian, hermitianpart!, hermitianpart, antihermitianpart!, and antihermitianpart (#64)
  • Support for BigFloat via new GenericLinearAlgebra extension (#87)
  • Mooncake reverse-mode AD rules (#85)
  • GPU support for image and null space computations (#82)
  • GPU support for polar decomposition (#83)
  • GPU support for new projection operations (#81)
  • Output truncation error for truncated decompositions (#75)
  • Documentation for truncated decomposition keyword arguments (#71)
  • Default algorithm implementations for GPU wrapper array types (#49)

Changed

  • Made gaugefix! optional (#95)
  • Renamed isisometry to isisometric for consistency with project_isometric (#73)
  • Refactored left_orth, right_orth, left_null and right_null interface (#79)
  • Improved GPU support for SVD operations (#80)
  • Loosened strictness on hermitian checks (#78)
  • Updated pullback tolerances (#92)

Removed

Fixed