Skip to content

Commit 272aabc

Browse files
Merge pull request #67 from ssorc3/development
Make SerDe Optional
2 parents eb76949 + fd00bc3 commit 272aabc

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+249
-91
lines changed

.circleci/config.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@ jobs:
2323
command: cargo fmt -- --check
2424
- run:
2525
name: Stable Build
26-
command: cargo build --features "nalgebra-bindings ndarray-bindings"
26+
command: cargo build --all-features
2727
- run:
2828
name: Test
29-
command: cargo test --features "nalgebra-bindings ndarray-bindings"
29+
command: cargo test --all-features
3030
- save_cache:
3131
key: project-cache
3232
paths:

Cargo.toml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,7 @@ num-traits = "0.2.12"
2525
num = "0.3.0"
2626
rand = "0.7.3"
2727
rand_distr = "0.3.0"
28-
serde = { version = "1.0.115", features = ["derive"] }
29-
serde_derive = "1.0.115"
28+
serde = { version = "1.0.115", features = ["derive"], optional = true }
3029

3130
[dev-dependencies]
3231
criterion = "0.3"

src/algorithm/neighbour/cover_tree.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
//! ```
2525
use std::fmt::Debug;
2626

27+
#[cfg(feature = "serde")]
2728
use serde::{Deserialize, Serialize};
2829

2930
use crate::algorithm::sort::heap_select::HeapSelection;
@@ -32,7 +33,8 @@ use crate::math::distance::Distance;
3233
use crate::math::num::RealNumber;
3334

3435
/// Implements Cover Tree algorithm
35-
#[derive(Serialize, Deserialize, Debug)]
36+
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
37+
#[derive(Debug)]
3638
pub struct CoverTree<T, F: RealNumber, D: Distance<T, F>> {
3739
base: F,
3840
inv_log_base: F,
@@ -56,7 +58,8 @@ impl<T, F: RealNumber, D: Distance<T, F>> PartialEq for CoverTree<T, F, D> {
5658
}
5759
}
5860

