src/discrete.rs

Thu, 04 Dec 2025 14:36:22 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Thu, 04 Dec 2025 14:36:22 -0500
changeset 3
fbdee8e4a78d
parent 0
e8f3b6c55ce7
child 4
f248f9848c87
permissions
-rw-r--r--

Added padded_iter to the Python interface, to deal with Fenics quirks

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
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
140 /// Prune all spikes with zero mass.
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
141 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
142 pub fn prune(&mut self) {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
143 self.prune_by(|δ| δ.α != F::ZERO);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
144 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
145
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
146 /// Prune spikes by the predicate `g`.
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_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
149 self.spikes.retain(g);
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 /// 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
153 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
154 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
155 self.spikes.extend(iter);
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 a spike to the 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 push(&mut self, δ: DeltaMeasure<Domain, F>) {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
161 self.spikes.push(δ);
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 /// 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
165 /// to have equal locations of same spike indices.
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
166 pub fn both_matching<'a>(
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
167 &'a self,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
168 other: &'a DiscreteMeasure<Domain, F>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
169 ) -> impl Iterator<Item = (F, F, &'a Domain)> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
170 let m = self.len().max(other.len());
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
171 self.iter_spikes()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
172 .map(Some)
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
173 .chain(std::iter::repeat(None))
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
174 .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
175 .take(m)
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
176 .map(|(oδ, orδ)| {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
177 match (oδ, orδ) {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
178 (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
179 (Some(δ), None) => (δ.α, F::ZERO, &δ.x),
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
180 (None, Some(rδ)) => (F::ZERO, rδ.α, &rδ.x),
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
181 (None, None) => panic!("This cannot happen!"),
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
182 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
183 })
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
184 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
185
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
186 /// 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
187 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
188 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
189 Domain: Clone,
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 self.both_matching(other)
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
192 .map(|(α, β, x)| (x.clone(), α - β))
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
193 .collect()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
194 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
195
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
196 /// 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
197 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
198 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
199 Domain: Clone,
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 self.both_matching(other)
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
202 .map(|(α, β, x)| (x.clone(), α + β))
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
203 .collect()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
204 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
205
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
206 /// 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
207 /// assuming equal locations of same spike indices.
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
208 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
209 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
210 F: Float,
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 self.both_matching(other)
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
213 .map(|(α, β, _)| (α - β).abs())
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
214 .sum()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
215 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
216 }
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 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
219 type Item = DeltaMeasure<Domain, F>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
220 type IntoIter = std::vec::IntoIter<DeltaMeasure<Domain, F>>;
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 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
223 fn into_iter(self) -> Self::IntoIter {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
224 self.spikes.into_iter()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
225 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
226 }
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 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
229 type Item = &'a DeltaMeasure<Domain, F>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
230 type IntoIter = SpikeIter<'a, Domain, F>;
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 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
233 fn into_iter(self) -> Self::IntoIter {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
234 self.spikes.iter()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
235 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
236 }
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 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
239 // Required method
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
240 fn sum<I>(iter: I) -> Self
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
241 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
242 I: Iterator<Item = DeltaMeasure<Domain, F>>,
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 Self::from_iter(iter)
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
245 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
246 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
247
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
248 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
249 // Required method
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
250 fn sum<I>(iter: I) -> Self
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
251 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
252 I: Iterator<Item = &'a DeltaMeasure<Domain, F>>,
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 Self::from_iter(iter.cloned())
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
255 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
256 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
257
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
258 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
259 // Required method
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
260 fn sum<I>(iter: I) -> Self
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
261 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
262 I: Iterator<Item = DiscreteMeasure<Domain, F>>,
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 Self::from_iter(iter.map(|μ| μ.into_iter()).flatten())
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
265 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
266 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
267
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
268 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
269 // Required method
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
270 fn sum<I>(iter: I) -> Self
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
271 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
272 I: Iterator<Item = &'a DiscreteMeasure<Domain, F>>,
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 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
275 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
276 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
277
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
278 impl<Domain: Clone, F: Float> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
279 /// 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
280 // 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
281 /// 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
282 // `μ2` can be than `self`, but not longer.
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
283 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
284 for δ in &self[μ2.len()..] {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
285 μ2.push(DeltaMeasure { x: δ.x.clone(), α: F::ZERO });
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
286 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
287 debug_assert_eq!(self.len(), μ2.len());
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
288 let mut dest = 0;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
289 for i in 0..self.len() {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
290 let α = self[i].α;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
291 let α_new = θ * α - ζ * μ2[i].α;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
292 if dest < i {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
293 μ2[dest] = DeltaMeasure { x: self[i].x.clone(), α };
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
294 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
295 } else {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
296 μ2[i].α = α;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
297 self[i].α = α_new;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
298 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
299 dest += 1;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
300 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
301 self.spikes.truncate(dest);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
302 μ2.spikes.truncate(dest);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
303 }
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
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
306 impl<Domain, F: Float> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
307 /// 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
308 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
309 pub fn prune_approx(&mut self, tolerance: F) {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
310 self.spikes.retain(|δ| δ.α.abs() > tolerance);
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 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
313
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
314 impl<Domain, F: Float + ToNalgebraRealField> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
315 /// 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
316 pub fn masses_dvector(&self) -> DVector<F::MixedType> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
317 DVector::from_iterator(
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
318 self.len(),
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
319 self.iter_masses().map(|α| α.to_nalgebra_mixed()),
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
320 )
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
321 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
322
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
323 /// 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
324 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
325 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
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 // /// 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
329 // pub fn masses_vec(&self) -> Vec<F::MixedType> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
330 // self.iter_masses()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
331 // .map(|α| α.to_nalgebra_mixed())
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
332 // .collect()
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
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
335 // /// 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
336 // 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
337 // 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
338 // }
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 // 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
342 // type Output = DeltaMeasure<Domain, F>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
343 // #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
344 // fn index(&self, i : usize) -> &Self::Output {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
345 // self.spikes.index(i)
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 // }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
348
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
349 // 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
350 // #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
351 // 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
352 // self.spikes.index_mut(i)
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
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
356 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
357 for DiscreteMeasure<Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
358 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
359 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
360 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
361 fn index(&self, i: I) -> &Self::Output {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
362 self.spikes.index(i)
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
363 }
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
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
366 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
367 for DiscreteMeasure<Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
368 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
369 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
370 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
371 self.spikes.index_mut(i)
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
372 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
373 }
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 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
376 for DiscreteMeasure<Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
377 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
378 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
379 fn from(list: [D; K]) -> Self {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
380 list.into_iter().collect()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
381 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
382 }
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 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
385 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
386 fn from(spikes: Vec<DeltaMeasure<Domain, F>>) -> Self {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
387 DiscreteMeasure { spikes }
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
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
391 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
392 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
393 &'a D: Into<DeltaMeasure<Domain, F>>,
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 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
396 fn from(list: &'a [D]) -> Self {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
397 list.into_iter().map(|d| d.into()).collect()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
398 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
399 }
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 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
402 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
403 fn from(δ: DeltaMeasure<Domain, F>) -> Self {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
404 DiscreteMeasure { spikes: vec![δ] }
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
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
408 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
409 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
410 fn from(δ: &'a DeltaMeasure<Domain, F>) -> Self {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
411 DiscreteMeasure { spikes: vec![δ.clone()] }
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
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
415 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
416 for DiscreteMeasure<Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
417 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
418 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
419 fn from_iter<T>(iter: T) -> Self
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
420 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
421 T: IntoIterator<Item = D>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
422 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
423 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
424 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
425 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
426
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
427 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
428 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
429 DeltaMeasure<Loc<N, F>, F>: Serialize + 'a,
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 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
432
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
433 // fn tabledump_headers(&'a self) -> Vec<String> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
434 // 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
435 // v.push("weight".into());
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
436 // v
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
437 // }
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_entries(&'a self) -> Self::Iter {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
440 // Ensure order matching the headers above
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
441 self.spikes.iter()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
442 }
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 // 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
446 // 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
447 // Then derive no longer works for DiscreteMeasure
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
448 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
449 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
450 F: Serialize,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
451 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
452 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
453 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
454 S: Serializer,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
455 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
456 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
457 for δ in self.spikes.iter() {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
458 s.serialize_element(δ)?;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
459 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
460 s.end()
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 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
463
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
464 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
465 type Domain = Domain;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
466 }
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 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
469 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
470 DeltaMeasure<Domain, F>: Norm<Radon, F>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
471 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
472 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
473 fn norm(&self, _: Radon) -> F {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
474 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
475 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
476 }
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 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
479 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
480 Domain: Space,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
481 G::Codomain: Sum + Mul<F, Output = G::Codomain>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
482 G: Mapping<Domain, Codomain = F> + Clone + ClosedSpace,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
483 for<'b> &'b Domain: Instance<Domain>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
484 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
485 type Codomain = G::Codomain;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
486
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
487 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
488 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
489 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
490 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
491 }
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 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
494 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
495 Domain: Space,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
496 G::Codomain: Sum + Mul<F, Output = G::Codomain>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
497 G: Mapping<Domain, Codomain = F> + Clone + ClosedSpace,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
498 for<'b> &'b Domain: Instance<Domain>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
499 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
500 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
501
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
502 /// Helper trait for constructing arithmetic operations for combinations
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
503 /// of [`DiscreteMeasure`] and [`DeltaMeasure`], and their references.
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
504 trait Lift<F: Num, Domain> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
505 type Producer: Iterator<Item = DeltaMeasure<Domain, F>>;
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 #[allow(dead_code)]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
508 /// Lifts `self` into a [`DiscreteMeasure`].
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
509 fn lift(self) -> DiscreteMeasure<Domain, F>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
510
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
511 /// 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
512 /// 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
513 fn lift_with(
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
514 self,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
515 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
516 f_mut: impl FnMut(&mut DeltaMeasure<Domain, F>),
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
517 ) -> DiscreteMeasure<Domain, F>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
518
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
519 /// 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
520 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
521 self,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
522 iter: I,
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 /// 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
526 fn produce(self) -> Self::Producer;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
527 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
528
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
529 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
530 type Producer = std::vec::IntoIter<DeltaMeasure<Domain, F>>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
531
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
532 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
533 fn lift(self) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
534 self
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
535 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
536
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
537 fn lift_with(
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
538 mut self,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
539 _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
540 f_mut: impl FnMut(&mut DeltaMeasure<Domain, F>),
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
541 ) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
542 self.spikes.iter_mut().for_each(f_mut);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
543 self
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
544 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
545
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
546 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
547 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
548 mut self,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
549 iter: I,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
550 ) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
551 self.spikes.extend(iter);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
552 self
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
553 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
554
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
555 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
556 fn produce(self) -> Self::Producer {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
557 self.spikes.into_iter()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
558 }
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 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
562 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
563
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
564 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
565 fn lift(self) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
566 self.clone()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
567 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
568
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
569 fn lift_with(
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
570 self,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
571 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
572 _f_mut: impl FnMut(&mut DeltaMeasure<Domain, F>),
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
573 ) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
574 DiscreteMeasure { spikes: self.spikes.iter().map(f).collect() }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
575 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
576
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
577 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
578 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
579 self,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
580 iter: I,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
581 ) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
582 let mut res = self.clone();
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
583 res.spikes.extend(iter);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
584 res
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
585 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
586
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
587 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
588 fn produce(self) -> Self::Producer {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
589 // 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
590 // a reference version of lift_extend.
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
591 self.spikes.iter().mapF(Clone::clone)
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 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
594
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
595 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
596 type Producer = std::iter::Once<DeltaMeasure<Domain, F>>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
597
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
598 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
599 fn lift(self) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
600 DiscreteMeasure { spikes: vec![self] }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
601 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
602
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
603 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
604 fn lift_with(
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
605 mut self,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
606 _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
607 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
608 ) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
609 f_mut(&mut self);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
610 DiscreteMeasure { spikes: vec![self] }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
611 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
612
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
613 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
614 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
615 self,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
616 iter: I,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
617 ) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
618 let mut spikes = vec![self];
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
619 spikes.extend(iter);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
620 DiscreteMeasure { spikes: spikes }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
621 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
622
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
623 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
624 fn produce(self) -> Self::Producer {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
625 std::iter::once(self)
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
626 }
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 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
630 type Producer = std::iter::Once<DeltaMeasure<Domain, F>>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
631
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
632 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
633 fn lift(self) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
634 DiscreteMeasure { spikes: vec![self.clone()] }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
635 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
636
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
637 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
638 fn lift_with(
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
639 self,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
640 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
641 _f_mut: impl FnMut(&mut DeltaMeasure<Domain, F>),
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
642 ) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
643 DiscreteMeasure { spikes: vec![f(self)] }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
644 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
645
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
646 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
647 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
648 self,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
649 iter: I,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
650 ) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
651 let mut spikes = vec![self.clone()];
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
652 spikes.extend(iter);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
653 DiscreteMeasure { spikes: spikes }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
654 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
655
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
656 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
657 fn produce(self) -> Self::Producer {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
658 std::iter::once(self.clone())
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
659 }
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 macro_rules! make_discrete_addsub_assign {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
663 ($rhs:ty) => {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
664 // Discrete += (&)Discrete
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
665 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
666 fn add_assign(&mut self, other: $rhs) {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
667 self.spikes.extend(other.produce());
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
668 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
669 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
670
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
671 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
672 for DiscreteMeasure<Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
673 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
674 fn sub_assign(&mut self, other: $rhs) {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
675 self.spikes.extend(other.produce().map(|δ| -δ));
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 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
678 };
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
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
681 make_discrete_addsub_assign!(DiscreteMeasure<Domain, F>);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
682 make_discrete_addsub_assign!(&'a DiscreteMeasure<Domain, F>);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
683 make_discrete_addsub_assign!(DeltaMeasure<Domain, F>);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
684 make_discrete_addsub_assign!(&'a DeltaMeasure<Domain, F>);
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 macro_rules! make_discrete_addsub {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
687 ($lhs:ty, $rhs:ty, $alt_order:expr) => {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
688 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
689 type Output = DiscreteMeasure<Domain, F>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
690 fn add(self, other: $rhs) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
691 if !$alt_order {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
692 self.lift_extend(other.produce())
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
693 } else {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
694 other.lift_extend(self.produce())
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
695 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
696 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
697 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
698
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
699 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
700 type Output = DiscreteMeasure<Domain, F>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
701 fn sub(self, other: $rhs) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
702 self.lift_extend(other.produce().map(|δ| -δ))
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 };
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
706 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
707
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
708 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
709 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
710 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
711 make_discrete_addsub!(
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
712 &'a DiscreteMeasure<Domain, F>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
713 &'b DiscreteMeasure<Domain, F>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
714 false
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
715 );
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
716 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
717 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
718 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
719 make_discrete_addsub!(
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
720 &'a DeltaMeasure<Domain, F>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
721 &'b DiscreteMeasure<Domain, F>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
722 false
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
723 );
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
724 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
725 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
726 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
727 make_discrete_addsub!(
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
728 &'a DiscreteMeasure<Domain, F>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
729 &'b DeltaMeasure<Domain, F>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
730 false
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
731 );
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
732 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
733 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
734 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
735 make_discrete_addsub!(
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
736 &'a DeltaMeasure<Domain, F>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
737 &'b DeltaMeasure<Domain, F>,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
738 false
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
739 );
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
740
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
741 macro_rules! make_discrete_scalarop_rhs {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
742 ($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
743 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
744 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
745 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
746 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
747 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
748 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
749 };
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
750
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
751 (@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
752 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
753 fn $fn_assign(&mut self, b : $rhs) {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
754 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
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 };
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
758 (@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
759 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
760 type Output = DiscreteMeasure<Domain, F>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
761 fn $fn(self, b : $rhs) -> Self::Output {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
762 self.lift_with(|δ| δ.$fn(b), |δ| δ.$fn_assign(b))
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 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
765 };
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
766 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
767
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
768 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
769 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
770
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
771 macro_rules! make_discrete_unary {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
772 ($trait:ident, $fn:ident, $type:ty) => {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
773 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
774 type Output = DiscreteMeasure<Domain, F>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
775 fn $fn(self) -> Self::Output {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
776 self.lift_with(|δ| δ.$fn(), |δ| δ.α = δ.α.$fn())
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
777 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
778 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
779 };
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
780 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
781
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
782 make_discrete_unary!(Neg, neg, DiscreteMeasure<Domain, F>);
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
783 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
784
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
785 // 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
786 // type Output = Self;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
787 // fn $fn(mut self, b : F) -> Self {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
788 // 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
789 // self
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 // }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
792
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
793 macro_rules! make_discrete_scalarop_lhs {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
794 ($trait:ident, $fn:ident; $($f:ident)+) => { $(
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
795 impl<Domain> $trait<DiscreteMeasure<Domain, $f>> for $f {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
796 type Output = DiscreteMeasure<Domain, $f>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
797 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
798 v.spikes.iter_mut().for_each(|δ| δ.α = self.$fn(δ.α));
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
799 v
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
800 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
801 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
802
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
803 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
804 type Output = DiscreteMeasure<Domain, $f>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
805 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
806 DiscreteMeasure{
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
807 spikes : v.spikes.iter().map(|δ| self.$fn(δ)).collect()
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 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
810 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
811
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
812 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
813 type Output = DiscreteMeasure<Domain, $f>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
814 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
815 v.spikes.iter_mut().for_each(|δ| δ.α = self.$fn(δ.α));
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
816 v
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 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
819
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
820 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
821 type Output = DiscreteMeasure<Domain, $f>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
822 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
823 DiscreteMeasure{
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
824 spikes : v.spikes.iter().map(|δ| self.$fn(δ)).collect()
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 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
827 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
828 )+ }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
829 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
830
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
831 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
832 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
833
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
834 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
835 type Element = DeltaMeasure<Domain, F>;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
836 type RefsIter<'a>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
837 = std::slice::Iter<'a, Self::Element>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
838 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
839 Self: 'a;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
840
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
841 #[inline]
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
842 fn iter_refs(&self) -> Self::RefsIter<'_> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
843 self.iter_spikes()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
844 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
845 }
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 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
848 type Principal = Self;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
849
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
850 type Decomp = MeasureDecomp;
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 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
854
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
855 pub type EitherSlice<'b, Domain, F> =
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
856 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
857
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
858 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
859 type Decomposition<'b>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
860 = EitherSlice<'b, Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
861 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
862 DiscreteMeasure<Domain, F>: 'b;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
863 type Reference<'b>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
864 = SpikeSlice<'b, Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
865 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
866 DiscreteMeasure<Domain, F>: 'b;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
867
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
868 /// 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
869 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
870 EitherDecomp::Borrowed(r)
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
871 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
872 }
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 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
875 for DiscreteMeasure<Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
876 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
877 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
878 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
879 DiscreteMeasure<Domain, F>: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
880 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
881 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
882 f(self.spikes.as_slice())
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
883 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
884
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
885 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
886 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
887 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
888 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
889 MyCow::Owned(self)
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
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
892 fn own(self) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
893 self
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
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
896 fn decompose<'b>(self) -> EitherSlice<'b, Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
897 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
898 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
899 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
900 EitherDecomp::Owned(self.spikes)
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 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
903
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
904 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
905 for &'a DiscreteMeasure<Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
906 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
907 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
908 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
909 DiscreteMeasure<Domain, F>: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
910 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
911 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
912 f(self.spikes.as_slice())
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
913 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
914
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
915 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
916 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
917 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
918 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
919 MyCow::Borrowed(self)
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
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
922 fn own(self) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
923 self.clone()
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
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
926 fn decompose<'b>(self) -> EitherSlice<'b, Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
927 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
928 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
929 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
930 EitherDecomp::Borrowed(self.spikes.as_slice())
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 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
933
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
934 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
935 for EitherSlice<'a, Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
936 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
937 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
938 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
939 DiscreteMeasure<Domain, F>: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
940 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
941 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
942 match self {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
943 EitherDecomp::Owned(v) => f(v.as_slice()),
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
944 EitherDecomp::Borrowed(s) => f(s),
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
945 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
946 }
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 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
949 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
950 Self: 'b,
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 MyCow::Owned(self.own())
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
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
955 fn own(self) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
956 match self {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
957 EitherDecomp::Owned(v) => v.into(),
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
958 EitherDecomp::Borrowed(s) => s.into(),
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
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
962 fn decompose<'b>(self) -> EitherSlice<'b, Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
963 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
964 Self: 'b,
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 self
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 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
969
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
970 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
971 for &'a EitherSlice<'a, Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
972 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
973 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
974 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
975 DiscreteMeasure<Domain, F>: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
976 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
977 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
978 match self {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
979 EitherDecomp::Owned(v) => f(v.as_slice()),
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
980 EitherDecomp::Borrowed(s) => f(s),
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
981 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
982 }
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 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
985 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
986 Self: 'b,
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 MyCow::Owned(self.own())
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
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
991 fn own(self) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
992 match self {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
993 EitherDecomp::Owned(v) => v.as_slice(),
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
994 EitherDecomp::Borrowed(s) => s,
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 .into()
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
997 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
998
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
999 fn decompose<'b>(self) -> EitherSlice<'b, Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1000 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1001 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1002 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1003 match self {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1004 EitherDecomp::Owned(v) => EitherDecomp::Borrowed(v.as_slice()),
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1005 EitherDecomp::Borrowed(s) => EitherDecomp::Borrowed(s),
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1006 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1007 }
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
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1010 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
1011 for SpikeSlice<'a, Domain, F>
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 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
1014 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1015 DiscreteMeasure<Domain, F>: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1016 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1017 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1018 f(self)
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1019 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1020
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1021 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
1022 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1023 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1024 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1025 MyCow::Owned(self.own())
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
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1028 fn own(self) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1029 self.into()
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
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1032 fn decompose<'b>(self) -> EitherSlice<'b, Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1033 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1034 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1035 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1036 EitherDecomp::Borrowed(self)
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 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1039
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1040 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
1041 for &'a SpikeSlice<'a, Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1042 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1043 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
1044 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1045 DiscreteMeasure<Domain, F>: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1046 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1047 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1048 f(*self)
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1049 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1050
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1051 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
1052 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1053 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1054 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1055 MyCow::Owned(self.own())
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
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1058 fn own(self) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1059 (*self).into()
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
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1062 fn decompose<'b>(self) -> EitherSlice<'b, Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1063 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1064 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1065 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1066 EitherDecomp::Borrowed(*self)
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 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1069
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1070 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
1071 for DeltaMeasure<Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1072 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1073 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
1074 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1075 DiscreteMeasure<Domain, F>: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1076 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1077 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1078 f(std::slice::from_ref(self))
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1079 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1080
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1081 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
1082 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1083 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1084 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1085 MyCow::Owned(self.own())
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
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1088 fn own(self) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1089 self.into()
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
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1092 fn decompose<'b>(self) -> EitherSlice<'b, Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1093 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1094 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1095 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1096 EitherDecomp::Owned(vec![self])
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 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1099
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1100 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
1101 for &'a DeltaMeasure<Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1102 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1103 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
1104 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1105 DiscreteMeasure<Domain, F>: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1106 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1107 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1108 f(std::slice::from_ref(*self))
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1109 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1110
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1111 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
1112 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1113 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1114 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1115 MyCow::Owned(self.own())
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
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1118 fn own(self) -> DiscreteMeasure<Domain, F> {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1119 self.into()
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
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1122 fn decompose<'b>(self) -> EitherSlice<'b, Domain, F>
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1123 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1124 Self: 'b,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1125 {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1126 EitherDecomp::Borrowed(std::slice::from_ref(self))
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 }
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1129
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1130 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
1131 where
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1132 F: Float,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1133 Domain: Clone + PartialEq,
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1134 DeltaMeasure<Domain, F>: Norm<Radon, F>,
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 type NormExp = Radon;
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1137
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1138 fn norm_exponent(&self) -> Radon {
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1139 Radon
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1140 }
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
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1143 self_ownable!(DiscreteMeasure<Domain, F> where Domain: Clone, F: Num);

mercurial