From a5016cbf9738f8c2b7b212c7ddf35e204a786485 Mon Sep 17 00:00:00 2001 From: Lukasz Woznicki Date: Thu, 22 Jan 2026 11:24:59 +0000 Subject: [PATCH] Update to Edition 2024 and bump deps --- Cargo.toml | 18 +++++++++--------- benches/benchmarks.rs | 2 +- src/activations.rs | 2 +- src/average_pooling.rs | 18 +++++++++++++----- src/batch_normalization.rs | 2 +- src/conv1d.rs | 9 ++++++--- src/dense.rs | 38 ++++++++++++++++++++++++++++---------- src/dropout.rs | 4 ++-- src/embedding.rs | 12 ++++++------ src/max_pooling.rs | 10 +++++++--- 10 files changed, 74 insertions(+), 41 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index a0e642d..0f0dc2a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,22 +1,22 @@ [package] +rust-version = "1.85.0" name = "tensorflow-layers" -version = "0.4.0" +version = "0.5.0" authors = ["Crowdstrike DSCI "] -edition = "2021" -rust = "1.60.0" +edition = "2024" description = "Pure Rust implementation of layers used in Tensorflow models" license = "MIT" include = ["Cargo.toml", "README.md", "benches/*", "src/*"] [dependencies] -ndarray = { version = "0.15.5", features = ["serde-1"] } -ndarray-rand = "0.14.0" -num-traits = "0.2.14" -serde = { version = "1.0.188", features = ["derive"] } +ndarray = { version = "0.17.2", features = ["serde"] } +ndarray-rand = "0.16.0" +num-traits = "0.2.19" +serde = { version = "1.0.228", features = ["derive"] } [dev-dependencies] -criterion = "0.5.1" -lazy_static = "1.4.0" +criterion = "0.8.1" +lazy_static = "1.5.0" [[bench]] name = "benchmarks" diff --git a/benches/benchmarks.rs b/benches/benchmarks.rs index 020f540..d43f4b1 100644 --- a/benches/benchmarks.rs +++ b/benches/benchmarks.rs @@ -4,7 +4,7 @@ #[macro_use] extern crate lazy_static; -use criterion::{black_box, criterion_group, criterion_main, Criterion}; +use criterion::{Criterion, black_box, criterion_group, criterion_main}; use ndarray::*; use tensorflow_layers::*; diff --git a/src/activations.rs b/src/activations.rs index e75580a..2e7d47f 100644 --- a/src/activations.rs +++ b/src/activations.rs @@ -131,7 +131,7 @@ impl Activation { #[allow(clippy::unreadable_literal)] mod tests { use super::*; - use ndarray::{array, Array1, Array2, Array3}; + use ndarray::{Array1, Array2, Array3, array}; #[test] fn test_relu_1d() { diff --git a/src/average_pooling.rs b/src/average_pooling.rs index cd6d734..bff43d2 100644 --- a/src/average_pooling.rs +++ b/src/average_pooling.rs @@ -101,7 +101,7 @@ impl AveragePooling1DLayer { #[allow(clippy::unreadable_literal)] mod tests { use super::*; - use ndarray::{array, Array1, Array2, Array3}; + use ndarray::{Array1, Array2, Array3, array}; #[test] fn test_averagepooling1d() { @@ -192,12 +192,20 @@ mod tests { [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] ], [ - [0.0, 5.73501, 6.6221056, 5.9534774, 2.8128617, 1.6962836, 0.0], - [0.0, -0.810096, 0.7763562, 2.1465158, 4.916585, 5.012854, 0.0] + [ + 0.0, 5.73501, 6.6221056, 5.9534774, 2.8128617, 1.6962836, 0.0 + ], + [ + 0.0, -0.810096, 0.7763562, 2.1465158, 4.916585, 5.012854, 0.0 + ] ], [ - [0.0, 3.8437622, 0.8588956, 4.1046715, 3.6405258, 2.4107575, 0.0], - [0.0, 1.9883004, 3.3759031, 1.6852531, 0.7157619, 1.3628602, 0.0] + [ + 0.0, 3.8437622, 0.8588956, 4.1046715, 3.6405258, 2.4107575, 0.0 + ], + [ + 0.0, 1.9883004, 3.3759031, 1.6852531, 0.7157619, 1.3628602, 0.0 + ] ] ]; diff --git a/src/batch_normalization.rs b/src/batch_normalization.rs index 77636fe..7cdad6e 100644 --- a/src/batch_normalization.rs +++ b/src/batch_normalization.rs @@ -76,7 +76,7 @@ impl BatchNormalization { #[allow(clippy::unreadable_literal)] mod tests { use super::*; - use ndarray::{arr2, arr3, Array2, Array3}; + use ndarray::{Array2, Array3, arr2, arr3}; #[test] fn test_batchnormalization_1d() { diff --git a/src/conv1d.rs b/src/conv1d.rs index 6ac07e6..d090205 100644 --- a/src/conv1d.rs +++ b/src/conv1d.rs @@ -46,7 +46,10 @@ impl Conv1DLayer { weights.raw_dim()[0], weights.raw_dim()[1] * weights.raw_dim()[2], ]; - weights.into_shape(output_shape).unwrap().reversed_axes() + weights + .into_shape_with_order(output_shape) + .unwrap() + .reversed_axes() }; Conv1DLayer { @@ -146,7 +149,7 @@ impl Conv1DLayer { // is reconstructed back from 2D to 3D. let mut result = data_intermediate .dot(&self.weights) - .into_shape(out_shape) + .into_shape_with_order(out_shape) .unwrap(); // Apply the bias @@ -162,7 +165,7 @@ impl Conv1DLayer { #[allow(clippy::unreadable_literal)] mod tests { use super::*; - use ndarray::{arr3, Array, Array1, Array3}; + use ndarray::{Array, Array1, Array3, arr3}; #[test] fn test_conv1d_simple() { diff --git a/src/dense.rs b/src/dense.rs index 3352a60..0ff7b43 100644 --- a/src/dense.rs +++ b/src/dense.rs @@ -78,7 +78,7 @@ impl DenseLayer { #[cfg(test)] mod tests { use super::*; - use ndarray::{array, Array, Array1, Array2, Array3}; + use ndarray::{Array, Array1, Array2, Array3, array}; #[test] fn test_dense_2d_simple() { @@ -121,9 +121,15 @@ mod tests { let result = dense_layer.apply2d(&data); let expected = array![ - [3587.0, 3654.0, 3721.0, 3788.0, 3855.0, 3922.0, 3989.0, 4056.0], - [8548.0, 8736.0, 8924.0, 9112.0, 9300.0, 9488.0, 9676.0, 9864.0], - [13509.0, 13818.0, 14127.0, 14436.0, 14745.0, 15054.0, 15363.0, 15672.0] + [ + 3587.0, 3654.0, 3721.0, 3788.0, 3855.0, 3922.0, 3989.0, 4056.0 + ], + [ + 8548.0, 8736.0, 8924.0, 9112.0, 9300.0, 9488.0, 9676.0, 9864.0 + ], + [ + 13509.0, 13818.0, 14127.0, 14436.0, 14745.0, 15054.0, 15363.0, 15672.0 + ] ]; assert_eq!(expected, result); @@ -141,14 +147,26 @@ mod tests { let result = dense_layer.apply3d(&data); let expected = array![ [ - [3587.0, 3654.0, 3721.0, 3788.0, 3855.0, 3922.0, 3989.0, 4056.0], - [8548.0, 8736.0, 8924.0, 9112.0, 9300.0, 9488.0, 9676.0, 9864.0], - [13509.0, 13818.0, 14127.0, 14436.0, 14745.0, 15054.0, 15363.0, 15672.0] + [ + 3587.0, 3654.0, 3721.0, 3788.0, 3855.0, 3922.0, 3989.0, 4056.0 + ], + [ + 8548.0, 8736.0, 8924.0, 9112.0, 9300.0, 9488.0, 9676.0, 9864.0 + ], + [ + 13509.0, 13818.0, 14127.0, 14436.0, 14745.0, 15054.0, 15363.0, 15672.0 + ] ], [ - [18470.0, 18900.0, 19330.0, 19760.0, 20190.0, 20620.0, 21050.0, 21480.0], - [23431.0, 23982.0, 24533.0, 25084.0, 25635.0, 26186.0, 26737.0, 27288.0], - [28392.0, 29064.0, 29736.0, 30408.0, 31080.0, 31752.0, 32424.0, 33096.0] + [ + 18470.0, 18900.0, 19330.0, 19760.0, 20190.0, 20620.0, 21050.0, 21480.0 + ], + [ + 23431.0, 23982.0, 24533.0, 25084.0, 25635.0, 26186.0, 26737.0, 27288.0 + ], + [ + 28392.0, 29064.0, 29736.0, 30408.0, 31080.0, 31752.0, 32424.0, 33096.0 + ] ] ]; diff --git a/src/dropout.rs b/src/dropout.rs index 794f098..093d987 100644 --- a/src/dropout.rs +++ b/src/dropout.rs @@ -1,5 +1,5 @@ use ndarray::{Array2, Zip}; -use ndarray_rand::{rand, rand_distr::Bernoulli, RandomExt}; +use ndarray_rand::{RandomExt, rand, rand_distr::Bernoulli}; use serde::{Deserialize, Serialize}; /// The implementation of Dropout layer @@ -36,7 +36,7 @@ impl Dropout { } let mut res: Array2 = data.clone(); - let mut rng = rand::thread_rng(); + let mut rng = rand::rng(); let mask2 = Array2::random_using( data.dim(), diff --git a/src/embedding.rs b/src/embedding.rs index 74d17e3..2aacb6a 100644 --- a/src/embedding.rs +++ b/src/embedding.rs @@ -54,14 +54,14 @@ impl EmbeddingLayer { #[cfg(test)] mod tests { use super::*; - use ndarray::{arr3, array, Array, Array2, Array3, Array4}; + use ndarray::{Array, Array2, Array3, Array4, arr3, array}; #[test] fn test_embedding_2d() { let data: Array2 = array![[1, 2, 3], [4, 5, 6], [7, 8, 9], [1, 4, 7]]; let weights: Array2 = Array::linspace(1., 1000., 1000) - .into_shape([100, 10]) + .into_shape_with_order([100, 10]) .unwrap(); let embedding_layer = EmbeddingLayer::new(weights); @@ -96,7 +96,7 @@ mod tests { let data: Array2 = array![[1, 2, 3], [4, 5, 6], [7, 8, 9], [1, 4, 7]]; let weights: Array2 = Array::linspace(1., 1000., 1000) - .into_shape([100, 10]) + .into_shape_with_order([100, 10]) .unwrap(); let embedding_layer = EmbeddingLayer::new(weights); @@ -131,7 +131,7 @@ mod tests { let data: Array3 = array![[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [1, 4, 7]]]; let weights: Array2 = Array::linspace(1., 1000., 1000) - .into_shape([100, 10]) + .into_shape_with_order([100, 10]) .unwrap(); let embedding_layer = EmbeddingLayer::new(weights); @@ -160,7 +160,7 @@ mod tests { let data: Array2 = array![[1, 2, 3], [4, 5, 100], [7, 8, 9], [1, 4, 7]]; let weights: Array2 = Array::linspace(1., 1000., 1000) - .into_shape([100, 10]) + .into_shape_with_order([100, 10]) .unwrap(); let embedding_layer = EmbeddingLayer::new(weights); @@ -173,7 +173,7 @@ mod tests { let data: Array3 = array![[[1, 2, 3], [4, 5, 100]], [[7, 8, 9], [1, 4, 7]]]; let weights: Array2 = Array::linspace(1., 1000., 1000) - .into_shape([100, 10]) + .into_shape_with_order([100, 10]) .unwrap(); let embedding_layer = EmbeddingLayer::new(weights); diff --git a/src/max_pooling.rs b/src/max_pooling.rs index 130e797..fe3c7d5 100644 --- a/src/max_pooling.rs +++ b/src/max_pooling.rs @@ -95,7 +95,7 @@ impl MaxPooling1DLayer { #[allow(clippy::unreadable_literal)] mod tests { use super::*; - use ndarray::{array, Array1, Array2, Array3}; + use ndarray::{Array1, Array2, Array3, array}; #[test] fn test_maxpooling1d() { @@ -200,8 +200,12 @@ mod tests { ] ], [ - [0.0, 5.975927, 3.1096065, 5.774783, 4.3322973, 3.3641431, 0.0], - [0.0, 4.976529, 5.649868, 2.2129567, 1.3772863, 4.3095136, 0.0] + [ + 0.0, 5.975927, 3.1096065, 5.774783, 4.3322973, 3.3641431, 0.0 + ], + [ + 0.0, 4.976529, 5.649868, 2.2129567, 1.3772863, 4.3095136, 0.0 + ] ] ];