diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9031df9..02d1179 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -19,3 +19,6 @@ jobs: - name: Rust Test run: cargo test --all-features + + - name: Rust Bench + run: cargo bench --all-features diff --git a/Cargo.toml b/Cargo.toml index e0fae0a..6148c77 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,3 +10,10 @@ repository = "https://github.com/Rust-Scientific-Computing/feotensor" [dependencies] itertools = "0.13.0" num = "0.4.3" + +[dev-dependencies] +criterion = "0.5" + +[[bench]] +name = "tensor_bench" +harness = false diff --git a/benches/tensor_bench.rs b/benches/tensor_bench.rs new file mode 100644 index 0000000..e6c2e2b --- /dev/null +++ b/benches/tensor_bench.rs @@ -0,0 +1,80 @@ +use criterion::{criterion_group, criterion_main, Criterion}; +use feotensor::{Matrix, Shape, Tensor, Vector}; + +// Contraction Methods + +fn bench_sum(c: &mut Criterion) { + let shape = Shape::new(vec![500, 500]).unwrap(); + let tensor = Tensor::::ones(&shape); + c.bench_function("tensor_sum", |b| b.iter(|| tensor.sum(vec![]))); +} + +fn bench_mean(c: &mut Criterion) { + let shape = Shape::new(vec![500, 500]).unwrap(); + let tensor = Tensor::::ones(&shape); + c.bench_function("tensor_mean", |b| b.iter(|| tensor.mean(vec![]))); +} + +fn bench_var(c: &mut Criterion) { + let shape = Shape::new(vec![500, 500]).unwrap(); + let tensor = Tensor::::ones(&shape); + c.bench_function("tensor_var", |b| b.iter(|| tensor.var(vec![]))); +} + +fn bench_max(c: &mut Criterion) { + let shape = Shape::new(vec![500, 500]).unwrap(); + let tensor = Tensor::::ones(&shape); + c.bench_function("tensor_max", |b| b.iter(|| tensor.max(vec![]))); +} + +fn bench_min(c: &mut Criterion) { + let shape = Shape::new(vec![500, 500]).unwrap(); + let tensor = Tensor::::ones(&shape); + c.bench_function("tensor_min", |b| b.iter(|| tensor.min(vec![]))); +} + +// Tensor Product + +fn bench_tensor_product(c: &mut Criterion) { + let shape_a = Shape::new(vec![100, 100]).unwrap(); + let shape_b = Shape::new(vec![100, 100]).unwrap(); + let tensor_a = Tensor::::ones(&shape_a); + let tensor_b = Tensor::::ones(&shape_b); + c.bench_function("tensor_product", |b| b.iter(|| tensor_a.prod(&tensor_b))); +} + +// Matrix Multiplication + +fn bench_matmul(c: &mut Criterion) { + let shape_a = Shape::new(vec![100, 100]).unwrap(); + let shape_b = Shape::new(vec![100, 100]).unwrap(); + let matrix_a = Matrix::::ones(&shape_a).unwrap(); + let matrix_b = Matrix::::ones(&shape_b).unwrap(); + c.bench_function("matrix_multiplication", |b| { + b.iter(|| matrix_a.matmul(&matrix_b)) + }); +} + +// Vector Multiplication + +fn bench_vecmul(c: &mut Criterion) { + let shape = Shape::new(vec![100]).unwrap(); + let vector_a = Vector::::ones(&shape).unwrap(); + let vector_b = Vector::::ones(&shape).unwrap(); + c.bench_function("vector_multiplication", |b| { + b.iter(|| vector_a.vecmul(&vector_b)) + }); +} + +criterion_group!( + benches, + bench_sum, + bench_mean, + bench_var, + bench_max, + bench_min, + bench_matmul, + bench_vecmul, + bench_tensor_product, +); +criterion_main!(benches); diff --git a/src/lib.rs b/src/lib.rs index 718f954..f8fdfeb 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,3 +7,12 @@ pub mod shape; pub mod storage; pub mod tensor; pub mod vector; + +// Re-export important structs +pub use axes::Axes; +pub use coordinate::Coordinate; +pub use error::ShapeError; +pub use matrix::Matrix; +pub use shape::Shape; +pub use tensor::Tensor; +pub use vector::Vector;