From a7dde93df8446f03b85750a817f5f855409c4aa5 Mon Sep 17 00:00:00 2001 From: Vinzent Steinberg Date: Wed, 11 Jul 2018 12:54:37 +0200 Subject: [PATCH] More idiomatic serde support * Follow the suggestions from the Serde docs. * Rename the feature from `serde` to `serde1`. * Fix a doctest. * Mention the feature in the README. --- Cargo.toml | 10 +++++----- README.md | 9 +++++++++ src/lib.rs | 5 +++-- src/minmax.rs | 4 ++-- src/moments/kurtosis.rs | 2 +- src/moments/mean.rs | 2 +- src/moments/mod.rs | 9 ++++++--- src/moments/skewness.rs | 2 +- src/moments/variance.rs | 2 +- src/quantile.rs | 2 +- src/weighted_mean.rs | 2 +- tests/moments.rs | 2 +- 12 files changed, 32 insertions(+), 19 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 5dc513f..fd7c2b6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,6 +10,9 @@ readme = "README.md" repository = "https://github.com/vks/average" version = "0.8.0" +[features] +serde1 = ["serde", "serde_derive"] + [[bench]] harness = false name = "mean" @@ -26,16 +29,13 @@ name = "kurtosis" num-traits = "0.2" num-integer = "0.1" float-ord = "0.2" +serde = { version = "1", optional = true } +serde_derive = { version = "1", optional = true } [dependencies.conv] default-features = false version = "0.3" -[dependencies.serde] -features = ["derive"] -optional = true -version = "1" - [dev-dependencies] bencher = "0.1" rand = "0.5" diff --git a/README.md b/README.md index 71e70e6..156824f 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,7 @@ easily parallelized by using `merge`. [Latest Version]: https://img.shields.io/crates/v/average.svg [crates.io]: https://crates.io/crates/average + ## Implemented statistics * Mean and its error. @@ -24,6 +25,14 @@ easily parallelized by using `merge`. * Quantile. * Histogram. + +## Crate features + +The following optional feature is available: + +* `serde1` enables serialization, via Serde version 1. + + ## Related Projects * [`quantiles`](https://crates.io/crates/quantiles): diff --git a/src/lib.rs b/src/lib.rs index 7e67416..1326b48 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -89,9 +89,10 @@ extern crate conv; extern crate float_ord; -#[cfg(feature = "serde")] -#[macro_use] +#[cfg(feature = "serde1")] extern crate serde; +#[cfg(feature = "serde1")] +#[macro_use] extern crate serde_derive; extern crate num_traits; extern crate num_integer; diff --git a/src/minmax.rs b/src/minmax.rs index db1b609..f9b43b3 100644 --- a/src/minmax.rs +++ b/src/minmax.rs @@ -24,7 +24,7 @@ fn max(a: f64, b: f64) -> f64 { /// println!("The minimum is {}.", a.min()); /// ``` #[derive(Debug, Clone)] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))] pub struct Min { x: f64, } @@ -104,7 +104,7 @@ impl Merge for Min { /// assert_eq!(a.max(), 5.); /// ``` #[derive(Debug, Clone)] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))] pub struct Max { x: f64, } diff --git a/src/moments/kurtosis.rs b/src/moments/kurtosis.rs index acdc9d0..d2c1690 100644 --- a/src/moments/kurtosis.rs +++ b/src/moments/kurtosis.rs @@ -3,7 +3,7 @@ /// /// This can be used to estimate the standard error of the mean. #[derive(Debug, Clone)] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))] pub struct Kurtosis { /// Estimator of mean, variance and skewness. avg: Skewness, diff --git a/src/moments/mean.rs b/src/moments/mean.rs index 70ec5e3..6fd6d8c 100644 --- a/src/moments/mean.rs +++ b/src/moments/mean.rs @@ -10,7 +10,7 @@ /// println!("The mean is {}.", a.mean()); /// ``` #[derive(Debug, Clone)] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))] pub struct Mean { /// Mean value. avg: f64, diff --git a/src/moments/mod.rs b/src/moments/mod.rs index 034262a..397d131 100644 --- a/src/moments/mod.rs +++ b/src/moments/mod.rs @@ -32,6 +32,10 @@ pub type MeanWithError = Variance; /// # extern crate conv; /// # extern crate num_integer; /// # extern crate num_traits; +/// #[cfg(feature = "serde1")] +/// extern crate serde; +/// #[cfg(feature = "serde1")] +/// #[macro_use] extern crate serde_derive; /// # #[macro_use] extern crate average; /// # fn main() { /// define_moments!(Moments4, 4); @@ -65,7 +69,7 @@ macro_rules! define_moments { /// Estimate the first N moments of a sequence of numbers a sequence of numbers /// ("population"). #[derive(Debug, Clone)] - #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] + #[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))] pub struct $name { /// Number of samples. /// @@ -126,13 +130,12 @@ macro_rules! define_moments { #[inline] pub fn standardized_moment(&self, p: usize) -> f64 { match p { - 0 => n, + 0 => f64::approx_from(self.n).unwrap(), 1 => 0., 2 => 1., _ => { let variance = self.central_moment(2); assert_ne!(variance, 0.); - let n = f64::approx_from(self.n).unwrap(); self.central_moment(p) / pow(variance.sqrt(), p) }, } diff --git a/src/moments/skewness.rs b/src/moments/skewness.rs index 29af9d8..59ae515 100644 --- a/src/moments/skewness.rs +++ b/src/moments/skewness.rs @@ -3,7 +3,7 @@ /// /// This can be used to estimate the standard error of the mean. #[derive(Debug, Clone)] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))] pub struct Skewness { /// Estimator of mean and variance. avg: MeanWithError, diff --git a/src/moments/variance.rs b/src/moments/variance.rs index 29ee966..cb79013 100644 --- a/src/moments/variance.rs +++ b/src/moments/variance.rs @@ -13,7 +13,7 @@ /// println!("The mean is {} ± {}.", a.mean(), a.error()); /// ``` #[derive(Debug, Clone)] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))] pub struct Variance { /// Estimator of average. avg: Mean, diff --git a/src/quantile.rs b/src/quantile.rs index 8724ddb..cf2f03b 100644 --- a/src/quantile.rs +++ b/src/quantile.rs @@ -15,7 +15,7 @@ use super::Estimate; // This uses the P² algorithm introduced here: // http://www.cs.wustl.edu/~jain/papers/ftp/psqr.pdf #[derive(Debug, Clone)] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))] pub struct Quantile { /// Marker heights. q: [f64; 5], diff --git a/src/weighted_mean.rs b/src/weighted_mean.rs index 1aa56c5..914b123 100644 --- a/src/weighted_mean.rs +++ b/src/weighted_mean.rs @@ -17,7 +17,7 @@ use super::{MeanWithError, Estimate, Merge}; /// println!("The weighted mean is {}.", a.mean()); /// ``` #[derive(Debug, Clone)] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))] pub struct WeightedMean { /// Sum of the weights. weight_sum: f64, diff --git a/tests/moments.rs b/tests/moments.rs index 85d60a7..67949aa 100644 --- a/tests/moments.rs +++ b/tests/moments.rs @@ -59,7 +59,7 @@ fn simple_serde() { let a: Moments4 = (1..6).map(f64::from).collect(); let b = serde_json::to_string(&a).unwrap(); assert_eq!(&b, "{\"n\":5,\"avg\":3.0,\"m\":[10.0,1.7763568394002506e-15,34.00000000000001]}"); - let mut c: Moments = serde_json::from_str(&b).unwrap(); + let mut c: Moments4 = serde_json::from_str(&b).unwrap(); assert_eq!(c.len(), 5); assert_eq!(c.mean(), 3.0); assert_eq!(c.central_moment(0), 1.0);