pub struct StridedView<'a, T, Op = Identity> { /* private fields */ }Expand description
Dynamic-rank immutable strided view with lazy element operations.
This is the Julia-equivalent StridedView type with:
- Dynamic rank, with metadata stored inline for up to
INLINE_RANKdimensions (StridedView::newcopies the caller’s layout, so the view borrows only the element data) - Lazy element operations via the
Optype parameter - Zero-copy transformations (permute, transpose, adjoint, conj)
§Type Parameters
'a: Lifetime of the underlying dataT: Element typeOp: Element operation applied lazily on access (default:Identity)
§Size
The inline metadata makes the view 184 bytes on 64-bit targets for
usize/isize strides.
§Auto traits
The view borrows its elements, so it is Send only when T: Sync (a
shared slice is). A view of non-Sync data is not Send:
use std::cell::Cell;
use strided_view::StridedView;
fn assert_send<T: Send>() {}
assert_send::<StridedView<'static, Cell<i32>>>();Implementations§
Source§impl<'a, T, Op> StridedView<'a, T, Op>
impl<'a, T, Op> StridedView<'a, T, Op>
Sourcepub fn new(
data: &'a [T],
dims: &[usize],
strides: &[isize],
offset: isize,
) -> Result<StridedView<'a, T, Op>, StridedError>
pub fn new( data: &'a [T], dims: &[usize], strides: &[isize], offset: isize, ) -> Result<StridedView<'a, T, Op>, StridedError>
Create an immutable strided view, copying the caller’s metadata inline.
The layout is copied into the view’s inline storage, so it does not
need to outlive the view and no heap allocation happens at rank
<= INLINE_RANK. The view’s lifetime is tied to data only.
§Examples
use strided_view::StridedView;
let data = [1.0f64, 2.0, 3.0, 4.0, 5.0, 6.0];
let view = StridedView::<f64>::new(&data, &[2, 3], &[1, 2], 0).unwrap();
assert_eq!(view.dims(), &[2, 3]);
assert_eq!(view.get(&[1, 2]), 6.0);Sourcepub unsafe fn new_unchecked(
data: &'a [T],
dims: &[usize],
strides: &[isize],
offset: isize,
) -> StridedView<'a, T, Op>
pub unsafe fn new_unchecked( data: &'a [T], dims: &[usize], strides: &[isize], offset: isize, ) -> StridedView<'a, T, Op>
Create a view without bounds checking, copying the caller’s metadata.
§Safety
The caller must ensure all index combinations stay within bounds.
§Examples
use strided_view::StridedView;
let data = [1.0f64, 2.0, 3.0, 4.0];
let view = unsafe { StridedView::<f64>::new_unchecked(&data, &[2, 2], &[1, 2], 0) };
assert_eq!(view.ndim(), 2);Sourcepub fn permute(
&self,
perm: &[usize],
) -> Result<StridedView<'a, T, Op>, StridedError>
pub fn permute( &self, perm: &[usize], ) -> Result<StridedView<'a, T, Op>, StridedError>
Permute dimensions.
Sourcepub fn diagonal_view(
&self,
axis_pairs: &[(usize, usize)],
) -> Result<StridedView<'a, T, Op>, StridedError>
pub fn diagonal_view( &self, axis_pairs: &[(usize, usize)], ) -> Result<StridedView<'a, T, Op>, StridedError>
Create a diagonal view by fusing repeated axis pairs via stride trick (zero-copy).
For each pair (a, b):
- New stride =
strides[a] + strides[b] - New dim =
min(dims[a], dims[b]) - The higher-numbered axis is removed
- Pairs use original axis numbering
§Errors
Returns StridedError::InvalidAxis when a pair names an axis outside
the rank or names the same axis twice, and
StridedError::OffsetOverflow when a fused stride does not fit
isize or the fused layout reaches past the backing allocation. Two
pairs may share an axis (A[i,i,i] is [(0, 1), (0, 2)]), but a pair
pattern that folds one axis into itself or into both ends of another
pair can address elements outside the backing data and is rejected.
§Example
A[i,i,j] shape=[n,n,m] strides=[s0,s1,s2] -> shape=[n,m] strides=[s0+s1, s2]
Sourcepub fn broadcast(
&self,
target_dims: &[usize],
) -> Result<StridedView<'a, T, Op>, StridedError>
pub fn broadcast( &self, target_dims: &[usize], ) -> Result<StridedView<'a, T, Op>, StridedError>
Broadcast this view to a target shape.
Size-1 dimensions are expanded (stride set to 0) to match target.
Source§impl<'a, T, Op> StridedView<'a, T, Op>
Composition methods: require T: ElementOpApply and Op: ComposableElementOp<T>.
impl<'a, T, Op> StridedView<'a, T, Op>
Composition methods: require T: ElementOpApply and Op: ComposableElementOp<T>.
Sourcepub fn transpose_2d(
&self,
) -> Result<StridedView<'a, T, <Op as ComposableElementOp<T>>::ComposeTranspose>, StridedError>
pub fn transpose_2d( &self, ) -> Result<StridedView<'a, T, <Op as ComposableElementOp<T>>::ComposeTranspose>, StridedError>
Transpose a 2D view: reverses dimensions and composes the Transpose element op.
Julia equivalent: Base.transpose(a::AbstractStridedView{<:Any, 2})
Sourcepub fn adjoint_2d(
&self,
) -> Result<StridedView<'a, T, <Op as ComposableElementOp<T>>::ComposeAdjoint>, StridedError>
pub fn adjoint_2d( &self, ) -> Result<StridedView<'a, T, <Op as ComposableElementOp<T>>::ComposeAdjoint>, StridedError>
Adjoint (conjugate transpose) of a 2D view.
Julia equivalent: Base.adjoint(a::AbstractStridedView{<:Any, 2})
Sourcepub fn conj(
&self,
) -> StridedView<'a, T, <Op as ComposableElementOp<T>>::ComposeConj>
pub fn conj( &self, ) -> StridedView<'a, T, <Op as ComposableElementOp<T>>::ComposeConj>
Complex conjugate (compose Conj without changing dims/strides).
Julia equivalent: Base.conj(a::AbstractStridedView)
Source§impl<'a, T, Op> StridedView<'a, T, Op>
Element access: requires Op: ElementOp<T>.
impl<'a, T, Op> StridedView<'a, T, Op>
Element access: requires Op: ElementOp<T>.
Trait Implementations§
Source§impl<T, Op> Clone for StridedView<'_, T, Op>
impl<T, Op> Clone for StridedView<'_, T, Op>
Source§fn clone(&self) -> StridedView<'_, T, Op>
fn clone(&self) -> StridedView<'_, T, Op>
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more