pub struct StructuredStorage<T> { /* private fields */ }Expand description
Structured tensor snapshot storage.
data and strides describe the payload tensor, while axis_classes
describes how logical axes map onto payload axes. Logical flat-buffer
semantics are column-major. A strided payload may contain unused backing
gaps; reductions and nonfinite scans visit only entries addressed by the
payload dimensions and strides.
A dense tensor has axis_classes = [0, 1, ..., rank-1] (each logical
axis maps to a distinct payload axis). A diagonal tensor has
axis_classes = [0, 0, ..., 0] (all logical axes share one payload axis),
storing only the diagonal entries.
§Examples
use tensor4all_tensorbackend::StructuredStorage;
// Dense 2x3 storage, column-major: [[1,3,5],[2,4,6]]
let dense = StructuredStorage::from_dense_col_major(
vec![1.0, 2.0, 3.0, 4.0, 5.0, 6.0], &[2, 3],
).unwrap();
assert!(dense.is_dense());
assert!(!dense.is_diag());
assert_eq!(dense.logical_rank(), 2);
assert_eq!(dense.logical_dims(), vec![2, 3]);
// Diagonal 3x3 storage
let diag = StructuredStorage::from_diag_col_major(vec![1.0, 2.0, 3.0], 2).unwrap();
assert!(diag.is_diag());
assert_eq!(diag.logical_dims(), vec![3, 3]);
assert_eq!(diag.len(), 3);Implementations§
Source§impl<T> StructuredStorage<T>
impl<T> StructuredStorage<T>
Sourcepub fn new(
data: Vec<T>,
payload_dims: Vec<usize>,
strides: Vec<isize>,
axis_classes: Vec<usize>,
) -> Result<Self>
pub fn new( data: Vec<T>, payload_dims: Vec<usize>, strides: Vec<isize>, axis_classes: Vec<usize>, ) -> Result<Self>
Creates a structured payload snapshot from explicit payload metadata.
payload_dims and strides describe the compressed payload tensor,
while axis_classes maps logical axes onto payload axes in canonical
first-appearance order.
§Errors
Returns an error if:
axis_classesis not in canonical first-appearance formpayload_dimsrank does not matchaxis_classesstridesrank does not matchpayload_dimsdatalength does not match the required storage length
§Examples
use tensor4all_tensorbackend::StructuredStorage;
// Dense 2x3 with explicit column-major strides
let s = StructuredStorage::new(
vec![1.0, 2.0, 3.0, 4.0, 5.0, 6.0],
vec![2, 3], // payload_dims
vec![1, 2], // column-major strides
vec![0, 1], // axis_classes: each axis is independent
).unwrap();
assert!(s.is_dense());
assert_eq!(s.len(), 6);Sourcepub fn from_dense_col_major(
data: Vec<T>,
logical_dims: &[usize],
) -> StorageResult<Self>
pub fn from_dense_col_major( data: Vec<T>, logical_dims: &[usize], ) -> StorageResult<Self>
Creates a dense structured snapshot from column-major logical data.
§Errors
Returns an error when the data length does not match the logical dimension /// product (a shape mismatch).
§Examples
use tensor4all_tensorbackend::StructuredStorage;
let s = StructuredStorage::from_dense_col_major(vec![10.0, 20.0, 30.0, 40.0], &[2, 2]).unwrap();
assert!(s.is_dense());
assert_eq!(s.data(), &[10.0, 20.0, 30.0, 40.0]);Sourcepub fn from_diag_col_major(
diag_data: Vec<T>,
logical_rank: usize,
) -> StorageResult<Self>
pub fn from_diag_col_major( diag_data: Vec<T>, logical_rank: usize, ) -> StorageResult<Self>
Creates a diagonal structured snapshot from column-major diagonal data.
The resulting tensor has logical_rank axes, each of size diag_data.len().
Only the diagonal entries are stored.
§Errors
Returns an error when the diagonal payload is incompatible with the logical /// rank (a shape mismatch).
§Examples
use tensor4all_tensorbackend::StructuredStorage;
let d = StructuredStorage::from_diag_col_major(vec![1.0, 2.0, 3.0], 2).unwrap();
assert!(d.is_diag());
assert_eq!(d.logical_dims(), vec![3, 3]);
assert_eq!(d.data(), &[1.0, 2.0, 3.0]);Sourcepub fn data(&self) -> &[T]
pub fn data(&self) -> &[T]
Returns the payload data buffer as a slice.
§Examples
use tensor4all_tensorbackend::StructuredStorage;
let s = StructuredStorage::from_dense_col_major(vec![1.0, 2.0], &[2]).unwrap();
assert_eq!(s.data(), &[1.0, 2.0]);Sourcepub fn payload_dims(&self) -> &[usize]
pub fn payload_dims(&self) -> &[usize]
Returns the payload tensor dimensions.
For dense tensors, this equals the logical dimensions. For diagonal
tensors, this is a single-element slice [n] where n is the diagonal
length.
§Examples
use tensor4all_tensorbackend::StructuredStorage;
let s = StructuredStorage::from_dense_col_major(vec![0.0; 6], &[2, 3]).unwrap();
assert_eq!(s.payload_dims(), &[2, 3]);
let d = StructuredStorage::from_diag_col_major(vec![1.0, 2.0], 3).unwrap();
assert_eq!(d.payload_dims(), &[2]);Sourcepub fn strides(&self) -> &[isize]
pub fn strides(&self) -> &[isize]
Returns the payload tensor strides.
§Examples
use tensor4all_tensorbackend::StructuredStorage;
// Column-major 2x3: strides are [1, 2]
let s = StructuredStorage::from_dense_col_major(vec![0.0; 6], &[2, 3]).unwrap();
assert_eq!(s.strides(), &[1, 2]);Sourcepub fn axis_classes(&self) -> &[usize]
pub fn axis_classes(&self) -> &[usize]
Returns the canonical logical-to-payload axis classes.
Each entry maps a logical axis to a payload axis index. Repeated values indicate axes that share the same payload dimension (e.g., diagonal).
§Examples
use tensor4all_tensorbackend::StructuredStorage;
let dense = StructuredStorage::from_dense_col_major(vec![0.0; 4], &[2, 2]).unwrap();
assert_eq!(dense.axis_classes(), &[0, 1]);
let diag = StructuredStorage::from_diag_col_major(vec![1.0, 2.0], 2).unwrap();
assert_eq!(diag.axis_classes(), &[0, 0]);Sourcepub fn logical_dims(&self) -> Vec<usize>
pub fn logical_dims(&self) -> Vec<usize>
Returns the logical dimensions derived from payload_dims and axis_classes.
§Examples
use tensor4all_tensorbackend::StructuredStorage;
let d = StructuredStorage::from_diag_col_major(vec![1.0, 2.0, 3.0], 3).unwrap();
assert_eq!(d.logical_dims(), vec![3, 3, 3]);Sourcepub fn logical_rank(&self) -> usize
pub fn logical_rank(&self) -> usize
Returns the logical rank (number of logical axes).
§Examples
use tensor4all_tensorbackend::StructuredStorage;
let s = StructuredStorage::from_dense_col_major(vec![0.0; 6], &[2, 3]).unwrap();
assert_eq!(s.logical_rank(), 2);Sourcepub fn is_dense(&self) -> bool
pub fn is_dense(&self) -> bool
Returns true when the logical tensor is dense (each logical axis maps
to a unique payload axis).
§Examples
use tensor4all_tensorbackend::StructuredStorage;
let s = StructuredStorage::from_dense_col_major(vec![1.0, 2.0], &[2]).unwrap();
assert!(s.is_dense());
let d = StructuredStorage::from_diag_col_major(vec![1.0, 2.0], 2).unwrap();
assert!(!d.is_dense());Sourcepub fn is_diag(&self) -> bool
pub fn is_diag(&self) -> bool
Returns true when the logical tensor is diagonal (rank >= 2 and all
logical axes map to the same payload axis).
§Examples
use tensor4all_tensorbackend::StructuredStorage;
let d = StructuredStorage::from_diag_col_major(vec![1.0, 2.0], 2).unwrap();
assert!(d.is_diag());
let s = StructuredStorage::from_dense_col_major(vec![1.0, 2.0], &[2]).unwrap();
assert!(!s.is_diag());Sourcepub fn len(&self) -> usize
pub fn len(&self) -> usize
Returns the payload buffer length.
§Examples
use tensor4all_tensorbackend::StructuredStorage;
let dense = StructuredStorage::from_dense_col_major(vec![1.0, 2.0, 3.0], &[3]).unwrap();
assert_eq!(dense.len(), 3);
let diag = StructuredStorage::from_diag_col_major(vec![1.0, 2.0], 2).unwrap();
assert_eq!(diag.len(), 2);Sourcepub fn is_empty(&self) -> bool
pub fn is_empty(&self) -> bool
Returns true when the payload buffer is empty.
§Examples
use tensor4all_tensorbackend::StructuredStorage;
let empty = StructuredStorage::from_dense_col_major(Vec::<f64>::new(), &[0]).unwrap();
assert!(empty.is_empty());
let non_empty = StructuredStorage::from_dense_col_major(vec![1.0], &[1]).unwrap();
assert!(!non_empty.is_empty());Sourcepub fn dense_col_major_view_if_contiguous(&self) -> Option<&[T]>
pub fn dense_col_major_view_if_contiguous(&self) -> Option<&[T]>
Returns a borrowed view when the logical tensor is dense and the payload is already stored contiguously in column-major order.
Returns None for diagonal or non-contiguous payloads.
§Examples
use tensor4all_tensorbackend::StructuredStorage;
let s = StructuredStorage::from_dense_col_major(vec![1.0, 2.0, 3.0], &[3]).unwrap();
assert_eq!(s.dense_col_major_view_if_contiguous(), Some(&[1.0, 2.0, 3.0][..]));
let d = StructuredStorage::from_diag_col_major(vec![1.0, 2.0], 2).unwrap();
assert_eq!(d.dense_col_major_view_if_contiguous(), None);Sourcepub fn payload_col_major_view_if_contiguous(&self) -> Option<&[T]>
pub fn payload_col_major_view_if_contiguous(&self) -> Option<&[T]>
Returns a borrowed compact-payload view when the payload is already stored contiguously in column-major order.
Source§impl<T: Clone> StructuredStorage<T>
impl<T: Clone> StructuredStorage<T>
Sourcepub fn payload_col_major_vec(&self) -> Vec<T>
pub fn payload_col_major_vec(&self) -> Vec<T>
Materializes the payload tensor as a contiguous column-major buffer.
If the payload is already column-major, returns a clone.
§Examples
use tensor4all_tensorbackend::StructuredStorage;
let s = StructuredStorage::from_dense_col_major(vec![1.0, 2.0, 3.0, 4.0], &[2, 2]).unwrap();
assert_eq!(s.payload_col_major_vec(), vec![1.0, 2.0, 3.0, 4.0]);Sourcepub fn permute_logical_axes(&self, perm: &[usize]) -> StorageResult<Self>
pub fn permute_logical_axes(&self, perm: &[usize]) -> StorageResult<Self>
Returns a copy of the storage with logical axes permuted.
§Errors
Returns an error when the permutation is not a valid reordering of the axes /// (an invalid-index failure).
§Examples
use tensor4all_tensorbackend::StructuredStorage;
// Diagonal 3x3x3 tensor; permute axes (identity for diag is always valid)
let d = StructuredStorage::from_diag_col_major(vec![1.0, 2.0, 3.0], 3).unwrap();
let p = d.permute_logical_axes(&[2, 0, 1]).unwrap();
// Diagonal: all axes share the same dimension, so dims stay the same
assert_eq!(p.logical_dims(), vec![3, 3, 3]);
assert!(p.is_diag());Source§impl<T: Copy> StructuredStorage<T>
impl<T: Copy> StructuredStorage<T>
Sourcepub fn map_copy<U>(&self, f: impl FnMut(T) -> U) -> StructuredStorage<U>
pub fn map_copy<U>(&self, f: impl FnMut(T) -> U) -> StructuredStorage<U>
Maps payload elements while preserving payload metadata and axis classes.
§Examples
use tensor4all_tensorbackend::StructuredStorage;
let s = StructuredStorage::from_dense_col_major(vec![1.0, 2.0, 3.0], &[3]).unwrap();
let doubled = s.map_copy(|x| x * 2.0);
assert_eq!(doubled.data(), &[2.0, 4.0, 6.0]);Source§impl<T: Copy + Default> StructuredStorage<T>
impl<T: Copy + Default> StructuredStorage<T>
Sourcepub fn logical_dense_col_major_vec(&self) -> StorageResult<Vec<T>>
pub fn logical_dense_col_major_vec(&self) -> StorageResult<Vec<T>>
Materializes the logical tensor as a contiguous column-major dense buffer.
Repeated entries in axis_classes encode equality constraints between
logical axes. Logical indices that violate those constraints are
structural zeros in the dense materialization.
§Errors
Returns an error if the logical dimension product overflows usize.
§Examples
use tensor4all_tensorbackend::StructuredStorage;
// Diagonal [1, 2] in 2x2 becomes [1, 0, 0, 2] column-major
let d = StructuredStorage::from_diag_col_major(vec![1.0, 2.0], 2).unwrap();
assert_eq!(d.logical_dense_col_major_vec().unwrap(), vec![1.0, 0.0, 0.0, 2.0]);Trait Implementations§
Source§impl<T: Clone> Clone for StructuredStorage<T>
impl<T: Clone> Clone for StructuredStorage<T>
Source§fn clone(&self) -> StructuredStorage<T>
fn clone(&self) -> StructuredStorage<T>
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl<T: Debug> Debug for StructuredStorage<T>
impl<T: Debug> Debug for StructuredStorage<T>
Source§impl<T: PartialEq> PartialEq for StructuredStorage<T>
impl<T: PartialEq> PartialEq for StructuredStorage<T>
Source§fn eq(&self, other: &StructuredStorage<T>) -> bool
fn eq(&self, other: &StructuredStorage<T>) -> bool
self and other values to be equal, and is used by ==.impl<T: PartialEq> StructuralPartialEq for StructuredStorage<T>
Auto Trait Implementations§
impl<T> Freeze for StructuredStorage<T>
impl<T> RefUnwindSafe for StructuredStorage<T>where
T: RefUnwindSafe,
impl<T> Send for StructuredStorage<T>where
T: Send,
impl<T> Sync for StructuredStorage<T>where
T: Sync,
impl<T> Unpin for StructuredStorage<T>where
T: Unpin,
impl<T> UnsafeUnpin for StructuredStorage<T>
impl<T> UnwindSafe for StructuredStorage<T>where
T: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T, U> Imply<T> for U
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more