From e0d46f430be0f7016a4816665fabaa6b9318a6fd Mon Sep 17 00:00:00 2001 From: Ben Cross Date: Sun, 17 Jan 2021 21:35:03 +0000 Subject: [PATCH 1/4] feat: Make SerDe optional --- Cargo.toml | 3 +-- src/algorithm/neighbour/cover_tree.rs | 10 ++++++---- src/algorithm/neighbour/linear_search.rs | 5 +++-- src/algorithm/neighbour/mod.rs | 8 +++++--- src/cluster/dbscan.rs | 5 +++-- src/cluster/kmeans.rs | 5 +++-- src/decomposition/pca.rs | 5 +++-- src/decomposition/svd.rs | 5 +++-- src/ensemble/random_forest_classifier.rs | 8 +++++--- src/ensemble/random_forest_regressor.rs | 8 +++++--- src/error/mod.rs | 8 +++++--- src/linalg/naive/dense_matrix.rs | 7 ++++++- src/linear/elastic_net.rs | 8 +++++--- src/linear/lasso.rs | 8 +++++--- src/linear/linear_regression.rs | 11 +++++++---- src/linear/logistic_regression.rs | 8 +++++--- src/linear/ridge_regression.rs | 11 +++++++---- src/math/distance/euclidian.rs | 5 +++-- src/math/distance/hamming.rs | 5 +++-- src/math/distance/mahalanobis.rs | 5 +++-- src/math/distance/manhattan.rs | 5 +++-- src/math/distance/minkowski.rs | 5 +++-- src/metrics/accuracy.rs | 5 +++-- src/metrics/auc.rs | 5 +++-- src/metrics/cluster_hcv.rs | 5 +++-- src/metrics/f1.rs | 5 +++-- src/metrics/mean_absolute_error.rs | 5 +++-- src/metrics/mean_squared_error.rs | 5 +++-- src/metrics/precision.rs | 5 +++-- src/metrics/r2.rs | 5 +++-- src/metrics/recall.rs | 5 +++-- src/naive_bayes/bernoulli.rs | 11 +++++++---- src/naive_bayes/categorical.rs | 11 +++++++---- src/naive_bayes/gaussian.rs | 11 +++++++---- src/naive_bayes/mod.rs | 5 +++-- src/naive_bayes/multinomial.rs | 11 +++++++---- src/neighbors/knn_classifier.rs | 8 +++++--- src/neighbors/knn_regressor.rs | 8 +++++--- src/neighbors/mod.rs | 5 +++-- src/svm/mod.rs | 14 +++++++++----- src/svm/svc.rs | 15 +++++++++------ src/svm/svr.rs | 15 +++++++++------ src/tree/decision_tree_classifier.rs | 14 +++++++++----- src/tree/decision_tree_regressor.rs | 11 +++++++---- 44 files changed, 206 insertions(+), 126 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 5e21aef..d941735 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,8 +25,7 @@ num-traits = "0.2.12" num = "0.3.0" rand = "0.7.3" rand_distr = "0.3.0" -serde = { version = "1.0.115", features = ["derive"] } -serde_derive = "1.0.115" +serde = { version = "1.0.115", features = ["derive"], optional = true } [dev-dependencies] criterion = "0.3" diff --git a/src/algorithm/neighbour/cover_tree.rs b/src/algorithm/neighbour/cover_tree.rs index d271ed6..553dc99 100644 --- a/src/algorithm/neighbour/cover_tree.rs +++ b/src/algorithm/neighbour/cover_tree.rs @@ -24,7 +24,7 @@ //! ``` use std::fmt::Debug; -use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::algorithm::sort::heap_select::HeapSelection; use crate::error::{Failed, FailedError}; @@ -32,7 +32,8 @@ use crate::math::distance::Distance; use crate::math::num::RealNumber; /// Implements Cover Tree algorithm -#[derive(Serialize, Deserialize, Debug)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug)] pub struct CoverTree> { base: F, inv_log_base: F, @@ -56,7 +57,8 @@ impl> PartialEq for CoverTree { } } -#[derive(Debug, Serialize, Deserialize)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug)] struct Node { idx: usize, max_dist: F, @@ -65,7 +67,7 @@ struct Node { scale: i64, } -#[derive(Debug, Serialize, Deserialize)] +#[derive(Debug)] struct DistanceSet { idx: usize, dist: Vec, diff --git a/src/algorithm/neighbour/linear_search.rs b/src/algorithm/neighbour/linear_search.rs index 45fbd6f..d82e575 100644 --- a/src/algorithm/neighbour/linear_search.rs +++ b/src/algorithm/neighbour/linear_search.rs @@ -22,7 +22,7 @@ //! //! ``` -use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use std::cmp::{Ordering, PartialOrd}; use std::marker::PhantomData; @@ -32,7 +32,8 @@ use crate::math::distance::Distance; use crate::math::num::RealNumber; /// Implements Linear Search algorithm, see [KNN algorithms](../index.html) -#[derive(Serialize, Deserialize, Debug)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug)] pub struct LinearKNNSearch> { distance: D, data: Vec, diff --git a/src/algorithm/neighbour/mod.rs b/src/algorithm/neighbour/mod.rs index bf9e669..9e432bd 100644 --- a/src/algorithm/neighbour/mod.rs +++ b/src/algorithm/neighbour/mod.rs @@ -35,7 +35,7 @@ use crate::algorithm::neighbour::linear_search::LinearKNNSearch; use crate::error::Failed; use crate::math::distance::Distance; use crate::math::num::RealNumber; -use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; pub(crate) mod bbd_tree; /// tree data structure for fast nearest neighbor search @@ -45,7 +45,8 @@ pub mod linear_search; /// Both, KNN classifier and regressor benefits from underlying search algorithms that helps to speed up queries. /// `KNNAlgorithmName` maintains a list of supported search algorithms, see [KNN algorithms](../algorithm/neighbour/index.html) -#[derive(Serialize, Deserialize, Debug, Clone)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug, Clone)] pub enum KNNAlgorithmName { /// Heap Search algorithm, see [`LinearSearch`](../algorithm/neighbour/linear_search/index.html) LinearSearch, @@ -53,7 +54,8 @@ pub enum KNNAlgorithmName { CoverTree, } -#[derive(Serialize, Deserialize, Debug)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug)] pub(crate) enum KNNAlgorithm, T>> { LinearSearch(LinearKNNSearch, T, D>), CoverTree(CoverTree, T, D>), diff --git a/src/cluster/dbscan.rs b/src/cluster/dbscan.rs index c793039..a117982 100644 --- a/src/cluster/dbscan.rs +++ b/src/cluster/dbscan.rs @@ -43,7 +43,7 @@ use std::fmt::Debug; use std::iter::Sum; -use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::algorithm::neighbour::{KNNAlgorithm, KNNAlgorithmName}; use crate::api::{Predictor, UnsupervisedEstimator}; @@ -55,7 +55,8 @@ use crate::math::num::RealNumber; use crate::tree::decision_tree_classifier::which_max; /// DBSCAN clustering algorithm -#[derive(Serialize, Deserialize, Debug)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug)] pub struct DBSCAN, T>> { cluster_labels: Vec, num_classes: usize, diff --git a/src/cluster/kmeans.rs b/src/cluster/kmeans.rs index 44ce1e6..78c9105 100644 --- a/src/cluster/kmeans.rs +++ b/src/cluster/kmeans.rs @@ -56,7 +56,7 @@ use rand::Rng; use std::fmt::Debug; use std::iter::Sum; -use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::algorithm::neighbour::bbd_tree::BBDTree; use crate::api::{Predictor, UnsupervisedEstimator}; @@ -66,7 +66,8 @@ use crate::math::distance::euclidian::*; use crate::math::num::RealNumber; /// K-Means clustering algorithm -#[derive(Serialize, Deserialize, Debug)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug)] pub struct KMeans { k: usize, y: Vec, diff --git a/src/decomposition/pca.rs b/src/decomposition/pca.rs index 189e6de..626f268 100644 --- a/src/decomposition/pca.rs +++ b/src/decomposition/pca.rs @@ -47,7 +47,7 @@ //! use std::fmt::Debug; -use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::api::{Transformer, UnsupervisedEstimator}; use crate::error::Failed; @@ -55,7 +55,8 @@ use crate::linalg::Matrix; use crate::math::num::RealNumber; /// Principal components analysis algorithm -#[derive(Serialize, Deserialize, Debug)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug)] pub struct PCA> { eigenvectors: M, eigenvalues: Vec, diff --git a/src/decomposition/svd.rs b/src/decomposition/svd.rs index 595e93c..7dc48dc 100644 --- a/src/decomposition/svd.rs +++ b/src/decomposition/svd.rs @@ -46,7 +46,7 @@ use std::fmt::Debug; use std::marker::PhantomData; -use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::api::{Transformer, UnsupervisedEstimator}; use crate::error::Failed; @@ -54,7 +54,8 @@ use crate::linalg::Matrix; use crate::math::num::RealNumber; /// SVD -#[derive(Serialize, Deserialize, Debug)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug)] pub struct SVD> { components: M, phantom: PhantomData, diff --git a/src/ensemble/random_forest_classifier.rs b/src/ensemble/random_forest_classifier.rs index 49c4239..74f210c 100644 --- a/src/ensemble/random_forest_classifier.rs +++ b/src/ensemble/random_forest_classifier.rs @@ -49,7 +49,7 @@ use std::default::Default; use std::fmt::Debug; use rand::Rng; -use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::api::{Predictor, SupervisedEstimator}; use crate::error::Failed; @@ -61,7 +61,8 @@ use crate::tree::decision_tree_classifier::{ /// Parameters of the Random Forest algorithm. /// Some parameters here are passed directly into base estimator. -#[derive(Serialize, Deserialize, Debug, Clone)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug, Clone)] pub struct RandomForestClassifierParameters { /// Split criteria to use when building a tree. See [Decision Tree Classifier](../../tree/decision_tree_classifier/index.html) pub criterion: SplitCriterion, @@ -78,7 +79,8 @@ pub struct RandomForestClassifierParameters { } /// Random Forest Classifier -#[derive(Serialize, Deserialize, Debug)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug)] pub struct RandomForestClassifier { parameters: RandomForestClassifierParameters, trees: Vec>, diff --git a/src/ensemble/random_forest_regressor.rs b/src/ensemble/random_forest_regressor.rs index fdeb9fc..74a1b59 100644 --- a/src/ensemble/random_forest_regressor.rs +++ b/src/ensemble/random_forest_regressor.rs @@ -47,7 +47,7 @@ use std::default::Default; use std::fmt::Debug; use rand::Rng; -use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::api::{Predictor, SupervisedEstimator}; use crate::error::Failed; @@ -57,7 +57,8 @@ use crate::tree::decision_tree_regressor::{ DecisionTreeRegressor, DecisionTreeRegressorParameters, }; -#[derive(Serialize, Deserialize, Debug, Clone)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug, Clone)] /// Parameters of the Random Forest Regressor /// Some parameters here are passed directly into base estimator. pub struct RandomForestRegressorParameters { @@ -74,7 +75,8 @@ pub struct RandomForestRegressorParameters { } /// Random Forest Regressor -#[derive(Serialize, Deserialize, Debug)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug)] pub struct RandomForestRegressor { parameters: RandomForestRegressorParameters, trees: Vec>, diff --git a/src/error/mod.rs b/src/error/mod.rs index 2409889..9a9bb8b 100644 --- a/src/error/mod.rs +++ b/src/error/mod.rs @@ -2,10 +2,11 @@ use std::error::Error; use std::fmt; -use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; /// Generic error to be raised when something goes wrong. -#[derive(Debug, Serialize, Deserialize)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug)] pub struct Failed { err: FailedError, msg: String, @@ -13,7 +14,8 @@ pub struct Failed { /// Type of error #[non_exhaustive] -#[derive(Copy, Clone, Debug, Serialize, Deserialize)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Copy, Clone, Debug)] pub enum FailedError { /// Can't fit algorithm to data FitFailed = 1, diff --git a/src/linalg/naive/dense_matrix.rs b/src/linalg/naive/dense_matrix.rs index a0b7bdb..9816a28 100644 --- a/src/linalg/naive/dense_matrix.rs +++ b/src/linalg/naive/dense_matrix.rs @@ -1,11 +1,14 @@ #![allow(clippy::ptr_arg)] use std::fmt; use std::fmt::Debug; -use std::marker::PhantomData; +#[cfg(feature = "serde")] use std::marker::PhantomData; use std::ops::Range; +#[cfg(feature = "serde")] use serde::de::{Deserializer, MapAccess, SeqAccess, Visitor}; +#[cfg(feature = "serde")] use serde::ser::{SerializeStruct, Serializer}; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::linalg::cholesky::CholeskyDecomposableMatrix; @@ -349,6 +352,7 @@ impl<'a, T: RealNumber> Iterator for DenseMatrixIterator<'a, T> { } } +#[cfg(feature = "serde")] impl<'de, T: RealNumber + fmt::Debug + Deserialize<'de>> Deserialize<'de> for DenseMatrix { fn deserialize(deserializer: D) -> Result where @@ -434,6 +438,7 @@ impl<'de, T: RealNumber + fmt::Debug + Deserialize<'de>> Deserialize<'de> for De } } +#[cfg(feature = "serde")] impl Serialize for DenseMatrix { fn serialize(&self, serializer: S) -> Result where diff --git a/src/linear/elastic_net.rs b/src/linear/elastic_net.rs index 2833ff1..7e7a29a 100644 --- a/src/linear/elastic_net.rs +++ b/src/linear/elastic_net.rs @@ -56,7 +56,7 @@ //! use std::fmt::Debug; -use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::api::{Predictor, SupervisedEstimator}; use crate::error::Failed; @@ -67,7 +67,8 @@ use crate::math::num::RealNumber; use crate::linear::lasso_optimizer::InteriorPointOptimizer; /// Elastic net parameters -#[derive(Serialize, Deserialize, Debug, Clone)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug, Clone)] pub struct ElasticNetParameters { /// Regularization parameter. pub alpha: T, @@ -84,7 +85,8 @@ pub struct ElasticNetParameters { } /// Elastic net -#[derive(Serialize, Deserialize, Debug)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug)] pub struct ElasticNet> { coefficients: M, intercept: T, diff --git a/src/linear/lasso.rs b/src/linear/lasso.rs index b99ecff..8f46bbc 100644 --- a/src/linear/lasso.rs +++ b/src/linear/lasso.rs @@ -24,7 +24,7 @@ //! use std::fmt::Debug; -use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::api::{Predictor, SupervisedEstimator}; use crate::error::Failed; @@ -34,7 +34,8 @@ use crate::linear::lasso_optimizer::InteriorPointOptimizer; use crate::math::num::RealNumber; /// Lasso regression parameters -#[derive(Serialize, Deserialize, Debug, Clone)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug, Clone)] pub struct LassoParameters { /// Controls the strength of the penalty to the loss function. pub alpha: T, @@ -47,7 +48,8 @@ pub struct LassoParameters { pub max_iter: usize, } -#[derive(Serialize, Deserialize, Debug)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug)] /// Lasso regressor pub struct Lasso> { coefficients: M, diff --git a/src/linear/linear_regression.rs b/src/linear/linear_regression.rs index 2ef03c1..6d24312 100644 --- a/src/linear/linear_regression.rs +++ b/src/linear/linear_regression.rs @@ -62,14 +62,15 @@ //! use std::fmt::Debug; -use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::api::{Predictor, SupervisedEstimator}; use crate::error::Failed; use crate::linalg::Matrix; use crate::math::num::RealNumber; -#[derive(Serialize, Deserialize, Debug, Clone)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug, Clone)] /// Approach to use for estimation of regression coefficients. QR is more efficient but SVD is more stable. pub enum LinearRegressionSolverName { /// QR decomposition, see [QR](../../linalg/qr/index.html) @@ -79,14 +80,16 @@ pub enum LinearRegressionSolverName { } /// Linear Regression parameters -#[derive(Serialize, Deserialize, Debug, Clone)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug, Clone)] pub struct LinearRegressionParameters { /// Solver to use for estimation of regression coefficients. pub solver: LinearRegressionSolverName, } /// Linear Regression -#[derive(Serialize, Deserialize, Debug)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug)] pub struct LinearRegression> { coefficients: M, intercept: T, diff --git a/src/linear/logistic_regression.rs b/src/linear/logistic_regression.rs index a71ac45..cdf78d1 100644 --- a/src/linear/logistic_regression.rs +++ b/src/linear/logistic_regression.rs @@ -56,7 +56,7 @@ use std::cmp::Ordering; use std::fmt::Debug; use std::marker::PhantomData; -use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::api::{Predictor, SupervisedEstimator}; use crate::error::Failed; @@ -68,11 +68,13 @@ use crate::optimization::line_search::Backtracking; use crate::optimization::FunctionOrder; /// Logistic Regression parameters -#[derive(Serialize, Deserialize, Debug, Clone)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug, Clone)] pub struct LogisticRegressionParameters {} /// Logistic Regression -#[derive(Serialize, Deserialize, Debug)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug)] pub struct LogisticRegression> { coefficients: M, intercept: M, diff --git a/src/linear/ridge_regression.rs b/src/linear/ridge_regression.rs index e9ed1ff..5afa2f9 100644 --- a/src/linear/ridge_regression.rs +++ b/src/linear/ridge_regression.rs @@ -58,7 +58,7 @@ //! use std::fmt::Debug; -use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::api::{Predictor, SupervisedEstimator}; use crate::error::Failed; @@ -66,7 +66,8 @@ use crate::linalg::BaseVector; use crate::linalg::Matrix; use crate::math::num::RealNumber; -#[derive(Serialize, Deserialize, Debug, Clone)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug, Clone)] /// Approach to use for estimation of regression coefficients. Cholesky is more efficient but SVD is more stable. pub enum RidgeRegressionSolverName { /// Cholesky decomposition, see [Cholesky](../../linalg/cholesky/index.html) @@ -76,7 +77,8 @@ pub enum RidgeRegressionSolverName { } /// Ridge Regression parameters -#[derive(Serialize, Deserialize, Debug, Clone)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug, Clone)] pub struct RidgeRegressionParameters { /// Solver to use for estimation of regression coefficients. pub solver: RidgeRegressionSolverName, @@ -88,7 +90,8 @@ pub struct RidgeRegressionParameters { } /// Ridge regression -#[derive(Serialize, Deserialize, Debug)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug)] pub struct RidgeRegression> { coefficients: M, intercept: T, diff --git a/src/math/distance/euclidian.rs b/src/math/distance/euclidian.rs index 9034727..6385f6e 100644 --- a/src/math/distance/euclidian.rs +++ b/src/math/distance/euclidian.rs @@ -18,14 +18,15 @@ //! //! //! -use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::math::num::RealNumber; use super::Distance; /// Euclidean distance is a measure of the true straight line distance between two points in Euclidean n-space. -#[derive(Serialize, Deserialize, Debug, Clone)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug, Clone)] pub struct Euclidian {} impl Euclidian { diff --git a/src/math/distance/hamming.rs b/src/math/distance/hamming.rs index 129fe16..bdd8e14 100644 --- a/src/math/distance/hamming.rs +++ b/src/math/distance/hamming.rs @@ -19,14 +19,15 @@ //! //! -use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::math::num::RealNumber; use super::Distance; /// While comparing two integer-valued vectors of equal length, Hamming distance is the number of bit positions in which the two bits are different -#[derive(Serialize, Deserialize, Debug, Clone)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug, Clone)] pub struct Hamming {} impl Distance, F> for Hamming { diff --git a/src/math/distance/mahalanobis.rs b/src/math/distance/mahalanobis.rs index 84aa947..9f47894 100644 --- a/src/math/distance/mahalanobis.rs +++ b/src/math/distance/mahalanobis.rs @@ -44,7 +44,7 @@ use std::marker::PhantomData; -use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::math::num::RealNumber; @@ -52,7 +52,8 @@ use super::Distance; use crate::linalg::Matrix; /// Mahalanobis distance. -#[derive(Serialize, Deserialize, Debug, Clone)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug, Clone)] pub struct Mahalanobis> { /// covariance matrix of the dataset pub sigma: M, diff --git a/src/math/distance/manhattan.rs b/src/math/distance/manhattan.rs index 9a69184..758763b 100644 --- a/src/math/distance/manhattan.rs +++ b/src/math/distance/manhattan.rs @@ -17,14 +17,15 @@ //! ``` //! //! -use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::math::num::RealNumber; use super::Distance; /// Manhattan distance -#[derive(Serialize, Deserialize, Debug, Clone)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug, Clone)] pub struct Manhattan {} impl Distance, T> for Manhattan { diff --git a/src/math/distance/minkowski.rs b/src/math/distance/minkowski.rs index c5dd85d..e953571 100644 --- a/src/math/distance/minkowski.rs +++ b/src/math/distance/minkowski.rs @@ -21,14 +21,15 @@ //! //! -use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::math::num::RealNumber; use super::Distance; /// Defines the Minkowski distance of order `p` -#[derive(Serialize, Deserialize, Debug, Clone)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug, Clone)] pub struct Minkowski { /// order, integer pub p: u16, diff --git a/src/metrics/accuracy.rs b/src/metrics/accuracy.rs index ef7028f..c5a129b 100644 --- a/src/metrics/accuracy.rs +++ b/src/metrics/accuracy.rs @@ -16,13 +16,14 @@ //! //! //! -use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::linalg::BaseVector; use crate::math::num::RealNumber; /// Accuracy metric. -#[derive(Serialize, Deserialize, Debug)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug)] pub struct Accuracy {} impl Accuracy { diff --git a/src/metrics/auc.rs b/src/metrics/auc.rs index 0f8d56a..f352ca7 100644 --- a/src/metrics/auc.rs +++ b/src/metrics/auc.rs @@ -20,14 +20,15 @@ //! * ["The ROC-AUC and the Mann-Whitney U-test", Haupt, J.](https://johaupt.github.io/roc-auc/model%20evaluation/Area_under_ROC_curve.html) #![allow(non_snake_case)] -use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::algorithm::sort::quick_sort::QuickArgSort; use crate::linalg::BaseVector; use crate::math::num::RealNumber; /// Area Under the Receiver Operating Characteristic Curve (ROC AUC) -#[derive(Serialize, Deserialize, Debug)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug)] pub struct AUC {} impl AUC { diff --git a/src/metrics/cluster_hcv.rs b/src/metrics/cluster_hcv.rs index 29a9db2..40e5173 100644 --- a/src/metrics/cluster_hcv.rs +++ b/src/metrics/cluster_hcv.rs @@ -1,10 +1,11 @@ -use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::linalg::BaseVector; use crate::math::num::RealNumber; use crate::metrics::cluster_helpers::*; -#[derive(Serialize, Deserialize, Debug)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug)] /// Homogeneity, completeness and V-Measure scores. pub struct HCVScore {} diff --git a/src/metrics/f1.rs b/src/metrics/f1.rs index 5c8537c..29f989e 100644 --- a/src/metrics/f1.rs +++ b/src/metrics/f1.rs @@ -18,7 +18,7 @@ //! //! //! -use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::linalg::BaseVector; use crate::math::num::RealNumber; @@ -26,7 +26,8 @@ use crate::metrics::precision::Precision; use crate::metrics::recall::Recall; /// F-measure -#[derive(Serialize, Deserialize, Debug)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug)] pub struct F1 { /// a positive real factor pub beta: T, diff --git a/src/metrics/mean_absolute_error.rs b/src/metrics/mean_absolute_error.rs index a069335..1049589 100644 --- a/src/metrics/mean_absolute_error.rs +++ b/src/metrics/mean_absolute_error.rs @@ -18,12 +18,13 @@ //! //! //! -use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::linalg::BaseVector; use crate::math::num::RealNumber; -#[derive(Serialize, Deserialize, Debug)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug)] /// Mean Absolute Error pub struct MeanAbsoluteError {} diff --git a/src/metrics/mean_squared_error.rs b/src/metrics/mean_squared_error.rs index 137c8e6..3bcb7e1 100644 --- a/src/metrics/mean_squared_error.rs +++ b/src/metrics/mean_squared_error.rs @@ -18,12 +18,13 @@ //! //! //! -use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::linalg::BaseVector; use crate::math::num::RealNumber; -#[derive(Serialize, Deserialize, Debug)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug)] /// Mean Squared Error pub struct MeanSquareError {} diff --git a/src/metrics/precision.rs b/src/metrics/precision.rs index 3524e7f..806c119 100644 --- a/src/metrics/precision.rs +++ b/src/metrics/precision.rs @@ -18,13 +18,14 @@ //! //! //! -use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::linalg::BaseVector; use crate::math::num::RealNumber; /// Precision metric. -#[derive(Serialize, Deserialize, Debug)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug)] pub struct Precision {} impl Precision { diff --git a/src/metrics/r2.rs b/src/metrics/r2.rs index cbcf7e4..0d661b7 100644 --- a/src/metrics/r2.rs +++ b/src/metrics/r2.rs @@ -18,13 +18,14 @@ //! //! //! -use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::linalg::BaseVector; use crate::math::num::RealNumber; /// Coefficient of Determination (R2) -#[derive(Serialize, Deserialize, Debug)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug)] pub struct R2 {} impl R2 { diff --git a/src/metrics/recall.rs b/src/metrics/recall.rs index 4d2be95..22f5402 100644 --- a/src/metrics/recall.rs +++ b/src/metrics/recall.rs @@ -18,13 +18,14 @@ //! //! //! -use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::linalg::BaseVector; use crate::math::num::RealNumber; /// Recall metric. -#[derive(Serialize, Deserialize, Debug)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug)] pub struct Recall {} impl Recall { diff --git a/src/naive_bayes/bernoulli.rs b/src/naive_bayes/bernoulli.rs index 388646f..7233b83 100644 --- a/src/naive_bayes/bernoulli.rs +++ b/src/naive_bayes/bernoulli.rs @@ -42,10 +42,11 @@ use crate::math::num::RealNumber; use crate::math::vector::RealNumberVector; use crate::naive_bayes::{BaseNaiveBayes, NBDistribution}; -use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; /// Naive Bayes classifier for Bearnoulli features -#[derive(Serialize, Deserialize, Debug, PartialEq)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug, PartialEq)] struct BernoulliNBDistribution { /// class labels known to the classifier class_labels: Vec, @@ -77,7 +78,8 @@ impl> NBDistribution for BernoulliNBDistributi } /// `BernoulliNB` parameters. Use `Default::default()` for default values. -#[derive(Serialize, Deserialize, Debug, Clone)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug, Clone)] pub struct BernoulliNBParameters { /// Additive (Laplace/Lidstone) smoothing parameter (0 for no smoothing). pub alpha: T, @@ -202,7 +204,8 @@ impl BernoulliNBDistribution { } /// BernoulliNB implements the categorical naive Bayes algorithm for categorically distributed data. -#[derive(Serialize, Deserialize, Debug, PartialEq)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug, PartialEq)] pub struct BernoulliNB> { inner: BaseNaiveBayes>, binarize: Option, diff --git a/src/naive_bayes/categorical.rs b/src/naive_bayes/categorical.rs index c6f28bd..c6b66c6 100644 --- a/src/naive_bayes/categorical.rs +++ b/src/naive_bayes/categorical.rs @@ -36,10 +36,11 @@ use crate::linalg::BaseVector; use crate::linalg::Matrix; use crate::math::num::RealNumber; use crate::naive_bayes::{BaseNaiveBayes, NBDistribution}; -use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; /// Naive Bayes classifier for categorical features -#[derive(Serialize, Deserialize, Debug)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug)] struct CategoricalNBDistribution { class_labels: Vec, class_priors: Vec, @@ -216,7 +217,8 @@ impl CategoricalNBDistribution { } /// `CategoricalNB` parameters. Use `Default::default()` for default values. -#[derive(Serialize, Deserialize, Debug, Clone)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug, Clone)] pub struct CategoricalNBParameters { /// Additive (Laplace/Lidstone) smoothing parameter (0 for no smoothing). pub alpha: T, @@ -237,7 +239,8 @@ impl Default for CategoricalNBParameters { } /// CategoricalNB implements the categorical naive Bayes algorithm for categorically distributed data. -#[derive(Serialize, Deserialize, Debug, PartialEq)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug, PartialEq)] pub struct CategoricalNB> { inner: BaseNaiveBayes>, } diff --git a/src/naive_bayes/gaussian.rs b/src/naive_bayes/gaussian.rs index 2ac9892..6ba78bb 100644 --- a/src/naive_bayes/gaussian.rs +++ b/src/naive_bayes/gaussian.rs @@ -30,10 +30,11 @@ use crate::linalg::Matrix; use crate::math::num::RealNumber; use crate::math::vector::RealNumberVector; use crate::naive_bayes::{BaseNaiveBayes, NBDistribution}; -use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; /// Naive Bayes classifier for categorical features -#[derive(Serialize, Deserialize, Debug, PartialEq)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug, PartialEq)] struct GaussianNBDistribution { /// class labels known to the classifier class_labels: Vec, @@ -75,7 +76,8 @@ impl> NBDistribution for GaussianNBDistributio } /// `GaussianNB` parameters. Use `Default::default()` for default values. -#[derive(Serialize, Deserialize, Debug, Default, Clone)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug, Default, Clone)] pub struct GaussianNBParameters { /// Prior probabilities of the classes. If specified the priors are not adjusted according to the data pub priors: Option>, @@ -178,7 +180,8 @@ impl GaussianNBDistribution { } /// GaussianNB implements the categorical naive Bayes algorithm for categorically distributed data. -#[derive(Serialize, Deserialize, Debug, PartialEq)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug, PartialEq)] pub struct GaussianNB> { inner: BaseNaiveBayes>, } diff --git a/src/naive_bayes/mod.rs b/src/naive_bayes/mod.rs index 7ab8b85..9a24466 100644 --- a/src/naive_bayes/mod.rs +++ b/src/naive_bayes/mod.rs @@ -39,7 +39,7 @@ use crate::error::Failed; use crate::linalg::BaseVector; use crate::linalg::Matrix; use crate::math::num::RealNumber; -use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use std::marker::PhantomData; /// Distribution used in the Naive Bayes classifier. @@ -55,7 +55,8 @@ pub(crate) trait NBDistribution> { } /// Base struct for the Naive Bayes classifier. -#[derive(Serialize, Deserialize, Debug, PartialEq)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug, PartialEq)] pub(crate) struct BaseNaiveBayes, D: NBDistribution> { distribution: D, _phantom_t: PhantomData, diff --git a/src/naive_bayes/multinomial.rs b/src/naive_bayes/multinomial.rs index 4cae1f3..23382a1 100644 --- a/src/naive_bayes/multinomial.rs +++ b/src/naive_bayes/multinomial.rs @@ -42,10 +42,11 @@ use crate::math::num::RealNumber; use crate::math::vector::RealNumberVector; use crate::naive_bayes::{BaseNaiveBayes, NBDistribution}; -use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; /// Naive Bayes classifier for Multinomial features -#[derive(Serialize, Deserialize, Debug, PartialEq)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug, PartialEq)] struct MultinomialNBDistribution { /// class labels known to the classifier class_labels: Vec, @@ -73,7 +74,8 @@ impl> NBDistribution for MultinomialNBDistribu } /// `MultinomialNB` parameters. Use `Default::default()` for default values. -#[derive(Serialize, Deserialize, Debug, Clone)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug, Clone)] pub struct MultinomialNBParameters { /// Additive (Laplace/Lidstone) smoothing parameter (0 for no smoothing). pub alpha: T, @@ -189,7 +191,8 @@ impl MultinomialNBDistribution { } /// MultinomialNB implements the categorical naive Bayes algorithm for categorically distributed data. -#[derive(Serialize, Deserialize, Debug, PartialEq)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug, PartialEq)] pub struct MultinomialNB> { inner: BaseNaiveBayes>, } diff --git a/src/neighbors/knn_classifier.rs b/src/neighbors/knn_classifier.rs index 97dd748..0f75220 100644 --- a/src/neighbors/knn_classifier.rs +++ b/src/neighbors/knn_classifier.rs @@ -33,7 +33,7 @@ //! use std::marker::PhantomData; -use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::algorithm::neighbour::{KNNAlgorithm, KNNAlgorithmName}; use crate::api::{Predictor, SupervisedEstimator}; @@ -45,7 +45,8 @@ use crate::math::num::RealNumber; use crate::neighbors::KNNWeightFunction; /// `KNNClassifier` parameters. Use `Default::default()` for default values. -#[derive(Serialize, Deserialize, Debug, Clone)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug, Clone)] pub struct KNNClassifierParameters, T>> { /// a function that defines a distance between each pair of point in training data. /// This function should extend [`Distance`](../../math/distance/trait.Distance.html) trait. @@ -62,7 +63,8 @@ pub struct KNNClassifierParameters, T>> { } /// K Nearest Neighbors Classifier -#[derive(Serialize, Deserialize, Debug)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug)] pub struct KNNClassifier, T>> { classes: Vec, y: Vec, diff --git a/src/neighbors/knn_regressor.rs b/src/neighbors/knn_regressor.rs index 4e73103..86bfd85 100644 --- a/src/neighbors/knn_regressor.rs +++ b/src/neighbors/knn_regressor.rs @@ -36,7 +36,7 @@ //! use std::marker::PhantomData; -use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::algorithm::neighbour::{KNNAlgorithm, KNNAlgorithmName}; use crate::api::{Predictor, SupervisedEstimator}; @@ -48,7 +48,8 @@ use crate::math::num::RealNumber; use crate::neighbors::KNNWeightFunction; /// `KNNRegressor` parameters. Use `Default::default()` for default values. -#[derive(Serialize, Deserialize, Debug, Clone)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug, Clone)] pub struct KNNRegressorParameters, T>> { /// a function that defines a distance between each pair of point in training data. /// This function should extend [`Distance`](../../math/distance/trait.Distance.html) trait. @@ -65,7 +66,8 @@ pub struct KNNRegressorParameters, T>> { } /// K Nearest Neighbors Regressor -#[derive(Serialize, Deserialize, Debug)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug)] pub struct KNNRegressor, T>> { y: Vec, knn_algorithm: KNNAlgorithm, diff --git a/src/neighbors/mod.rs b/src/neighbors/mod.rs index 85ea6b8..6beb75e 100644 --- a/src/neighbors/mod.rs +++ b/src/neighbors/mod.rs @@ -33,7 +33,7 @@ //! use crate::math::num::RealNumber; -use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; /// K Nearest Neighbors Classifier pub mod knn_classifier; @@ -48,7 +48,8 @@ pub mod knn_regressor; pub type KNNAlgorithmName = crate::algorithm::neighbour::KNNAlgorithmName; /// Weight function that is used to determine estimated value. -#[derive(Serialize, Deserialize, Debug, Clone)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug, Clone)] pub enum KNNWeightFunction { /// All k nearest points are weighted equally Uniform, diff --git a/src/svm/mod.rs b/src/svm/mod.rs index 1e013d2..abe8071 100644 --- a/src/svm/mod.rs +++ b/src/svm/mod.rs @@ -26,7 +26,7 @@ pub mod svc; pub mod svr; -use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::linalg::BaseVector; use crate::math::num::RealNumber; @@ -93,18 +93,21 @@ impl Kernels { } /// Linear Kernel -#[derive(Serialize, Deserialize, Debug, Clone)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug, Clone)] pub struct LinearKernel {} /// Radial basis function (Gaussian) kernel -#[derive(Serialize, Deserialize, Debug, Clone)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug, Clone)] pub struct RBFKernel { /// kernel coefficient pub gamma: T, } /// Polynomial kernel -#[derive(Serialize, Deserialize, Debug, Clone)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug, Clone)] pub struct PolynomialKernel { /// degree of the polynomial pub degree: T, @@ -115,7 +118,8 @@ pub struct PolynomialKernel { } /// Sigmoid (hyperbolic tangent) kernel -#[derive(Serialize, Deserialize, Debug, Clone)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug, Clone)] pub struct SigmoidKernel { /// kernel coefficient pub gamma: T, diff --git a/src/svm/svc.rs b/src/svm/svc.rs index 095d555..0582cdc 100644 --- a/src/svm/svc.rs +++ b/src/svm/svc.rs @@ -76,7 +76,7 @@ use std::marker::PhantomData; use rand::seq::SliceRandom; -use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::api::{Predictor, SupervisedEstimator}; use crate::error::Failed; @@ -85,7 +85,8 @@ use crate::linalg::Matrix; use crate::math::num::RealNumber; use crate::svm::{Kernel, Kernels, LinearKernel}; -#[derive(Serialize, Deserialize, Debug, Clone)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug, Clone)] /// SVC Parameters pub struct SVCParameters, K: Kernel> { /// Number of epochs. @@ -100,11 +101,12 @@ pub struct SVCParameters, K: Kernel m: PhantomData, } -#[derive(Serialize, Deserialize, Debug)] -#[serde(bound( +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug)] +#[cfg_attr(feature = "serde", serde(bound( serialize = "M::RowVector: Serialize, K: Serialize, T: Serialize", deserialize = "M::RowVector: Deserialize<'de>, K: Deserialize<'de>, T: Deserialize<'de>", -))] +)))] /// Support Vector Classifier pub struct SVC, K: Kernel> { classes: Vec, @@ -114,7 +116,8 @@ pub struct SVC, K: Kernel> { b: T, } -#[derive(Serialize, Deserialize, Debug)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug)] struct SupportVector> { index: usize, x: V, diff --git a/src/svm/svr.rs b/src/svm/svr.rs index 9eb6046..4d61b97 100644 --- a/src/svm/svr.rs +++ b/src/svm/svr.rs @@ -68,7 +68,7 @@ use std::cell::{Ref, RefCell}; use std::fmt::Debug; use std::marker::PhantomData; -use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::api::{Predictor, SupervisedEstimator}; use crate::error::Failed; @@ -77,7 +77,8 @@ use crate::linalg::Matrix; use crate::math::num::RealNumber; use crate::svm::{Kernel, Kernels, LinearKernel}; -#[derive(Serialize, Deserialize, Debug, Clone)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug, Clone)] /// SVR Parameters pub struct SVRParameters, K: Kernel> { /// Epsilon in the epsilon-SVR model. @@ -92,11 +93,12 @@ pub struct SVRParameters, K: Kernel m: PhantomData, } -#[derive(Serialize, Deserialize, Debug)] -#[serde(bound( +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug)] +#[cfg_attr(feature = "serde", serde(bound( serialize = "M::RowVector: Serialize, K: Serialize, T: Serialize", deserialize = "M::RowVector: Deserialize<'de>, K: Deserialize<'de>, T: Deserialize<'de>", -))] +)))] /// Epsilon-Support Vector Regression pub struct SVR, K: Kernel> { @@ -106,7 +108,8 @@ pub struct SVR, K: Kernel> { b: T, } -#[derive(Serialize, Deserialize, Debug)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug)] struct SupportVector> { index: usize, x: V, diff --git a/src/tree/decision_tree_classifier.rs b/src/tree/decision_tree_classifier.rs index 3a92c54..b014152 100644 --- a/src/tree/decision_tree_classifier.rs +++ b/src/tree/decision_tree_classifier.rs @@ -68,7 +68,7 @@ use std::fmt::Debug; use std::marker::PhantomData; use rand::seq::SliceRandom; -use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::algorithm::sort::quick_sort::QuickArgSort; use crate::api::{Predictor, SupervisedEstimator}; @@ -76,7 +76,8 @@ use crate::error::Failed; use crate::linalg::Matrix; use crate::math::num::RealNumber; -#[derive(Serialize, Deserialize, Debug, Clone)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug, Clone)] /// Parameters of Decision Tree pub struct DecisionTreeClassifierParameters { /// Split criteria to use when building a tree. @@ -90,7 +91,8 @@ pub struct DecisionTreeClassifierParameters { } /// Decision Tree -#[derive(Serialize, Deserialize, Debug)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug)] pub struct DecisionTreeClassifier { nodes: Vec>, parameters: DecisionTreeClassifierParameters, @@ -100,7 +102,8 @@ pub struct DecisionTreeClassifier { } /// The function to measure the quality of a split. -#[derive(Serialize, Deserialize, Debug, Clone)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug, Clone)] pub enum SplitCriterion { /// [Gini index](../decision_tree_classifier/index.html) Gini, @@ -110,7 +113,8 @@ pub enum SplitCriterion { ClassificationError, } -#[derive(Serialize, Deserialize, Debug)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug)] struct Node { index: usize, output: usize, diff --git a/src/tree/decision_tree_regressor.rs b/src/tree/decision_tree_regressor.rs index 06ee507..ef8c52c 100644 --- a/src/tree/decision_tree_regressor.rs +++ b/src/tree/decision_tree_regressor.rs @@ -63,7 +63,7 @@ use std::default::Default; use std::fmt::Debug; use rand::seq::SliceRandom; -use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::algorithm::sort::quick_sort::QuickArgSort; use crate::api::{Predictor, SupervisedEstimator}; @@ -71,7 +71,8 @@ use crate::error::Failed; use crate::linalg::Matrix; use crate::math::num::RealNumber; -#[derive(Serialize, Deserialize, Debug, Clone)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug, Clone)] /// Parameters of Regression Tree pub struct DecisionTreeRegressorParameters { /// The maximum depth of the tree. @@ -83,14 +84,16 @@ pub struct DecisionTreeRegressorParameters { } /// Regression Tree -#[derive(Serialize, Deserialize, Debug)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug)] pub struct DecisionTreeRegressor { nodes: Vec>, parameters: DecisionTreeRegressorParameters, depth: u16, } -#[derive(Serialize, Deserialize, Debug)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug)] struct Node { index: usize, output: T, From 762986b271c141b112ecb5d855834de76923ae3c Mon Sep 17 00:00:00 2001 From: Ben Cross Date: Sun, 17 Jan 2021 21:37:30 +0000 Subject: [PATCH 2/4] Cargo format --- src/algorithm/neighbour/cover_tree.rs | 3 ++- src/algorithm/neighbour/linear_search.rs | 3 ++- src/algorithm/neighbour/mod.rs | 3 ++- src/cluster/dbscan.rs | 3 ++- src/cluster/kmeans.rs | 3 ++- src/decomposition/pca.rs | 3 ++- src/decomposition/svd.rs | 3 ++- src/ensemble/random_forest_classifier.rs | 3 ++- src/ensemble/random_forest_regressor.rs | 3 ++- src/error/mod.rs | 3 ++- src/linalg/naive/dense_matrix.rs | 3 ++- src/linear/elastic_net.rs | 3 ++- src/linear/lasso.rs | 3 ++- src/linear/linear_regression.rs | 3 ++- src/linear/logistic_regression.rs | 3 ++- src/linear/ridge_regression.rs | 3 ++- src/math/distance/euclidian.rs | 3 ++- src/math/distance/hamming.rs | 3 ++- src/math/distance/mahalanobis.rs | 3 ++- src/math/distance/manhattan.rs | 3 ++- src/math/distance/minkowski.rs | 3 ++- src/metrics/accuracy.rs | 3 ++- src/metrics/auc.rs | 3 ++- src/metrics/cluster_hcv.rs | 3 ++- src/metrics/f1.rs | 3 ++- src/metrics/mean_absolute_error.rs | 3 ++- src/metrics/mean_squared_error.rs | 3 ++- src/metrics/precision.rs | 3 ++- src/metrics/r2.rs | 3 ++- src/metrics/recall.rs | 3 ++- src/naive_bayes/bernoulli.rs | 3 ++- src/naive_bayes/categorical.rs | 3 ++- src/naive_bayes/gaussian.rs | 3 ++- src/naive_bayes/mod.rs | 3 ++- src/naive_bayes/multinomial.rs | 3 ++- src/neighbors/knn_classifier.rs | 3 ++- src/neighbors/knn_regressor.rs | 3 ++- src/neighbors/mod.rs | 3 ++- src/svm/mod.rs | 3 ++- src/svm/svc.rs | 14 +++++++++----- src/svm/svr.rs | 14 +++++++++----- src/tree/decision_tree_classifier.rs | 3 ++- src/tree/decision_tree_regressor.rs | 3 ++- 43 files changed, 100 insertions(+), 51 deletions(-) diff --git a/src/algorithm/neighbour/cover_tree.rs b/src/algorithm/neighbour/cover_tree.rs index 553dc99..96a3389 100644 --- a/src/algorithm/neighbour/cover_tree.rs +++ b/src/algorithm/neighbour/cover_tree.rs @@ -24,7 +24,8 @@ //! ``` use std::fmt::Debug; -#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; use crate::algorithm::sort::heap_select::HeapSelection; use crate::error::{Failed, FailedError}; diff --git a/src/algorithm/neighbour/linear_search.rs b/src/algorithm/neighbour/linear_search.rs index d82e575..f89e751 100644 --- a/src/algorithm/neighbour/linear_search.rs +++ b/src/algorithm/neighbour/linear_search.rs @@ -22,7 +22,8 @@ //! //! ``` -#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; use std::cmp::{Ordering, PartialOrd}; use std::marker::PhantomData; diff --git a/src/algorithm/neighbour/mod.rs b/src/algorithm/neighbour/mod.rs index 9e432bd..321ec01 100644 --- a/src/algorithm/neighbour/mod.rs +++ b/src/algorithm/neighbour/mod.rs @@ -35,7 +35,8 @@ use crate::algorithm::neighbour::linear_search::LinearKNNSearch; use crate::error::Failed; use crate::math::distance::Distance; use crate::math::num::RealNumber; -#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; pub(crate) mod bbd_tree; /// tree data structure for fast nearest neighbor search diff --git a/src/cluster/dbscan.rs b/src/cluster/dbscan.rs index a117982..73d686d 100644 --- a/src/cluster/dbscan.rs +++ b/src/cluster/dbscan.rs @@ -43,7 +43,8 @@ use std::fmt::Debug; use std::iter::Sum; -#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; use crate::algorithm::neighbour::{KNNAlgorithm, KNNAlgorithmName}; use crate::api::{Predictor, UnsupervisedEstimator}; diff --git a/src/cluster/kmeans.rs b/src/cluster/kmeans.rs index 78c9105..a454b1f 100644 --- a/src/cluster/kmeans.rs +++ b/src/cluster/kmeans.rs @@ -56,7 +56,8 @@ use rand::Rng; use std::fmt::Debug; use std::iter::Sum; -#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; use crate::algorithm::neighbour::bbd_tree::BBDTree; use crate::api::{Predictor, UnsupervisedEstimator}; diff --git a/src/decomposition/pca.rs b/src/decomposition/pca.rs index 626f268..e3212e3 100644 --- a/src/decomposition/pca.rs +++ b/src/decomposition/pca.rs @@ -47,7 +47,8 @@ //! use std::fmt::Debug; -#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; use crate::api::{Transformer, UnsupervisedEstimator}; use crate::error::Failed; diff --git a/src/decomposition/svd.rs b/src/decomposition/svd.rs index 7dc48dc..5524e29 100644 --- a/src/decomposition/svd.rs +++ b/src/decomposition/svd.rs @@ -46,7 +46,8 @@ use std::fmt::Debug; use std::marker::PhantomData; -#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; use crate::api::{Transformer, UnsupervisedEstimator}; use crate::error::Failed; diff --git a/src/ensemble/random_forest_classifier.rs b/src/ensemble/random_forest_classifier.rs index 74f210c..62e83b5 100644 --- a/src/ensemble/random_forest_classifier.rs +++ b/src/ensemble/random_forest_classifier.rs @@ -49,7 +49,8 @@ use std::default::Default; use std::fmt::Debug; use rand::Rng; -#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; use crate::api::{Predictor, SupervisedEstimator}; use crate::error::Failed; diff --git a/src/ensemble/random_forest_regressor.rs b/src/ensemble/random_forest_regressor.rs index 74a1b59..18c2f69 100644 --- a/src/ensemble/random_forest_regressor.rs +++ b/src/ensemble/random_forest_regressor.rs @@ -47,7 +47,8 @@ use std::default::Default; use std::fmt::Debug; use rand::Rng; -#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; use crate::api::{Predictor, SupervisedEstimator}; use crate::error::Failed; diff --git a/src/error/mod.rs b/src/error/mod.rs index 9a9bb8b..4e84f6e 100644 --- a/src/error/mod.rs +++ b/src/error/mod.rs @@ -2,7 +2,8 @@ use std::error::Error; use std::fmt; -#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; /// Generic error to be raised when something goes wrong. #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] diff --git a/src/linalg/naive/dense_matrix.rs b/src/linalg/naive/dense_matrix.rs index 9816a28..1a9b3a6 100644 --- a/src/linalg/naive/dense_matrix.rs +++ b/src/linalg/naive/dense_matrix.rs @@ -1,7 +1,8 @@ #![allow(clippy::ptr_arg)] use std::fmt; use std::fmt::Debug; -#[cfg(feature = "serde")] use std::marker::PhantomData; +#[cfg(feature = "serde")] +use std::marker::PhantomData; use std::ops::Range; #[cfg(feature = "serde")] diff --git a/src/linear/elastic_net.rs b/src/linear/elastic_net.rs index 7e7a29a..f4a4326 100644 --- a/src/linear/elastic_net.rs +++ b/src/linear/elastic_net.rs @@ -56,7 +56,8 @@ //! use std::fmt::Debug; -#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; use crate::api::{Predictor, SupervisedEstimator}; use crate::error::Failed; diff --git a/src/linear/lasso.rs b/src/linear/lasso.rs index 8f46bbc..17712b1 100644 --- a/src/linear/lasso.rs +++ b/src/linear/lasso.rs @@ -24,7 +24,8 @@ //! use std::fmt::Debug; -#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; use crate::api::{Predictor, SupervisedEstimator}; use crate::error::Failed; diff --git a/src/linear/linear_regression.rs b/src/linear/linear_regression.rs index 6d24312..290a2db 100644 --- a/src/linear/linear_regression.rs +++ b/src/linear/linear_regression.rs @@ -62,7 +62,8 @@ //! use std::fmt::Debug; -#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; use crate::api::{Predictor, SupervisedEstimator}; use crate::error::Failed; diff --git a/src/linear/logistic_regression.rs b/src/linear/logistic_regression.rs index cdf78d1..45777be 100644 --- a/src/linear/logistic_regression.rs +++ b/src/linear/logistic_regression.rs @@ -56,7 +56,8 @@ use std::cmp::Ordering; use std::fmt::Debug; use std::marker::PhantomData; -#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; use crate::api::{Predictor, SupervisedEstimator}; use crate::error::Failed; diff --git a/src/linear/ridge_regression.rs b/src/linear/ridge_regression.rs index 5afa2f9..4e1ebad 100644 --- a/src/linear/ridge_regression.rs +++ b/src/linear/ridge_regression.rs @@ -58,7 +58,8 @@ //! use std::fmt::Debug; -#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; use crate::api::{Predictor, SupervisedEstimator}; use crate::error::Failed; diff --git a/src/math/distance/euclidian.rs b/src/math/distance/euclidian.rs index 6385f6e..b06d7d1 100644 --- a/src/math/distance/euclidian.rs +++ b/src/math/distance/euclidian.rs @@ -18,7 +18,8 @@ //! //! //! -#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; use crate::math::num::RealNumber; diff --git a/src/math/distance/hamming.rs b/src/math/distance/hamming.rs index bdd8e14..d23b57f 100644 --- a/src/math/distance/hamming.rs +++ b/src/math/distance/hamming.rs @@ -19,7 +19,8 @@ //! //! -#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; use crate::math::num::RealNumber; diff --git a/src/math/distance/mahalanobis.rs b/src/math/distance/mahalanobis.rs index 9f47894..7ff86e9 100644 --- a/src/math/distance/mahalanobis.rs +++ b/src/math/distance/mahalanobis.rs @@ -44,7 +44,8 @@ use std::marker::PhantomData; -#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; use crate::math::num::RealNumber; diff --git a/src/math/distance/manhattan.rs b/src/math/distance/manhattan.rs index 758763b..3162178 100644 --- a/src/math/distance/manhattan.rs +++ b/src/math/distance/manhattan.rs @@ -17,7 +17,8 @@ //! ``` //! //! -#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; use crate::math::num::RealNumber; diff --git a/src/math/distance/minkowski.rs b/src/math/distance/minkowski.rs index e953571..1e97ea8 100644 --- a/src/math/distance/minkowski.rs +++ b/src/math/distance/minkowski.rs @@ -21,7 +21,8 @@ //! //! -#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; use crate::math::num::RealNumber; diff --git a/src/metrics/accuracy.rs b/src/metrics/accuracy.rs index c5a129b..6912a4c 100644 --- a/src/metrics/accuracy.rs +++ b/src/metrics/accuracy.rs @@ -16,7 +16,8 @@ //! //! //! -#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; use crate::linalg::BaseVector; use crate::math::num::RealNumber; diff --git a/src/metrics/auc.rs b/src/metrics/auc.rs index f352ca7..508295b 100644 --- a/src/metrics/auc.rs +++ b/src/metrics/auc.rs @@ -20,7 +20,8 @@ //! * ["The ROC-AUC and the Mann-Whitney U-test", Haupt, J.](https://johaupt.github.io/roc-auc/model%20evaluation/Area_under_ROC_curve.html) #![allow(non_snake_case)] -#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; use crate::algorithm::sort::quick_sort::QuickArgSort; use crate::linalg::BaseVector; diff --git a/src/metrics/cluster_hcv.rs b/src/metrics/cluster_hcv.rs index 40e5173..d881bdc 100644 --- a/src/metrics/cluster_hcv.rs +++ b/src/metrics/cluster_hcv.rs @@ -1,4 +1,5 @@ -#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; use crate::linalg::BaseVector; use crate::math::num::RealNumber; diff --git a/src/metrics/f1.rs b/src/metrics/f1.rs index 29f989e..d957d9b 100644 --- a/src/metrics/f1.rs +++ b/src/metrics/f1.rs @@ -18,7 +18,8 @@ //! //! //! -#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; use crate::linalg::BaseVector; use crate::math::num::RealNumber; diff --git a/src/metrics/mean_absolute_error.rs b/src/metrics/mean_absolute_error.rs index 1049589..db3039f 100644 --- a/src/metrics/mean_absolute_error.rs +++ b/src/metrics/mean_absolute_error.rs @@ -18,7 +18,8 @@ //! //! //! -#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; use crate::linalg::BaseVector; use crate::math::num::RealNumber; diff --git a/src/metrics/mean_squared_error.rs b/src/metrics/mean_squared_error.rs index 3bcb7e1..3003e5d 100644 --- a/src/metrics/mean_squared_error.rs +++ b/src/metrics/mean_squared_error.rs @@ -18,7 +18,8 @@ //! //! //! -#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; use crate::linalg::BaseVector; use crate::math::num::RealNumber; diff --git a/src/metrics/precision.rs b/src/metrics/precision.rs index 806c119..2bd0dcf 100644 --- a/src/metrics/precision.rs +++ b/src/metrics/precision.rs @@ -18,7 +18,8 @@ //! //! //! -#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; use crate::linalg::BaseVector; use crate::math::num::RealNumber; diff --git a/src/metrics/r2.rs b/src/metrics/r2.rs index 0d661b7..c710ef5 100644 --- a/src/metrics/r2.rs +++ b/src/metrics/r2.rs @@ -18,7 +18,8 @@ //! //! //! -#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; use crate::linalg::BaseVector; use crate::math::num::RealNumber; diff --git a/src/metrics/recall.rs b/src/metrics/recall.rs index 22f5402..d1fad56 100644 --- a/src/metrics/recall.rs +++ b/src/metrics/recall.rs @@ -18,7 +18,8 @@ //! //! //! -#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; use crate::linalg::BaseVector; use crate::math::num::RealNumber; diff --git a/src/naive_bayes/bernoulli.rs b/src/naive_bayes/bernoulli.rs index 7233b83..cdbfa80 100644 --- a/src/naive_bayes/bernoulli.rs +++ b/src/naive_bayes/bernoulli.rs @@ -42,7 +42,8 @@ use crate::math::num::RealNumber; use crate::math::vector::RealNumberVector; use crate::naive_bayes::{BaseNaiveBayes, NBDistribution}; -#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; /// Naive Bayes classifier for Bearnoulli features #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] diff --git a/src/naive_bayes/categorical.rs b/src/naive_bayes/categorical.rs index c6b66c6..dc8587a 100644 --- a/src/naive_bayes/categorical.rs +++ b/src/naive_bayes/categorical.rs @@ -36,7 +36,8 @@ use crate::linalg::BaseVector; use crate::linalg::Matrix; use crate::math::num::RealNumber; use crate::naive_bayes::{BaseNaiveBayes, NBDistribution}; -#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; /// Naive Bayes classifier for categorical features #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] diff --git a/src/naive_bayes/gaussian.rs b/src/naive_bayes/gaussian.rs index 6ba78bb..c27c396 100644 --- a/src/naive_bayes/gaussian.rs +++ b/src/naive_bayes/gaussian.rs @@ -30,7 +30,8 @@ use crate::linalg::Matrix; use crate::math::num::RealNumber; use crate::math::vector::RealNumberVector; use crate::naive_bayes::{BaseNaiveBayes, NBDistribution}; -#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; /// Naive Bayes classifier for categorical features #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] diff --git a/src/naive_bayes/mod.rs b/src/naive_bayes/mod.rs index 9a24466..f7c8da6 100644 --- a/src/naive_bayes/mod.rs +++ b/src/naive_bayes/mod.rs @@ -39,7 +39,8 @@ use crate::error::Failed; use crate::linalg::BaseVector; use crate::linalg::Matrix; use crate::math::num::RealNumber; -#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; use std::marker::PhantomData; /// Distribution used in the Naive Bayes classifier. diff --git a/src/naive_bayes/multinomial.rs b/src/naive_bayes/multinomial.rs index 23382a1..fa91020 100644 --- a/src/naive_bayes/multinomial.rs +++ b/src/naive_bayes/multinomial.rs @@ -42,7 +42,8 @@ use crate::math::num::RealNumber; use crate::math::vector::RealNumberVector; use crate::naive_bayes::{BaseNaiveBayes, NBDistribution}; -#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; /// Naive Bayes classifier for Multinomial features #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] diff --git a/src/neighbors/knn_classifier.rs b/src/neighbors/knn_classifier.rs index 0f75220..839eea3 100644 --- a/src/neighbors/knn_classifier.rs +++ b/src/neighbors/knn_classifier.rs @@ -33,7 +33,8 @@ //! use std::marker::PhantomData; -#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; use crate::algorithm::neighbour::{KNNAlgorithm, KNNAlgorithmName}; use crate::api::{Predictor, SupervisedEstimator}; diff --git a/src/neighbors/knn_regressor.rs b/src/neighbors/knn_regressor.rs index 86bfd85..1edf86a 100644 --- a/src/neighbors/knn_regressor.rs +++ b/src/neighbors/knn_regressor.rs @@ -36,7 +36,8 @@ //! use std::marker::PhantomData; -#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; use crate::algorithm::neighbour::{KNNAlgorithm, KNNAlgorithmName}; use crate::api::{Predictor, SupervisedEstimator}; diff --git a/src/neighbors/mod.rs b/src/neighbors/mod.rs index 6beb75e..86b1e46 100644 --- a/src/neighbors/mod.rs +++ b/src/neighbors/mod.rs @@ -33,7 +33,8 @@ //! use crate::math::num::RealNumber; -#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; /// K Nearest Neighbors Classifier pub mod knn_classifier; diff --git a/src/svm/mod.rs b/src/svm/mod.rs index abe8071..068f773 100644 --- a/src/svm/mod.rs +++ b/src/svm/mod.rs @@ -26,7 +26,8 @@ pub mod svc; pub mod svr; -#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; use crate::linalg::BaseVector; use crate::math::num::RealNumber; diff --git a/src/svm/svc.rs b/src/svm/svc.rs index 0582cdc..9d77812 100644 --- a/src/svm/svc.rs +++ b/src/svm/svc.rs @@ -76,7 +76,8 @@ use std::marker::PhantomData; use rand::seq::SliceRandom; -#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; use crate::api::{Predictor, SupervisedEstimator}; use crate::error::Failed; @@ -103,10 +104,13 @@ pub struct SVCParameters, K: Kernel #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug)] -#[cfg_attr(feature = "serde", serde(bound( - serialize = "M::RowVector: Serialize, K: Serialize, T: Serialize", - deserialize = "M::RowVector: Deserialize<'de>, K: Deserialize<'de>, T: Deserialize<'de>", -)))] +#[cfg_attr( + feature = "serde", + serde(bound( + serialize = "M::RowVector: Serialize, K: Serialize, T: Serialize", + deserialize = "M::RowVector: Deserialize<'de>, K: Deserialize<'de>, T: Deserialize<'de>", + )) +)] /// Support Vector Classifier pub struct SVC, K: Kernel> { classes: Vec, diff --git a/src/svm/svr.rs b/src/svm/svr.rs index 4d61b97..cbb1ea5 100644 --- a/src/svm/svr.rs +++ b/src/svm/svr.rs @@ -68,7 +68,8 @@ use std::cell::{Ref, RefCell}; use std::fmt::Debug; use std::marker::PhantomData; -#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; use crate::api::{Predictor, SupervisedEstimator}; use crate::error::Failed; @@ -95,10 +96,13 @@ pub struct SVRParameters, K: Kernel #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug)] -#[cfg_attr(feature = "serde", serde(bound( - serialize = "M::RowVector: Serialize, K: Serialize, T: Serialize", - deserialize = "M::RowVector: Deserialize<'de>, K: Deserialize<'de>, T: Deserialize<'de>", -)))] +#[cfg_attr( + feature = "serde", + serde(bound( + serialize = "M::RowVector: Serialize, K: Serialize, T: Serialize", + deserialize = "M::RowVector: Deserialize<'de>, K: Deserialize<'de>, T: Deserialize<'de>", + )) +)] /// Epsilon-Support Vector Regression pub struct SVR, K: Kernel> { diff --git a/src/tree/decision_tree_classifier.rs b/src/tree/decision_tree_classifier.rs index b014152..7575a5a 100644 --- a/src/tree/decision_tree_classifier.rs +++ b/src/tree/decision_tree_classifier.rs @@ -68,7 +68,8 @@ use std::fmt::Debug; use std::marker::PhantomData; use rand::seq::SliceRandom; -#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; use crate::algorithm::sort::quick_sort::QuickArgSort; use crate::api::{Predictor, SupervisedEstimator}; diff --git a/src/tree/decision_tree_regressor.rs b/src/tree/decision_tree_regressor.rs index ef8c52c..d1292db 100644 --- a/src/tree/decision_tree_regressor.rs +++ b/src/tree/decision_tree_regressor.rs @@ -63,7 +63,8 @@ use std::default::Default; use std::fmt::Debug; use rand::seq::SliceRandom; -#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; use crate::algorithm::sort::quick_sort::QuickArgSort; use crate::api::{Predictor, SupervisedEstimator}; From f1cf8a6f0845f48e16f342f3e56b1bdb93ae2d2a Mon Sep 17 00:00:00 2001 From: Ben Cross Date: Mon, 18 Jan 2021 10:32:35 +0000 Subject: [PATCH 3/4] Added serde feature flags to tests --- src/algorithm/neighbour/cover_tree.rs | 4 +++- src/algorithm/neighbour/linear_search.rs | 3 ++- src/cluster/dbscan.rs | 2 ++ src/cluster/kmeans.rs | 1 + src/decomposition/pca.rs | 1 + src/decomposition/svd.rs | 1 + src/ensemble/random_forest_classifier.rs | 1 + src/ensemble/random_forest_regressor.rs | 1 + src/linalg/naive/dense_matrix.rs | 2 ++ src/linear/elastic_net.rs | 1 + src/linear/lasso.rs | 1 + src/linear/linear_regression.rs | 1 + src/linear/logistic_regression.rs | 1 + src/linear/ridge_regression.rs | 1 + src/naive_bayes/bernoulli.rs | 1 + src/naive_bayes/categorical.rs | 1 + src/naive_bayes/gaussian.rs | 1 + src/naive_bayes/multinomial.rs | 1 + src/neighbors/knn_classifier.rs | 1 + src/neighbors/knn_regressor.rs | 1 + src/svm/svc.rs | 2 ++ src/svm/svr.rs | 2 ++ src/tree/decision_tree_classifier.rs | 1 + src/tree/decision_tree_regressor.rs | 1 + 24 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/algorithm/neighbour/cover_tree.rs b/src/algorithm/neighbour/cover_tree.rs index 96a3389..9c5c806 100644 --- a/src/algorithm/neighbour/cover_tree.rs +++ b/src/algorithm/neighbour/cover_tree.rs @@ -457,7 +457,8 @@ mod tests { use super::*; use crate::math::distance::Distances; - #[derive(Debug, Serialize, Deserialize, Clone)] + #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] + #[derive(Debug, Clone)] struct SimpleDistance {} impl Distance for SimpleDistance { @@ -503,6 +504,7 @@ mod tests { } #[test] + #[cfg(feature = "serde")] fn serde() { let data = vec![1, 2, 3, 4, 5, 6, 7, 8, 9]; diff --git a/src/algorithm/neighbour/linear_search.rs b/src/algorithm/neighbour/linear_search.rs index f89e751..b4a3c89 100644 --- a/src/algorithm/neighbour/linear_search.rs +++ b/src/algorithm/neighbour/linear_search.rs @@ -140,7 +140,8 @@ mod tests { use super::*; use crate::math::distance::Distances; - #[derive(Debug, Serialize, Deserialize, Clone)] + #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] + #[derive(Debug, Clone)] struct SimpleDistance {} impl Distance for SimpleDistance { diff --git a/src/cluster/dbscan.rs b/src/cluster/dbscan.rs index 73d686d..d7a706a 100644 --- a/src/cluster/dbscan.rs +++ b/src/cluster/dbscan.rs @@ -265,6 +265,7 @@ impl, T>> DBSCAN { mod tests { use super::*; use crate::linalg::naive::dense_matrix::DenseMatrix; + #[cfg(feature = "serde")] use crate::math::distance::euclidian::Euclidian; #[test] @@ -299,6 +300,7 @@ mod tests { } #[test] + #[cfg(feature = "serde")] fn serde() { let x = DenseMatrix::from_2d_array(&[ &[5.1, 3.5, 1.4, 0.2], diff --git a/src/cluster/kmeans.rs b/src/cluster/kmeans.rs index a454b1f..6be52a5 100644 --- a/src/cluster/kmeans.rs +++ b/src/cluster/kmeans.rs @@ -347,6 +347,7 @@ mod tests { } #[test] + #[cfg(feature = "serde")] fn serde() { let x = DenseMatrix::from_2d_array(&[ &[5.1, 3.5, 1.4, 0.2], diff --git a/src/decomposition/pca.rs b/src/decomposition/pca.rs index e3212e3..de258dc 100644 --- a/src/decomposition/pca.rs +++ b/src/decomposition/pca.rs @@ -567,6 +567,7 @@ mod tests { } #[test] + #[cfg(feature = "serde")] fn serde() { let iris = DenseMatrix::from_2d_array(&[ &[5.1, 3.5, 1.4, 0.2], diff --git a/src/decomposition/svd.rs b/src/decomposition/svd.rs index 5524e29..6f5a1bd 100644 --- a/src/decomposition/svd.rs +++ b/src/decomposition/svd.rs @@ -228,6 +228,7 @@ mod tests { } #[test] + #[cfg(feature = "serde")] fn serde() { let iris = DenseMatrix::from_2d_array(&[ &[5.1, 3.5, 1.4, 0.2], diff --git a/src/ensemble/random_forest_classifier.rs b/src/ensemble/random_forest_classifier.rs index 62e83b5..4127627 100644 --- a/src/ensemble/random_forest_classifier.rs +++ b/src/ensemble/random_forest_classifier.rs @@ -325,6 +325,7 @@ mod tests { } #[test] + #[cfg(feature = "serde")] fn serde() { let x = DenseMatrix::from_2d_array(&[ &[5.1, 3.5, 1.4, 0.2], diff --git a/src/ensemble/random_forest_regressor.rs b/src/ensemble/random_forest_regressor.rs index 18c2f69..02eef99 100644 --- a/src/ensemble/random_forest_regressor.rs +++ b/src/ensemble/random_forest_regressor.rs @@ -274,6 +274,7 @@ mod tests { } #[test] + #[cfg(feature = "serde")] fn serde() { let x = DenseMatrix::from_2d_array(&[ &[234.289, 235.6, 159., 107.608, 1947., 60.323], diff --git a/src/linalg/naive/dense_matrix.rs b/src/linalg/naive/dense_matrix.rs index 1a9b3a6..4faa77d 100644 --- a/src/linalg/naive/dense_matrix.rs +++ b/src/linalg/naive/dense_matrix.rs @@ -1312,6 +1312,7 @@ mod tests { } #[test] + #[cfg(feature = "serde")] fn to_from_json() { let a = DenseMatrix::from_2d_array(&[&[0.9, 0.4, 0.7], &[0.4, 0.5, 0.3], &[0.7, 0.3, 0.8]]); let deserialized_a: DenseMatrix = @@ -1320,6 +1321,7 @@ mod tests { } #[test] + #[cfg(feature = "serde")] fn to_from_bincode() { let a = DenseMatrix::from_2d_array(&[&[0.9, 0.4, 0.7], &[0.4, 0.5, 0.3], &[0.7, 0.3, 0.8]]); let deserialized_a: DenseMatrix = diff --git a/src/linear/elastic_net.rs b/src/linear/elastic_net.rs index f4a4326..479ae2a 100644 --- a/src/linear/elastic_net.rs +++ b/src/linear/elastic_net.rs @@ -401,6 +401,7 @@ mod tests { } #[test] + #[cfg(feature = "serde")] fn serde() { let x = DenseMatrix::from_2d_array(&[ &[234.289, 235.6, 159.0, 107.608, 1947., 60.323], diff --git a/src/linear/lasso.rs b/src/linear/lasso.rs index 17712b1..8c59a4f 100644 --- a/src/linear/lasso.rs +++ b/src/linear/lasso.rs @@ -275,6 +275,7 @@ mod tests { } #[test] + #[cfg(feature = "serde")] fn serde() { let x = DenseMatrix::from_2d_array(&[ &[234.289, 235.6, 159.0, 107.608, 1947., 60.323], diff --git a/src/linear/linear_regression.rs b/src/linear/linear_regression.rs index 290a2db..2734a78 100644 --- a/src/linear/linear_regression.rs +++ b/src/linear/linear_regression.rs @@ -251,6 +251,7 @@ mod tests { } #[test] + #[cfg(feature = "serde")] fn serde() { let x = DenseMatrix::from_2d_array(&[ &[234.289, 235.6, 159.0, 107.608, 1947., 60.323], diff --git a/src/linear/logistic_regression.rs b/src/linear/logistic_regression.rs index 45777be..cbdef77 100644 --- a/src/linear/logistic_regression.rs +++ b/src/linear/logistic_regression.rs @@ -543,6 +543,7 @@ mod tests { } #[test] + #[cfg(feature = "serde")] fn serde() { let x = DenseMatrix::from_2d_array(&[ &[1., -5.], diff --git a/src/linear/ridge_regression.rs b/src/linear/ridge_regression.rs index 4e1ebad..787c338 100644 --- a/src/linear/ridge_regression.rs +++ b/src/linear/ridge_regression.rs @@ -330,6 +330,7 @@ mod tests { } #[test] + #[cfg(feature = "serde")] fn serde() { let x = DenseMatrix::from_2d_array(&[ &[234.289, 235.6, 159.0, 107.608, 1947., 60.323], diff --git a/src/naive_bayes/bernoulli.rs b/src/naive_bayes/bernoulli.rs index cdbfa80..6a7d0b4 100644 --- a/src/naive_bayes/bernoulli.rs +++ b/src/naive_bayes/bernoulli.rs @@ -351,6 +351,7 @@ mod tests { } #[test] + #[cfg(feature = "serde")] fn serde() { let x = DenseMatrix::::from_2d_array(&[ &[1., 1., 0., 0., 0., 0.], diff --git a/src/naive_bayes/categorical.rs b/src/naive_bayes/categorical.rs index dc8587a..2161528 100644 --- a/src/naive_bayes/categorical.rs +++ b/src/naive_bayes/categorical.rs @@ -349,6 +349,7 @@ mod tests { } #[test] + #[cfg(feature = "serde")] fn serde() { let x = DenseMatrix::::from_2d_array(&[ &[3., 4., 0., 1.], diff --git a/src/naive_bayes/gaussian.rs b/src/naive_bayes/gaussian.rs index c27c396..28c4785 100644 --- a/src/naive_bayes/gaussian.rs +++ b/src/naive_bayes/gaussian.rs @@ -281,6 +281,7 @@ mod tests { } #[test] + #[cfg(feature = "serde")] fn serde() { let x = DenseMatrix::::from_2d_array(&[ &[-1., -1.], diff --git a/src/naive_bayes/multinomial.rs b/src/naive_bayes/multinomial.rs index fa91020..06ee071 100644 --- a/src/naive_bayes/multinomial.rs +++ b/src/naive_bayes/multinomial.rs @@ -324,6 +324,7 @@ mod tests { )); } #[test] + #[cfg(feature = "serde")] fn serde() { let x = DenseMatrix::::from_2d_array(&[ &[1., 1., 0., 0., 0., 0.], diff --git a/src/neighbors/knn_classifier.rs b/src/neighbors/knn_classifier.rs index 839eea3..ba6693e 100644 --- a/src/neighbors/knn_classifier.rs +++ b/src/neighbors/knn_classifier.rs @@ -280,6 +280,7 @@ mod tests { } #[test] + #[cfg(feature = "serde")] fn serde() { let x = DenseMatrix::from_2d_array(&[&[1., 2.], &[3., 4.], &[5., 6.], &[7., 8.], &[9., 10.]]); diff --git a/src/neighbors/knn_regressor.rs b/src/neighbors/knn_regressor.rs index 1edf86a..ed52496 100644 --- a/src/neighbors/knn_regressor.rs +++ b/src/neighbors/knn_regressor.rs @@ -269,6 +269,7 @@ mod tests { } #[test] + #[cfg(feature = "serde")] fn serde() { let x = DenseMatrix::from_2d_array(&[&[1., 2.], &[3., 4.], &[5., 6.], &[7., 8.], &[9., 10.]]); diff --git a/src/svm/svc.rs b/src/svm/svc.rs index 9d77812..3101425 100644 --- a/src/svm/svc.rs +++ b/src/svm/svc.rs @@ -726,6 +726,7 @@ mod tests { use super::*; use crate::linalg::naive::dense_matrix::*; use crate::metrics::accuracy; + #[cfg(feature = "serde")] use crate::svm::*; #[test] @@ -814,6 +815,7 @@ mod tests { } #[test] + #[cfg(feature = "serde")] fn svc_serde() { let x = DenseMatrix::from_2d_array(&[ &[5.1, 3.5, 1.4, 0.2], diff --git a/src/svm/svr.rs b/src/svm/svr.rs index cbb1ea5..b160cca 100644 --- a/src/svm/svr.rs +++ b/src/svm/svr.rs @@ -533,6 +533,7 @@ mod tests { use super::*; use crate::linalg::naive::dense_matrix::*; use crate::metrics::mean_squared_error; + #[cfg(feature = "serde")] use crate::svm::*; #[test] @@ -569,6 +570,7 @@ mod tests { } #[test] + #[cfg(feature = "serde")] fn svr_serde() { let x = DenseMatrix::from_2d_array(&[ &[234.289, 235.6, 159.0, 107.608, 1947., 60.323], diff --git a/src/tree/decision_tree_classifier.rs b/src/tree/decision_tree_classifier.rs index 7575a5a..ba79d52 100644 --- a/src/tree/decision_tree_classifier.rs +++ b/src/tree/decision_tree_classifier.rs @@ -745,6 +745,7 @@ mod tests { } #[test] + #[cfg(feature = "serde")] fn serde() { let x = DenseMatrix::from_2d_array(&[ &[1., 1., 1., 0.], diff --git a/src/tree/decision_tree_regressor.rs b/src/tree/decision_tree_regressor.rs index d1292db..307d357 100644 --- a/src/tree/decision_tree_regressor.rs +++ b/src/tree/decision_tree_regressor.rs @@ -581,6 +581,7 @@ mod tests { } #[test] + #[cfg(feature = "serde")] fn serde() { let x = DenseMatrix::from_2d_array(&[ &[234.289, 235.6, 159., 107.608, 1947., 60.323], From fd00bc3780a5d4e289d6689179ebb80798d74e77 Mon Sep 17 00:00:00 2001 From: Ben Cross Date: Mon, 18 Jan 2021 20:50:49 +0000 Subject: [PATCH 4/4] Run the pipeline with --all-features enabled --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index a931ff5..6cdd0e4 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -23,10 +23,10 @@ jobs: command: cargo fmt -- --check - run: name: Stable Build - command: cargo build --features "nalgebra-bindings ndarray-bindings" + command: cargo build --all-features - run: name: Test - command: cargo test --features "nalgebra-bindings ndarray-bindings" + command: cargo test --all-features - save_cache: key: project-cache paths: