diff -r ef02a80bf4bc -r 21e51de02ab6 src/nalgebra_support.rs --- a/src/nalgebra_support.rs Wed Sep 03 22:05:33 2025 -0500 +++ b/src/nalgebra_support.rs Fri Sep 05 00:16:08 2025 -0500 @@ -17,9 +17,9 @@ use nalgebra::base::constraint::{DimEq, SameNumberOfColumns, SameNumberOfRows, ShapeConstraint}; use nalgebra::base::dimension::*; use nalgebra::{ - ClosedAddAssign, ClosedMulAssign, DefaultAllocator, Dim, LpNorm, Matrix, MatrixView, OMatrix, - OVector, RawStorage, RealField, Scalar, SimdComplexField, Storage, StorageMut, UniformNorm, - Vector, U1, + ArrayStorage, ClosedAddAssign, ClosedMulAssign, DefaultAllocator, Dim, LpNorm, Matrix, + MatrixView, OMatrix, OVector, RawStorage, RealField, Scalar, SimdComplexField, Storage, + StorageMut, UniformNorm, VecStorage, Vector, ViewStorage, ViewStorageMut, U1, }; use num_traits::identities::{One, Zero}; use std::ops::Mul; @@ -60,10 +60,7 @@ } trait StridesOk>::Buffer>: - DimEq - + DimEq - + DimEq>::Buffer as RawStorage>::RStride> - + DimEq>::Buffer as RawStorage>::CStride> + DimEq + DimEq where S: RawStorage, E: Scalar, @@ -73,25 +70,47 @@ { } -impl StridesOk for ShapeConstraint +impl StridesOk> for ShapeConstraint where - ShapeConstraint: DimEq - + DimEq - + DimEq< - Dyn, - <>::Buffer as RawStorage>::RStride, - > + DimEq< - Dyn, - <>::Buffer as RawStorage>::CStride, - >, - S: Storage, + M: Dim, E: Scalar, - N: Dim, - M: Dim, - DefaultAllocator: Allocator, + DefaultAllocator: Allocator, +{ +} + +impl StridesOk, Const, ArrayStorage> + for ShapeConstraint +where + E: Scalar, { } +macro_rules! strides_ok { + ($R:ty, $C:ty where $($qual:tt)*) => { + impl<'a, E, N, M, $($qual)*> StridesOk> for ShapeConstraint + where + N: Dim, + M: Dim, + E: Scalar, + DefaultAllocator: Allocator, + { + } + impl<'a, E, N, M, $($qual)*> StridesOk> for ShapeConstraint + where + N: Dim, + M: Dim, + E: Scalar, + DefaultAllocator: Allocator, + { + } + }; +} + +strides_ok!(Dyn, Dyn where ); +strides_ok!(Dyn, Const where const C : usize); +strides_ok!(Const, Dyn where const R : usize); +strides_ok!(Const, Const where const R : usize, const C : usize); + impl Space for Matrix where SM: Storage, @@ -99,7 +118,7 @@ M: Dim, E: Scalar + Zero + One + Copy, DefaultAllocator: Allocator, - ShapeConstraint: StridesOk + StridesOk, + ShapeConstraint: StridesOk, { type Principal = OMatrix; type Decomp = MatrixDecomposition; @@ -115,7 +134,7 @@ K: Dim, E: Scalar + Zero + One + Copy, DefaultAllocator: Allocator, - ShapeConstraint: StridesOk + StridesOk, + ShapeConstraint: StridesOk, { type Decomposition<'b> = MyCow<'b, OMatrix> @@ -143,7 +162,7 @@ K: Dim, E: Scalar + Zero + One + Copy, DefaultAllocator: Allocator, - ShapeConstraint: StridesOk + StridesOk, + ShapeConstraint: StridesOk + StridesOk, { #[inline] fn eval_ref<'b, R>( @@ -188,7 +207,7 @@ K: Dim, E: Scalar + Zero + One + Copy, DefaultAllocator: Allocator, - ShapeConstraint: StridesOk + StridesOk, + ShapeConstraint: StridesOk + StridesOk, { fn eval_ref<'b, R>( &'b self, @@ -231,7 +250,7 @@ K: Dim, E: Scalar + Zero + One + Copy, DefaultAllocator: Allocator, - ShapeConstraint: StridesOk + StridesOk, + ShapeConstraint: StridesOk, { #[inline] fn eval_ref<'b, R>( @@ -275,7 +294,7 @@ K: Dim, E: Scalar + Zero + One + Copy + ClosedMulAssign + ClosedAddAssign, DefaultAllocator: Allocator + Allocator + Allocator, - ShapeConstraint: StridesOk + StridesOk + StridesOk, + ShapeConstraint: StridesOk + StridesOk, { type Codomain = OMatrix; @@ -293,7 +312,7 @@ K: Dim, E: Scalar + Zero + One + Copy + ClosedMulAssign + ClosedAddAssign, DefaultAllocator: Allocator + Allocator + Allocator, - ShapeConstraint: StridesOk + StridesOk + StridesOk, + ShapeConstraint: StridesOk + StridesOk, { } @@ -306,7 +325,7 @@ K: Dim, E: Scalar + Zero + One + Float, DefaultAllocator: Allocator + Allocator + Allocator, - ShapeConstraint: StridesOk + StridesOk + StridesOk, + ShapeConstraint: StridesOk + StridesOk, { #[inline] fn gemv>>( @@ -328,7 +347,7 @@ N: Dim, E: Scalar + Zero + One + Float, DefaultAllocator: Allocator, - ShapeConstraint: StridesOk, + ShapeConstraint: StridesOk, { type Field = E; type PrincipalV = OMatrix; @@ -348,7 +367,7 @@ N: Dim, E: Scalar + Zero + One + Float, DefaultAllocator: Allocator, - ShapeConstraint: StridesOk + StridesOk, + ShapeConstraint: StridesOk, { #[inline] fn axpy>>(&mut self, α: E, x: I, β: E) { @@ -393,7 +412,7 @@ M: Dim, E: Scalar + Zero + One + Float + RealField, DefaultAllocator: Allocator, - ShapeConstraint: StridesOk, + ShapeConstraint: StridesOk, { #[inline] fn proj_ball(self, ρ: E, exp: Linfinity) -> ::Principal { @@ -409,7 +428,7 @@ M: Dim, E: Scalar + Zero + One + Copy + Float + RealField, DefaultAllocator: Allocator, - ShapeConstraint: StridesOk, + ShapeConstraint: StridesOk, { #[inline] fn proj_ball_mut(&mut self, ρ: E, _: Linfinity) { @@ -426,8 +445,7 @@ K: Dim, E: Scalar + Zero + One + Copy + SimdComplexField, DefaultAllocator: Allocator + Allocator + Allocator + Allocator, - ShapeConstraint: - StridesOk + StridesOk + StridesOk + StridesOk, + ShapeConstraint: StridesOk + StridesOk, { type AdjointCodomain = OMatrix; type Adjoint<'a> @@ -471,7 +489,7 @@ S: Storage, E: Float + Scalar + Zero + One + RealField, DefaultAllocator: Allocator, - ShapeConstraint: StridesOk, + ShapeConstraint: StridesOk, { type PrincipalE = OMatrix; @@ -497,7 +515,7 @@ S: Storage, E: Float + Scalar + Zero + One + RealField, DefaultAllocator: Allocator, - ShapeConstraint: StridesOk, + ShapeConstraint: StridesOk, { #[inline] fn origin() -> OVector { @@ -513,7 +531,7 @@ S: Storage, E: Float + Scalar + Zero + One + RealField, DefaultAllocator: Allocator, - ShapeConstraint: StridesOk, + ShapeConstraint: StridesOk, { type NormExp = L2; @@ -535,7 +553,7 @@ S: Storage, E: Float + Scalar + Zero + One + RealField, DefaultAllocator: Allocator, - ShapeConstraint: StridesOk, + ShapeConstraint: StridesOk, { type DualSpace = OMatrix; @@ -551,7 +569,6 @@ S: Storage, E: Float + Scalar + Zero + One + RealField, DefaultAllocator: Allocator, - ShapeConstraint: StridesOk, { #[inline] fn norm(&self, _: L1) -> E { @@ -565,7 +582,7 @@ S: Storage, E: Float + Scalar + Zero + One + RealField, DefaultAllocator: Allocator, - ShapeConstraint: StridesOk, + ShapeConstraint: StridesOk, { #[inline] fn dist>(&self, other: I, _: L1) -> E { @@ -580,7 +597,6 @@ S: Storage, E: Float + Scalar + Zero + One + RealField, DefaultAllocator: Allocator, - ShapeConstraint: StridesOk, { #[inline] fn norm(&self, _: L2) -> E { @@ -595,7 +611,7 @@ S: Storage, E: Float + Scalar + Zero + One + RealField, DefaultAllocator: Allocator, - ShapeConstraint: StridesOk, + ShapeConstraint: StridesOk, { #[inline] fn dist>(&self, other: I, _: L2) -> E { @@ -610,7 +626,6 @@ S: Storage, E: Float + Scalar + Zero + One + RealField, DefaultAllocator: Allocator, - ShapeConstraint: StridesOk, { #[inline] fn norm(&self, _: Linfinity) -> E { @@ -625,7 +640,7 @@ S: Storage, E: Float + Scalar + Zero + One + RealField, DefaultAllocator: Allocator, - ShapeConstraint: StridesOk, + ShapeConstraint: StridesOk, { #[inline] fn dist>(&self, other: I, _: Linfinity) -> E {