# HG changeset patch # User Tuomo Valkonen # Date 1757049368 18000 # Node ID 21e51de02ab61cfb9cbbe8be1bff421c93ad2a0c # Parent ef02a80bf4bc8e423b9ecdc7df04b0f955b2dc7c strides alt diff -r ef02a80bf4bc -r 21e51de02ab6 src/euclidean/wrap.rs --- a/src/euclidean/wrap.rs Wed Sep 03 22:05:33 2025 -0500 +++ b/src/euclidean/wrap.rs Fri Sep 05 00:16:08 2025 -0500 @@ -124,6 +124,7 @@ // $crate::wrap!(imp<> do $type); // }; ($F:ty; $type:ty where $($qual:tt)*) => { + $crate::wrap!(impl_unary $type, std::ops::Neg, neg where $($qual)*); $crate::wrap!(impl_binary $type, std::ops::Add, add where $($qual)*); $crate::wrap!(impl_binary $type, std::ops::Sub, sub where $($qual)*); @@ -140,14 +141,14 @@ impl<$($qual)*> $crate::norms::Norm<$crate::norms::L2, $F> for $type { fn norm(&self, p : $crate::norms::L2) -> $F { - self.get_view().norm(p) + $crate::norms::Norm::norm(&self.get_view(), p) } } impl<$($qual)*> $crate::norms::Dist<$crate::norms::L2, $F> for $type { fn dist>(&self, other : I, p : $crate::norms::L2) -> $F { - other.eval_decompose(|x| self.get_view().dist(p, x)) + other.eval_ref(|x| self.get_view().dist(x, p)) } } @@ -163,7 +164,7 @@ type DualSpace = Self; fn dual_origin(&self) -> Self { - self.similar_origin(self) + $crate::linops::VectorSpace::similar_origin(self) } } @@ -231,7 +232,7 @@ fn copy_from>(&mut self, x: I) { x.eval_decompose(|v| { - self.get_view_mut().copy_from(v.get_view()) + self.get_view_mut().copy_from(&v.get_view()) }) } @@ -248,7 +249,7 @@ } impl<$($qual)*> $crate::instance::Space for $type { - type Decomp = <::Unwrapped as $crate::instance::Space>::Decomp; + type Decomp = $crate::instance::BasicDecomposition; type Principal = Self; } }; 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 {