pub struct ScaledSumSqAccumulator<SumSqAcc>where
SumSqAcc: SumAccumulator<Input: RealScalar>,{ /* private fields */ }Expand description
Accumulator for computing scaled sum-of-squares: scale² × Σ(xᵢ/scale)².
This accumulator is used internally for computing vector norms (especially L2), but is general enough for any algorithm that needs to sum squared non-negative values while maintaining numerical stability through dynamic scaling.
The key invariant is that scale tracks the running maximum absolute value,
preventing overflow and underflow. When a larger value is encountered, previous
accumulated terms are rescaled by (old_scale / new_scale)².
§Type parameter SumSqAcc
The accumulation strategy for the scaled sum-of-squares term:
NaiveSum: plain+=, fastestNeumaierSum: compensated summation for better accuracy
§Input contract
The Input type is NonNegativeRealScalar<ScalarType::RealType>,
which explicitly encodes that all pushed values must be non-negative.
Callers must validate and wrap values with NonNegativeRealScalar before pushing.
§Example
use num_valid::algorithms::accumulators::*;
use num_valid::scalars::NonNegativeRealScalar;
let mut acc = ScaledSumSqAccumulator::<NaiveSum<f64>>::new();
acc.push(NonNegativeRealScalar::new(3.0)); // validated non-negative
acc.push(NonNegativeRealScalar::new(4.0));
let result = acc.result(); // 3² + 4² = 25Implementations§
Source§impl<SumSqAcc> ScaledSumSqAccumulator<SumSqAcc>where
SumSqAcc: SumAccumulator<Input: RealScalar>,
impl<SumSqAcc> ScaledSumSqAccumulator<SumSqAcc>where
SumSqAcc: SumAccumulator<Input: RealScalar>,
pub fn result_sqrt(self) -> NonNegativeRealScalar<SumSqAcc::Input>
Sourcepub fn new_sequential<I>(values: I) -> Self
pub fn new_sequential<I>(values: I) -> Self
Build a new accumulator by sequentially pushing non-negative values.
This is the basic constructor for building from validated non-negative inputs.
For building from arbitrary scalars (which need abs()), use
new_sequential_from_scalars.
Sourcepub fn new_sequential_from_scalars<I>(values: I) -> Self
pub fn new_sequential_from_scalars<I>(values: I) -> Self
Build a new accumulator by sequentially processing scalars, automatically taking abs().
This is a convenience method for L2 norm computation, where scalar values (real or complex) are automatically converted to their absolute value (modulus for complex scalars) before accumulation.
§Example
use num_valid::algorithms::accumulators::*;
let values = [3.0_f64, -4.0, 5.0];
let mut acc = ScaledSumSqAccumulator::<NaiveSum<f64>>::new_sequential_from_scalars(values);
// Accumulates |3| = 3, |-4| = 4, |5| = 5
// Result: √(9 + 16 + 25) = √50Sourcepub fn new_parallel_from_scalars<I>(values: I) -> Self
pub fn new_parallel_from_scalars<I>(values: I) -> Self
Build a new accumulator in parallel, automatically taking abs() of each scalar.
Distributes work across threads using rayon. Each thread accumulates its chunk
independently, then results are merged via Accumulator::combine.
Trait Implementations§
Source§impl<SumSqAcc> Accumulator for ScaledSumSqAccumulator<SumSqAcc>where
SumSqAcc: SumAccumulator<Input: RealScalar>,
impl<SumSqAcc> Accumulator for ScaledSumSqAccumulator<SumSqAcc>where
SumSqAcc: SumAccumulator<Input: RealScalar>,
Source§type Input = NonNegativeRealScalar<<SumSqAcc as Accumulator>::Input>
type Input = NonNegativeRealScalar<<SumSqAcc as Accumulator>::Input>
Input must be already validated as non-negative
Source§fn push(&mut self, value: Self::Input)
fn push(&mut self, value: Self::Input)
Adds a non-negative value to the accumulator.
The input must already be validated as non-negative via NonNegativeRealScalar.
Source§fn combine(&mut self, other: Self)
fn combine(&mut self, other: Self)
Merges another accumulator, rescaling as needed when scales differ. Handles all permutations of scale relationships (>, <, ==) and empty accumulators.
Source§type Output = NonNegativeRealScalar<<SumSqAcc as Accumulator>::Input>
type Output = NonNegativeRealScalar<<SumSqAcc as Accumulator>::Input>
result.Source§fn new_sequential<I>(values: I) -> Selfwhere
I: IntoIterator<Item = Self::Input>,
fn new_sequential<I>(values: I) -> Selfwhere
I: IntoIterator<Item = Self::Input>,
values. Read moreSource§fn new_parallel<I>(values: I) -> Self
fn new_parallel<I>(values: I) -> Self
Auto Trait Implementations§
impl<SumSqAcc> Freeze for ScaledSumSqAccumulator<SumSqAcc>where
<SumSqAcc as Accumulator>::Input: for<'a> Sized,
NonNegativeRealScalar<<SumSqAcc as Accumulator>::Input>: Freeze,
SumSqAcc: Freeze,
impl<SumSqAcc> RefUnwindSafe for ScaledSumSqAccumulator<SumSqAcc>where
<SumSqAcc as Accumulator>::Input: for<'a> Sized,
NonNegativeRealScalar<<SumSqAcc as Accumulator>::Input>: RefUnwindSafe,
SumSqAcc: RefUnwindSafe,
impl<SumSqAcc> Send for ScaledSumSqAccumulator<SumSqAcc>where
<SumSqAcc as Accumulator>::Input: for<'a> Sized,
NonNegativeRealScalar<<SumSqAcc as Accumulator>::Input>: Send,
SumSqAcc: Send,
impl<SumSqAcc> Sync for ScaledSumSqAccumulator<SumSqAcc>where
<SumSqAcc as Accumulator>::Input: for<'a> Sized,
NonNegativeRealScalar<<SumSqAcc as Accumulator>::Input>: Sync,
SumSqAcc: Sync,
impl<SumSqAcc> Unpin for ScaledSumSqAccumulator<SumSqAcc>where
<SumSqAcc as Accumulator>::Input: for<'a> Sized,
NonNegativeRealScalar<<SumSqAcc as Accumulator>::Input>: Unpin,
SumSqAcc: Unpin,
impl<SumSqAcc> UnsafeUnpin for ScaledSumSqAccumulator<SumSqAcc>where
<SumSqAcc as Accumulator>::Input: for<'a> Sized,
NonNegativeRealScalar<<SumSqAcc as Accumulator>::Input>: UnsafeUnpin,
SumSqAcc: UnsafeUnpin,
impl<SumSqAcc> UnwindSafe for ScaledSumSqAccumulator<SumSqAcc>where
<SumSqAcc as Accumulator>::Input: for<'a> Sized,
NonNegativeRealScalar<<SumSqAcc as Accumulator>::Input>: UnwindSafe,
SumSqAcc: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CheckedAs for T
impl<T> CheckedAs for T
Source§fn checked_as<Dst>(self) -> Option<Dst>where
T: CheckedCast<Dst>,
fn checked_as<Dst>(self) -> Option<Dst>where
T: CheckedCast<Dst>,
Source§impl<Src, Dst> CheckedCastFrom<Src> for Dstwhere
Src: CheckedCast<Dst>,
impl<Src, Dst> CheckedCastFrom<Src> for Dstwhere
Src: CheckedCast<Dst>,
Source§fn checked_cast_from(src: Src) -> Option<Dst>
fn checked_cast_from(src: Src) -> Option<Dst>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more