59-
#[derive(Debug, Serialize, Deserialize)]
61+
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
62+
#[derive(Debug)]
6063
struct Node<F: RealNumber> {
6164
idx: usize,
6265
max_dist: F,
@@ -65,7 +68,7 @@ struct Node<F: RealNumber> {
6568
scale: i64,
6669
}
6770

68-
#[derive(Debug, Serialize, Deserialize)]
71+
#[derive(Debug)]
6972
struct DistanceSet<F: RealNumber> {
7073
idx: usize,
7174
dist: Vec<F>,
@@ -454,7 +457,8 @@ mod tests {
454457
use super::*;
455458
use crate::math::distance::Distances;
456459

457-
#[derive(Debug, Serialize, Deserialize, Clone)]
460+
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
461+
#[derive(Debug, Clone)]
458462
struct SimpleDistance {}
459463

460464
impl Distance<i32, f64> for SimpleDistance {
@@ -500,6 +504,7 @@ mod tests {
500504
}
501505

502506
#[test]
507+
#[cfg(feature = "serde")]
503508
fn serde() {
504509
let data = vec![1, 2, 3, 4, 5, 6, 7, 8, 9];
505510

src/algorithm/neighbour/linear_search.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
//!
2323
//! ```
2424
25+
#[cfg(feature = "serde")]
2526
use serde::{Deserialize, Serialize};
2627
use std::cmp::{Ordering, PartialOrd};
2728
use std::marker::PhantomData;
@@ -32,7 +33,8 @@ use crate::math::distance::Distance;
3233
use crate::math::num::RealNumber;
3334

3435
/// Implements Linear Search algorithm, see [KNN algorithms](../index.html)
35-
#[derive(Serialize, Deserialize, Debug)]
36+
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
37+
#[derive(Debug)]
3638
pub struct LinearKNNSearch<T, F: RealNumber, D: Distance<T, F>> {
3739
distance: D,
3840
data: Vec<T>,
@@ -138,7 +140,8 @@ mod tests {
138140
use super::*;
139141
use crate::math::distance::Distances;
140142

141-
#[derive(Debug, Serialize, Deserialize, Clone)]
143+
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
144+
#[derive(Debug, Clone)]
142145
struct SimpleDistance {}
143146

144147
impl Distance<i32, f64> for SimpleDistance {

src/algorithm/neighbour/mod.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ use crate::algorithm::neighbour::linear_search::LinearKNNSearch;
3535
use crate::error::Failed;
3636
use crate::math::distance::Distance;
3737
use crate::math::num::RealNumber;
38+
#[cfg(feature = "serde")]
3839
use serde::{Deserialize, Serialize};
3940

4041
pub(crate) mod bbd_tree;
@@ -45,15 +46,17 @@ pub mod linear_search;
4546

4647
/// Both, KNN classifier and regressor benefits from underlying search algorithms that helps to speed up queries.
4748
/// `KNNAlgorithmName` maintains a list of supported search algorithms, see [KNN algorithms](../algorithm/neighbour/index.html)
48-
#[derive(Serialize, Deserialize, Debug, Clone)]
49+
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
50+
#[derive(Debug, Clone)]
4951
pub enum KNNAlgorithmName {
5052
/// Heap Search algorithm, see [`LinearSearch`](../algorithm/neighbour/linear_search/index.html)
5153
LinearSearch,
5254
/// Cover Tree Search algorithm, see [`CoverTree`](../algorithm/neighbour/cover_tree/index.html)
5355
CoverTree,
5456
}
5557

56-
#[derive(Serialize, Deserialize, Debug)]
58+
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
59+
#[derive(Debug)]
5760
pub(crate) enum KNNAlgorithm<T: RealNumber, D: Distance<Vec<T>, T>> {
5861
LinearSearch(LinearKNNSearch<Vec<T>, T, D>),
5962
CoverTree(CoverTree<Vec<T>, T, D>),

src/cluster/dbscan.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
use std::fmt::Debug;
4444
use std::iter::Sum;
4545

46+
#[cfg(feature = "serde")]
4647
use serde::{Deserialize, Serialize};
4748

4849
use crate::algorithm::neighbour::{KNNAlgorithm, KNNAlgorithmName};
@@ -55,7 +56,8 @@ use crate::math::num::RealNumber;
5556
use crate::tree::decision_tree_classifier::which_max;
5657

5758
/// DBSCAN clustering algorithm
58-
#[derive(Serialize, Deserialize, Debug)]
59+
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
60+
#[derive(Debug)]
5961
pub struct DBSCAN<T: RealNumber, D: Distance<Vec<T>, T>> {
6062
cluster_labels: Vec<i16>,
6163
num_classes: usize,
@@ -263,6 +265,7 @@ impl<T: RealNumber + Sum, D: Distance<Vec<T>, T>> DBSCAN<T, D> {
263265
mod tests {
264266
use super::*;
265267
use crate::linalg::naive::dense_matrix::DenseMatrix;
268+
#[cfg(feature = "serde")]
266269
use crate::math::distance::euclidian::Euclidian;
267270

268271
#[test]
@@ -297,6 +300,7 @@ mod tests {
297300
}
298301

299302
#[test]
303+
#[cfg(feature = "serde")]
300304
fn serde() {
301305
let x = DenseMatrix::from_2d_array(&[
302306
&[5.1, 3.5, 1.4, 0.2],

src/cluster/kmeans.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ use rand::Rng;
5656
use std::fmt::Debug;
5757
use std::iter::Sum;
5858

59+
#[cfg(feature = "serde")]
5960
use serde::{Deserialize, Serialize};
6061

6162
use crate::algorithm::neighbour::bbd_tree::BBDTree;
@@ -66,7 +67,8 @@ use crate::math::distance::euclidian::*;
6667
use crate::math::num::RealNumber;
6768

6869
/// K-Means clustering algorithm
69-
#[derive(Serialize, Deserialize, Debug)]
70+
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
71+
#[derive(Debug)]
7072
pub struct KMeans<T: RealNumber> {
7173
k: usize,
7274
y: Vec<usize>,
@@ -345,6 +347,7 @@ mod tests {
345347
}
346348

347349
#[test]
350+
#[cfg(feature = "serde")]
348351
fn serde() {
349352
let x = DenseMatrix::from_2d_array(&[
350353
&[5.1, 3.5, 1.4, 0.2],

src/decomposition/pca.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
//! <script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
4848
use std::fmt::Debug;
4949

50+
#[cfg(feature = "serde")]
5051
use serde::{Deserialize, Serialize};
5152

5253
use crate::api::{Transformer, UnsupervisedEstimator};
@@ -55,7 +56,8 @@ use crate::linalg::Matrix;
5556
use crate::math::num::RealNumber;
5657

5758
/// Principal components analysis algorithm
58-
#[derive(Serialize, Deserialize, Debug)]
59+
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
60+
#[derive(Debug)]
5961
pub struct PCA<T: RealNumber, M: Matrix<T>> {
6062
eigenvectors: M,
6163
eigenvalues: Vec<T>,
@@ -565,6 +567,7 @@ mod tests {
565567
}
566568

567569
#[test]
570+
#[cfg(feature = "serde")]
568571
fn serde() {
569572
let iris = DenseMatrix::from_2d_array(&[
570573
&[5.1, 3.5, 1.4, 0.2],

src/decomposition/svd.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
use std::fmt::Debug;
4747
use std::marker::PhantomData;
4848

49+
#[cfg(feature = "serde")]
4950
use serde::{Deserialize, Serialize};
5051

5152
use crate::api::{Transformer, UnsupervisedEstimator};
@@ -54,7 +55,8 @@ use crate::linalg::Matrix;
5455
use crate::math::num::RealNumber;
5556

5657
/// SVD
57-
#[derive(Serialize, Deserialize, Debug)]
58+
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
59+
#[derive(Debug)]
5860
pub struct SVD<T: RealNumber, M: Matrix<T>> {
5961
components: M,
6062
phantom: PhantomData<T>,
@@ -226,6 +228,7 @@ mod tests {
226228
}
227229

228230
#[test]
231+
#[cfg(feature = "serde")]
229232
fn serde() {
230233
let iris = DenseMatrix::from_2d_array(&[
231234
&[5.1, 3.5, 1.4, 0.2],

src/ensemble/random_forest_classifier.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ use std::default::Default;
4949
use std::fmt::Debug;
5050

5151
use rand::Rng;
52+
#[cfg(feature = "serde")]
5253
use serde::{Deserialize, Serialize};
5354

5455
use crate::api::{Predictor, SupervisedEstimator};
@@ -61,7 +62,8 @@ use crate::tree::decision_tree_classifier::{
6162

6263
/// Parameters of the Random Forest algorithm.
6364
/// Some parameters here are passed directly into base estimator.
64-
#[derive(Serialize, Deserialize, Debug, Clone)]
65+
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
66+
#[derive(Debug, Clone)]
6567
pub struct RandomForestClassifierParameters {
6668
/// Split criteria to use when building a tree. See [Decision Tree Classifier](../../tree/decision_tree_classifier/index.html)
6769
pub criterion: SplitCriterion,
@@ -78,7 +80,8 @@ pub struct RandomForestClassifierParameters {
7880
}
7981

8082
/// Random Forest Classifier
81-
#[derive(Serialize, Deserialize, Debug)]
83+
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
84+
#[derive(Debug)]
8285
pub struct RandomForestClassifier<T: RealNumber> {
8386
parameters: RandomForestClassifierParameters,
8487
trees: Vec<DecisionTreeClassifier<T>>,
@@ -322,6 +325,7 @@ mod tests {
322325
}
323326

324327
#[test]
328+
#[cfg(feature = "serde")]
325329
fn serde() {
326330
let x = DenseMatrix::from_2d_array(&[
327331
&[5.1, 3.5, 1.4, 0.2],

src/ensemble/random_forest_regressor.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ use std::default::Default;
4747
use std::fmt::Debug;
4848

4949
use rand::Rng;
50+
#[cfg(feature = "serde")]
5051
use serde::{Deserialize, Serialize};
5152

5253
use crate::api::{Predictor, SupervisedEstimator};
@@ -57,7 +58,8 @@ use crate::tree::decision_tree_regressor::{
5758
DecisionTreeRegressor, DecisionTreeRegressorParameters,
5859
};
5960

60-
#[derive(Serialize, Deserialize, Debug, Clone)]
61+
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
62+
#[derive(Debug, Clone)]
6163
/// Parameters of the Random Forest Regressor
6264
/// Some parameters here are passed directly into base estimator.
6365
pub struct RandomForestRegressorParameters {
@@ -74,7 +76,8 @@ pub struct RandomForestRegressorParameters {
7476
}
7577

7678
/// Random Forest Regressor
77-
#[derive(Serialize, Deserialize, Debug)]
79+
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
80+
#[derive(Debug)]
7881
pub struct RandomForestRegressor<T: RealNumber> {
7982
parameters: RandomForestRegressorParameters,
8083
trees: Vec<DecisionTreeRegressor<T>>,
@@ -271,6 +274,7 @@ mod tests {
271274
}
272275

273276
#[test]
277+
#[cfg(feature = "serde")]
274278
fn serde() {
275279
let x = DenseMatrix::from_2d_array(&[
276280
&[234.289, 235.6, 159., 107.608, 1947., 60.323],

src/error/mod.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,21 @@
22
use std::error::Error;
33
use std::fmt;
44

5+
#[cfg(feature = "serde")]
56
use serde::{Deserialize, Serialize};
67

78
/// Generic error to be raised when something goes wrong.
8-
#[derive(Debug, Serialize, Deserialize)]
9+
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
10+
#[derive(Debug)]
911
pub struct Failed {
1012
err: FailedError,
1113
msg: String,
1214
}
1315

1416
/// Type of error
1517
#[non_exhaustive]
16-
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
18+
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
19+
#[derive(Copy, Clone, Debug)]
1720
pub enum FailedError {
1821
/// Can't fit algorithm to data
1922
FitFailed = 1,

src/linalg/naive/dense_matrix.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
#![allow(clippy::ptr_arg)]
22
use std::fmt;
33
use std::fmt::Debug;
4+
#[cfg(feature = "serde")]
45
use std::marker::PhantomData;
56
use std::ops::Range;
67

8+
#[cfg(feature = "serde")]
79
use serde::de::{Deserializer, MapAccess, SeqAccess, Visitor};
10+
#[cfg(feature = "serde")]
811
use serde::ser::{SerializeStruct, Serializer};
12+
#[cfg(feature = "serde")]
913
use serde::{Deserialize, Serialize};
1014

1115
use crate::linalg::cholesky::CholeskyDecomposableMatrix;
@@ -349,6 +353,7 @@ impl<'a, T: RealNumber> Iterator for DenseMatrixIterator<'a, T> {
349353
}
350354
}
351355

356+
#[cfg(feature = "serde")]
352357
impl<'de, T: RealNumber + fmt::Debug + Deserialize<'de>> Deserialize<'de> for DenseMatrix<T> {
353358
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
354359
where
@@ -434,6 +439,7 @@ impl<'de, T: RealNumber + fmt::Debug + Deserialize<'de>> Deserialize<'de> for De
434439
}
435440
}
436441

442+
#[cfg(feature = "serde")]
437443
impl<T: RealNumber + fmt::Debug + Serialize> Serialize for DenseMatrix<T> {
438444
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
439445
where
@@ -1306,6 +1312,7 @@ mod tests {
13061312
}
13071313

13081314
#[test]
1315+
#[cfg(feature = "serde")]
13091316
fn to_from_json() {
13101317
let a = DenseMatrix::from_2d_array(&[&[0.9, 0.4, 0.7], &[0.4, 0.5, 0.3], &[0.7, 0.3, 0.8]]);
13111318
let deserialized_a: DenseMatrix<f64> =
@@ -1314,6 +1321,7 @@ mod tests {
13141321
}
13151322

13161323
#[test]
1324+
#[cfg(feature = "serde")]
13171325
fn to_from_bincode() {
13181326
let a = DenseMatrix::from_2d_array(&[&[0.9, 0.4, 0.7], &[0.4, 0.5, 0.3], &[0.7, 0.3, 0.8]]);
13191327
let deserialized_a: DenseMatrix<f64> =

0 commit comments

Comments
 (0)