- Support matrix-scalar multiplication/division without the
Scale
wrapper forf32
/f64
. - Implemented conjugate gradient, BiCGSTAB, and LSMR iterative solvers (currently gated by the
unstable
feature). - Implemented Hermitian matrix pseudoinverse implementation. Thanks @lishen_ for the contribution.
- Implemented column and row mean and variance in
faer::stats
. - Added more iterator and parallel iterator functions (
MatRef::[col|row]_partition
,MatRef::par_[col|row]_partition
, etc.). - Added
full
andzeros
constructors to owned Col, Row, and Matrix (issue-125). - Added
shape
function to return both the row and the column count of a matrix. - Added several missing associated functions from the mut and owning variants of matrices.
- Implemented
core::iter::{Sum, Product}
forc32
andc64
. - Sparse Cholesky can now be used with user-provided permutations.
- Simplified matrix constructors, adding a variant with a
_generic
prefix for the old behavior. - LDLT and Bunch-Kaufman decompositions now stores the diagonal blocks instead of their inverses. This helps avoid infinities and NaNs when dealing with singular matrices.
- Integrated
nano-gemm
as a backend for small matrix multiplication. - Significant performance improvements for small LLT and LDLT decompositions.
- Refactored the project so that
faer
contains all the core and decomposition implementations.faer-{core,cholesky,lu,qr,svd,evd,sparse}
are now deprecated and will no longer be updated. - Improved the multithreaded performance of the Eigenvalue decomposition for large matrices.
- Decomposition solve functions now accept column vectors as well as matrices.
- Implemented the L1 norm, and the squared L2 norm.
- Implemented conversions from sparse to dense matrices, by calling
mat.to_dense()
. - Sparse matrices now support duplicated entries. Note that
faer
will not add duplicated entries to a matrix unless the opposite is explicitly mentioned in the function documentation.faer
also will deduplicate entries when created withSparse{Col,Row}Mat::try_new_from_indices
and other similar functions. - Implemented conversions from unsorted to sorted sparse matrices by calling
mat.to_sorted()
(ormat.sort_indices()
for owned matrices). - Implemented
{Col,Row}::try_as_slice[_mut]
functions that return data as a slice if it is contiguous. - Implemented
.for_each_with_index
and.map_with_index
for the matrix zipping API, which passes the matrix row and column indices as well as the values. - Added
rand
support for randomly generating matrices in thefaer::stats
module, as well as forfaer::complex_native::{c32,c64}
. - Implemented a pseudoinverse helper for the high level SVD and thin SVD decompositions.
- Implemented sparse matrix arithmetic operators (other than sparse-sparse matrix multiplication), and added mutable sparse views as well as owning sparse matrix containers.
- Implemented
try_from_triplets
for sparse matrices. - Re-exported subcrates in
faer::modules
. - Improved performance of the SVD decomposition for small matrices.
- Implemented
col!
,row!
andconcat!
macros. Thanks @DeliciousHair for the contribution. - Implemented more
c32/c64
operations. Thanks @edyounis for the contribution. - Implemented the Kronecker product in
faer_core
. Thanks @edyounis for the contribution. - Implemented (de)serialization of
Mat
. Thanks @cramt for the contribution.
- Implemented the index operator for row and column structures. Thanks @DeliciousHair for the contribution.
- Exposed a few sparse matrix operations in the high level API.
- Implemented sparse LU and QR, and exposed sparse decompositions in the high level API.
- Better assertion error messages in no_std mode.
- Implemented initial API of
Row
/RowRef
/RowMut
andCol
/ColRef
/ColMut
structs for handling matrices with a single row or column. - Implemented
[Mat|Col|Row]::norm_l2
and[Mat|Col|Row]::norm_max
for computing the L2 norm of a matrix or its maximum absolute value. - Fixed several bugs in the eigenvalue decompositions. Special thanks to @AlexMath for tracking down the errors.
- Updated
zipped!
macro API, which now requires a matchingunzipped!
for matching the closure arguments. - Removed the limitation on the number of matrices that can be passed to
zipped!
. - Added a
zipped!(...).map(|unzipped!(...)| { ... })
API to allow mapping a zipped pack of matrices and returns the result as a matrix. - Updated
polars
dependency to 0.34. - Speed improvements for complex matrix multiplication on AMD cpus.
- New SIMD functions in the Entity trait for aligned loads and stores.
- Renamed multiple methods such as
MatMut::transpose
toMatMut::transpose_mut
.
- Implemented sparse data structures in
faer_core::sparse
. - Implemented sparse Cholesky decompositions, simplicial and supernodal. Only the low level API is currently exposed in
faer-sparse
. - Implemented dynamic regularization for the Bunch-Kaufman Cholesky decomposition.
- Implemented diagonal wrappers that can be used to interpret a matrix as a diagonal matrix, using
{MatRef,MatMut}::diagonal
and{MatRef,MatMut}::column_vector_as_diagonal
. - Implemented matrix multiplication syntax sugar for diagonal wrappers, and permutation matrices.
- Implemented
compute_thin_r
andcompute_thin_q
infaer::solvers::{Qr,ColPivQr}
. - Implemented initial SIMD support for aarch64.
- Implemented the Bunch-Kaufman Cholesky decomposition for hermitian indefinite matrices.
- Implemented dynamic regularization for the diagonal LDLT.
- Support conversions involving complex values using
IntoFaerComplex
,IntoNalgebraComplex
andIntoNdarrayComplex
. - Refactored the Entity trait for better ergonomics.
faer
scalar traits are now prefixed withfaer_
to avoid conflicts with standard library and popular library traits.no_std
andno_rayon
are now supported, with the optional featuresstd
andrayon
(enabled by default).- Performance improvements in the eigenvalue decomposition and thin matrix multiplication.
- Implemented matrix chunked iterators and parallel chunked iterators.
- Renamed
{Mat,MatMut}::fill_with_zero
tofill_zeros
- Renamed
{Mat,MatMut}::fill_with_constant
tofill
- More ergonomic
polars
api. - Refactored Entity and ComplexField SIMD api.
- Switched from DynStack/GlobalMemBuffer to PodStack/GlobalPodBuffer.
- Fixed usize overflow bug in eigenvalue decomposition.
- High level api implemented in
faer
. - Renamed
Mat::with_dims
toMat::from_fn
. - Renamed
{Mat,MatMut}::set_zeros
tofill_with_zero
. - Renamed
{Mat,MatMut}::set_constant
tofill_with_constant
.
- Performance improvements for small matrices.
- Simpler SVD/EVD API for fixed precision floating point types.
- Simpler math operators (+, -, *). Thanks @geo-ant and @DJDuque.
- More robust pivoted decompositions for rank deficient matrices.
- Better overflow/underflow handling in matrix decompositions, as well as non finite inputs.
- Provide control over global parallelism settings in
faer-core
. - Various bug fixes for complex number handling.
- Implement the non Hermitian eigenvalue decomposition.
- Improve performance of matrix multiplication.
- Improve performance of LU decomposition with partial pivoting.
- Refactor the core traits for better SIMD support for non native types, using a structure-of-arrays layout.
- Implement the Hermitian eigenvalue decomposition.
- Add
to_owned
function for converting aMatRef/MatMut
to aMat
. Thanks @Tastaturtaste - Allow comparison of conjugated matrices
- Performance improvements for
f32
,c32
, andc64
- Performance improvements for small/medium matrix decompositions
- Refactor the
ComplexField
trait to allow for nonCopy
types. Note that types other thanf32
,f64
,c32
,c64
are not yet supported.
- Start keeping track of changes.
- Complex SVD support.
- Improve performance for thin SVD.
- Fixed an edge case in complex Householder computation where the input vector is all zeros.