Skip to content

Commit ba025f1

Browse files
authored
Release v0.35.0 (#1602)
* feat: add conversion from/to glam 0.33 * chore: bump rand 0.10 and itertools 0.14 * chore: bump simba to 0.10 * Release v0.35.0 * chore: cargo fmt * Bump MSRV to 1.89 * fix benches compilation
1 parent f122fb6 commit ba025f1

30 files changed

Lines changed: 103 additions & 56 deletions

.github/workflows/nalgebra-ci-build.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ jobs:
6060
- name: Select rustc version
6161
uses: actions-rs/toolchain@v1
6262
with:
63-
toolchain: 1.87.0
63+
toolchain: 1.89.0
6464
override: true
6565
- uses: actions/checkout@v4
6666
- name: check
@@ -77,7 +77,7 @@ jobs:
7777
- name: Select rustc version
7878
uses: actions-rs/toolchain@v1
7979
with:
80-
toolchain: 1.87.0
80+
toolchain: 1.89.0
8181
override: true
8282
- uses: actions/checkout@v4
8383
- name: test

CHANGELOG.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,27 @@ This project adheres to [Semantic Versioning](https://semver.org/).
88
**nalgebra-lapack change log** is found [here](https://github.com/dimforge/nalgebra/blob/main/nalgebra-lapack/CHANGELOG.md)
99
starting with `nalgebra-lapack` version `0.27.0`.
1010

11+
## [0.35.0] (24 May 2026)
12+
13+
### Added
14+
15+
- Add the Bunch–Kaufman LDL decomposition (`LBLT`) via the new `Matrix::lblt` method [#1591](https://github.com/dimforge/nalgebra/pull/1591).
16+
- Add `OneNorm` and the `Matrix::one_norm` method computing the induced matrix 1-norm (maximum absolute column sum) [#1591](https://github.com/dimforge/nalgebra/pull/1591).
17+
- Add the `convert-glam033` feature to enable conversion from/to types from `glam` v0.33.
18+
19+
### Changed
20+
21+
- Bumped MSRV to 1.89.0.
22+
- Updated `simba` dependency to 0.10.
23+
- Updated `rand` dependency to 0.10 and `rand_distr` to 0.6.
24+
- Removed the `convert-glamXXX` features for all `glam` versions prior to 0.30 [#1598](https://github.com/dimforge/nalgebra/pull/1598).
25+
- Clarified norm documentation: `EuclideanNorm` is the Frobenius norm for matrices, `LpNorm`/`UniformNorm` are entrywise, not induced matrix norms [#1591](https://github.com/dimforge/nalgebra/pull/1591).
26+
- `nalgebra-lapack`: updated `thiserror` to 2.0.
27+
28+
### Fixed
29+
30+
- Fix the `T: Sync` bound on `impl Send for ViewStorage` so view storages can be sent across threads when `T: Send` [#1581](https://github.com/dimforge/nalgebra/pull/1581).
31+
1132
## [0.34.2] (28 March 2026)
1233

1334
### Added

Cargo.toml

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "nalgebra"
3-
version = "0.34.2"
3+
version = "0.35.0"
44
authors = ["Sébastien Crozet <developer@crozet.re>"]
55

66
description = "General-purpose linear algebra library with transformations and statically-sized or dynamically-sized matrices."
@@ -12,7 +12,7 @@ categories = ["science", "mathematics", "wasm", "no-std"]
1212
keywords = ["linear", "algebra", "matrix", "vector", "math"]
1313
license = "Apache-2.0"
1414
edition = "2024"
15-
rust-version = "1.87.0"
15+
rust-version = "1.89.0"
1616
exclude = ["/ci/*", "/.travis.yml", "/Makefile"]
1717

1818
[badges]
@@ -34,6 +34,7 @@ std = [
3434
"glam030?/std",
3535
"glam031?/std",
3636
"glam032?/std",
37+
"glam033?/std",
3738
]
3839
sparse = []
3940
debug = ["approx/num-complex", "rand"]
@@ -45,6 +46,7 @@ libm = [
4546
"glam030?/libm",
4647
"glam031?/libm",
4748
"glam032?/libm",
49+
"glam033?/libm",
4850
]
4951
libm-force = ["simba/libm_force"]
5052
macros = ["nalgebra-macros"]
@@ -55,6 +57,7 @@ convert-bytemuck = ["bytemuck", "num-complex/bytemuck"]
5557
convert-glam030 = ["glam030"]
5658
convert-glam031 = ["glam031"]
5759
convert-glam032 = ["glam032"]
60+
convert-glam033 = ["glam033"]
5861

5962
# Serialization
6063
## To use serde in a #[no-std] environment, enable the
@@ -81,14 +84,14 @@ rkyv-safe-deser = ["rkyv-serialize", "rkyv/validation"]
8184
[dependencies]
8285
nalgebra-macros = { version = "0.3.0", path = "nalgebra-macros", optional = true }
8386
typenum = "1.12"
84-
rand-package = { package = "rand", version = "0.9", optional = true, default-features = false }
87+
rand-package = { package = "rand", version = "0.10", optional = true, default-features = false }
8588
num-traits = { version = "0.2", default-features = false }
8689
num-complex = { version = "0.4", default-features = false }
8790
num-rational = { version = "0.4", default-features = false }
8891
approx = { version = "0.5", default-features = false }
89-
simba = { version = "0.9", default-features = false }
92+
simba = { version = "0.10", default-features = false }
9093
alga = { version = "0.9", default-features = false, optional = true }
91-
rand_distr = { version = "0.5", default-features = false, optional = true }
94+
rand_distr = { version = "0.6", default-features = false, optional = true }
9295
matrixmultiply = { version = "0.3", optional = true }
9396
serde = { version = "1.0", default-features = false, features = ["derive"], optional = true }
9497
# TODO: once rkyv is updated to 0.8, we could consider removing the `allow(unsafe_op_in_unsafe_fn)`.
@@ -103,20 +106,20 @@ proptest = { version = "1", optional = true, default-features = false, features
103106
glam030 = { package = "glam", version = "0.30", optional = true, default-features = false }
104107
glam031 = { package = "glam", version = "0.31", optional = true, default-features = false }
105108
glam032 = { package = "glam", version = "0.32", optional = true, default-features = false }
109+
glam033 = { package = "glam", version = "0.33", optional = true, default-features = false, features = ["f64", "i32", "u32"] }
106110
rayon = { version = "1.6", optional = true }
107111
defmt = { version = "1.0.1", optional = true }
108112
encase = { version = "0.12", optional = true }
109113

110114
[dev-dependencies]
111115
serde_json = "1.0"
112-
rand_xorshift = "0.4"
113-
rand_isaac = "0.4"
116+
rand_xorshift = "0.5"
114117
criterion = { version = "0.7", features = ["html_reports"] }
115118
nalgebra = { path = ".", features = ["debug", "compare", "rand", "macros"] }
116119

117120
# For matrix comparison macro
118121
matrixcompare = "0.3.0"
119-
itertools = "0.13"
122+
itertools = "0.14"
120123

121124
# For macro testing
122125
trybuild = "1.0.90"

benches/common/macros.rs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@ macro_rules! bench_binop(
99
($name: ident, $t1: ty, $t2: ty, $binop: ident) => {
1010
fn $name(bh: &mut criterion::Criterion) {
1111
use rand::SeedableRng;
12+
use rand::RngExt;
1213

13-
let mut rng = IsaacRng::seed_from_u64(0);
14+
let mut rng = XorShiftRng::seed_from_u64(0);
1415

1516
bh.bench_function(stringify!($name), |bh| bh.iter_batched(
1617
|| (rng.random::<$t1>(), rng.random::<$t2>()),
@@ -27,8 +28,9 @@ macro_rules! bench_binop_ref(
2728
($name: ident, $t1: ty, $t2: ty, $binop: ident) => {
2829
fn $name(bh: &mut criterion::Criterion) {
2930
use rand::SeedableRng;
31+
use rand::RngExt;
3032

31-
let mut rng = IsaacRng::seed_from_u64(0);
33+
let mut rng = XorShiftRng::seed_from_u64(0);
3234

3335
bh.bench_function(stringify!($name), |bh| bh.iter_batched_ref(
3436
|| (rng.random::<$t1>(), rng.random::<$t2>()),
@@ -50,9 +52,10 @@ macro_rules! bench_binop_single_1st(
5052
($name: ident, $t1: ty, $t2: ty, $binop: ident) => {
5153
fn $name(bh: &mut criterion::Criterion) {
5254
use rand::SeedableRng;
55+
use rand::RngExt;
5356
use std::hint::black_box;
5457

55-
let mut rng = IsaacRng::seed_from_u64(0);
58+
let mut rng = XorShiftRng::seed_from_u64(0);
5659

5760
let first = black_box(rng.random::<$t1>());
5861

@@ -71,9 +74,10 @@ macro_rules! bench_binop_single_1st_ref(
7174
($name: ident, $t1: ty, $t2: ty, $binop: ident) => {
7275
fn $name(bh: &mut criterion::Criterion) {
7376
use rand::SeedableRng;
77+
use rand::RngExt;
7478
use std::hint::black_box;
7579

76-
let mut rng = IsaacRng::seed_from_u64(0);
80+
let mut rng = XorShiftRng::seed_from_u64(0);
7781

7882
let first = black_box(rng.random::<$t1>());
7983

@@ -92,8 +96,9 @@ macro_rules! bench_unop(
9296
($name: ident, $t: ty, $unop: ident) => {
9397
fn $name(bh: &mut criterion::Criterion) {
9498
use rand::SeedableRng;
99+
use rand::RngExt;
95100

96-
let mut rng = IsaacRng::seed_from_u64(0);
101+
let mut rng = XorShiftRng::seed_from_u64(0);
97102

98103
bh.bench_function(stringify!($name), |bh| bh.iter_batched_ref(
99104
|| rng.random::<$t>(),

benches/core/matrix.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use na::{DMatrix, DVector, Matrix2, Matrix3, Matrix4, OMatrix, U10, Vector2, Vector3, Vector4};
2-
use rand::Rng;
3-
use rand_isaac::IsaacRng;
2+
use rand_xorshift::XorShiftRng;
43
use std::hint::black_box;
54
use std::ops::{Add, Div, Mul, Sub};
65

benches/core/vector.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use na::{DVector, SVector, Vector2, Vector3, Vector4};
2-
use rand::Rng;
3-
use rand_isaac::IsaacRng;
2+
use rand::RngExt;
3+
use rand_xorshift::XorShiftRng;
44

55
use std::ops::{Add, Div, Mul, Sub};
66

@@ -51,7 +51,7 @@ bench_binop_ref!(vec10000_dot_f32, SVector<f32, 10000>, SVector<f32, 10000>, dot
5151
fn vec10000_axpy_f64(bh: &mut criterion::Criterion) {
5252
use rand::SeedableRng;
5353

54-
let mut rng = IsaacRng::seed_from_u64(0);
54+
let mut rng = XorShiftRng::seed_from_u64(0);
5555

5656
bh.bench_function("vec10000_axpy_f64", |bh| {
5757
bh.iter_batched(
@@ -74,7 +74,7 @@ fn vec10000_axpy_f64(bh: &mut criterion::Criterion) {
7474
fn vec10000_axpy_beta_f64(bh: &mut criterion::Criterion) {
7575
use rand::SeedableRng;
7676

77-
let mut rng = IsaacRng::seed_from_u64(0);
77+
let mut rng = XorShiftRng::seed_from_u64(0);
7878

7979
bh.bench_function("vec10000_axpy_beta_f64", |bh| {
8080
bh.iter_batched(
@@ -98,7 +98,7 @@ fn vec10000_axpy_beta_f64(bh: &mut criterion::Criterion) {
9898
fn vec10000_axpy_f64_slice(bh: &mut criterion::Criterion) {
9999
use rand::SeedableRng;
100100

101-
let mut rng = IsaacRng::seed_from_u64(0);
101+
let mut rng = XorShiftRng::seed_from_u64(0);
102102

103103
bh.bench_function("vec10000_axpy_f64_slice", |bh| {
104104
bh.iter_batched(
@@ -123,7 +123,7 @@ fn vec10000_axpy_f64_slice(bh: &mut criterion::Criterion) {
123123
fn vec10000_axpy_f64_static(bh: &mut criterion::Criterion) {
124124
use rand::SeedableRng;
125125

126-
let mut rng = IsaacRng::seed_from_u64(0);
126+
let mut rng = XorShiftRng::seed_from_u64(0);
127127

128128
// NOTE: for some reasons, it is much faster if the argument are boxed (Box::new(OVector...)).
129129
bh.bench_function("vec10000_axpy_f64_static", |bh| {
@@ -147,7 +147,7 @@ fn vec10000_axpy_f64_static(bh: &mut criterion::Criterion) {
147147
fn vec10000_axpy_f32(bh: &mut criterion::Criterion) {
148148
use rand::SeedableRng;
149149

150-
let mut rng = IsaacRng::seed_from_u64(0);
150+
let mut rng = XorShiftRng::seed_from_u64(0);
151151

152152
bh.bench_function("vec10000_axpy_f32", |bh| {
153153
bh.iter_batched(
@@ -170,7 +170,7 @@ fn vec10000_axpy_f32(bh: &mut criterion::Criterion) {
170170
fn vec10000_axpy_beta_f32(bh: &mut criterion::Criterion) {
171171
use rand::SeedableRng;
172172

173-
let mut rng = IsaacRng::seed_from_u64(0);
173+
let mut rng = XorShiftRng::seed_from_u64(0);
174174

175175
bh.bench_function("vec10000_axpy_beta_f32", |bh| {
176176
bh.iter_batched(

benches/geometry/quaternion.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use na::{Quaternion, UnitQuaternion, Vector3};
2-
use rand::Rng;
3-
use rand_isaac::IsaacRng;
2+
use rand_xorshift::XorShiftRng;
43
use std::ops::{Add, Div, Mul, Sub};
54

65
#[path = "../common/macros.rs"]

benches/lib.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ extern crate rand_package as rand;
77
extern crate criterion;
88

99
use na::{DMatrix, SMatrix, Scalar};
10-
use rand::Rng;
10+
use rand::RngExt;
1111
use rand::distr::{Distribution, StandardUniform};
12-
use rand_isaac::IsaacRng;
12+
use rand_xorshift::XorShiftRng;
1313

1414
pub mod core;
1515
pub mod geometry;
@@ -22,14 +22,14 @@ where
2222
StandardUniform: Distribution<T>,
2323
{
2424
use rand::SeedableRng;
25-
let mut rng = IsaacRng::seed_from_u64(0);
25+
let mut rng = XorShiftRng::seed_from_u64(0);
2626
SMatrix::from_fn(|_, _| rng.random())
2727
}
2828

2929
#[allow(dead_code)]
3030
fn reproducible_dmatrix(nrows: usize, ncols: usize) -> DMatrix<f64> {
3131
use rand::SeedableRng;
32-
let mut rng = IsaacRng::seed_from_u64(0);
32+
let mut rng = XorShiftRng::seed_from_u64(0);
3333
DMatrix::<f64>::from_fn(nrows, ncols, |_, _| rng.random())
3434
}
3535

examples/cargo/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ version = "0.0.0"
44
authors = ["You"]
55

66
[dependencies]
7-
nalgebra = "0.34.0"
7+
nalgebra = "0.35.0"
88

99
[[bin]]
1010
name = "example"

nalgebra-glm/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,5 +29,5 @@ convert-bytemuck = ["nalgebra/bytemuck"]
2929
[dependencies]
3030
num-traits = { version = "0.2", default-features = false }
3131
approx = { version = "0.5", default-features = false }
32-
simba = { version = "0.9", default-features = false }
33-
nalgebra = { path = "..", version = "0.34", default-features = false }
32+
simba = { version = "0.10", default-features = false }
33+
nalgebra = { path = "..", version = "0.35", default-features = false }

0 commit comments

Comments
 (0)