Wed, 22 Apr 2026 23:52:52 -0500
Bump required alg_tools version
|
0
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
1 | /*! |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
2 | This module implementes delta measures, i.e., single spikes $\alpha \delta_x$ for some |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
3 | location $x$ and mass $\alpha$. |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
4 | */ |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
5 | |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
6 | use super::base::*; |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
7 | use alg_tools::instance::{ClosedSpace, Instance, Space}; |
|
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::norms::Norm; |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
11 | use alg_tools::self_ownable; |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
12 | use alg_tools::types::*; |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
13 | use serde::ser::{Serialize, SerializeStruct, Serializer}; |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
14 | use std::ops::{Div, DivAssign, Mul, MulAssign, Neg}; |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
15 | |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
16 | /// Representation of a delta measure. |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
17 | /// |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
18 | /// This is a single spike $\alpha \delta\_x$ for some location $x$ in `Domain` and |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
19 | /// a mass $\alpha$ in `F`. |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
20 | #[derive(Clone, Copy, Debug)] |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
21 | pub struct DeltaMeasure<Domain, F: Num> { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
22 | // This causes [`csv`] to crash. |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
23 | //#[serde(flatten)] |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
24 | /// Location of the spike |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
25 | pub x: Domain, |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
26 | /// Mass of the spike |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
27 | pub α: F, |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
28 | } |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
29 | |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
30 | const COORDINATE_NAMES: &'static [&'static str] = &["x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7"]; |
|
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 | // Need to manually implement serialisation as [`csv`] writer fails on |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
33 | // 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
|
34 | impl<F: Num, const N: usize> Serialize for DeltaMeasure<Loc<N, F>, F> |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
35 | where |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
36 | F: Serialize, |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
37 | { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
38 | 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
|
39 | where |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
40 | S: Serializer, |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
41 | { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
42 | assert!(N <= COORDINATE_NAMES.len()); |
|
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 | let mut s = serializer.serialize_struct("DeltaMeasure", N + 1)?; |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
45 | for (i, e) in (0..).zip(self.x.iter()) { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
46 | s.serialize_field(COORDINATE_NAMES[i], e)?; |
|
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 | s.serialize_field("weight", &self.α)?; |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
49 | s.end() |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
50 | } |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
51 | } |
|
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 | impl<Domain, F: Float> Measure<F> for DeltaMeasure<Domain, F> { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
54 | type Domain = Domain; |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
55 | } |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
56 | |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
57 | impl<Domain, F: Float> Norm<Radon, F> for DeltaMeasure<Domain, F> { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
58 | #[inline] |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
59 | fn norm(&self, _: Radon) -> F { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
60 | self.α.abs() |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
61 | } |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
62 | } |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
63 | |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
64 | // impl<Domain : PartialEq, F : Float> Dist<Radon, F> for DeltaMeasure<Domain, F> { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
65 | // #[inline] |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
66 | // fn dist(&self, other : &Self, _ : Radon) -> F { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
67 | // if self.x == other. x { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
68 | // (self.α - other.α).abs() |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
69 | // } else { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
70 | // self.α.abs() + other.α.abs() |
|
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 | // } |
|
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 | |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
75 | impl<Domain, G, F: Num> Mapping<G> for DeltaMeasure<Domain, F> |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
76 | where |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
77 | Domain: Space, |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
78 | G::Codomain: Mul<F, Output = G::Codomain>, |
|
4
f248f9848c87
Remove unnecessary trait bounds in Mapping implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
0
diff
changeset
|
79 | G: Mapping<Domain> + ClosedSpace, |
|
0
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
80 | for<'b> &'b Domain: Instance<Domain>, |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
81 | { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
82 | type Codomain = G::Codomain; |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
83 | |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
84 | #[inline] |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
85 | 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
|
86 | g.eval(|g̃| g̃.apply(&self.x) * self.α) |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
87 | } |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
88 | } |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
89 | |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
90 | impl<Domain, G, F: Num> Linear<G> for DeltaMeasure<Domain, F> |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
91 | where |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
92 | Domain: Space, |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
93 | G::Codomain: Mul<F, Output = G::Codomain>, |
|
4
f248f9848c87
Remove unnecessary trait bounds in Mapping implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
0
diff
changeset
|
94 | G: Mapping<Domain> + ClosedSpace, |
|
0
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
95 | for<'b> &'b Domain: Instance<Domain>, |
|
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 | |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
99 | // /// Partial blanket implementation of [`DeltaMeasure`] as a linear functional of [`Mapping`]s. |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
100 | // /// A full blanket implementation is not possible due to annoying Rust limitations: only [`Apply`] |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
101 | // /// on a reference is implemented, but a consuming [`Apply`] has to be implemented on a case-by-case |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
102 | // /// basis, not because an implementation could not be written, but because the Rust trait system |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
103 | // /// chokes up. |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
104 | // impl<Domain, G, F : Num, V> Linear<G> for DeltaMeasure<Domain, F> |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
105 | // where G: for<'a> Apply<&'a Domain, Output = V>, |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
106 | // V : Mul<F>, |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
107 | // Self: Apply<G, Output = <V as Mul<F>>::Output> { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
108 | // type Codomain = <V as Mul<F>>::Output; |
|
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 | |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
111 | // impl<'b, Domain, G, F : Num, V> Apply<&'b G> for DeltaMeasure<Domain, F> |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
112 | // where G: for<'a> Apply<&'a Domain, Output = V>, |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
113 | // V : Mul<F> { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
114 | // type Output = <V as Mul<F>>::Output; |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
115 | |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
116 | // #[inline] |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
117 | // fn apply(&self, g : &'b G) -> Self::Output { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
118 | // g.apply(&self.x) * self.α |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
119 | // } |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
120 | // } |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
121 | |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
122 | // /// Implementation of the necessary apply for BTFNs |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
123 | // mod btfn_apply { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
124 | // use super::*; |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
125 | // use alg_tools::bisection_tree::{BTFN, BTImpl, SupportGenerator, LocalAnalysis}; |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
126 | |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
127 | // impl<F : Float, BT, G, V, const N : usize> Apply<BTFN<F, G, BT, N>> |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
128 | // for DeltaMeasure<Loc<N, F>, F> |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
129 | // where BT : BTImpl< N, F>, |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
130 | // G : SupportGenerator< N, F, Id=BT::Data>, |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
131 | // G::SupportType : LocalAnalysis<F, BT::Agg, N> + for<'a> Apply<&'a Loc<N, F>, Output = V>, |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
132 | // V : std::iter::Sum + Mul<F> { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
133 | |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
134 | // type Output = <V as Mul<F>>::Output; |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
135 | |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
136 | // #[inline] |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
137 | // fn apply(&self, g : BTFN<F, G, BT, N>) -> Self::Output { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
138 | // g.apply(&self.x) * self.α |
|
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 | // } |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
141 | // } |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
142 | |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
143 | impl<D, Domain, F: Num> From<(D, F)> for DeltaMeasure<Domain, F> |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
144 | where |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
145 | D: Into<Domain>, |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
146 | { |
|
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 | fn from((x, α): (D, F)) -> Self { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
149 | DeltaMeasure { x: x.into(), α: α } |
|
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 | |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
153 | impl<'a, Domain: Clone, F: Num> From<&'a DeltaMeasure<Domain, F>> for DeltaMeasure<Domain, F> { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
154 | #[inline] |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
155 | fn from(d: &'a DeltaMeasure<Domain, F>) -> Self { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
156 | d.clone() |
|
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 | } |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
159 | |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
160 | impl<Domain, F: Num> DeltaMeasure<Domain, F> { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
161 | /// Set the mass of the spike. |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
162 | #[inline] |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
163 | pub fn set_mass(&mut self, α: F) { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
164 | self.α = α |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
165 | } |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
166 | |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
167 | /// Set the location of the spike. |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
168 | #[inline] |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
169 | pub fn set_location(&mut self, x: Domain) { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
170 | self.x = x |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
171 | } |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
172 | |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
173 | /// Get the mass of the spike. |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
174 | #[inline] |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
175 | pub fn get_mass(&self) -> F { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
176 | self.α |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
177 | } |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
178 | |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
179 | /// Get a mutable reference to the mass of the spike. |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
180 | #[inline] |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
181 | pub fn get_mass_mut(&mut self) -> &mut F { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
182 | &mut self.α |
|
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 | /// Get a reference to the location of the spike. |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
186 | #[inline] |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
187 | pub fn get_location(&self) -> &Domain { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
188 | &self.x |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
189 | } |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
190 | |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
191 | /// Get a mutable reference to the location of the spike. |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
192 | #[inline] |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
193 | pub fn get_location_mut(&mut self) -> &mut Domain { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
194 | &mut self.x |
|
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 | } |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
197 | |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
198 | impl<Domain, F: Num> IntoIterator for DeltaMeasure<Domain, F> { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
199 | type Item = Self; |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
200 | type IntoIter = std::iter::Once<Self>; |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
201 | |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
202 | #[inline] |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
203 | fn into_iter(self) -> Self::IntoIter { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
204 | std::iter::once(self) |
|
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 | } |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
207 | |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
208 | impl<'a, Domain, F: Num> IntoIterator for &'a DeltaMeasure<Domain, F> { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
209 | type Item = Self; |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
210 | type IntoIter = std::iter::Once<Self>; |
|
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 | #[inline] |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
213 | fn into_iter(self) -> Self::IntoIter { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
214 | std::iter::once(self) |
|
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 | macro_rules! make_delta_scalarop_rhs { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
219 | ($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
|
220 | impl<F: Num, Domain> $trait<F> for DeltaMeasure<Domain, F> { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
221 | type Output = Self; |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
222 | fn $fn(mut self, b: F) -> Self { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
223 | self.α.$fn_assign(b); |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
224 | self |
|
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, F: Num, Domain> $trait<&'a F> for DeltaMeasure<Domain, F> { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
229 | type Output = Self; |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
230 | fn $fn(mut self, b: &'a F) -> Self { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
231 | self.α.$fn_assign(*b); |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
232 | self |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
233 | } |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
234 | } |
|
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 | impl<'b, F: Num, Domain: Clone> $trait<F> for &'b DeltaMeasure<Domain, F> { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
237 | type Output = DeltaMeasure<Domain, F>; |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
238 | fn $fn(self, b: F) -> Self::Output { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
239 | DeltaMeasure { α: self.α.$fn(b), x: self.x.clone() } |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
240 | } |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
241 | } |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
242 | |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
243 | impl<'a, 'b, F: Num, Domain: Clone> $trait<&'a F> for &'b DeltaMeasure<Domain, F> { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
244 | type Output = DeltaMeasure<Domain, F>; |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
245 | fn $fn(self, b: &'a F) -> Self::Output { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
246 | DeltaMeasure { α: self.α.$fn(*b), x: self.x.clone() } |
|
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 | } |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
249 | |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
250 | impl<F: Num, Domain> $trait_assign<F> for DeltaMeasure<Domain, F> { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
251 | fn $fn_assign(&mut self, b: F) { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
252 | self.α.$fn_assign(b) |
|
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 | } |
|
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 | impl<'a, F: Num, Domain> $trait_assign<&'a F> for DeltaMeasure<Domain, F> { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
257 | fn $fn_assign(&mut self, b: &'a F) { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
258 | self.α.$fn_assign(*b) |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
259 | } |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
260 | } |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
261 | }; |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
262 | } |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
263 | |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
264 | make_delta_scalarop_rhs!(Mul, mul, MulAssign, mul_assign); |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
265 | make_delta_scalarop_rhs!(Div, div, DivAssign, div_assign); |
|
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 | macro_rules! make_delta_scalarop_lhs { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
268 | ($trait:ident, $fn:ident; $($f:ident)+) => { $( |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
269 | impl<Domain> $trait<DeltaMeasure<Domain, $f>> for $f { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
270 | type Output = DeltaMeasure<Domain, $f>; |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
271 | fn $fn(self, mut δ : DeltaMeasure<Domain, $f>) -> Self::Output { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
272 | δ.α = self.$fn(δ.α); |
|
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 | } |
|
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 | impl<'a, Domain : Clone> $trait<&'a DeltaMeasure<Domain, $f>> for $f { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
278 | type Output = DeltaMeasure<Domain, $f>; |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
279 | fn $fn(self, δ : &'a DeltaMeasure<Domain, $f>) -> Self::Output { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
280 | DeltaMeasure{ x : δ.x.clone(), α : self.$fn(δ.α) } |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
281 | } |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
282 | } |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
283 | |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
284 | impl<'b, Domain> $trait<DeltaMeasure<Domain, $f>> for &'b $f { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
285 | type Output = DeltaMeasure<Domain, $f>; |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
286 | fn $fn(self, mut δ : DeltaMeasure<Domain, $f>) -> Self::Output { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
287 | δ.α = self.$fn(δ.α); |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
288 | δ |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
289 | } |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
290 | } |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
291 | |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
292 | impl<'a, 'b, Domain : Clone> $trait<&'a DeltaMeasure<Domain, $f>> for &'b $f { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
293 | type Output = DeltaMeasure<Domain, $f>; |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
294 | fn $fn(self, δ : &'a DeltaMeasure<Domain, $f>) -> Self::Output { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
295 | DeltaMeasure{ x : δ.x.clone(), α : self.$fn(δ.α) } |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
296 | } |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
297 | } |
|
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 | } |
|
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 | make_delta_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
|
302 | make_delta_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
|
303 | |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
304 | macro_rules! make_delta_unary { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
305 | ($trait:ident, $fn:ident, $type:ty) => { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
306 | 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
|
307 | type Output = DeltaMeasure<Domain, F>; |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
308 | fn $fn(self) -> Self::Output { |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
309 | let mut tmp = self.clone(); |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
310 | tmp.α = tmp.α.$fn(); |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
311 | tmp |
|
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 | }; |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
315 | } |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
316 | |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
317 | make_delta_unary!(Neg, neg, DeltaMeasure<Domain, F>); |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
318 | make_delta_unary!(Neg, neg, &'a DeltaMeasure<Domain, F>); |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
319 | |
|
e8f3b6c55ce7
Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff
changeset
|
320 | self_ownable!(DeltaMeasure<Domain, F> where Domain: Clone, F: Num); |