src/discrete.rs

Sat, 24 Jan 2026 19:24:29 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Sat, 24 Jan 2026 19:24:29 -0500
changeset 5
e781c543e228
parent 4
f248f9848c87
permissions
-rw-r--r--

Add truncate

0
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1 //! This module implementes discrete measures.
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
2
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
3 use super::base::*;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
4 use super::delta::*;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
5 use alg_tools::collection::Collection;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
6 use alg_tools::instance::{ClosedSpace, Decomposition, EitherDecomp, Instance, MyCow, Space};
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
7 use alg_tools::iter::{MapF, Mappable};
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
8 use alg_tools::linops::{Linear, Mapping};
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
9 use alg_tools::loc::Loc;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
10 use alg_tools::nalgebra_support::ToNalgebraRealField;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
11 use alg_tools::norms::{Norm, Normed};
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
12 use alg_tools::self_ownable;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
13 use alg_tools::tabledump::TableDump;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
14 use alg_tools::types::*;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
15 use nalgebra::DVector;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
16 use serde::ser::{Serialize, SerializeSeq, Serializer};
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
17 use std::iter::Sum;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
18 use std::ops::{
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
19 Add, AddAssign, Div, DivAssign, Index, IndexMut, Mul, MulAssign, Neg, Sub, SubAssign,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
20 };
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
21
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
22 /// Representation of a discrete measure.
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
23 ///
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
24 /// This is the measure $μ = ∑_{k=1}^n α_k δ_{x_k}$, consisting of several
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
25 /// [`DeltaMeasure`], i.e., “spikes” $α_k δ_{x_k}$ with weights $\alpha_k$ in `F` at locations
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
26 /// $x_k$ in `Domain`.
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
27 #[derive(Clone, Debug)]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
28 pub struct DiscreteMeasure<Domain, F: Num> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
29 pub(super) spikes: Vec<DeltaMeasure<Domain, F>>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
30 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
31
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
32 pub type RNDM<const N: usize, F = f64> = DiscreteMeasure<Loc<N, F>, F>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
33
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
34 /// Iterator over the [`DeltaMeasure`] spikes of a [`DiscreteMeasure`].
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
35 pub type SpikeIter<'a, Domain, F> = std::slice::Iter<'a, DeltaMeasure<Domain, F>>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
36
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
37 /// Iterator over mutable [`DeltaMeasure`] spikes of a [`DiscreteMeasure`].
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
38 pub type SpikeIterMut<'a, Domain, F> = std::slice::IterMut<'a, DeltaMeasure<Domain, F>>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
39
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
40 /// Iterator over the locations of the spikes of a [`DiscreteMeasure`].
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
41 pub type LocationIter<'a, Domain, F> =
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
42 std::iter::Map<SpikeIter<'a, Domain, F>, fn(&'a DeltaMeasure<Domain, F>) -> &'a Domain>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
43
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
44 /// Iterator over the masses of the spikes of a [`DiscreteMeasure`].
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
45 pub type MassIter<'a, Domain, F> =
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
46 std::iter::Map<SpikeIter<'a, Domain, F>, fn(&'a DeltaMeasure<Domain, F>) -> F>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
47
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
48 /// Iterator over the mutable locations of the spikes of a [`DiscreteMeasure`].
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
49 pub type MassIterMut<'a, Domain, F> = std::iter::Map<
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
50 SpikeIterMut<'a, Domain, F>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
51 for<'r> fn(&'r mut DeltaMeasure<Domain, F>) -> &'r mut F,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
52 >;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
53
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
54 impl<Domain, F: Num> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
55 /// Create a new zero measure (empty spike set).
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
56 pub fn new() -> Self {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
57 DiscreteMeasure { spikes: Vec::new() }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
58 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
59
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
60 /// Number of [`DeltaMeasure`] spikes in the measure
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
61 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
62 pub fn len(&self) -> usize {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
63 self.spikes.len()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
64 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
65
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
66 /// Replace with the zero measure.
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
67 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
68 pub fn clear(&mut self) {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
69 self.spikes.clear()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
70 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
71
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
72 /// Remove `i`:th spike, not maintaining order.
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
73 ///
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
74 /// Panics if indiex is out of bounds.
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
75 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
76 pub fn swap_remove(&mut self, i: usize) -> DeltaMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
77 self.spikes.swap_remove(i)
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
78 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
79
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
80 /// Iterate over (references to) the [`DeltaMeasure`] spikes in this measure
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
81 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
82 pub fn iter_spikes(&self) -> SpikeIter<'_, Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
83 self.spikes.iter()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
84 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
85
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
86 /// Iterate over mutable references to the [`DeltaMeasure`] spikes in this measure
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
87 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
88 pub fn iter_spikes_mut(&mut self) -> SpikeIterMut<'_, Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
89 self.spikes.iter_mut()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
90 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
91
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
92 /// Iterate over the location of the spikes in this measure
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
93 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
94 pub fn iter_locations(&self) -> LocationIter<'_, Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
95 self.iter_spikes().map(DeltaMeasure::get_location)
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
96 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
97
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
98 /// Iterate over the masses of the spikes in this measure
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
99 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
100 pub fn iter_masses(&self) -> MassIter<'_, Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
101 self.iter_spikes().map(DeltaMeasure::get_mass)
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
102 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
103
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
104 /// Iterate over the masses of the spikes in this measure
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
105 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
106 pub fn iter_masses_mut(&mut self) -> MassIterMut<'_, Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
107 self.iter_spikes_mut().map(DeltaMeasure::get_mass_mut)
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
108 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
109
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
110 /// Update the masses of all the spikes to those produced by an iterator.
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
111 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
112 pub fn set_masses<I: Iterator<Item = F>>(&mut self, iter: I) {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
113 self.spikes
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
114 .iter_mut()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
115 .zip(iter)
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
116 .for_each(|(δ, α)| δ.set_mass(α));
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
117 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
118
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
119 /// Update the locations of all the spikes to those produced by an iterator.
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
120 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
121 pub fn set_locations<'a, I: Iterator<Item = &'a Domain>>(&mut self, iter: I)
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
122 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
123 Domain: 'static + Clone,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
124 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
125 self.spikes
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
126 .iter_mut()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
127 .zip(iter.cloned())
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
128 .for_each(|(δ, α)| δ.set_location(α));
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
129 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
130
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
131 // /// Map the masses of all the spikes using a function and an iterator
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
132 // #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
133 // pub fn zipmap_masses<
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
134 // I : Iterator<Item=F>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
135 // G : Fn(F, I::Item) -> F
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
136 // > (&mut self, iter : I, g : G) {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
137 // self.spikes.iter_mut().zip(iter).for_each(|(δ, v)| δ.set_mass(g(δ.get_mass(), v)));
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
138 // }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
139
5
e781c543e228 Add truncate
Tuomo Valkonen <tuomov@iki.fi>
parents: 4
diff changeset
140 /// Truncate to `len`.
e781c543e228 Add truncate
Tuomo Valkonen <tuomov@iki.fi>
parents: 4
diff changeset
141 #[inline]
e781c543e228 Add truncate
Tuomo Valkonen <tuomov@iki.fi>
parents: 4
diff changeset
142 pub fn truncate(&mut self, len: usize) {
e781c543e228 Add truncate
Tuomo Valkonen <tuomov@iki.fi>
parents: 4
diff changeset
143 self.spikes.truncate(len);
e781c543e228 Add truncate
Tuomo Valkonen <tuomov@iki.fi>
parents: 4
diff changeset
144 }
e781c543e228 Add truncate
Tuomo Valkonen <tuomov@iki.fi>
parents: 4
diff changeset
145
0
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
146 /// Prune all spikes with zero mass.
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
147 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
148 pub fn prune(&mut self) {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
149 self.prune_by(|δ| δ.α != F::ZERO);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
150 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
151
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
152 /// Prune spikes by the predicate `g`.
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
153 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
154 pub fn prune_by<G: FnMut(&DeltaMeasure<Domain, F>) -> bool>(&mut self, g: G) {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
155 self.spikes.retain(g);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
156 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
157
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
158 /// Add the spikes produced by `iter` to this measure.
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
159 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
160 pub fn extend<I: Iterator<Item = DeltaMeasure<Domain, F>>>(&mut self, iter: I) {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
161 self.spikes.extend(iter);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
162 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
163
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
164 /// Add a spike to the measure
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
165 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
166 pub fn push(&mut self, δ: DeltaMeasure<Domain, F>) {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
167 self.spikes.push(δ);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
168 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
169
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
170 /// Iterate over triples of masses and locations of two discrete measures, which are assumed
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
171 /// to have equal locations of same spike indices.
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
172 pub fn both_matching<'a>(
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
173 &'a self,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
174 other: &'a DiscreteMeasure<Domain, F>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
175 ) -> impl Iterator<Item = (F, F, &'a Domain)> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
176 let m = self.len().max(other.len());
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
177 self.iter_spikes()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
178 .map(Some)
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
179 .chain(std::iter::repeat(None))
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
180 .zip(other.iter_spikes().map(Some).chain(std::iter::repeat(None)))
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
181 .take(m)
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
182 .map(|(oδ, orδ)| {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
183 match (oδ, orδ) {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
184 (Some(δ), Some(rδ)) => (δ.α, rδ.α, &δ.x), // Assumed δ.x=rδ.x
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
185 (Some(δ), None) => (δ.α, F::ZERO, &δ.x),
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
186 (None, Some(rδ)) => (F::ZERO, rδ.α, &rδ.x),
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
187 (None, None) => panic!("This cannot happen!"),
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
188 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
189 })
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
190 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
191
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
192 /// Subtract `other` from `self`, assuming equal locations of same spike indices
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
193 pub fn sub_matching(&self, other: &DiscreteMeasure<Domain, F>) -> DiscreteMeasure<Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
194 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
195 Domain: Clone,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
196 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
197 self.both_matching(other)
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
198 .map(|(α, β, x)| (x.clone(), α - β))
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
199 .collect()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
200 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
201
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
202 /// Add `other` to `self`, assuming equal locations of same spike indices
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
203 pub fn add_matching(&self, other: &DiscreteMeasure<Domain, F>) -> DiscreteMeasure<Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
204 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
205 Domain: Clone,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
206 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
207 self.both_matching(other)
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
208 .map(|(α, β, x)| (x.clone(), α + β))
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
209 .collect()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
210 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
211
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
212 /// Calculate the Radon-norm distance of `self` to `other`,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
213 /// assuming equal locations of same spike indices.
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
214 pub fn dist_matching(&self, other: &DiscreteMeasure<Domain, F>) -> F
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
215 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
216 F: Float,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
217 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
218 self.both_matching(other)
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
219 .map(|(α, β, _)| (α - β).abs())
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
220 .sum()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
221 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
222 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
223
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
224 impl<Domain, F: Num> IntoIterator for DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
225 type Item = DeltaMeasure<Domain, F>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
226 type IntoIter = std::vec::IntoIter<DeltaMeasure<Domain, F>>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
227
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
228 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
229 fn into_iter(self) -> Self::IntoIter {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
230 self.spikes.into_iter()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
231 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
232 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
233
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
234 impl<'a, Domain, F: Num> IntoIterator for &'a DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
235 type Item = &'a DeltaMeasure<Domain, F>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
236 type IntoIter = SpikeIter<'a, Domain, F>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
237
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
238 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
239 fn into_iter(self) -> Self::IntoIter {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
240 self.spikes.iter()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
241 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
242 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
243
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
244 impl<Domain, F: Num> Sum<DeltaMeasure<Domain, F>> for DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
245 // Required method
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
246 fn sum<I>(iter: I) -> Self
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
247 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
248 I: Iterator<Item = DeltaMeasure<Domain, F>>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
249 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
250 Self::from_iter(iter)
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
251 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
252 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
253
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
254 impl<'a, Domain: Clone, F: Num> Sum<&'a DeltaMeasure<Domain, F>> for DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
255 // Required method
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
256 fn sum<I>(iter: I) -> Self
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
257 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
258 I: Iterator<Item = &'a DeltaMeasure<Domain, F>>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
259 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
260 Self::from_iter(iter.cloned())
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
261 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
262 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
263
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
264 impl<Domain, F: Num> Sum<DiscreteMeasure<Domain, F>> for DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
265 // Required method
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
266 fn sum<I>(iter: I) -> Self
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
267 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
268 I: Iterator<Item = DiscreteMeasure<Domain, F>>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
269 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
270 Self::from_iter(iter.map(|μ| μ.into_iter()).flatten())
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
271 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
272 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
273
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
274 impl<'a, Domain: Clone, F: Num> Sum<&'a DiscreteMeasure<Domain, F>> for DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
275 // Required method
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
276 fn sum<I>(iter: I) -> Self
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
277 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
278 I: Iterator<Item = &'a DiscreteMeasure<Domain, F>>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
279 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
280 Self::from_iter(iter.map(|μ| μ.iter_spikes()).flatten().cloned())
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
281 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
282 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
283
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
284 impl<Domain: Clone, F: Float> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
285 /// Computes `μ1 ← θ * μ1 - ζ * μ2`, pruning entries where both `μ1` (`self`) and `μ2` have
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
286 // zero weight. `μ2` will contain a pruned copy of pruned original `μ1` without arithmetic
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
287 /// performed. **This expects `self` and `μ2` to have matching coordinates in each index**.
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
288 // `μ2` can be than `self`, but not longer.
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
289 pub fn pruning_sub(&mut self, θ: F, ζ: F, μ2: &mut Self) {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
290 for δ in &self[μ2.len()..] {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
291 μ2.push(DeltaMeasure { x: δ.x.clone(), α: F::ZERO });
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
292 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
293 debug_assert_eq!(self.len(), μ2.len());
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
294 let mut dest = 0;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
295 for i in 0..self.len() {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
296 let α = self[i].α;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
297 let α_new = θ * α - ζ * μ2[i].α;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
298 if dest < i {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
299 μ2[dest] = DeltaMeasure { x: self[i].x.clone(), α };
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
300 self[dest] = DeltaMeasure { x: self[i].x.clone(), α: α_new };
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
301 } else {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
302 μ2[i].α = α;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
303 self[i].α = α_new;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
304 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
305 dest += 1;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
306 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
307 self.spikes.truncate(dest);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
308 μ2.spikes.truncate(dest);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
309 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
310 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
311
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
312 impl<Domain, F: Float> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
313 /// Prune all spikes with mass absolute value less than the given `tolerance`.
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
314 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
315 pub fn prune_approx(&mut self, tolerance: F) {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
316 self.spikes.retain(|δ| δ.α.abs() > tolerance);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
317 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
318 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
319
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
320 impl<Domain, F: Float + ToNalgebraRealField> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
321 /// Extracts the masses of the spikes as a [`DVector`].
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
322 pub fn masses_dvector(&self) -> DVector<F::MixedType> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
323 DVector::from_iterator(
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
324 self.len(),
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
325 self.iter_masses().map(|α| α.to_nalgebra_mixed()),
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
326 )
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
327 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
328
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
329 /// Sets the masses of the spikes from the values of a [`DVector`].
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
330 pub fn set_masses_dvector(&mut self, x: &DVector<F::MixedType>) {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
331 self.set_masses(x.iter().map(|&α| F::from_nalgebra_mixed(α)));
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
332 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
333
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
334 // /// Extracts the masses of the spikes as a [`Vec`].
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
335 // pub fn masses_vec(&self) -> Vec<F::MixedType> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
336 // self.iter_masses()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
337 // .map(|α| α.to_nalgebra_mixed())
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
338 // .collect()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
339 // }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
340
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
341 // /// Sets the masses of the spikes from the values of a [`Vec`].
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
342 // pub fn set_masses_vec(&mut self, x : &Vec<F::MixedType>) {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
343 // self.set_masses(x.iter().map(|&α| F::from_nalgebra_mixed(α)));
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
344 // }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
345 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
346
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
347 // impl<Domain, F :Num> Index<usize> for DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
348 // type Output = DeltaMeasure<Domain, F>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
349 // #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
350 // fn index(&self, i : usize) -> &Self::Output {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
351 // self.spikes.index(i)
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
352 // }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
353 // }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
354
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
355 // impl<Domain, F :Num> IndexMut<usize> for DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
356 // #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
357 // fn index_mut(&mut self, i : usize) -> &mut Self::Output {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
358 // self.spikes.index_mut(i)
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
359 // }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
360 // }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
361
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
362 impl<Domain, F: Num, I: std::slice::SliceIndex<[DeltaMeasure<Domain, F>]>> Index<I>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
363 for DiscreteMeasure<Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
364 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
365 type Output = <I as std::slice::SliceIndex<[DeltaMeasure<Domain, F>]>>::Output;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
366 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
367 fn index(&self, i: I) -> &Self::Output {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
368 self.spikes.index(i)
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
369 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
370 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
371
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
372 impl<Domain, F: Num, I: std::slice::SliceIndex<[DeltaMeasure<Domain, F>]>> IndexMut<I>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
373 for DiscreteMeasure<Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
374 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
375 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
376 fn index_mut(&mut self, i: I) -> &mut Self::Output {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
377 self.spikes.index_mut(i)
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
378 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
379 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
380
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
381 impl<Domain, F: Num, D: Into<DeltaMeasure<Domain, F>>, const K: usize> From<[D; K]>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
382 for DiscreteMeasure<Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
383 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
384 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
385 fn from(list: [D; K]) -> Self {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
386 list.into_iter().collect()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
387 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
388 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
389
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
390 impl<Domain, F: Num> From<Vec<DeltaMeasure<Domain, F>>> for DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
391 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
392 fn from(spikes: Vec<DeltaMeasure<Domain, F>>) -> Self {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
393 DiscreteMeasure { spikes }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
394 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
395 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
396
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
397 impl<'a, Domain, F: Num, D> From<&'a [D]> for DiscreteMeasure<Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
398 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
399 &'a D: Into<DeltaMeasure<Domain, F>>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
400 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
401 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
402 fn from(list: &'a [D]) -> Self {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
403 list.into_iter().map(|d| d.into()).collect()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
404 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
405 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
406
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
407 impl<Domain, F: Num> From<DeltaMeasure<Domain, F>> for DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
408 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
409 fn from(δ: DeltaMeasure<Domain, F>) -> Self {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
410 DiscreteMeasure { spikes: vec![δ] }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
411 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
412 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
413
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
414 impl<'a, Domain: Clone, F: Num> From<&'a DeltaMeasure<Domain, F>> for DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
415 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
416 fn from(δ: &'a DeltaMeasure<Domain, F>) -> Self {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
417 DiscreteMeasure { spikes: vec![δ.clone()] }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
418 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
419 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
420
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
421 impl<Domain, F: Num, D: Into<DeltaMeasure<Domain, F>>> FromIterator<D>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
422 for DiscreteMeasure<Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
423 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
424 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
425 fn from_iter<T>(iter: T) -> Self
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
426 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
427 T: IntoIterator<Item = D>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
428 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
429 DiscreteMeasure { spikes: iter.into_iter().map(|m| m.into()).collect() }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
430 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
431 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
432
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
433 impl<'a, F: Num, const N: usize> TableDump<'a> for DiscreteMeasure<Loc<N, F>, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
434 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
435 DeltaMeasure<Loc<N, F>, F>: Serialize + 'a,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
436 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
437 type Iter = std::slice::Iter<'a, DeltaMeasure<Loc<N, F>, F>>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
438
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
439 // fn tabledump_headers(&'a self) -> Vec<String> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
440 // let mut v : Vec<String> = (0..N).map(|i| format!("x{}", i)).collect();
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
441 // v.push("weight".into());
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
442 // v
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
443 // }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
444
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
445 fn tabledump_entries(&'a self) -> Self::Iter {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
446 // Ensure order matching the headers above
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
447 self.spikes.iter()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
448 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
449 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
450
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
451 // Need to manually implement serialisation for DeltaMeasure<Loc<N, F>, F> [`csv`] writer fails on
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
452 // structs with nested arrays as well as with #[serde(flatten)].
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
453 // Then derive no longer works for DiscreteMeasure
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
454 impl<F: Num, const N: usize> Serialize for DiscreteMeasure<Loc<N, F>, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
455 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
456 F: Serialize,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
457 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
458 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
459 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
460 S: Serializer,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
461 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
462 let mut s = serializer.serialize_seq(Some(self.spikes.len()))?;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
463 for δ in self.spikes.iter() {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
464 s.serialize_element(δ)?;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
465 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
466 s.end()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
467 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
468 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
469
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
470 impl<Domain: PartialEq, F: Float> Measure<F> for DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
471 type Domain = Domain;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
472 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
473
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
474 impl<Domain: PartialEq, F: Float> Norm<Radon, F> for DiscreteMeasure<Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
475 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
476 DeltaMeasure<Domain, F>: Norm<Radon, F>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
477 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
478 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
479 fn norm(&self, _: Radon) -> F {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
480 self.spikes.iter().map(|m| m.norm(Radon)).sum()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
481 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
482 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
483
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
484 impl<Domain, G, F: Num> Mapping<G> for DiscreteMeasure<Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
485 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
486 Domain: Space,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
487 G::Codomain: Sum + Mul<F, Output = G::Codomain>,
4
f248f9848c87 Remove unnecessary trait bounds in Mapping implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
488 G: Mapping<Domain, Codomain = F> + ClosedSpace,
0
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
489 for<'b> &'b Domain: Instance<Domain>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
490 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
491 type Codomain = G::Codomain;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
492
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
493 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
494 fn apply<I: Instance<G>>(&self, g: I) -> Self::Codomain {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
495 g.eval(|g| self.spikes.iter().map(|m| g.apply(&m.x) * m.α).sum())
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
496 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
497 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
498
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
499 impl<Domain, G, F: Num> Linear<G> for DiscreteMeasure<Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
500 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
501 Domain: Space,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
502 G::Codomain: Sum + Mul<F, Output = G::Codomain>,
4
f248f9848c87 Remove unnecessary trait bounds in Mapping implementation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
503 G: Mapping<Domain, Codomain = F> + ClosedSpace,
0
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
504 for<'b> &'b Domain: Instance<Domain>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
505 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
506 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
507
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
508 /// Helper trait for constructing arithmetic operations for combinations
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
509 /// of [`DiscreteMeasure`] and [`DeltaMeasure`], and their references.
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
510 trait Lift<F: Num, Domain> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
511 type Producer: Iterator<Item = DeltaMeasure<Domain, F>>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
512
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
513 #[allow(dead_code)]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
514 /// Lifts `self` into a [`DiscreteMeasure`].
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
515 fn lift(self) -> DiscreteMeasure<Domain, F>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
516
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
517 /// Lifts `self` into a [`DiscreteMeasure`], apply either `f` or `f_mut` whether the type
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
518 /// this method is implemented for is a reference or or not.
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
519 fn lift_with(
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
520 self,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
521 f: impl Fn(&DeltaMeasure<Domain, F>) -> DeltaMeasure<Domain, F>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
522 f_mut: impl FnMut(&mut DeltaMeasure<Domain, F>),
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
523 ) -> DiscreteMeasure<Domain, F>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
524
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
525 /// Extend `self` into a [`DiscreteMeasure`] with the spikes produced by `iter`.
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
526 fn lift_extend<I: Iterator<Item = DeltaMeasure<Domain, F>>>(
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
527 self,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
528 iter: I,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
529 ) -> DiscreteMeasure<Domain, F>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
530
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
531 /// Returns an iterator for producing copies of the spikes of `self`.
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
532 fn produce(self) -> Self::Producer;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
533 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
534
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
535 impl<F: Num, Domain> Lift<F, Domain> for DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
536 type Producer = std::vec::IntoIter<DeltaMeasure<Domain, F>>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
537
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
538 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
539 fn lift(self) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
540 self
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
541 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
542
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
543 fn lift_with(
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
544 mut self,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
545 _f: impl Fn(&DeltaMeasure<Domain, F>) -> DeltaMeasure<Domain, F>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
546 f_mut: impl FnMut(&mut DeltaMeasure<Domain, F>),
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
547 ) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
548 self.spikes.iter_mut().for_each(f_mut);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
549 self
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
550 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
551
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
552 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
553 fn lift_extend<I: Iterator<Item = DeltaMeasure<Domain, F>>>(
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
554 mut self,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
555 iter: I,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
556 ) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
557 self.spikes.extend(iter);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
558 self
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
559 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
560
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
561 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
562 fn produce(self) -> Self::Producer {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
563 self.spikes.into_iter()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
564 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
565 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
566
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
567 impl<'a, F: Num, Domain: Clone> Lift<F, Domain> for &'a DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
568 type Producer = MapF<std::slice::Iter<'a, DeltaMeasure<Domain, F>>, DeltaMeasure<Domain, F>>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
569
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
570 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
571 fn lift(self) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
572 self.clone()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
573 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
574
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
575 fn lift_with(
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
576 self,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
577 f: impl Fn(&DeltaMeasure<Domain, F>) -> DeltaMeasure<Domain, F>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
578 _f_mut: impl FnMut(&mut DeltaMeasure<Domain, F>),
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
579 ) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
580 DiscreteMeasure { spikes: self.spikes.iter().map(f).collect() }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
581 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
582
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
583 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
584 fn lift_extend<I: Iterator<Item = DeltaMeasure<Domain, F>>>(
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
585 self,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
586 iter: I,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
587 ) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
588 let mut res = self.clone();
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
589 res.spikes.extend(iter);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
590 res
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
591 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
592
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
593 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
594 fn produce(self) -> Self::Producer {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
595 // TODO: maybe not optimal to clone here and would benefit from
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
596 // a reference version of lift_extend.
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
597 self.spikes.iter().mapF(Clone::clone)
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
598 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
599 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
600
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
601 impl<F: Num, Domain> Lift<F, Domain> for DeltaMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
602 type Producer = std::iter::Once<DeltaMeasure<Domain, F>>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
603
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
604 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
605 fn lift(self) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
606 DiscreteMeasure { spikes: vec![self] }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
607 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
608
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
609 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
610 fn lift_with(
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
611 mut self,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
612 _f: impl Fn(&DeltaMeasure<Domain, F>) -> DeltaMeasure<Domain, F>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
613 mut f_mut: impl FnMut(&mut DeltaMeasure<Domain, F>),
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
614 ) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
615 f_mut(&mut self);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
616 DiscreteMeasure { spikes: vec![self] }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
617 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
618
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
619 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
620 fn lift_extend<I: Iterator<Item = DeltaMeasure<Domain, F>>>(
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
621 self,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
622 iter: I,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
623 ) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
624 let mut spikes = vec![self];
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
625 spikes.extend(iter);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
626 DiscreteMeasure { spikes: spikes }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
627 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
628
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
629 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
630 fn produce(self) -> Self::Producer {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
631 std::iter::once(self)
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
632 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
633 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
634
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
635 impl<'a, F: Num, Domain: Clone> Lift<F, Domain> for &'a DeltaMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
636 type Producer = std::iter::Once<DeltaMeasure<Domain, F>>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
637
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
638 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
639 fn lift(self) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
640 DiscreteMeasure { spikes: vec![self.clone()] }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
641 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
642
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
643 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
644 fn lift_with(
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
645 self,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
646 f: impl Fn(&DeltaMeasure<Domain, F>) -> DeltaMeasure<Domain, F>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
647 _f_mut: impl FnMut(&mut DeltaMeasure<Domain, F>),
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
648 ) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
649 DiscreteMeasure { spikes: vec![f(self)] }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
650 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
651
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
652 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
653 fn lift_extend<I: Iterator<Item = DeltaMeasure<Domain, F>>>(
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
654 self,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
655 iter: I,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
656 ) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
657 let mut spikes = vec![self.clone()];
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
658 spikes.extend(iter);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
659 DiscreteMeasure { spikes: spikes }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
660 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
661
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
662 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
663 fn produce(self) -> Self::Producer {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
664 std::iter::once(self.clone())
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
665 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
666 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
667
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
668 macro_rules! make_discrete_addsub_assign {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
669 ($rhs:ty) => {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
670 // Discrete += (&)Discrete
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
671 impl<'a, F: Num, Domain: Clone> AddAssign<$rhs> for DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
672 fn add_assign(&mut self, other: $rhs) {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
673 self.spikes.extend(other.produce());
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
674 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
675 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
676
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
677 impl<'a, F: Num + Neg<Output = F>, Domain: Clone> SubAssign<$rhs>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
678 for DiscreteMeasure<Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
679 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
680 fn sub_assign(&mut self, other: $rhs) {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
681 self.spikes.extend(other.produce().map(|δ| -δ));
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
682 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
683 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
684 };
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
685 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
686
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
687 make_discrete_addsub_assign!(DiscreteMeasure<Domain, F>);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
688 make_discrete_addsub_assign!(&'a DiscreteMeasure<Domain, F>);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
689 make_discrete_addsub_assign!(DeltaMeasure<Domain, F>);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
690 make_discrete_addsub_assign!(&'a DeltaMeasure<Domain, F>);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
691
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
692 macro_rules! make_discrete_addsub {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
693 ($lhs:ty, $rhs:ty, $alt_order:expr) => {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
694 impl<'a, 'b, F: Num, Domain: Clone> Add<$rhs> for $lhs {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
695 type Output = DiscreteMeasure<Domain, F>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
696 fn add(self, other: $rhs) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
697 if !$alt_order {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
698 self.lift_extend(other.produce())
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
699 } else {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
700 other.lift_extend(self.produce())
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
701 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
702 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
703 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
704
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
705 impl<'a, 'b, F: Num + Neg<Output = F>, Domain: Clone> Sub<$rhs> for $lhs {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
706 type Output = DiscreteMeasure<Domain, F>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
707 fn sub(self, other: $rhs) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
708 self.lift_extend(other.produce().map(|δ| -δ))
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
709 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
710 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
711 };
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
712 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
713
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
714 make_discrete_addsub!(DiscreteMeasure<Domain, F>, DiscreteMeasure<Domain, F>, false);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
715 make_discrete_addsub!(DiscreteMeasure<Domain, F>, &'b DiscreteMeasure<Domain, F>, false);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
716 make_discrete_addsub!(&'a DiscreteMeasure<Domain, F>, DiscreteMeasure<Domain, F>, true);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
717 make_discrete_addsub!(
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
718 &'a DiscreteMeasure<Domain, F>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
719 &'b DiscreteMeasure<Domain, F>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
720 false
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
721 );
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
722 make_discrete_addsub!(DeltaMeasure<Domain, F>, DiscreteMeasure<Domain, F>, false);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
723 make_discrete_addsub!(DeltaMeasure<Domain, F>, &'b DiscreteMeasure<Domain, F>, false);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
724 make_discrete_addsub!(&'a DeltaMeasure<Domain, F>, DiscreteMeasure<Domain, F>, true);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
725 make_discrete_addsub!(
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
726 &'a DeltaMeasure<Domain, F>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
727 &'b DiscreteMeasure<Domain, F>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
728 false
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
729 );
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
730 make_discrete_addsub!(DiscreteMeasure<Domain, F>, DeltaMeasure<Domain, F>, false);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
731 make_discrete_addsub!(DiscreteMeasure<Domain, F>, &'b DeltaMeasure<Domain, F>, false);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
732 make_discrete_addsub!(&'a DiscreteMeasure<Domain, F>, DeltaMeasure<Domain, F>, false);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
733 make_discrete_addsub!(
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
734 &'a DiscreteMeasure<Domain, F>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
735 &'b DeltaMeasure<Domain, F>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
736 false
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
737 );
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
738 make_discrete_addsub!(DeltaMeasure<Domain, F>, DeltaMeasure<Domain, F>, false);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
739 make_discrete_addsub!(DeltaMeasure<Domain, F>, &'b DeltaMeasure<Domain, F>, false);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
740 make_discrete_addsub!(&'a DeltaMeasure<Domain, F>, DeltaMeasure<Domain, F>, false);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
741 make_discrete_addsub!(
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
742 &'a DeltaMeasure<Domain, F>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
743 &'b DeltaMeasure<Domain, F>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
744 false
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
745 );
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
746
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
747 macro_rules! make_discrete_scalarop_rhs {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
748 ($trait:ident, $fn:ident, $trait_assign:ident, $fn_assign:ident) => {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
749 make_discrete_scalarop_rhs!(@assign DiscreteMeasure<Domain, F>, F, $trait_assign, $fn_assign);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
750 make_discrete_scalarop_rhs!(@assign DiscreteMeasure<Domain, F>, &'a F, $trait_assign, $fn_assign);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
751 make_discrete_scalarop_rhs!(@new DiscreteMeasure<Domain, F>, F, $trait, $fn, $fn_assign);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
752 make_discrete_scalarop_rhs!(@new DiscreteMeasure<Domain, F>, &'a F, $trait, $fn, $fn_assign);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
753 make_discrete_scalarop_rhs!(@new &'b DiscreteMeasure<Domain, F>, F, $trait, $fn, $fn_assign);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
754 make_discrete_scalarop_rhs!(@new &'b DiscreteMeasure<Domain, F>, &'a F, $trait, $fn, $fn_assign);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
755 };
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
756
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
757 (@assign $lhs:ty, $rhs:ty, $trait_assign:ident, $fn_assign:ident) => {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
758 impl<'a, 'b, F : Num, Domain> $trait_assign<$rhs> for $lhs {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
759 fn $fn_assign(&mut self, b : $rhs) {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
760 self.spikes.iter_mut().for_each(|δ| δ.$fn_assign(b));
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
761 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
762 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
763 };
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
764 (@new $lhs:ty, $rhs:ty, $trait:ident, $fn:ident, $fn_assign:ident) => {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
765 impl<'a, 'b, F : Num, Domain : Clone> $trait<$rhs> for $lhs {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
766 type Output = DiscreteMeasure<Domain, F>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
767 fn $fn(self, b : $rhs) -> Self::Output {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
768 self.lift_with(|δ| δ.$fn(b), |δ| δ.$fn_assign(b))
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
769 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
770 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
771 };
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
772 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
773
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
774 make_discrete_scalarop_rhs!(Mul, mul, MulAssign, mul_assign);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
775 make_discrete_scalarop_rhs!(Div, div, DivAssign, div_assign);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
776
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
777 macro_rules! make_discrete_unary {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
778 ($trait:ident, $fn:ident, $type:ty) => {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
779 impl<'a, F: Num + Neg<Output = F>, Domain: Clone> Neg for $type {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
780 type Output = DiscreteMeasure<Domain, F>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
781 fn $fn(self) -> Self::Output {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
782 self.lift_with(|δ| δ.$fn(), |δ| δ.α = δ.α.$fn())
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
783 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
784 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
785 };
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
786 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
787
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
788 make_discrete_unary!(Neg, neg, DiscreteMeasure<Domain, F>);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
789 make_discrete_unary!(Neg, neg, &'a DiscreteMeasure<Domain, F>);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
790
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
791 // impl<F : Num, Domain> Neg for DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
792 // type Output = Self;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
793 // fn $fn(mut self, b : F) -> Self {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
794 // self.lift().spikes.iter_mut().for_each(|δ| δ.neg(b));
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
795 // self
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
796 // }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
797 // }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
798
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
799 macro_rules! make_discrete_scalarop_lhs {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
800 ($trait:ident, $fn:ident; $($f:ident)+) => { $(
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
801 impl<Domain> $trait<DiscreteMeasure<Domain, $f>> for $f {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
802 type Output = DiscreteMeasure<Domain, $f>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
803 fn $fn(self, mut v : DiscreteMeasure<Domain, $f>) -> Self::Output {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
804 v.spikes.iter_mut().for_each(|δ| δ.α = self.$fn(δ.α));
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
805 v
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
806 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
807 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
808
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
809 impl<'a, Domain : Copy> $trait<&'a DiscreteMeasure<Domain, $f>> for $f {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
810 type Output = DiscreteMeasure<Domain, $f>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
811 fn $fn(self, v : &'a DiscreteMeasure<Domain, $f>) -> Self::Output {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
812 DiscreteMeasure{
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
813 spikes : v.spikes.iter().map(|δ| self.$fn(δ)).collect()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
814 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
815 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
816 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
817
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
818 impl<'b, Domain> $trait<DiscreteMeasure<Domain, $f>> for &'b $f {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
819 type Output = DiscreteMeasure<Domain, $f>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
820 fn $fn(self, mut v : DiscreteMeasure<Domain, $f>) -> Self::Output {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
821 v.spikes.iter_mut().for_each(|δ| δ.α = self.$fn(δ.α));
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
822 v
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
823 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
824 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
825
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
826 impl<'a, 'b, Domain : Copy> $trait<&'a DiscreteMeasure<Domain, $f>> for &'b $f {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
827 type Output = DiscreteMeasure<Domain, $f>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
828 fn $fn(self, v : &'a DiscreteMeasure<Domain, $f>) -> Self::Output {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
829 DiscreteMeasure{
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
830 spikes : v.spikes.iter().map(|δ| self.$fn(δ)).collect()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
831 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
832 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
833 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
834 )+ }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
835 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
836
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
837 make_discrete_scalarop_lhs!(Mul, mul; f32 f64 i8 i16 i32 i64 isize u8 u16 u32 u64 usize);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
838 make_discrete_scalarop_lhs!(Div, div; f32 f64 i8 i16 i32 i64 isize u8 u16 u32 u64 usize);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
839
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
840 impl<F: Num, Domain> Collection for DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
841 type Element = DeltaMeasure<Domain, F>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
842 type RefsIter<'a>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
843 = std::slice::Iter<'a, Self::Element>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
844 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
845 Self: 'a;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
846
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
847 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
848 fn iter_refs(&self) -> Self::RefsIter<'_> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
849 self.iter_spikes()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
850 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
851 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
852
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
853 impl<Domain: Clone, F: Num> Space for DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
854 type Principal = Self;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
855
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
856 type Decomp = MeasureDecomp;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
857 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
858
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
859 pub type SpikeSlice<'b, Domain, F> = &'b [DeltaMeasure<Domain, F>];
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
860
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
861 pub type EitherSlice<'b, Domain, F> =
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
862 EitherDecomp<Vec<DeltaMeasure<Domain, F>>, SpikeSlice<'b, Domain, F>>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
863
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
864 impl<F: Num, Domain: Clone> Decomposition<DiscreteMeasure<Domain, F>> for MeasureDecomp {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
865 type Decomposition<'b>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
866 = EitherSlice<'b, Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
867 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
868 DiscreteMeasure<Domain, F>: 'b;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
869 type Reference<'b>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
870 = SpikeSlice<'b, Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
871 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
872 DiscreteMeasure<Domain, F>: 'b;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
873
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
874 /// Left the lightweight reference type into a full decomposition type.
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
875 fn lift<'b>(r: Self::Reference<'b>) -> Self::Decomposition<'b> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
876 EitherDecomp::Borrowed(r)
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
877 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
878 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
879
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
880 impl<F: Num, Domain: Clone> Instance<DiscreteMeasure<Domain, F>, MeasureDecomp>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
881 for DiscreteMeasure<Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
882 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
883 fn eval_ref<'b, R>(&'b self, f: impl FnOnce(SpikeSlice<'b, Domain, F>) -> R) -> R
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
884 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
885 DiscreteMeasure<Domain, F>: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
886 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
887 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
888 f(self.spikes.as_slice())
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
889 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
890
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
891 fn cow<'b>(self) -> MyCow<'b, DiscreteMeasure<Domain, F>>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
892 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
893 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
894 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
895 MyCow::Owned(self)
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
896 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
897
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
898 fn own(self) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
899 self
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
900 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
901
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
902 fn decompose<'b>(self) -> EitherSlice<'b, Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
903 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
904 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
905 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
906 EitherDecomp::Owned(self.spikes)
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
907 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
908 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
909
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
910 impl<'a, F: Num, Domain: Clone> Instance<DiscreteMeasure<Domain, F>, MeasureDecomp>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
911 for &'a DiscreteMeasure<Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
912 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
913 fn eval_ref<'b, R>(&'b self, f: impl FnOnce(SpikeSlice<'b, Domain, F>) -> R) -> R
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
914 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
915 DiscreteMeasure<Domain, F>: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
916 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
917 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
918 f(self.spikes.as_slice())
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
919 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
920
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
921 fn cow<'b>(self) -> MyCow<'b, DiscreteMeasure<Domain, F>>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
922 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
923 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
924 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
925 MyCow::Borrowed(self)
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
926 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
927
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
928 fn own(self) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
929 self.clone()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
930 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
931
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
932 fn decompose<'b>(self) -> EitherSlice<'b, Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
933 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
934 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
935 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
936 EitherDecomp::Borrowed(self.spikes.as_slice())
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
937 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
938 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
939
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
940 impl<'a, F: Num, Domain: Clone> Instance<DiscreteMeasure<Domain, F>, MeasureDecomp>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
941 for EitherSlice<'a, Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
942 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
943 fn eval_ref<'b, R>(&'b self, f: impl FnOnce(SpikeSlice<'b, Domain, F>) -> R) -> R
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
944 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
945 DiscreteMeasure<Domain, F>: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
946 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
947 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
948 match self {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
949 EitherDecomp::Owned(v) => f(v.as_slice()),
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
950 EitherDecomp::Borrowed(s) => f(s),
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
951 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
952 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
953
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
954 fn cow<'b>(self) -> MyCow<'b, DiscreteMeasure<Domain, F>>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
955 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
956 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
957 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
958 MyCow::Owned(self.own())
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
959 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
960
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
961 fn own(self) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
962 match self {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
963 EitherDecomp::Owned(v) => v.into(),
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
964 EitherDecomp::Borrowed(s) => s.into(),
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
965 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
966 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
967
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
968 fn decompose<'b>(self) -> EitherSlice<'b, Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
969 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
970 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
971 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
972 self
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
973 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
974 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
975
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
976 impl<'a, F: Num, Domain: Clone> Instance<DiscreteMeasure<Domain, F>, MeasureDecomp>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
977 for &'a EitherSlice<'a, Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
978 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
979 fn eval_ref<'b, R>(&'b self, f: impl FnOnce(SpikeSlice<'b, Domain, F>) -> R) -> R
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
980 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
981 DiscreteMeasure<Domain, F>: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
982 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
983 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
984 match self {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
985 EitherDecomp::Owned(v) => f(v.as_slice()),
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
986 EitherDecomp::Borrowed(s) => f(s),
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
987 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
988 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
989
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
990 fn cow<'b>(self) -> MyCow<'b, DiscreteMeasure<Domain, F>>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
991 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
992 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
993 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
994 MyCow::Owned(self.own())
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
995 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
996
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
997 fn own(self) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
998 match self {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
999 EitherDecomp::Owned(v) => v.as_slice(),
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1000 EitherDecomp::Borrowed(s) => s,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1001 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1002 .into()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1003 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1004
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1005 fn decompose<'b>(self) -> EitherSlice<'b, Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1006 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1007 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1008 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1009 match self {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1010 EitherDecomp::Owned(v) => EitherDecomp::Borrowed(v.as_slice()),
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1011 EitherDecomp::Borrowed(s) => EitherDecomp::Borrowed(s),
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1012 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1013 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1014 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1015
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1016 impl<'a, F: Num, Domain: Clone> Instance<DiscreteMeasure<Domain, F>, MeasureDecomp>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1017 for SpikeSlice<'a, Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1018 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1019 fn eval_ref<'b, R>(&'b self, f: impl FnOnce(SpikeSlice<'b, Domain, F>) -> R) -> R
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1020 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1021 DiscreteMeasure<Domain, F>: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1022 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1023 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1024 f(self)
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1025 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1026
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1027 fn cow<'b>(self) -> MyCow<'b, DiscreteMeasure<Domain, F>>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1028 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1029 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1030 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1031 MyCow::Owned(self.own())
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1032 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1033
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1034 fn own(self) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1035 self.into()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1036 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1037
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1038 fn decompose<'b>(self) -> EitherSlice<'b, Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1039 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1040 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1041 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1042 EitherDecomp::Borrowed(self)
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1043 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1044 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1045
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1046 impl<'a, F: Num, Domain: Clone> Instance<DiscreteMeasure<Domain, F>, MeasureDecomp>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1047 for &'a SpikeSlice<'a, Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1048 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1049 fn eval_ref<'b, R>(&'b self, f: impl FnOnce(SpikeSlice<'b, Domain, F>) -> R) -> R
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1050 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1051 DiscreteMeasure<Domain, F>: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1052 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1053 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1054 f(*self)
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1055 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1056
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1057 fn cow<'b>(self) -> MyCow<'b, DiscreteMeasure<Domain, F>>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1058 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1059 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1060 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1061 MyCow::Owned(self.own())
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1062 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1063
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1064 fn own(self) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1065 (*self).into()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1066 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1067
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1068 fn decompose<'b>(self) -> EitherSlice<'b, Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1069 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1070 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1071 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1072 EitherDecomp::Borrowed(*self)
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1073 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1074 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1075
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1076 impl<F: Num, Domain: Clone> Instance<DiscreteMeasure<Domain, F>, MeasureDecomp>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1077 for DeltaMeasure<Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1078 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1079 fn eval_ref<'b, R>(&'b self, f: impl FnOnce(SpikeSlice<'b, Domain, F>) -> R) -> R
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1080 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1081 DiscreteMeasure<Domain, F>: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1082 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1083 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1084 f(std::slice::from_ref(self))
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1085 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1086
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1087 fn cow<'b>(self) -> MyCow<'b, DiscreteMeasure<Domain, F>>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1088 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1089 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1090 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1091 MyCow::Owned(self.own())
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1092 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1093
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1094 fn own(self) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1095 self.into()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1096 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1097
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1098 fn decompose<'b>(self) -> EitherSlice<'b, Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1099 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1100 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1101 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1102 EitherDecomp::Owned(vec![self])
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1103 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1104 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1105
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1106 impl<'a, F: Num, Domain: Clone> Instance<DiscreteMeasure<Domain, F>, MeasureDecomp>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1107 for &'a DeltaMeasure<Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1108 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1109 fn eval_ref<'b, R>(&'b self, f: impl FnOnce(SpikeSlice<'b, Domain, F>) -> R) -> R
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1110 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1111 DiscreteMeasure<Domain, F>: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1112 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1113 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1114 f(std::slice::from_ref(*self))
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1115 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1116
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1117 fn cow<'b>(self) -> MyCow<'b, DiscreteMeasure<Domain, F>>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1118 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1119 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1120 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1121 MyCow::Owned(self.own())
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1122 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1123
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1124 fn own(self) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1125 self.into()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1126 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1127
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1128 fn decompose<'b>(self) -> EitherSlice<'b, Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1129 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1130 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1131 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1132 EitherDecomp::Borrowed(std::slice::from_ref(self))
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1133 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1134 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1135
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1136 impl<F, Domain> Normed<F> for DiscreteMeasure<Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1137 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1138 F: Float,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1139 Domain: Clone + PartialEq,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1140 DeltaMeasure<Domain, F>: Norm<Radon, F>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1141 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1142 type NormExp = Radon;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1143
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1144 fn norm_exponent(&self) -> Radon {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1145 Radon
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1146 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1147 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1148
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1149 self_ownable!(DiscreteMeasure<Domain, F> where Domain: Clone, F: Num);

mercurial