src/measures/delta.rs

branch
dev
changeset 38
0f59c0d02e13
parent 35
b087e3eab191
equal deleted inserted replaced
37:c5d8bd1a7728 38:0f59c0d02e13
4 */ 4 */
5 5
6 use super::base::*; 6 use super::base::*;
7 use crate::types::*; 7 use crate::types::*;
8 use std::ops::{Div, Mul, DivAssign, MulAssign, Neg}; 8 use std::ops::{Div, Mul, DivAssign, MulAssign, Neg};
9 use serde::ser::{Serialize, Serializer, SerializeStruct}; 9 use serde::{Serialize, Deserialize};
10 use alg_tools::norms::Norm; 10 use alg_tools::norms::Norm;
11 use alg_tools::linops::{Mapping, Linear}; 11 use alg_tools::linops::{Mapping, Linear};
12 use alg_tools::instance::{Instance, Space}; 12 use alg_tools::instance::{Instance, Space};
13 13
14 /// Representation of a delta measure. 14 /// Representation of a delta measure.
15 /// 15 ///
16 /// This is a single spike $\alpha \delta\_x$ for some location $x$ in `Domain` and 16 /// This is a single spike $\alpha \delta\_x$ for some location $x$ in `Domain` and
17 /// a mass $\alpha$ in `F`. 17 /// a mass $\alpha$ in `F`.
18 #[derive(Clone,Copy,Debug)] 18 #[derive(Clone,Copy,Debug,Serialize,Deserialize)]
19 pub struct DeltaMeasure<Domain, F : Num> { 19 pub struct DeltaMeasure<Domain, F : Num> {
20 // This causes [`csv`] to crash. 20 // This causes [`csv`] to crash.
21 //#[serde(flatten)] 21 //#[serde(flatten)]
22 /// Location of the spike 22 /// Location of the spike
23 pub x : Domain, 23 pub x : Domain,
24 /// Mass of the spike 24 /// Mass of the spike
25 pub α : F 25 pub α : F
26 } 26 }
27
28 const COORDINATE_NAMES : &'static [&'static str] = &[
29 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7"
30 ];
31
32 // Need to manually implement serialisation as [`csv`] writer fails on
33 // structs with nested arrays as well as with #[serde(flatten)].
34 impl<F : Num, const N : usize> Serialize for DeltaMeasure<Loc<F, N>, F>
35 where
36 F: Serialize,
37 {
38 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
39 where
40 S: Serializer,
41 {
42 assert!(N <= COORDINATE_NAMES.len());
43
44 let mut s = serializer.serialize_struct("DeltaMeasure", N+1)?;
45 for (i, e) in (0..).zip(self.x.iter()) {
46 s.serialize_field(COORDINATE_NAMES[i], e)?;
47 }
48 s.serialize_field("weight", &self.α)?;
49 s.end()
50 }
51 }
52
53 27
54 impl<Domain, F : Float> Measure<F> for DeltaMeasure<Domain, F> { 28 impl<Domain, F : Float> Measure<F> for DeltaMeasure<Domain, F> {
55 type Domain = Domain; 29 type Domain = Domain;
56 } 30 }
57 31

mercurial