--- a/src/measures/delta.rs Thu Jan 23 23:35:28 2025 +0100 +++ b/src/measures/delta.rs Mon Jan 06 21:37:03 2025 -0500 @@ -6,7 +6,7 @@ use super::base::*; use crate::types::*; use std::ops::{Div, Mul, DivAssign, MulAssign, Neg}; -use serde::ser::{Serialize, Serializer, SerializeStruct}; +use serde::{Serialize, Deserialize}; use alg_tools::norms::Norm; use alg_tools::linops::{Mapping, Linear}; use alg_tools::instance::{Instance, Space}; @@ -15,7 +15,7 @@ /// /// This is a single spike $\alpha \delta\_x$ for some location $x$ in `Domain` and /// a mass $\alpha$ in `F`. -#[derive(Clone,Copy,Debug)] +#[derive(Clone,Copy,Debug,Serialize,Deserialize)] pub struct DeltaMeasure<Domain, F : Num> { // This causes [`csv`] to crash. //#[serde(flatten)] @@ -25,32 +25,6 @@ pub α : F } -const COORDINATE_NAMES : &'static [&'static str] = &[ - "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7" -]; - -// Need to manually implement serialisation as [`csv`] writer fails on -// structs with nested arrays as well as with #[serde(flatten)]. -impl<F : Num, const N : usize> Serialize for DeltaMeasure<Loc<F, N>, F> -where - F: Serialize, -{ - fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> - where - S: Serializer, - { - assert!(N <= COORDINATE_NAMES.len()); - - let mut s = serializer.serialize_struct("DeltaMeasure", N+1)?; - for (i, e) in (0..).zip(self.x.iter()) { - s.serialize_field(COORDINATE_NAMES[i], e)?; - } - s.serialize_field("weight", &self.α)?; - s.end() - } -} - - impl<Domain, F : Float> Measure<F> for DeltaMeasure<Domain, F> { type Domain = Domain; }