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).
Each pair (a, b) ties axes a and b to one index. Pairs that share
an axis chain into one class ([(0, 1), (1, 2)] and [(0, 1), (0, 2)]
both tie axes 0, 1 and 2), and each class becomes one axis:
- New stride = the sum of the strides of the axes in the class
- New dim = the minimum of their dims
- The class sits at its lowest-numbered axis; the others are removed
- Pairs use original axis numbering; their order does not matter, and repeating a pair has no further effect
§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.
§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