tensors/lib.rs
1//! Compact dense tensor primitives for numerical algorithms.
2//!
3//! The crate intentionally starts with a small surface area: row-major owned
4//! arrays, cheap strided views, checked shape errors, scalar kernels, and
5//! matrix primitives that can later delegate to accelerated backends.
6//!
7//! # Examples
8//!
9//! Matrix slicing and multiplication:
10//!
11//! ```
12//! use tensors::{Array2, matmul};
13//!
14//! let a = Array2::from_vec([2, 3], vec![1.0, 2.0, 3.0, 4.0, 5.0, 6.0])?;
15//! let gram = matmul(a.transpose_view(), a.view())?;
16//!
17//! assert_eq!(gram.shape(), [3, 3]);
18//! assert_eq!(gram[(0, 0)], 17.0);
19//! # Ok::<(), tensors::Error>(())
20//! ```
21//!
22//! Lazy preprocessing for PCA-style workflows:
23//!
24//! ```
25//! use tensors::{Array2, LinearOperator, StandardizedOperator, column_means, column_variances};
26//!
27//! let a = Array2::from_vec([3, 2], vec![1.0, 2.0, 3.0, 6.0, 5.0, 10.0])?;
28//! let means = column_means(a.view());
29//! let scales = column_variances(a.view(), &means)?
30//! .into_iter()
31//! .map(f64::sqrt)
32//! .collect::<Vec<_>>();
33//! let standardized = StandardizedOperator::new(a, means, scales);
34//!
35//! let mut y = [0.0; 3];
36//! standardized.matvec(&[1.0, -1.0], &mut y)?;
37//! assert_eq!(y.len(), 3);
38//! # Ok::<(), tensors::Error>(())
39//! ```
40//!
41//! Randomized SVD on a dense matrix:
42//!
43//! ```
44//! use tensors::{Array2, RandomizedSvdOptions, randomized_svd};
45//!
46//! let a = Array2::from_vec([3, 2], vec![3.0, 0.0, 4.0, 0.0, 0.0, 0.0])?;
47//! let result = randomized_svd(
48//! &a,
49//! RandomizedSvdOptions {
50//! rank: 1,
51//! oversampling: 1,
52//! power_iterations: 1,
53//! seed: Some(7),
54//! ..RandomizedSvdOptions::default()
55//! },
56//! )?;
57//!
58//! assert_eq!(result.s.len(), 1);
59//! # Ok::<(), tensors::Error>(())
60//! ```
61
62#![warn(missing_docs)]
63
64mod array2;
65mod array3;
66mod arrayn;
67mod error;
68mod linalg;
69mod numeric;
70mod preprocessing;
71mod rand;
72mod sparse;
73mod view2;
74mod view3;
75mod workspace;
76
77pub use array2::Array2;
78pub use array3::{Array3, Axis3, fold_view, unfold_view};
79pub use arrayn::{ArrayN, ArrayViewMutN, ArrayViewN};
80pub use error::{Error, Result};
81pub use linalg::{
82 CenteredOperator, ColumnScaledOperator, EighResult, LinearOperator, QrResult,
83 RandomizedSvdOptions, RowScaledOperator, StandardizedOperator, SvdResult, Transpose,
84 approx_reconstruction_error, axpy, axpy_f32, axpy_f64, batch_randomized_svd,
85 batch_randomized_svd_parallel, dot, dot_f32, dot_f64, eigh_small, explained_variance_ratio,
86 gemm, gemm_with_workspace, matmul, norm_l2, norm_l2_f32, norm_l2_f64, pack_block, qr,
87 randomized_range_finder, randomized_svd, randomized_svd_with_error, reorthogonalize, svd_small,
88 thin_qr, unpack_block,
89};
90pub use numeric::Float;
91pub use preprocessing::{
92 center_columns_inplace, center_rows_inplace, centered_columns, centered_rows, column_means,
93 column_variances, row_means, row_variances, scale_columns_inplace, scale_rows_inplace,
94 standardize_columns_inplace, standardize_rows_inplace,
95};
96pub use sparse::CsrMatrix;
97pub use view2::{ArrayView2, ArrayViewMut2};
98pub use view3::{ArrayView3, ArrayViewMut3};
99pub use workspace::{ScratchBuffer, Workspace};