| 105 // } |
130 // } |
| 106 |
131 |
| 107 /// Prune all spikes with zero mass. |
132 /// Prune all spikes with zero mass. |
| 108 #[inline] |
133 #[inline] |
| 109 pub fn prune(&mut self) { |
134 pub fn prune(&mut self) { |
| 110 self.spikes.retain(|δ| δ.α != F::ZERO); |
135 self.prune_by(|δ| δ.α != F::ZERO); |
| |
136 } |
| |
137 |
| |
138 /// Prune spikes by the predicate `g`. |
| |
139 #[inline] |
| |
140 pub fn prune_by<G : FnMut(&DeltaMeasure<Domain, F>) -> bool>(&mut self, g : G) { |
| |
141 self.spikes.retain(g); |
| |
142 } |
| |
143 |
| |
144 /// Add the spikes produced by `iter` to this measure. |
| |
145 #[inline] |
| |
146 pub fn extend<I : Iterator<Item=DeltaMeasure<Domain, F>>>( |
| |
147 &mut self, |
| |
148 iter : I |
| |
149 ) { |
| |
150 self.spikes.extend(iter); |
| |
151 } |
| |
152 |
| |
153 /// Add a spike to the measure |
| |
154 #[inline] |
| |
155 pub fn push(&mut self, δ : DeltaMeasure<Domain, F>) { |
| |
156 self.spikes.push(δ); |
| |
157 } |
| |
158 |
| |
159 /// Iterate over triples of masses and locations of two discrete measures, which are assumed |
| |
160 /// to have equal locations of same spike indices. |
| |
161 pub fn both_matching<'a>(&'a self, other : &'a DiscreteMeasure<Domain, F>) -> |
| |
162 impl Iterator<Item=(F, F, &'a Domain)> { |
| |
163 let m = self.len().max(other.len()); |
| |
164 self.iter_spikes().map(Some).chain(std::iter::repeat(None)) |
| |
165 .zip(other.iter_spikes().map(Some).chain(std::iter::repeat(None))) |
| |
166 .take(m) |
| |
167 .map(|(oδ, orδ)| { |
| |
168 match (oδ, orδ) { |
| |
169 (Some(δ), Some(rδ)) => (δ.α, rδ.α, &δ.x), // Assumed δ.x=rδ.x |
| |
170 (Some(δ), None) => (δ.α, F::ZERO, &δ.x), |
| |
171 (None, Some(rδ)) => (F::ZERO, rδ.α, &rδ.x), |
| |
172 (None, None) => panic!("This cannot happen!"), |
| |
173 } |
| |
174 }) |
| |
175 } |
| |
176 |
| |
177 /// Subtract `other` from `self`, assuming equal locations of same spike indices |
| |
178 pub fn sub_matching(&self, other : &DiscreteMeasure<Domain, F>) -> DiscreteMeasure<Domain, F> |
| |
179 where Domain : Clone { |
| |
180 self.both_matching(other) |
| |
181 .map(|(α, β, x)| (x.clone(), α - β)) |
| |
182 .collect() |
| |
183 } |
| |
184 |
| |
185 /// Add `other` to `self`, assuming equal locations of same spike indices |
| |
186 pub fn add_matching(&self, other : &DiscreteMeasure<Domain, F>) -> DiscreteMeasure<Domain, F> |
| |
187 where Domain : Clone { |
| |
188 self.both_matching(other) |
| |
189 .map(|(α, β, x)| (x.clone(), α + β)) |
| |
190 .collect() |
| |
191 } |
| |
192 |
| |
193 /// Calculate the Radon-norm distance of `self` to `other`, |
| |
194 /// assuming equal locations of same spike indices. |
| |
195 pub fn dist_matching(&self, other : &DiscreteMeasure<Domain, F>) -> F where F : Float { |
| |
196 self.both_matching(other) |
| |
197 .map(|(α, β, _)| (α-β).abs()) |
| |
198 .sum() |
| |
199 } |
| |
200 } |
| |
201 |
| |
202 impl<Domain, F : Num> IntoIterator for DiscreteMeasure<Domain, F> { |
| |
203 type Item = DeltaMeasure<Domain, F>; |
| |
204 type IntoIter = std::vec::IntoIter<DeltaMeasure<Domain, F>>; |
| |
205 |
| |
206 #[inline] |
| |
207 fn into_iter(self) -> Self::IntoIter { |
| |
208 self.spikes.into_iter() |
| |
209 } |
| |
210 } |
| |
211 |
| |
212 impl<'a, Domain, F : Num> IntoIterator for &'a DiscreteMeasure<Domain, F> { |
| |
213 type Item = &'a DeltaMeasure<Domain, F>; |
| |
214 type IntoIter = SpikeIter<'a, Domain, F>; |
| |
215 |
| |
216 #[inline] |
| |
217 fn into_iter(self) -> Self::IntoIter { |
| |
218 self.spikes.iter() |
| |
219 } |
| |
220 } |
| |
221 |
| |
222 impl<Domain, F : Num> Sum<DeltaMeasure<Domain, F>> for DiscreteMeasure<Domain, F> { |
| |
223 // Required method |
| |
224 fn sum<I>(iter: I) -> Self |
| |
225 where |
| |
226 I : Iterator<Item = DeltaMeasure<Domain, F>> |
| |
227 { |
| |
228 Self::from_iter(iter) |
| |
229 } |
| |
230 } |
| |
231 |
| |
232 impl<'a, Domain : Clone, F : Num> Sum<&'a DeltaMeasure<Domain, F>> |
| |
233 for DiscreteMeasure<Domain, F> |
| |
234 { |
| |
235 // Required method |
| |
236 fn sum<I>(iter: I) -> Self |
| |
237 where |
| |
238 I : Iterator<Item = &'a DeltaMeasure<Domain, F>> |
| |
239 { |
| |
240 Self::from_iter(iter.cloned()) |
| |
241 } |
| |
242 } |
| |
243 |
| |
244 impl<Domain, F : Num> Sum<DiscreteMeasure<Domain, F>> for DiscreteMeasure<Domain, F> { |
| |
245 // Required method |
| |
246 fn sum<I>(iter: I) -> Self |
| |
247 where |
| |
248 I : Iterator<Item = DiscreteMeasure<Domain, F>> |
| |
249 { |
| |
250 Self::from_iter(iter.map(|μ| μ.into_iter()).flatten()) |
| |
251 } |
| |
252 } |
| |
253 |
| |
254 impl<'a, Domain : Clone, F : Num> Sum<&'a DiscreteMeasure<Domain, F>> |
| |
255 for DiscreteMeasure<Domain, F> |
| |
256 { |
| |
257 // Required method |
| |
258 fn sum<I>(iter: I) -> Self |
| |
259 where |
| |
260 I : Iterator<Item = &'a DiscreteMeasure<Domain, F>> |
| |
261 { |
| |
262 Self::from_iter(iter.map(|μ| μ.iter_spikes()).flatten().cloned()) |
| 111 } |
263 } |
| 112 } |
264 } |
| 113 |
265 |
| 114 impl<Domain : Clone, F : Float> DiscreteMeasure<Domain, F> { |
266 impl<Domain : Clone, F : Float> DiscreteMeasure<Domain, F> { |
| 115 /// Computes `μ1 ← θ * μ1 - ζ * μ2`, pruning entries where both `μ1` (`self`) and `μ2` have |
267 /// 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. |
268 // zero weight. `μ2` will contain a pruned copy of pruned original `μ1` without arithmetic |
| 117 /// **This expects `self` and `μ2` to have matching coordinates in each index**. |
269 /// performed. **This expects `self` and `μ2` to have matching coordinates in each index**. |
| 118 // `μ2` can be than `self`, but not longer. |
270 // `μ2` can be than `self`, but not longer. |
| 119 pub fn pruning_sub(&mut self, θ : F, ζ : F, μ2 : &mut Self) { |
271 pub fn pruning_sub(&mut self, θ : F, ζ : F, μ2 : &mut Self) { |
| 120 let mut μ2_get = 0; |
272 for δ in &self[μ2.len()..] { |
| 121 let mut μ2_insert = 0; |
273 μ2.push(DeltaMeasure{ x : δ.x.clone(), α : F::ZERO}); |
| 122 self.spikes.drain_filter(|&mut DeltaMeasure{ α : ref mut α_ref, ref x }| { |
274 } |
| 123 // Get weight of spike in μ2, zero if out of bounds. |
275 debug_assert_eq!(self.len(), μ2.len()); |
| 124 let β = μ2.spikes.get(μ2_get).map_or(F::ZERO, DeltaMeasure::get_mass); |
276 let mut dest = 0; |
| 125 μ2_get += 1; |
277 for i in 0..self.len() { |
| 126 |
278 let α = self[i].α; |
| 127 if *α_ref == F::ZERO && β == F::ZERO { |
279 let α_new = θ * α - ζ * μ2[i].α; |
| 128 // Prune |
280 if dest < i { |
| 129 true |
281 μ2[dest] = DeltaMeasure{ x : self[i].x.clone(), α }; |
| |
282 self[dest] = DeltaMeasure{ x : self[i].x.clone(), α : α_new }; |
| 130 } else { |
283 } else { |
| 131 // Save self weight |
284 μ2[i].α = α; |
| 132 let α = *α_ref; |
285 self[i].α = α_new; |
| 133 // Modify self |
286 } |
| 134 *α_ref = θ * α - ζ * β; |
287 dest += 1; |
| 135 // Make copy of old self weight in μ2 |
288 } |
| 136 let δ = DeltaMeasure{ α, x : x.clone() }; |
289 self.spikes.truncate(dest); |
| 137 match μ2.spikes.get_mut(μ2_insert) { |
290 μ2.spikes.truncate(dest); |
| 138 Some(replace) => { |
|
| 139 *replace = δ; |
|
| 140 }, |
|
| 141 None => { |
|
| 142 debug_assert_eq!(μ2.len(), μ2_insert); |
|
| 143 μ2.spikes.push(δ); |
|
| 144 }, |
|
| 145 } |
|
| 146 μ2_insert += 1; |
|
| 147 // Keep |
|
| 148 false |
|
| 149 } |
|
| 150 }); |
|
| 151 // Truncate μ2 to same length as self. |
|
| 152 μ2.spikes.truncate(μ2_insert); |
|
| 153 debug_assert_eq!(μ2.len(), self.len()); |
|
| 154 } |
291 } |
| 155 } |
292 } |
| 156 |
293 |
| 157 impl<Domain, F : Float> DiscreteMeasure<Domain, F> { |
294 impl<Domain, F : Float> DiscreteMeasure<Domain, F> { |
| 158 /// Prune all spikes with mass absolute value less than the given `tolerance`. |
295 /// Prune all spikes with mass absolute value less than the given `tolerance`. |
| 172 |
309 |
| 173 /// Sets the masses of the spikes from the values of a [`DVector`]. |
310 /// Sets the masses of the spikes from the values of a [`DVector`]. |
| 174 pub fn set_masses_dvector(&mut self, x : &DVector<F::MixedType>) { |
311 pub fn set_masses_dvector(&mut self, x : &DVector<F::MixedType>) { |
| 175 self.set_masses(x.iter().map(|&α| F::from_nalgebra_mixed(α))); |
312 self.set_masses(x.iter().map(|&α| F::from_nalgebra_mixed(α))); |
| 176 } |
313 } |
| 177 } |
314 |
| 178 |
315 // /// Extracts the masses of the spikes as a [`Vec`]. |
| 179 impl<Domain, F :Num> Index<usize> for DiscreteMeasure<Domain, F> { |
316 // pub fn masses_vec(&self) -> Vec<F::MixedType> { |
| 180 type Output = DeltaMeasure<Domain, F>; |
317 // self.iter_masses() |
| 181 #[inline] |
318 // .map(|α| α.to_nalgebra_mixed()) |
| 182 fn index(&self, i : usize) -> &Self::Output { |
319 // .collect() |
| |
320 // } |
| |
321 |
| |
322 // /// Sets the masses of the spikes from the values of a [`Vec`]. |
| |
323 // pub fn set_masses_vec(&mut self, x : &Vec<F::MixedType>) { |
| |
324 // self.set_masses(x.iter().map(|&α| F::from_nalgebra_mixed(α))); |
| |
325 // } |
| |
326 } |
| |
327 |
| |
328 // impl<Domain, F :Num> Index<usize> for DiscreteMeasure<Domain, F> { |
| |
329 // type Output = DeltaMeasure<Domain, F>; |
| |
330 // #[inline] |
| |
331 // fn index(&self, i : usize) -> &Self::Output { |
| |
332 // self.spikes.index(i) |
| |
333 // } |
| |
334 // } |
| |
335 |
| |
336 // impl<Domain, F :Num> IndexMut<usize> for DiscreteMeasure<Domain, F> { |
| |
337 // #[inline] |
| |
338 // fn index_mut(&mut self, i : usize) -> &mut Self::Output { |
| |
339 // self.spikes.index_mut(i) |
| |
340 // } |
| |
341 // } |
| |
342 |
| |
343 impl< |
| |
344 Domain, |
| |
345 F : Num, |
| |
346 I : std::slice::SliceIndex<[DeltaMeasure<Domain, F>]> |
| |
347 > Index<I> |
| |
348 for DiscreteMeasure<Domain, F> { |
| |
349 type Output = <I as std::slice::SliceIndex<[DeltaMeasure<Domain, F>]>>::Output; |
| |
350 #[inline] |
| |
351 fn index(&self, i : I) -> &Self::Output { |
| 183 self.spikes.index(i) |
352 self.spikes.index(i) |
| 184 } |
353 } |
| 185 } |
354 } |
| 186 |
355 |
| 187 impl<Domain, F :Num> IndexMut<usize> for DiscreteMeasure<Domain, F> { |
356 impl< |
| 188 #[inline] |
357 Domain, |
| 189 fn index_mut(&mut self, i : usize) -> &mut Self::Output { |
358 F : Num, |
| |
359 I : std::slice::SliceIndex<[DeltaMeasure<Domain, F>]> |
| |
360 > IndexMut<I> |
| |
361 for DiscreteMeasure<Domain, F> { |
| |
362 #[inline] |
| |
363 fn index_mut(&mut self, i : I) -> &mut Self::Output { |
| 190 self.spikes.index_mut(i) |
364 self.spikes.index_mut(i) |
| 191 } |
365 } |
| 192 } |
366 } |
| |
367 |
| 193 |
368 |
| 194 impl<Domain, F : Num, D : Into<DeltaMeasure<Domain, F>>, const K : usize> From<[D; K]> |
369 impl<Domain, F : Num, D : Into<DeltaMeasure<Domain, F>>, const K : usize> From<[D; K]> |
| 195 for DiscreteMeasure<Domain, F> { |
370 for DiscreteMeasure<Domain, F> { |
| 196 #[inline] |
371 #[inline] |
| 197 fn from(list : [D; K]) -> Self { |
372 fn from(list : [D; K]) -> Self { |
| 198 list.into_iter().collect() |
373 list.into_iter().collect() |
| 199 } |
374 } |
| 200 } |
375 } |
| |
376 |
| |
377 impl<Domain, F : Num> From<Vec<DeltaMeasure<Domain, F>>> |
| |
378 for DiscreteMeasure<Domain, F> { |
| |
379 #[inline] |
| |
380 fn from(spikes : Vec<DeltaMeasure<Domain, F>>) -> Self { |
| |
381 DiscreteMeasure{ spikes } |
| |
382 } |
| |
383 } |
| |
384 |
| |
385 impl<'a, Domain, F : Num, D> From<&'a [D]> |
| |
386 for DiscreteMeasure<Domain, F> |
| |
387 where &'a D : Into<DeltaMeasure<Domain, F>> { |
| |
388 #[inline] |
| |
389 fn from(list : &'a [D]) -> Self { |
| |
390 list.into_iter().map(|d| d.into()).collect() |
| |
391 } |
| |
392 } |
| |
393 |
| |
394 |
| |
395 impl<Domain, F : Num> From<DeltaMeasure<Domain, F>> |
| |
396 for DiscreteMeasure<Domain, F> { |
| |
397 #[inline] |
| |
398 fn from(δ : DeltaMeasure<Domain, F>) -> Self { |
| |
399 DiscreteMeasure{ |
| |
400 spikes : vec!(δ) |
| |
401 } |
| |
402 } |
| |
403 } |
| |
404 |
| |
405 impl<'a, Domain : Clone, F : Num> From<&'a DeltaMeasure<Domain, F>> |
| |
406 for DiscreteMeasure<Domain, F> { |
| |
407 #[inline] |
| |
408 fn from(δ : &'a DeltaMeasure<Domain, F>) -> Self { |
| |
409 DiscreteMeasure{ |
| |
410 spikes : vec!(δ.clone()) |
| |
411 } |
| |
412 } |
| |
413 } |
| |
414 |
| 201 |
415 |
| 202 impl<Domain, F : Num, D : Into<DeltaMeasure<Domain, F>>> FromIterator<D> |
416 impl<Domain, F : Num, D : Into<DeltaMeasure<Domain, F>>> FromIterator<D> |
| 203 for DiscreteMeasure<Domain, F> { |
417 for DiscreteMeasure<Domain, F> { |
| 204 #[inline] |
418 #[inline] |
| 205 fn from_iter<T>(iter : T) -> Self |
419 fn from_iter<T>(iter : T) -> Self |
| 256 fn norm(&self, _ : Radon) -> F { |
470 fn norm(&self, _ : Radon) -> F { |
| 257 self.spikes.iter().map(|m| m.norm(Radon)).sum() |
471 self.spikes.iter().map(|m| m.norm(Radon)).sum() |
| 258 } |
472 } |
| 259 } |
473 } |
| 260 |
474 |
| 261 impl<Domain, G, F : Num, Y : Sum + Mul<F, Output=Y>> Apply<G> for DiscreteMeasure<Domain, F> |
475 impl<Domain, G, F : Num> Mapping<G> for DiscreteMeasure<Domain, F> |
| 262 where G: for<'a> Apply<&'a Domain, Output = Y> { |
476 where |
| 263 type Output = Y; |
477 Domain : Space, |
| 264 #[inline] |
478 G::Codomain : Sum + Mul<F, Output=G::Codomain>, |
| 265 fn apply(&self, g : G) -> Y { |
479 G : Mapping<Domain, Codomain=F> + Clone + Space, |
| 266 self.spikes.iter().map(|m| g.apply(&m.x) * m.α).sum() |
480 for<'b> &'b Domain : Instance<Domain>, |
| 267 } |
481 { |
| 268 } |
482 type Codomain = G::Codomain; |
| 269 |
483 |
| 270 impl<Domain, G, F : Num, Y : Sum + Mul<F, Output=Y>> Linear<G> for DiscreteMeasure<Domain, F> |
484 #[inline] |
| 271 where G : for<'a> Apply<&'a Domain, Output = Y> { |
485 fn apply<I : Instance<G>>(&self, g : I) -> Self::Codomain { |
| 272 type Codomain = Y; |
486 g.eval(|g| self.spikes.iter().map(|m| g.apply(&m.x) * m.α).sum()) |
| 273 } |
487 } |
| |
488 } |
| |
489 |
| |
490 impl<Domain, G, F : Num> Linear<G> for DiscreteMeasure<Domain, F> |
| |
491 where |
| |
492 Domain : Space, |
| |
493 G::Codomain : Sum + Mul<F, Output=G::Codomain>, |
| |
494 G : Mapping<Domain, Codomain=F> + Clone + Space, |
| |
495 for<'b> &'b Domain : Instance<Domain>, |
| |
496 { } |
| 274 |
497 |
| 275 |
498 |
| 276 /// Helper trait for constructing arithmetic operations for combinations |
499 /// Helper trait for constructing arithmetic operations for combinations |
| 277 /// of [`DiscreteMeasure`] and [`DeltaMeasure`], and their references. |
500 /// of [`DiscreteMeasure`] and [`DeltaMeasure`], and their references. |
| 278 trait Lift<F : Num, Domain> { |
501 trait Lift<F : Num, Domain> { |
| 279 type Producer : Iterator<Item=DeltaMeasure<Domain, F>>; |
502 type Producer : Iterator<Item=DeltaMeasure<Domain, F>>; |
| 280 |
503 |
| |
504 #[allow(dead_code)] |
| 281 /// Lifts `self` into a [`DiscreteMeasure`]. |
505 /// Lifts `self` into a [`DiscreteMeasure`]. |
| 282 fn lift(self) -> DiscreteMeasure<Domain, F>; |
506 fn lift(self) -> DiscreteMeasure<Domain, F>; |
| 283 |
507 |
| 284 /// Lifts `self` into a [`DiscreteMeasure`], apply either `f` or `f_mut` whether the type |
508 /// Lifts `self` into a [`DiscreteMeasure`], apply either `f` or `f_mut` whether the type |
| 285 /// this method is implemented for is a reference or or not. |
509 /// this method is implemented for is a reference or or not. |
| 572 )+ } |
796 )+ } |
| 573 } |
797 } |
| 574 |
798 |
| 575 make_discrete_scalarop_lhs!(Mul, mul; f32 f64 i8 i16 i32 i64 isize u8 u16 u32 u64 usize); |
799 make_discrete_scalarop_lhs!(Mul, mul; f32 f64 i8 i16 i32 i64 isize u8 u16 u32 u64 usize); |
| 576 make_discrete_scalarop_lhs!(Div, div; f32 f64 i8 i16 i32 i64 isize u8 u16 u32 u64 usize); |
800 make_discrete_scalarop_lhs!(Div, div; f32 f64 i8 i16 i32 i64 isize u8 u16 u32 u64 usize); |
| |
801 |
| |
802 impl<F : Num, Domain> Collection for DiscreteMeasure<Domain, F> { |
| |
803 type Element = DeltaMeasure<Domain, F>; |
| |
804 type RefsIter<'a> = std::slice::Iter<'a, Self::Element> where Self : 'a; |
| |
805 |
| |
806 #[inline] |
| |
807 fn iter_refs(&self) -> Self::RefsIter<'_> { |
| |
808 self.iter_spikes() |
| |
809 } |
| |
810 } |
| |
811 |
| |
812 impl<Domain : Clone, F : Num> Space for DiscreteMeasure<Domain, F> { |
| |
813 type Decomp = MeasureDecomp; |
| |
814 } |
| |
815 |
| |
816 pub type SpikeSlice<'b, Domain, F> = &'b [DeltaMeasure<Domain, F>]; |
| |
817 |
| |
818 pub type EitherSlice<'b, Domain, F> = EitherDecomp< |
| |
819 Vec<DeltaMeasure<Domain, F>>, |
| |
820 SpikeSlice<'b, Domain, F> |
| |
821 >; |
| |
822 |
| |
823 impl<F : Num, Domain : Clone> Decomposition<DiscreteMeasure<Domain, F>> for MeasureDecomp { |
| |
824 type Decomposition<'b> = EitherSlice<'b, Domain, F> where DiscreteMeasure<Domain, F> : 'b; |
| |
825 type Reference<'b> = SpikeSlice<'b, Domain, F> where DiscreteMeasure<Domain, F> : 'b; |
| |
826 |
| |
827 /// Left the lightweight reference type into a full decomposition type. |
| |
828 fn lift<'b>(r : Self::Reference<'b>) -> Self::Decomposition<'b> { |
| |
829 EitherDecomp::Borrowed(r) |
| |
830 } |
| |
831 } |
| |
832 |
| |
833 impl<F : Num, Domain : Clone> Instance<DiscreteMeasure<Domain, F>, MeasureDecomp> |
| |
834 for DiscreteMeasure<Domain, F> |
| |
835 { |
| |
836 fn decompose<'b>(self) |
| |
837 -> <MeasureDecomp as Decomposition<DiscreteMeasure<Domain, F>>>::Decomposition<'b> |
| |
838 where Self : 'b, DiscreteMeasure<Domain, F> : 'b { |
| |
839 EitherDecomp::Owned(self.spikes) |
| |
840 } |
| |
841 |
| |
842 fn ref_instance(&self) |
| |
843 -> <MeasureDecomp as Decomposition<DiscreteMeasure<Domain, F>>>::Reference<'_> |
| |
844 { |
| |
845 self.spikes.as_slice() |
| |
846 } |
| |
847 |
| |
848 fn cow<'b>(self) -> MyCow<'b, DiscreteMeasure<Domain, F>> where Self : 'b { |
| |
849 MyCow::Owned(self) |
| |
850 } |
| |
851 |
| |
852 fn own(self) -> DiscreteMeasure<Domain, F> { |
| |
853 self |
| |
854 } |
| |
855 } |
| |
856 |
| |
857 impl<'a, F : Num, Domain : Clone> Instance<DiscreteMeasure<Domain, F>, MeasureDecomp> |
| |
858 for &'a DiscreteMeasure<Domain, F> |
| |
859 { |
| |
860 fn decompose<'b>(self) |
| |
861 -> <MeasureDecomp as Decomposition<DiscreteMeasure<Domain, F>>>::Decomposition<'b> |
| |
862 where Self : 'b, DiscreteMeasure<Domain, F> : 'b { |
| |
863 EitherDecomp::Borrowed(self.spikes.as_slice()) |
| |
864 } |
| |
865 |
| |
866 fn ref_instance(&self) |
| |
867 -> <MeasureDecomp as Decomposition<DiscreteMeasure<Domain, F>>>::Reference<'_> |
| |
868 { |
| |
869 self.spikes.as_slice() |
| |
870 } |
| |
871 |
| |
872 fn cow<'b>(self) -> MyCow<'b, DiscreteMeasure<Domain, F>> where Self : 'b { |
| |
873 MyCow::Borrowed(self) |
| |
874 } |
| |
875 |
| |
876 fn own(self) -> DiscreteMeasure<Domain, F> { |
| |
877 self.clone() |
| |
878 } |
| |
879 } |
| |
880 |
| |
881 impl<'a, F : Num, Domain : Clone> Instance<DiscreteMeasure<Domain, F>, MeasureDecomp> |
| |
882 for EitherSlice<'a, Domain, F> |
| |
883 { |
| |
884 fn decompose<'b>(self) |
| |
885 -> <MeasureDecomp as Decomposition<DiscreteMeasure<Domain, F>>>::Decomposition<'b> |
| |
886 where Self : 'b, DiscreteMeasure<Domain, F> : 'b { |
| |
887 self |
| |
888 } |
| |
889 |
| |
890 fn ref_instance(&self) |
| |
891 -> <MeasureDecomp as Decomposition<DiscreteMeasure<Domain, F>>>::Reference<'_> |
| |
892 { |
| |
893 match self { |
| |
894 EitherDecomp::Owned(v) => v.as_slice(), |
| |
895 EitherDecomp::Borrowed(s) => s, |
| |
896 } |
| |
897 } |
| |
898 |
| |
899 fn own(self) -> DiscreteMeasure<Domain, F> { |
| |
900 match self { |
| |
901 EitherDecomp::Owned(v) => v.into(), |
| |
902 EitherDecomp::Borrowed(s) => s.into(), |
| |
903 } |
| |
904 } |
| |
905 } |
| |
906 |
| |
907 impl<'a, F : Num, Domain : Clone> Instance<DiscreteMeasure<Domain, F>, MeasureDecomp> |
| |
908 for &'a EitherSlice<'a, Domain, F> |
| |
909 { |
| |
910 fn decompose<'b>(self) |
| |
911 -> <MeasureDecomp as Decomposition<DiscreteMeasure<Domain, F>>>::Decomposition<'b> |
| |
912 where Self : 'b, DiscreteMeasure<Domain, F> : 'b { |
| |
913 match self { |
| |
914 EitherDecomp::Owned(v) => EitherDecomp::Borrowed(v.as_slice()), |
| |
915 EitherDecomp::Borrowed(s) => EitherDecomp::Borrowed(s), |
| |
916 } |
| |
917 } |
| |
918 |
| |
919 fn ref_instance(&self) |
| |
920 -> <MeasureDecomp as Decomposition<DiscreteMeasure<Domain, F>>>::Reference<'_> |
| |
921 { |
| |
922 match self { |
| |
923 EitherDecomp::Owned(v) => v.as_slice(), |
| |
924 EitherDecomp::Borrowed(s) => s, |
| |
925 } |
| |
926 } |
| |
927 |
| |
928 fn own(self) -> DiscreteMeasure<Domain, F> { |
| |
929 match self { |
| |
930 EitherDecomp::Owned(v) => v.as_slice(), |
| |
931 EitherDecomp::Borrowed(s) => s |
| |
932 }.into() |
| |
933 } |
| |
934 } |
| |
935 |
| |
936 impl<'a, F : Num, Domain : Clone> Instance<DiscreteMeasure<Domain, F>, MeasureDecomp> |
| |
937 for SpikeSlice<'a, Domain, F> |
| |
938 { |
| |
939 fn decompose<'b>(self) |
| |
940 -> <MeasureDecomp as Decomposition<DiscreteMeasure<Domain, F>>>::Decomposition<'b> |
| |
941 where Self : 'b, DiscreteMeasure<Domain, F> : 'b { |
| |
942 EitherDecomp::Borrowed(self) |
| |
943 } |
| |
944 |
| |
945 fn ref_instance(&self) |
| |
946 -> <MeasureDecomp as Decomposition<DiscreteMeasure<Domain, F>>>::Reference<'_> |
| |
947 { |
| |
948 self |
| |
949 } |
| |
950 |
| |
951 fn own(self) -> DiscreteMeasure<Domain, F> { |
| |
952 self.into() |
| |
953 } |
| |
954 } |
| |
955 |
| |
956 impl<'a, F : Num, Domain : Clone> Instance<DiscreteMeasure<Domain, F>, MeasureDecomp> |
| |
957 for &'a SpikeSlice<'a, Domain, F> |
| |
958 { |
| |
959 fn decompose<'b>(self) |
| |
960 -> <MeasureDecomp as Decomposition<DiscreteMeasure<Domain, F>>>::Decomposition<'b> |
| |
961 where Self : 'b, DiscreteMeasure<Domain, F> : 'b { |
| |
962 EitherDecomp::Borrowed(*self) |
| |
963 } |
| |
964 |
| |
965 fn ref_instance(&self) |
| |
966 -> <MeasureDecomp as Decomposition<DiscreteMeasure<Domain, F>>>::Reference<'_> |
| |
967 { |
| |
968 *self |
| |
969 } |
| |
970 |
| |
971 fn own(self) -> DiscreteMeasure<Domain, F> { |
| |
972 (*self).into() |
| |
973 } |
| |
974 } |
| |
975 |
| |
976 impl<F : Num, Domain : Clone > Instance<DiscreteMeasure<Domain, F>, MeasureDecomp> |
| |
977 for DeltaMeasure<Domain, F> |
| |
978 { |
| |
979 fn decompose<'b>(self) |
| |
980 -> <MeasureDecomp as Decomposition<DiscreteMeasure<Domain, F>>>::Decomposition<'b> |
| |
981 where Self : 'b, DiscreteMeasure<Domain, F> : 'b { |
| |
982 EitherDecomp::Owned(vec![self]) |
| |
983 } |
| |
984 |
| |
985 fn ref_instance(&self) |
| |
986 -> <MeasureDecomp as Decomposition<DiscreteMeasure<Domain, F>>>::Reference<'_> |
| |
987 { |
| |
988 std::slice::from_ref(self) |
| |
989 } |
| |
990 |
| |
991 fn own(self) -> DiscreteMeasure<Domain, F> { |
| |
992 self.into() |
| |
993 } |
| |
994 } |
| |
995 |
| |
996 impl<'a, F : Num, Domain : Clone> Instance<DiscreteMeasure<Domain, F>, MeasureDecomp> |
| |
997 for &'a DeltaMeasure<Domain, F> |
| |
998 { |
| |
999 fn decompose<'b>(self) |
| |
1000 -> <MeasureDecomp as Decomposition<DiscreteMeasure<Domain, F>>>::Decomposition<'b> |
| |
1001 where Self : 'b, DiscreteMeasure<Domain, F> : 'b { |
| |
1002 EitherDecomp::Borrowed(std::slice::from_ref(self)) |
| |
1003 } |
| |
1004 |
| |
1005 fn ref_instance(&self) |
| |
1006 -> <MeasureDecomp as Decomposition<DiscreteMeasure<Domain, F>>>::Reference<'_> |
| |
1007 { |
| |
1008 std::slice::from_ref(*self) |
| |
1009 } |
| |
1010 |
| |
1011 fn own(self) -> DiscreteMeasure<Domain, F> { |
| |
1012 self.into() |
| |
1013 } |
| |
1014 } |