src/delta.rs

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

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

Add truncate

0
e8f3b6c55ce7 Initialise repository, separating measure from pointsource_algs
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1 /*!
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);

mercurial