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: 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..9c5c806 100644 --- a/src/algorithm/neighbour/cover_tree.rs +++ b/src/algorithm/neighbour/cover_tree.rs @@ -24,6 +24,7 @@ //! ``` use std::fmt::Debug; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::algorithm::sort::heap_select::HeapSelection; @@ -32,7 +33,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 +58,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 +68,7 @@ struct Node { scale: i64, } -#[derive(Debug, Serialize, Deserialize)] +#[derive(Debug)] struct DistanceSet { idx: usize, dist: Vec, @@ -454,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 { @@ -500,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 45fbd6f..b4a3c89 100644 --- a/src/algorithm/neighbour/linear_search.rs +++ b/src/algorithm/neighbour/linear_search.rs @@ -22,6 +22,7 @@ //! //! ``` +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use std::cmp::{Ordering, PartialOrd}; use std::marker::PhantomData; @@ -32,7 +33,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, @@ -138,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/algorithm/neighbour/mod.rs b/src/algorithm/neighbour/mod.rs index bf9e669..321ec01 100644 --- a/src/algorithm/neighbour/mod.rs +++ b/src/algorithm/neighbour/mod.rs @@ -35,6 +35,7 @@ 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}; pub(crate) mod bbd_tree; @@ -45,7 +46,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 +55,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..d7a706a 100644 --- a/src/cluster/dbscan.rs +++ b/src/cluster/dbscan.rs @@ -43,6 +43,7 @@ use std::fmt::Debug; use std::iter::Sum; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::algorithm::neighbour::{KNNAlgorithm, KNNAlgorithmName}; @@ -55,7 +56,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, @@ -263,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] @@ -297,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 44ce1e6..6be52a5 100644 --- a/src/cluster/kmeans.rs +++ b/src/cluster/kmeans.rs @@ -56,6 +56,7 @@ use rand::Rng; use std::fmt::Debug; use std::iter::Sum; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::algorithm::neighbour::bbd_tree::BBDTree; @@ -66,7 +67,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, @@ -345,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 189e6de..de258dc 100644 --- a/src/decomposition/pca.rs +++ b/src/decomposition/pca.rs @@ -47,6 +47,7 @@ //! use std::fmt::Debug; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::api::{Transformer, UnsupervisedEstimator}; @@ -55,7 +56,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, @@ -565,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 595e93c..6f5a1bd 100644 --- a/src/decomposition/svd.rs +++ b/src/decomposition/svd.rs @@ -46,6 +46,7 @@ use std::fmt::Debug; use std::marker::PhantomData; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::api::{Transformer, UnsupervisedEstimator}; @@ -54,7 +55,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, @@ -226,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 49c4239..4127627 100644 --- a/src/ensemble/random_forest_classifier.rs +++ b/src/ensemble/random_forest_classifier.rs @@ -49,6 +49,7 @@ use std::default::Default; use std::fmt::Debug; use rand::Rng; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::api::{Predictor, SupervisedEstimator}; @@ -61,7 +62,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 +80,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>, @@ -322,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 fdeb9fc..02eef99 100644 --- a/src/ensemble/random_forest_regressor.rs +++ b/src/ensemble/random_forest_regressor.rs @@ -47,6 +47,7 @@ use std::default::Default; use std::fmt::Debug; use rand::Rng; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::api::{Predictor, SupervisedEstimator}; @@ -57,7 +58,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 +76,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>, @@ -271,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/error/mod.rs b/src/error/mod.rs index 2409889..4e84f6e 100644 --- a/src/error/mod.rs +++ b/src/error/mod.rs @@ -2,10 +2,12 @@ use std::error::Error; use std::fmt; +#[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 +15,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..4faa77d 100644 --- a/src/linalg/naive/dense_matrix.rs +++ b/src/linalg/naive/dense_matrix.rs @@ -1,11 +1,15 @@ #![allow(clippy::ptr_arg)] use std::fmt; use std::fmt::Debug; +#[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 +353,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 +439,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 @@ -1306,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 = @@ -1314,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 2833ff1..479ae2a 100644 --- a/src/linear/elastic_net.rs +++ b/src/linear/elastic_net.rs @@ -56,6 +56,7 @@ //! use std::fmt::Debug; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::api::{Predictor, SupervisedEstimator}; @@ -67,7 +68,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 +86,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, @@ -398,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 b99ecff..8c59a4f 100644 --- a/src/linear/lasso.rs +++ b/src/linear/lasso.rs @@ -24,6 +24,7 @@ //! use std::fmt::Debug; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::api::{Predictor, SupervisedEstimator}; @@ -34,7 +35,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 +49,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, @@ -272,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 2ef03c1..2734a78 100644 --- a/src/linear/linear_regression.rs +++ b/src/linear/linear_regression.rs @@ -62,6 +62,7 @@ //! use std::fmt::Debug; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::api::{Predictor, SupervisedEstimator}; @@ -69,7 +70,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)] /// 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 +81,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, @@ -247,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 a71ac45..cbdef77 100644 --- a/src/linear/logistic_regression.rs +++ b/src/linear/logistic_regression.rs @@ -56,6 +56,7 @@ use std::cmp::Ordering; use std::fmt::Debug; use std::marker::PhantomData; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::api::{Predictor, SupervisedEstimator}; @@ -68,11 +69,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, @@ -540,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 e9ed1ff..787c338 100644 --- a/src/linear/ridge_regression.rs +++ b/src/linear/ridge_regression.rs @@ -58,6 +58,7 @@ //! use std::fmt::Debug; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::api::{Predictor, SupervisedEstimator}; @@ -66,7 +67,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 +78,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 +91,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, @@ -326,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/math/distance/euclidian.rs b/src/math/distance/euclidian.rs index 9034727..b06d7d1 100644 --- a/src/math/distance/euclidian.rs +++ b/src/math/distance/euclidian.rs @@ -18,6 +18,7 @@ //! //! //! +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::math::num::RealNumber; @@ -25,7 +26,8 @@ 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..d23b57f 100644 --- a/src/math/distance/hamming.rs +++ b/src/math/distance/hamming.rs @@ -19,6 +19,7 @@ //! //! +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::math::num::RealNumber; @@ -26,7 +27,8 @@ 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..7ff86e9 100644 --- a/src/math/distance/mahalanobis.rs +++ b/src/math/distance/mahalanobis.rs @@ -44,6 +44,7 @@ use std::marker::PhantomData; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::math::num::RealNumber; @@ -52,7 +53,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..3162178 100644 --- a/src/math/distance/manhattan.rs +++ b/src/math/distance/manhattan.rs @@ -17,6 +17,7 @@ //! ``` //! //! +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::math::num::RealNumber; @@ -24,7 +25,8 @@ 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..1e97ea8 100644 --- a/src/math/distance/minkowski.rs +++ b/src/math/distance/minkowski.rs @@ -21,6 +21,7 @@ //! //! +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::math::num::RealNumber; @@ -28,7 +29,8 @@ 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..6912a4c 100644 --- a/src/metrics/accuracy.rs +++ b/src/metrics/accuracy.rs @@ -16,13 +16,15 @@ //! //! //! +#[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..508295b 100644 --- a/src/metrics/auc.rs +++ b/src/metrics/auc.rs @@ -20,6 +20,7 @@ //! * ["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}; use crate::algorithm::sort::quick_sort::QuickArgSort; @@ -27,7 +28,8 @@ 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..d881bdc 100644 --- a/src/metrics/cluster_hcv.rs +++ b/src/metrics/cluster_hcv.rs @@ -1,10 +1,12 @@ +#[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..d957d9b 100644 --- a/src/metrics/f1.rs +++ b/src/metrics/f1.rs @@ -18,6 +18,7 @@ //! //! //! +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::linalg::BaseVector; @@ -26,7 +27,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..db3039f 100644 --- a/src/metrics/mean_absolute_error.rs +++ b/src/metrics/mean_absolute_error.rs @@ -18,12 +18,14 @@ //! //! //! +#[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..3003e5d 100644 --- a/src/metrics/mean_squared_error.rs +++ b/src/metrics/mean_squared_error.rs @@ -18,12 +18,14 @@ //! //! //! +#[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..2bd0dcf 100644 --- a/src/metrics/precision.rs +++ b/src/metrics/precision.rs @@ -18,13 +18,15 @@ //! //! //! +#[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..c710ef5 100644 --- a/src/metrics/r2.rs +++ b/src/metrics/r2.rs @@ -18,13 +18,15 @@ //! //! //! +#[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..d1fad56 100644 --- a/src/metrics/recall.rs +++ b/src/metrics/recall.rs @@ -18,13 +18,15 @@ //! //! //! +#[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..6a7d0b4 100644 --- a/src/naive_bayes/bernoulli.rs +++ b/src/naive_bayes/bernoulli.rs @@ -42,10 +42,12 @@ use crate::math::num::RealNumber; use crate::math::vector::RealNumberVector; use crate::naive_bayes::{BaseNaiveBayes, NBDistribution}; +#[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 +79,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 +205,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, @@ -347,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 c6f28bd..2161528 100644 --- a/src/naive_bayes/categorical.rs +++ b/src/naive_bayes/categorical.rs @@ -36,10 +36,12 @@ 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}; /// 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 +218,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 +240,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>, } @@ -345,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 2ac9892..28c4785 100644 --- a/src/naive_bayes/gaussian.rs +++ b/src/naive_bayes/gaussian.rs @@ -30,10 +30,12 @@ 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}; /// 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 +77,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 +181,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>, } @@ -277,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/mod.rs b/src/naive_bayes/mod.rs index 7ab8b85..f7c8da6 100644 --- a/src/naive_bayes/mod.rs +++ b/src/naive_bayes/mod.rs @@ -39,6 +39,7 @@ use crate::error::Failed; use crate::linalg::BaseVector; use crate::linalg::Matrix; use crate::math::num::RealNumber; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use std::marker::PhantomData; @@ -55,7 +56,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..06ee071 100644 --- a/src/naive_bayes/multinomial.rs +++ b/src/naive_bayes/multinomial.rs @@ -42,10 +42,12 @@ use crate::math::num::RealNumber; use crate::math::vector::RealNumberVector; use crate::naive_bayes::{BaseNaiveBayes, NBDistribution}; +#[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 +75,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 +192,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>, } @@ -320,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 97dd748..ba6693e 100644 --- a/src/neighbors/knn_classifier.rs +++ b/src/neighbors/knn_classifier.rs @@ -33,6 +33,7 @@ //! use std::marker::PhantomData; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::algorithm::neighbour::{KNNAlgorithm, KNNAlgorithmName}; @@ -45,7 +46,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 +64,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, @@ -277,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 4e73103..ed52496 100644 --- a/src/neighbors/knn_regressor.rs +++ b/src/neighbors/knn_regressor.rs @@ -36,6 +36,7 @@ //! use std::marker::PhantomData; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::algorithm::neighbour::{KNNAlgorithm, KNNAlgorithmName}; @@ -48,7 +49,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 +67,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, @@ -266,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/neighbors/mod.rs b/src/neighbors/mod.rs index 85ea6b8..86b1e46 100644 --- a/src/neighbors/mod.rs +++ b/src/neighbors/mod.rs @@ -33,6 +33,7 @@ //! use crate::math::num::RealNumber; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; /// K Nearest Neighbors Classifier @@ -48,7 +49,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..068f773 100644 --- a/src/svm/mod.rs +++ b/src/svm/mod.rs @@ -26,6 +26,7 @@ pub mod svc; pub mod svr; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::linalg::BaseVector; @@ -93,18 +94,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 +119,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..3101425 100644 --- a/src/svm/svc.rs +++ b/src/svm/svc.rs @@ -76,6 +76,7 @@ use std::marker::PhantomData; use rand::seq::SliceRandom; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::api::{Predictor, SupervisedEstimator}; @@ -85,7 +86,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 +102,15 @@ pub struct SVCParameters, K: Kernel m: PhantomData, } -#[derive(Serialize, Deserialize, Debug)] -#[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", 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 +120,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, @@ -719,6 +726,7 @@ mod tests { use super::*; use crate::linalg::naive::dense_matrix::*; use crate::metrics::accuracy; + #[cfg(feature = "serde")] use crate::svm::*; #[test] @@ -807,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 9eb6046..b160cca 100644 --- a/src/svm/svr.rs +++ b/src/svm/svr.rs @@ -68,6 +68,7 @@ use std::cell::{Ref, RefCell}; use std::fmt::Debug; use std::marker::PhantomData; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::api::{Predictor, SupervisedEstimator}; @@ -77,7 +78,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 +94,15 @@ pub struct SVRParameters, K: Kernel m: PhantomData, } -#[derive(Serialize, Deserialize, Debug)] -#[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", 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 +112,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, @@ -526,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] @@ -562,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 3a92c54..ba79d52 100644 --- a/src/tree/decision_tree_classifier.rs +++ b/src/tree/decision_tree_classifier.rs @@ -68,6 +68,7 @@ use std::fmt::Debug; use std::marker::PhantomData; use rand::seq::SliceRandom; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::algorithm::sort::quick_sort::QuickArgSort; @@ -76,7 +77,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 +92,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 +103,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 +114,8 @@ pub enum SplitCriterion { ClassificationError, } -#[derive(Serialize, Deserialize, Debug)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug)] struct Node { index: usize, output: usize, @@ -740,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 06ee507..307d357 100644 --- a/src/tree/decision_tree_regressor.rs +++ b/src/tree/decision_tree_regressor.rs @@ -63,6 +63,7 @@ use std::default::Default; use std::fmt::Debug; use rand::seq::SliceRandom; +#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::algorithm::sort::quick_sort::QuickArgSort; @@ -71,7 +72,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 +85,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, @@ -577,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],