diff -r bd13c2ae3450 -r 56c8adc32b09 src/measures/discrete.rs --- a/src/measures/discrete.rs Fri Apr 28 13:15:19 2023 +0300 +++ b/src/measures/discrete.rs Tue Dec 31 09:34:24 2024 -0500 @@ -59,6 +59,20 @@ self.spikes.len() } + /// Replace with the zero measure. + #[inline] + pub fn clear(&mut self) { + self.spikes.clear() + } + + /// Remove `i`:th spike, not maintaining order. + /// + /// Panics if indiex is out of bounds. + #[inline] + pub fn swap_remove(&mut self, i : usize) -> DeltaMeasure{ + self.spikes.swap_remove(i) + } + /// Iterate over (references to) the [`DeltaMeasure`] spikes in this measure #[inline] pub fn iter_spikes(&self) -> SpikeIter<'_, Domain, F> { @@ -109,6 +123,31 @@ pub fn prune(&mut self) { self.spikes.retain(|δ| δ.α != F::ZERO); } + + /// Add the spikes produced by `iter` to this measure. + #[inline] + pub fn extend>>( + &mut self, + iter : I + ) { + self.spikes.extend(iter); + } + + /// Add a spike to the measure + #[inline] + pub fn push(&mut self, δ : DeltaMeasure) { + self.spikes.push(δ); + } +} + +impl IntoIterator for DiscreteMeasure { + type Item = DeltaMeasure; + type IntoIter = > as IntoIterator>::IntoIter; + + #[inline] + fn into_iter(self) -> Self::IntoIter { + self.spikes.into_iter() + } } impl DiscreteMeasure { @@ -119,7 +158,7 @@ pub fn pruning_sub(&mut self, θ : F, ζ : F, μ2 : &mut Self) { let mut μ2_get = 0; let mut μ2_insert = 0; - self.spikes.drain_filter(|&mut DeltaMeasure{ α : ref mut α_ref, ref x }| { + self.spikes.retain_mut(|&mut DeltaMeasure{ α : ref mut α_ref, ref x }| { // Get weight of spike in μ2, zero if out of bounds. let β = μ2.spikes.get(μ2_get).map_or(F::ZERO, DeltaMeasure::get_mass); μ2_get += 1; @@ -176,21 +215,47 @@ } } -impl Index for DiscreteMeasure { - type Output = DeltaMeasure; +// impl Index for DiscreteMeasure { +// type Output = DeltaMeasure; +// #[inline] +// fn index(&self, i : usize) -> &Self::Output { +// self.spikes.index(i) +// } +// } + +// impl IndexMut for DiscreteMeasure { +// #[inline] +// fn index_mut(&mut self, i : usize) -> &mut Self::Output { +// self.spikes.index_mut(i) +// } +// } + +impl< + Domain, + F : Num, + I : std::slice::SliceIndex<[DeltaMeasure]> +> Index +for DiscreteMeasure { + type Output = ]>>::Output; #[inline] - fn index(&self, i : usize) -> &Self::Output { + fn index(&self, i : I) -> &Self::Output { self.spikes.index(i) } } -impl IndexMut for DiscreteMeasure { +impl< + Domain, + F : Num, + I : std::slice::SliceIndex<[DeltaMeasure]> +> IndexMut +for DiscreteMeasure { #[inline] - fn index_mut(&mut self, i : usize) -> &mut Self::Output { + fn index_mut(&mut self, i : I) -> &mut Self::Output { self.spikes.index_mut(i) } } + impl>, const K : usize> From<[D; K]> for DiscreteMeasure { #[inline]