From 183c3a8e7e3d71dc8bed37cf6356e94375babc3a Mon Sep 17 00:00:00 2001 From: Emily Matheys Date: Thu, 17 Sep 2026 15:37:04 +0300 Subject: [PATCH 1/2] refactor: Use ConstOne wherever possible --- .../mapping-algorithms/src/geo/haversine.rs | 12 +++++----- .../mapping-algorithms/src/lines/bresenham.rs | 22 +++++++++---------- .../mapping-algorithms/src/types/isometry.rs | 5 +++-- crates/mapping-algorithms/src/utils/mod.rs | 6 ++--- 4 files changed, 23 insertions(+), 22 deletions(-) diff --git a/crates/mapping-algorithms/src/geo/haversine.rs b/crates/mapping-algorithms/src/geo/haversine.rs index b4ae291..fa13929 100644 --- a/crates/mapping-algorithms/src/geo/haversine.rs +++ b/crates/mapping-algorithms/src/geo/haversine.rs @@ -22,14 +22,14 @@ */ use nalgebra::{Point2, RealField, Scalar}; -use num_traits::Float; +use num_traits::{ConstOne, Float}; #[inline] fn half_angle_sine_squared(input: T) -> T where - T: Float, + T: ConstOne + Float, { - (input.to_radians() / (T::one() + T::one())).sin().powi(2) + (input.to_radians() / (T::ONE + T::ONE)).sin().powi(2) } /// Calculates the Haversine distance between two points on a sphere using floating-point arithmetic. @@ -54,7 +54,7 @@ pub fn calculate_haversine_distance( sphere_radius: T, ) -> T where - T: Scalar + Float, + T: ConstOne + Scalar + Float, { let delta_lat = point_b.x - point_a.x; let delta_lon = point_b.y - point_a.y; @@ -65,10 +65,10 @@ where let basic_haversine = half_angle_sine_squared(delta_lat) + half_angle_sine_squared(delta_lon) * lat1_radians.cos() * lat2_radians.cos(); - let inverse_haversine = (T::one() + T::one()) + let inverse_haversine = (T::ONE + T::ONE) * basic_haversine .sqrt() - .atan2((T::one() - basic_haversine).sqrt()); + .atan2((T::ONE - basic_haversine).sqrt()); sphere_radius * inverse_haversine } diff --git a/crates/mapping-algorithms/src/lines/bresenham.rs b/crates/mapping-algorithms/src/lines/bresenham.rs index 7c4f365..8546f9c 100644 --- a/crates/mapping-algorithms/src/lines/bresenham.rs +++ b/crates/mapping-algorithms/src/lines/bresenham.rs @@ -22,7 +22,7 @@ */ use nalgebra::{ComplexField, Point, RealField, Scalar}; -use num_traits::AsPrimitive; +use num_traits::{AsPrimitive, ConstOne}; use crate::{FusedIterator, Vec, array, fmt, marker::PhantomData}; @@ -76,7 +76,7 @@ pub struct BresenhamLine { _output: PhantomData T>, } -impl, T, const N: usize> BresenhamLine +impl, T, const N: usize> BresenhamLine where usize: AsPrimitive, { @@ -115,9 +115,9 @@ where let steps: [F; N] = array::from_fn(|idx| { if end_point[idx] > start_point[idx] { - F::one() + F::ONE } else { - -F::one() + -F::ONE } }); @@ -147,14 +147,14 @@ where steps, errors: [F::zero(); N], primary_axis, - threshold: F::one() - (F::one() / >::as_(N + 1)), - remaining: >::as_(primary_delta + F::one()), + threshold: F::ONE - (F::ONE / >::as_(N + 1)), + remaining: >::as_(primary_delta + F::ONE), _output: PhantomData, }) } } -impl, T: Scalar + Copy, const N: usize> Iterator +impl, T: Scalar + Copy, const N: usize> Iterator for BresenhamLine { type Item = Point; @@ -176,7 +176,7 @@ impl, T: Scalar + Copy, const N: usize> Iterator self.errors[axis] += self.increments[axis]; if self.errors[axis] >= self.threshold { self.current[axis] += self.steps[axis]; - self.errors[axis] -= F::one(); + self.errors[axis] -= F::ONE; } } @@ -191,12 +191,12 @@ impl, T: Scalar + Copy, const N: usize> Iterator } } -impl, T: Scalar + Copy, const N: usize> ExactSizeIterator +impl, T: Scalar + Copy, const N: usize> ExactSizeIterator for BresenhamLine { } -impl, T: Scalar + Copy, const N: usize> FusedIterator +impl, T: Scalar + Copy, const N: usize> FusedIterator for BresenhamLine { } @@ -232,7 +232,7 @@ pub fn plot_bresenham_line( end_point: Point, ) -> Result>, BresenhamError> where - F: RealField + AsPrimitive + AsPrimitive, + F: ConstOne + RealField + AsPrimitive + AsPrimitive, usize: AsPrimitive, T: Scalar + Copy, { diff --git a/crates/mapping-algorithms/src/types/isometry.rs b/crates/mapping-algorithms/src/types/isometry.rs index bb72dc2..5101de8 100644 --- a/crates/mapping-algorithms/src/types/isometry.rs +++ b/crates/mapping-algorithms/src/types/isometry.rs @@ -24,6 +24,7 @@ use nalgebra::{ AbstractRotation, Isometry, Point, RealField, SMatrix, UnitComplex, UnitQuaternion, }; +use num_traits::ConstOne; use crate::{marker::PhantomData, utils::verify_rotation_matrix_determinant}; @@ -52,7 +53,7 @@ pub trait AbstractIsometry { impl AbstractIsometry for IsometryAbstractor where - T: Copy + RealField, + T: ConstOne + Copy + RealField, { type RotType = UnitComplex; @@ -77,7 +78,7 @@ where impl AbstractIsometry for IsometryAbstractor where - T: Copy + RealField, + T: ConstOne + Copy + RealField, { type RotType = UnitQuaternion; diff --git a/crates/mapping-algorithms/src/utils/mod.rs b/crates/mapping-algorithms/src/utils/mod.rs index 99df52d..25b8b3d 100644 --- a/crates/mapping-algorithms/src/utils/mod.rs +++ b/crates/mapping-algorithms/src/utils/mod.rs @@ -22,7 +22,7 @@ */ use nalgebra::{Const, DimMin, Point, RealField, SMatrix, Scalar}; -use num_traits::NumOps; +use num_traits::{ConstOne, NumOps}; #[cfg_attr( feature = "tracing", @@ -51,13 +51,13 @@ pub(crate) fn verify_rotation_matrix_determinant( v_t: SMatrix, ) -> SMatrix where - T: Copy + RealField, + T: ConstOne + Copy + RealField, Const: DimMin, Output = Const>, { if (u * v_t).determinant() < T::zero() { u.column_mut(N - 1) .iter_mut() - .for_each(|element| *element *= T::one().neg()); // Reverse the last column + .for_each(|element| *element *= T::ONE.neg()); // Reverse the last column } u * v_t } From 5afd260b3f53b7295bc3a259ebd0bdec71829682 Mon Sep 17 00:00:00 2001 From: Emily Matheys Date: Thu, 17 Sep 2026 15:39:32 +0300 Subject: [PATCH 2/2] use const zero as well --- crates/mapping-algorithms/src/lines/bresenham.rs | 13 +++++++------ .../src/point_clouds/icp/helpers.rs | 6 +++--- .../mapping-algorithms/src/point_clouds/icp/mod.rs | 6 +++--- crates/mapping-algorithms/src/point_clouds/mod.rs | 6 +++--- .../mapping-algorithms/src/polygons/graham_scan.rs | 8 ++++---- .../mapping-algorithms/src/polygons/jarvis_march.rs | 6 +++--- crates/mapping-algorithms/src/types/isometry.rs | 6 +++--- crates/mapping-algorithms/src/utils/mod.rs | 6 +++--- 8 files changed, 29 insertions(+), 28 deletions(-) diff --git a/crates/mapping-algorithms/src/lines/bresenham.rs b/crates/mapping-algorithms/src/lines/bresenham.rs index 8546f9c..d2c06e1 100644 --- a/crates/mapping-algorithms/src/lines/bresenham.rs +++ b/crates/mapping-algorithms/src/lines/bresenham.rs @@ -22,7 +22,7 @@ */ use nalgebra::{ComplexField, Point, RealField, Scalar}; -use num_traits::{AsPrimitive, ConstOne}; +use num_traits::{AsPrimitive, ConstOne, ConstZero}; use crate::{FusedIterator, Vec, array, fmt, marker::PhantomData}; @@ -76,7 +76,8 @@ pub struct BresenhamLine { _output: PhantomData T>, } -impl, T, const N: usize> BresenhamLine +impl, T, const N: usize> + BresenhamLine where usize: AsPrimitive, { @@ -124,7 +125,7 @@ where // Deltas are absolute, so zero is a valid starting maximum. // comparing with `>=` lets the last of several equal axes win. let (primary_axis, primary_delta) = deltas.iter().enumerate().fold( - (0, F::zero()), + (0, F::ZERO), |(primary_axis, primary_delta), (idx, &delta)| { if delta >= primary_delta { (idx, delta) @@ -135,7 +136,7 @@ where ); let increments: [F; N] = if primary_delta.is_zero() { - [F::zero(); N] + [F::ZERO; N] } else { array::from_fn(|idx| deltas[idx] / primary_delta) }; @@ -145,7 +146,7 @@ where end: end_point, increments, steps, - errors: [F::zero(); N], + errors: [F::ZERO; N], primary_axis, threshold: F::ONE - (F::ONE / >::as_(N + 1)), remaining: >::as_(primary_delta + F::ONE), @@ -232,7 +233,7 @@ pub fn plot_bresenham_line( end_point: Point, ) -> Result>, BresenhamError> where - F: ConstOne + RealField + AsPrimitive + AsPrimitive, + F: ConstOne + ConstZero + RealField + AsPrimitive + AsPrimitive, usize: AsPrimitive, T: Scalar + Copy, { diff --git a/crates/mapping-algorithms/src/point_clouds/icp/helpers.rs b/crates/mapping-algorithms/src/point_clouds/icp/helpers.rs index dfbb3b1..7d1f4c8 100644 --- a/crates/mapping-algorithms/src/point_clouds/icp/helpers.rs +++ b/crates/mapping-algorithms/src/point_clouds/icp/helpers.rs @@ -25,7 +25,7 @@ use nalgebra::{ ArrayStorage, ClosedAddAssign, ClosedDivAssign, ClosedSubAssign, Const, Matrix, Point, SMatrix, Scalar, Vector, }; -use num_traits::{AsPrimitive, NumOps, Zero}; +use num_traits::{AsPrimitive, ConstZero, NumOps}; use crate::{Sum, array, point_clouds::calculate_point_cloud_center, utils::distance_squared}; @@ -119,7 +119,7 @@ pub(crate) fn get_rotation_matrix_and_centroids( closest_points: &[Point], ) -> (SMatrix, Point, Point) where - T: ClosedAddAssign + ClosedDivAssign + ClosedSubAssign + Copy + NumOps + Scalar + Zero, + T: ClosedAddAssign + ClosedDivAssign + ClosedSubAssign + ConstZero + Copy + NumOps + Scalar, usize: AsPrimitive, { let (mean_transformed_a, mean_closest) = ( @@ -128,7 +128,7 @@ where ); let rot_mat = transformed_points_a.iter().zip(closest_points.iter()).fold( - Matrix::from_array_storage(ArrayStorage([[T::zero(); N]; N])), + Matrix::from_array_storage(ArrayStorage([[T::ZERO; N]; N])), |rot_mat, (transformed_point_a, closest_point)| { let a_distance_from_centroid = transformed_point_a - mean_transformed_a; let closest_point_distance_from_centroid = closest_point - mean_closest; diff --git a/crates/mapping-algorithms/src/point_clouds/icp/mod.rs b/crates/mapping-algorithms/src/point_clouds/icp/mod.rs index bc51b82..12ed089 100644 --- a/crates/mapping-algorithms/src/point_clouds/icp/mod.rs +++ b/crates/mapping-algorithms/src/point_clouds/icp/mod.rs @@ -24,7 +24,7 @@ pub use types::{ICPConfiguration, ICPConfigurationBuilder, ICPError, ICPResult, ICPSuccess}; use nalgebra::{ComplexField, Isometry, Point, RealField, SimdRealField}; -use num_traits::{AsPrimitive, Bounded}; +use num_traits::{AsPrimitive, Bounded, ConstZero}; use crate::{ Sum, Vec, @@ -76,7 +76,7 @@ pub fn icp_iteration( config: &ICPConfiguration, ) -> Result> where - T: Bounded + Copy + Default + RealField + Sum + SimdRealField, + T: Bounded + ConstZero + Copy + Default + RealField + Sum + SimdRealField, usize: AsPrimitive, IsometryAbstractor: AbstractIsometry, { @@ -146,7 +146,7 @@ pub fn icp( config: ICPConfiguration, ) -> ICPResult as AbstractIsometry>::RotType, N> where - T: Bounded + Copy + Default + IsNan + RealField + Sum, + T: Bounded + ConstZero + Copy + Default + IsNan + RealField + Sum, usize: AsPrimitive, IsometryAbstractor: AbstractIsometry, { diff --git a/crates/mapping-algorithms/src/point_clouds/mod.rs b/crates/mapping-algorithms/src/point_clouds/mod.rs index 356fa03..0c7c0dc 100644 --- a/crates/mapping-algorithms/src/point_clouds/mod.rs +++ b/crates/mapping-algorithms/src/point_clouds/mod.rs @@ -32,7 +32,7 @@ use crate::{Vec, array}; use nalgebra::{ AbstractRotation, ClosedAddAssign, ClosedDivAssign, Isometry, Point, RealField, Scalar, }; -use num_traits::{AsPrimitive, Zero}; +use num_traits::{AsPrimitive, ConstZero}; use rand::distr::uniform::SampleUniform; use rand::{RngExt, SeedableRng}; @@ -60,7 +60,7 @@ mod nearest_neighbour; )] pub fn calculate_point_cloud_center(points: &[Point]) -> Point where - T: ClosedAddAssign + ClosedDivAssign + Copy + Scalar + Zero, + T: ClosedAddAssign + ClosedDivAssign + ConstZero + Copy + Scalar, usize: AsPrimitive, { if points.is_empty() { @@ -69,7 +69,7 @@ where points .iter() - .fold(Point::::from([T::zero(); N]), |acc, it| { + .fold(Point::::from([T::ZERO; N]), |acc, it| { Point::from(acc.coords + it.coords) }) / points.len().as_() diff --git a/crates/mapping-algorithms/src/polygons/graham_scan.rs b/crates/mapping-algorithms/src/polygons/graham_scan.rs index e5fa2c4..02114da 100644 --- a/crates/mapping-algorithms/src/polygons/graham_scan.rs +++ b/crates/mapping-algorithms/src/polygons/graham_scan.rs @@ -23,7 +23,7 @@ use core::fmt::Debug; use nalgebra::{ComplexField, Point2}; -use num_traits::{AsPrimitive, NumAssign}; +use num_traits::{AsPrimitive, ConstZero, NumAssign}; use crate::{ ToOwned, Vec, VecDeque, @@ -39,7 +39,7 @@ use super::calculate_determinant; )] fn build_hull_segment< 'a, - O: ComplexField + Copy + PartialOrd, + O: ComplexField + ConstZero + Copy + PartialOrd, T: AsPrimitive + Debug + IsNan + NumAssign + PartialOrd, >( mut accumulator: VecDeque<&'a Point2>, @@ -50,7 +50,7 @@ fn build_hull_segment< accumulator[accumulator.len() - 2], accumulator[accumulator.len() - 1], current_point, - ) <= O::zero() + ) <= O::ZERO { accumulator.pop_back(); } @@ -85,7 +85,7 @@ pub fn graham_scan( voxel_size: Option, ) -> Option>> where - O: AsPrimitive + ComplexField + Copy + PartialOrd, + O: AsPrimitive + ComplexField + ConstZero + Copy + PartialOrd, T: AsPrimitive + Debug + IsNan + NumAssign + PartialOrd, usize: AsPrimitive, { diff --git a/crates/mapping-algorithms/src/polygons/jarvis_march.rs b/crates/mapping-algorithms/src/polygons/jarvis_march.rs index f7ff042..02aadff 100644 --- a/crates/mapping-algorithms/src/polygons/jarvis_march.rs +++ b/crates/mapping-algorithms/src/polygons/jarvis_march.rs @@ -22,7 +22,7 @@ */ use nalgebra::{ComplexField, Point2, Scalar}; -use num_traits::{AsPrimitive, NumAssign, real::Real}; +use num_traits::{AsPrimitive, ConstZero, NumAssign, real::Real}; use crate::{Ordering, Vec, point_clouds::downsample_point_cloud_voxel}; @@ -47,7 +47,7 @@ use super::calculate_determinant; )] pub fn jarvis_march(points: &[Point2], voxel_size: Option) -> Option>> where - O: AsPrimitive + ComplexField + Copy + Real, + O: AsPrimitive + ComplexField + ConstZero + Copy + Real, T: AsPrimitive + NumAssign + PartialOrd + Scalar, usize: AsPrimitive, { @@ -80,7 +80,7 @@ where let mut endpoint = &points_downsampled_slice[0]; for point in points_downsampled_slice { if endpoint == current_vertex - || calculate_determinant(hull.last().unwrap(), endpoint, point) < O::zero() + || calculate_determinant(hull.last().unwrap(), endpoint, point) < O::ZERO { endpoint = point; } diff --git a/crates/mapping-algorithms/src/types/isometry.rs b/crates/mapping-algorithms/src/types/isometry.rs index 5101de8..8befb96 100644 --- a/crates/mapping-algorithms/src/types/isometry.rs +++ b/crates/mapping-algorithms/src/types/isometry.rs @@ -24,7 +24,7 @@ use nalgebra::{ AbstractRotation, Isometry, Point, RealField, SMatrix, UnitComplex, UnitQuaternion, }; -use num_traits::ConstOne; +use num_traits::{ConstOne, ConstZero}; use crate::{marker::PhantomData, utils::verify_rotation_matrix_determinant}; @@ -53,7 +53,7 @@ pub trait AbstractIsometry { impl AbstractIsometry for IsometryAbstractor where - T: ConstOne + Copy + RealField, + T: ConstOne + ConstZero + Copy + RealField, { type RotType = UnitComplex; @@ -78,7 +78,7 @@ where impl AbstractIsometry for IsometryAbstractor where - T: ConstOne + Copy + RealField, + T: ConstOne + ConstZero + Copy + RealField, { type RotType = UnitQuaternion; diff --git a/crates/mapping-algorithms/src/utils/mod.rs b/crates/mapping-algorithms/src/utils/mod.rs index 25b8b3d..90e962c 100644 --- a/crates/mapping-algorithms/src/utils/mod.rs +++ b/crates/mapping-algorithms/src/utils/mod.rs @@ -22,7 +22,7 @@ */ use nalgebra::{Const, DimMin, Point, RealField, SMatrix, Scalar}; -use num_traits::{ConstOne, NumOps}; +use num_traits::{ConstOne, ConstZero, NumOps}; #[cfg_attr( feature = "tracing", @@ -51,10 +51,10 @@ pub(crate) fn verify_rotation_matrix_determinant( v_t: SMatrix, ) -> SMatrix where - T: ConstOne + Copy + RealField, + T: ConstOne + ConstZero + Copy + RealField, Const: DimMin, Output = Const>, { - if (u * v_t).determinant() < T::zero() { + if (u * v_t).determinant() < T::ZERO { u.column_mut(N - 1) .iter_mut() .for_each(|element| *element *= T::ONE.neg()); // Reverse the last column