57 #[inline] |
57 #[inline] |
58 pub fn len(&self) -> usize { |
58 pub fn len(&self) -> usize { |
59 self.spikes.len() |
59 self.spikes.len() |
60 } |
60 } |
61 |
61 |
|
62 /// Replace with the zero measure. |
|
63 #[inline] |
|
64 pub fn clear(&mut self) { |
|
65 self.spikes.clear() |
|
66 } |
|
67 |
|
68 /// Remove `i`:th spike, not maintaining order. |
|
69 /// |
|
70 /// Panics if indiex is out of bounds. |
|
71 #[inline] |
|
72 pub fn swap_remove(&mut self, i : usize) -> DeltaMeasure<Domain, F>{ |
|
73 self.spikes.swap_remove(i) |
|
74 } |
|
75 |
62 /// Iterate over (references to) the [`DeltaMeasure`] spikes in this measure |
76 /// Iterate over (references to) the [`DeltaMeasure`] spikes in this measure |
63 #[inline] |
77 #[inline] |
64 pub fn iter_spikes(&self) -> SpikeIter<'_, Domain, F> { |
78 pub fn iter_spikes(&self) -> SpikeIter<'_, Domain, F> { |
65 self.spikes.iter() |
79 self.spikes.iter() |
66 } |
80 } |
107 /// Prune all spikes with zero mass. |
121 /// Prune all spikes with zero mass. |
108 #[inline] |
122 #[inline] |
109 pub fn prune(&mut self) { |
123 pub fn prune(&mut self) { |
110 self.spikes.retain(|δ| δ.α != F::ZERO); |
124 self.spikes.retain(|δ| δ.α != F::ZERO); |
111 } |
125 } |
|
126 |
|
127 /// Add the spikes produced by `iter` to this measure. |
|
128 #[inline] |
|
129 pub fn extend<I : Iterator<Item=DeltaMeasure<Domain, F>>>( |
|
130 &mut self, |
|
131 iter : I |
|
132 ) { |
|
133 self.spikes.extend(iter); |
|
134 } |
|
135 |
|
136 /// Add a spike to the measure |
|
137 #[inline] |
|
138 pub fn push(&mut self, δ : DeltaMeasure<Domain, F>) { |
|
139 self.spikes.push(δ); |
|
140 } |
|
141 } |
|
142 |
|
143 impl<Domain, F : Num> IntoIterator for DiscreteMeasure<Domain, F> { |
|
144 type Item = DeltaMeasure<Domain, F>; |
|
145 type IntoIter = <Vec<DeltaMeasure<Domain, F>> as IntoIterator>::IntoIter; |
|
146 |
|
147 #[inline] |
|
148 fn into_iter(self) -> Self::IntoIter { |
|
149 self.spikes.into_iter() |
|
150 } |
112 } |
151 } |
113 |
152 |
114 impl<Domain : Clone, F : Float> DiscreteMeasure<Domain, F> { |
153 impl<Domain : Clone, F : Float> DiscreteMeasure<Domain, F> { |
115 /// Computes `μ1 ← θ * μ1 - ζ * μ2`, pruning entries where both `μ1` (`self`) and `μ2` have |
154 /// Computes `μ1 ← θ * μ1 - ζ * μ2`, pruning entries where both `μ1` (`self`) and `μ2` have |
116 // zero weight. `μ2` will contain copy of pruned original `μ1` without arithmetic performed. |
155 // zero weight. `μ2` will contain copy of pruned original `μ1` without arithmetic performed. |
117 /// **This expects `self` and `μ2` to have matching coordinates in each index**. |
156 /// **This expects `self` and `μ2` to have matching coordinates in each index**. |
118 // `μ2` can be than `self`, but not longer. |
157 // `μ2` can be than `self`, but not longer. |
119 pub fn pruning_sub(&mut self, θ : F, ζ : F, μ2 : &mut Self) { |
158 pub fn pruning_sub(&mut self, θ : F, ζ : F, μ2 : &mut Self) { |
120 let mut μ2_get = 0; |
159 let mut μ2_get = 0; |
121 let mut μ2_insert = 0; |
160 let mut μ2_insert = 0; |
122 self.spikes.drain_filter(|&mut DeltaMeasure{ α : ref mut α_ref, ref x }| { |
161 self.spikes.retain_mut(|&mut DeltaMeasure{ α : ref mut α_ref, ref x }| { |
123 // Get weight of spike in μ2, zero if out of bounds. |
162 // Get weight of spike in μ2, zero if out of bounds. |
124 let β = μ2.spikes.get(μ2_get).map_or(F::ZERO, DeltaMeasure::get_mass); |
163 let β = μ2.spikes.get(μ2_get).map_or(F::ZERO, DeltaMeasure::get_mass); |
125 μ2_get += 1; |
164 μ2_get += 1; |
126 |
165 |
127 if *α_ref == F::ZERO && β == F::ZERO { |
166 if *α_ref == F::ZERO && β == F::ZERO { |
174 pub fn set_masses_dvector(&mut self, x : &DVector<F::MixedType>) { |
213 pub fn set_masses_dvector(&mut self, x : &DVector<F::MixedType>) { |
175 self.set_masses(x.iter().map(|&α| F::from_nalgebra_mixed(α))); |
214 self.set_masses(x.iter().map(|&α| F::from_nalgebra_mixed(α))); |
176 } |
215 } |
177 } |
216 } |
178 |
217 |
179 impl<Domain, F :Num> Index<usize> for DiscreteMeasure<Domain, F> { |
218 // impl<Domain, F :Num> Index<usize> for DiscreteMeasure<Domain, F> { |
180 type Output = DeltaMeasure<Domain, F>; |
219 // type Output = DeltaMeasure<Domain, F>; |
181 #[inline] |
220 // #[inline] |
182 fn index(&self, i : usize) -> &Self::Output { |
221 // fn index(&self, i : usize) -> &Self::Output { |
|
222 // self.spikes.index(i) |
|
223 // } |
|
224 // } |
|
225 |
|
226 // impl<Domain, F :Num> IndexMut<usize> for DiscreteMeasure<Domain, F> { |
|
227 // #[inline] |
|
228 // fn index_mut(&mut self, i : usize) -> &mut Self::Output { |
|
229 // self.spikes.index_mut(i) |
|
230 // } |
|
231 // } |
|
232 |
|
233 impl< |
|
234 Domain, |
|
235 F : Num, |
|
236 I : std::slice::SliceIndex<[DeltaMeasure<Domain, F>]> |
|
237 > Index<I> |
|
238 for DiscreteMeasure<Domain, F> { |
|
239 type Output = <I as std::slice::SliceIndex<[DeltaMeasure<Domain, F>]>>::Output; |
|
240 #[inline] |
|
241 fn index(&self, i : I) -> &Self::Output { |
183 self.spikes.index(i) |
242 self.spikes.index(i) |
184 } |
243 } |
185 } |
244 } |
186 |
245 |
187 impl<Domain, F :Num> IndexMut<usize> for DiscreteMeasure<Domain, F> { |
246 impl< |
188 #[inline] |
247 Domain, |
189 fn index_mut(&mut self, i : usize) -> &mut Self::Output { |
248 F : Num, |
|
249 I : std::slice::SliceIndex<[DeltaMeasure<Domain, F>]> |
|
250 > IndexMut<I> |
|
251 for DiscreteMeasure<Domain, F> { |
|
252 #[inline] |
|
253 fn index_mut(&mut self, i : I) -> &mut Self::Output { |
190 self.spikes.index_mut(i) |
254 self.spikes.index_mut(i) |
191 } |
255 } |
192 } |
256 } |
|
257 |
193 |
258 |
194 impl<Domain, F : Num, D : Into<DeltaMeasure<Domain, F>>, const K : usize> From<[D; K]> |
259 impl<Domain, F : Num, D : Into<DeltaMeasure<Domain, F>>, const K : usize> From<[D; K]> |
195 for DiscreteMeasure<Domain, F> { |
260 for DiscreteMeasure<Domain, F> { |
196 #[inline] |
261 #[inline] |
197 fn from(list : [D; K]) -> Self { |
262 fn from(list : [D; K]) -> Self { |