Skip to main content

TypedTensorViewMut

Struct TypedTensorViewMut 

Source
pub struct TypedTensorViewMut<'a, T, R: TensorRank = DynRank> { /* private fields */ }
Expand description

Mutable borrowed view of typed tensor storage with arbitrary strides.

§Examples

use tenferro_tensor::TypedTensorViewMut;

let mut data = [1_i32, 2, 3];
let mut view = TypedTensorViewMut::from_slice(vec![3], vec![-1], 2, &mut data)?;
*view.get_mut(&[2]).unwrap() = 10;
assert_eq!(view.as_read_only().get(&[2]), Some(&10));

Implementations§

Source§

impl<'a, T: 'static> TypedTensorViewMut<'a, T, DynRank>

Source

pub fn from_col_major(shape: &[usize], data: &'a mut [T]) -> Result<Self>

Create a mutable dynamic-rank view over compact column-major host data.

§Examples
use tenferro_tensor::TypedTensorViewMut;

let mut data = [1_i32, 2, 3, 4];
let view = TypedTensorViewMut::from_col_major(&[2, 2], &mut data)?;
assert_eq!(view.strides(), &[1, 2]);
§Errors

Returns crate::Error::Validation with tenferro_tensor_core::ValidationError::IntegerOverflow for compact shape or offset arithmetic overflow, or tenferro_tensor_core::ValidationError::ViewOutOfBounds when the compact shape reaches beyond data.

Source

pub fn from_slice( shape: impl AsRef<[usize]>, strides: impl AsRef<[isize]>, offset: isize, data: &'a mut [T], ) -> Result<Self>

Create a mutable host view from explicit layout metadata.

Layouts where distinct logical elements can alias the same physical element are rejected.

§Examples
use tenferro_tensor::TypedTensorViewMut;

let mut data = [1_i32, 2];
assert!(TypedTensorViewMut::from_slice(vec![2], vec![0], 0, &mut data).is_err());
§Errors

Returns crate::Error::Validation with tenferro_tensor_core::ValidationError::RankMismatch when shape and strides have different ranks, tenferro_tensor_core::ValidationError::ViewOutOfBounds when the layout reaches beyond data, tenferro_tensor_core::ValidationError::OverlappingMutableLayout when logical elements alias, or tenferro_tensor_core::ValidationError::IntegerOverflow for layout arithmetic overflow.

Source§

impl<'a, T: 'static, R: TensorRank> TypedTensorViewMut<'a, T, R>

Source

pub fn from_slice_ranked( shape: impl Into<R::Shape>, strides: impl Into<R::Strides>, offset: isize, data: &'a mut [T], ) -> Result<Self>

Create a rank-generic mutable host view from explicit layout metadata.

§Examples
use tenferro_tensor::{Rank, TypedTensorViewMut};

let mut data = [1_i32, 2, 3, 4];
let view = TypedTensorViewMut::<_, Rank<2>>::from_slice_ranked([2, 2], [1, 2], 0, &mut data)?;
assert_eq!(view.shape(), &[2, 2]);
§Errors

Returns crate::Error::Validation with tenferro_tensor_core::ValidationError::RankMismatch when the typed rank does not match shape or strides, tenferro_tensor_core::ValidationError::ViewOutOfBounds when the layout reaches beyond data, tenferro_tensor_core::ValidationError::OverlappingMutableLayout when logical elements alias, or tenferro_tensor_core::ValidationError::IntegerOverflow for layout arithmetic overflow.

Source

pub fn shape(&self) -> &[usize]

Return the logical shape.

§Examples
use tenferro_tensor::TypedTensorViewMut;

let mut data = [0_i32; 2];
let view = TypedTensorViewMut::from_slice(vec![2], vec![1], 0, &mut data)?;
assert_eq!(view.shape(), &[2]);
Source

pub fn strides(&self) -> &[isize]

Return strides in element units.

§Examples
use tenferro_tensor::TypedTensorViewMut;

let mut data = [0_i32; 2];
let view = TypedTensorViewMut::from_slice(vec![2], vec![-1], 1, &mut data)?;
assert_eq!(view.strides(), &[-1]);
Source

pub fn offset(&self) -> isize

Return the physical element offset.

§Examples
use tenferro_tensor::TypedTensorViewMut;

let mut data = [1_i32, 2];
let view = TypedTensorViewMut::from_slice(vec![1], vec![1], 1, &mut data)?;
assert_eq!(view.offset(), 1);
Source

pub fn host_storage(&self) -> Result<&[T]>

Return the borrowed host storage backing this view.

This exposes the entire backing host allocation, not just the logical slice covered by this view. Use TypedTensorViewMut::as_read_only with TypedTensorView::as_slice when the caller needs the contiguous logical region instead.

§Examples
use tenferro_tensor::TypedTensorViewMut;

let mut data = [1_i32, 2];
let view = TypedTensorViewMut::from_slice(vec![2], vec![1], 0, &mut data)?;
assert_eq!(view.host_storage()?, &[1, 2]);
§Errors

Returns crate::Error::RuntimeState when this view wraps a backend buffer; backend storage must be downloaded before host inspection.

Source

pub fn host_storage_mut(&mut self) -> Result<&mut [T]>

Mutably borrow the host storage backing this view.

This exposes the entire backing host allocation, not just the logical slice covered by this view. Prefer scalar element accessors when mutating a logical region; tensor-sized copies belong to an active backend.

§Examples
use tenferro_tensor::TypedTensorViewMut;

let mut data = [1_i32, 2];
let mut view = TypedTensorViewMut::from_slice(vec![2], vec![1], 0, &mut data)?;
view.host_storage_mut()?[0] = 3;
assert_eq!(view.get(&[0]), Some(&3));
§Errors

Returns crate::Error::RuntimeState when this view wraps a backend buffer; backend storage must be downloaded before host inspection.

Source

pub fn n_elements(&self) -> usize

Return the number of logical elements in this view.

§Examples
use tenferro_tensor::TypedTensorViewMut;

let mut data = [0_i32; 6];
let view = TypedTensorViewMut::from_slice(vec![2, 3], vec![1, 2], 0, &mut data)?;
assert_eq!(view.n_elements(), 6);
Source

pub fn layout(&self) -> &TensorLayout<R>

Return layout metadata for this view.

§Examples
use tenferro_tensor::TypedTensorViewMut;

let mut data = [1_i32, 2];
let view = TypedTensorViewMut::from_slice(vec![2], vec![1], 0, &mut data)?;
assert!(view.layout().is_compact_col_major().unwrap());
Source

pub fn placement(&self) -> &Placement

Return placement metadata for this view.

§Examples
use tenferro_tensor::{MemoryKind, TypedTensorViewMut};

let mut data = [1_i32];
let view = TypedTensorViewMut::from_slice(vec![1], vec![1], 0, &mut data)?;
assert_eq!(view.placement().memory_kind, MemoryKind::UnpinnedHost);
Source

pub fn linear_offset(&self, indices: &[usize]) -> Option<usize>

Compute the physical element offset for a logical index.

§Examples
use tenferro_tensor::TypedTensorViewMut;

let mut data = [1_i32, 2, 3];
let view = TypedTensorViewMut::from_slice(vec![3], vec![-1], 2, &mut data)?;
assert_eq!(view.linear_offset(&[2]), Some(0));
Source

pub fn layout_linear_offset(&self, indices: &[usize]) -> Result<usize>

Compute the physical element offset for a logical index, returning a typed error.

§Examples
use tenferro_tensor::TypedTensorViewMut;

let mut data = [1_i32, 2, 3];
let view = TypedTensorViewMut::from_slice([3], [-1], 2, &mut data)?;
assert_eq!(view.layout_linear_offset(&[2])?, 0);
§Errors

Returns crate::Error::Validation with tenferro_tensor_core::ValidationError::RankMismatch when indices has the wrong rank, tenferro_tensor_core::ValidationError::InvalidArgument when an index is outside its axis extent, or tenferro_tensor_core::ValidationError::IntegerOverflow when offset arithmetic overflows.

Source

pub fn is_col_major_contiguous(&self) -> Result<bool>

Return whether this mutable view is compact column-major.

§Examples
use tenferro_tensor::TypedTensorViewMut;

let mut data = [1_i32, 2];
let view = TypedTensorViewMut::from_slice([2], [1], 0, &mut data)?;
assert!(view.is_col_major_contiguous()?);
§Errors

Returns crate::Error::Validation with tenferro_tensor_core::ValidationError::IntegerOverflow when compactness arithmetic overflows.

Source

pub fn layout_summary(&self) -> String

Return a compact string summary of this mutable view’s layout metadata.

§Examples
use tenferro_tensor::TypedTensorViewMut;

let mut data = [1_i32, 2];
let view = TypedTensorViewMut::from_slice([2], [1], 0, &mut data)?;
assert!(view.layout_summary().contains("shape=[2]"));
Source

pub fn assert_col_major_contiguous(&self) -> Result<()>

Assert this mutable view is compact column-major.

§Examples
use tenferro_tensor::TypedTensorViewMut;

let mut data = [1_i32, 2];
let view = TypedTensorViewMut::from_slice([2], [1], 0, &mut data)?;
view.assert_col_major_contiguous()?;
§Errors

Returns crate::Error::Validation with tenferro_tensor_core::ValidationError::IntegerOverflow when compactness arithmetic overflows, or tenferro_tensor_core::ValidationError::InvalidArgument when the view is not compact column-major.

Source

pub fn get(&self, indices: &[usize]) -> Option<&T>

Borrow one host element by logical index.

§Examples
use tenferro_tensor::TypedTensorViewMut;

let mut data = [1_i32, 2];
let view = TypedTensorViewMut::from_slice(vec![2], vec![1], 0, &mut data)?;
assert_eq!(view.get(&[1]), Some(&2));
Source

pub fn get_mut(&mut self, indices: &[usize]) -> Option<&mut T>

Mutably borrow one host element by logical index.

§Examples
use tenferro_tensor::TypedTensorViewMut;

let mut data = [1_i32, 2];
let mut view = TypedTensorViewMut::from_slice(vec![2], vec![1], 0, &mut data)?;
*view.get_mut(&[1]).unwrap() = 20;
assert_eq!(view.get(&[1]), Some(&20));
Source

pub fn as_read_only(&self) -> TypedTensorView<'_, T, R>

Borrow this mutable view as a read-only view.

§Examples
use tenferro_tensor::TypedTensorViewMut;

let mut data = [1_i32];
let view = TypedTensorViewMut::from_slice(vec![1], vec![1], 0, &mut data)?;
assert_eq!(view.as_read_only().get(&[0]), Some(&1));
Source

pub fn into_read_only(self) -> TypedTensorView<'a, T, R>

Convert this mutable view into a read-only view.

§Examples
use tenferro_tensor::TypedTensorViewMut;

let mut data = [1_i32];
let view = TypedTensorViewMut::from_slice(vec![1], vec![1], 0, &mut data)?;
assert_eq!(view.into_read_only().get(&[0]), Some(&1));
Source

pub fn transpose_view( self, axes: impl AsRef<[usize]>, ) -> Result<TypedTensorViewMut<'a, T, R>>

Consume this mutable view and return a metadata-only axis permutation.

§Examples
use tenferro_tensor::{Rank, TypedTensorViewMut};

let mut data = [1_i32, 2, 3, 4];
let view = TypedTensorViewMut::<_, Rank<2>>::from_slice_ranked([2, 2], [1, 2], 0, &mut data)?;
let transposed = view.transpose_view([1, 0])?;
assert_eq!(transposed.strides(), &[2, 1]);
§Errors

Returns crate::Error::Validation with tenferro_tensor_core::ValidationError::InvalidPermutationLength, tenferro_tensor_core::ValidationError::AxisOutOfBounds, or tenferro_tensor_core::ValidationError::DuplicateAxis when axes is not a valid permutation, tenferro_tensor_core::ValidationError::OverlappingMutableLayout when the permutation creates aliases, or tenferro_tensor_core::ValidationError::IntegerOverflow for layout arithmetic overflow.

Source

pub fn try_slice( &mut self, slices: &[StridedSliceSpec], ) -> Result<TypedTensorViewMut<'_, T, R>>

Return a mutable metadata-only slice using one StridedSliceSpec per axis.

§Examples
use tenferro_tensor::{StridedSliceSpec, TypedTensorViewMut};

let mut data = [1_i32, 2, 3];
let mut view = TypedTensorViewMut::from_slice(vec![3], vec![1], 0, &mut data)?;
*view.try_slice(&[StridedSliceSpec::reverse()])?.get_mut(&[0]).unwrap() = 30;
assert_eq!(view.get(&[2]), Some(&30));
§Errors

Returns crate::Error::Validation with tenferro_tensor_core::ValidationError::RankMismatch when the slice count differs from the view rank, tenferro_tensor_core::ValidationError::InvalidSliceStep or tenferro_tensor_core::ValidationError::InvalidSliceBounds for an invalid slice, tenferro_tensor_core::ValidationError::ViewOutOfBounds when the result exceeds the backing buffer, tenferro_tensor_core::ValidationError::OverlappingMutableLayout when logical elements alias, or tenferro_tensor_core::ValidationError::IntegerOverflow for layout arithmetic overflow.

Source

pub fn try_slice_axis( &mut self, axis: usize, slice: StridedSliceSpec, ) -> Result<TypedTensorViewMut<'_, T, R>>

Return a mutable metadata-only slice along one axis.

§Examples
use tenferro_tensor::{StridedSliceSpec, TypedTensorViewMut};

let mut data = [1_i32, 2, 3, 4];
let mut view = TypedTensorViewMut::from_slice(vec![2, 2], vec![1, 2], 0, &mut data)?;
assert_eq!(view.try_slice_axis(1, StridedSliceSpec::reverse())?.get(&[0, 0]), Some(&3));
§Errors

Returns crate::Error::Validation with tenferro_tensor_core::ValidationError::AxisOutOfBounds when axis is outside the view rank, tenferro_tensor_core::ValidationError::InvalidSliceStep or tenferro_tensor_core::ValidationError::InvalidSliceBounds for an invalid slice, tenferro_tensor_core::ValidationError::ViewOutOfBounds when the result exceeds the backing buffer, tenferro_tensor_core::ValidationError::OverlappingMutableLayout when logical elements alias, or tenferro_tensor_core::ValidationError::IntegerOverflow for layout arithmetic overflow.

Source

pub fn try_multi_slice_mut( &mut self, first: &[StridedSliceSpec], second: &[StridedSliceSpec], ) -> Result<Option<TypedTensorViewMutPair<'_, T, R>>>

Return two mutable metadata-only slices when their physical ranges are disjoint.

§Examples
use tenferro_tensor::{StridedSliceSpec, TypedTensorViewMut};

let mut data = [1_i32, 2, 3, 4];
let mut view = TypedTensorViewMut::from_slice(vec![4], vec![1], 0, &mut data)?;
let (left, right) = view
    .try_multi_slice_mut(
        &[StridedSliceSpec::new(0, Some(2), 1)],
        &[StridedSliceSpec::new(2, Some(4), 1)],
    )
    ?
    .unwrap();
assert_eq!(left.shape(), &[2]);
assert_eq!(right.shape(), &[2]);
§Errors

Returns crate::Error::Validation with tenferro_tensor_core::ValidationError::RankMismatch for either slice count, tenferro_tensor_core::ValidationError::InvalidSliceStep or tenferro_tensor_core::ValidationError::InvalidSliceBounds for invalid parameters, tenferro_tensor_core::ValidationError::ViewOutOfBounds when a result exceeds the backing buffer, tenferro_tensor_core::ValidationError::OverlappingMutableLayout when a result aliases, tenferro_tensor_core::ValidationError::InvalidArgument for a negative reachable offset, or tenferro_tensor_core::ValidationError::IntegerOverflow for layout arithmetic overflow. The method returns Ok(None) when the two ranges overlap or the view uses backend storage.

Source

pub fn try_reshape( &mut self, shape: &[usize], ) -> Result<TypedTensorViewMut<'_, T, DynRank>>

Return a mutable metadata-only dynamic-rank reshape for contiguous views.

§Examples
use tenferro_tensor::TypedTensorViewMut;

let mut data = [1_i32, 2, 3, 4];
let mut view = TypedTensorViewMut::from_slice(vec![2, 2], vec![1, 2], 0, &mut data)?;
assert_eq!(view.try_reshape(&[4])?.shape(), &[4]);
§Errors

Returns crate::Error::Validation with tenferro_tensor_core::ValidationError::NonContiguousViewAsSlice when the source is not compact column-major, tenferro_tensor_core::ValidationError::ShapeMismatch (whose tenferro_tensor_core::ShapeMismatch::ReshapeElementCount source records the counts) when element counts differ, tenferro_tensor_core::ValidationError::OverlappingMutableLayout when the reshaped layout aliases, tenferro_tensor_core::ValidationError::IntegerOverflow for shape or layout arithmetic overflow, or tenferro_tensor_core::ValidationError::ViewOutOfBounds when the reshaped view exceeds the backing buffer.

Trait Implementations§

Source§

impl<'a, T: Debug, R: Debug + TensorRank> Debug for TypedTensorViewMut<'a, T, R>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'a, T> From<TypedTensorViewMut<'a, T>> for TypedTensorWrite<'a, T>

Source§

fn from(view: TypedTensorViewMut<'a, T>) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

§

impl<'a, T, R> Freeze for TypedTensorViewMut<'a, T, R>
where <R as TensorRank>::Shape: Freeze, <R as TensorRank>::Strides: Freeze,

§

impl<'a, T, R = DynRank> !RefUnwindSafe for TypedTensorViewMut<'a, T, R>

§

impl<'a, T, R> Send for TypedTensorViewMut<'a, T, R>
where <R as TensorRank>::Shape: Send, <R as TensorRank>::Strides: Send, T: Send,

§

impl<'a, T, R> Sync for TypedTensorViewMut<'a, T, R>
where <R as TensorRank>::Shape: Sync, <R as TensorRank>::Strides: Sync, T: Sync,

§

impl<'a, T, R> Unpin for TypedTensorViewMut<'a, T, R>
where <R as TensorRank>::Shape: Unpin, <R as TensorRank>::Strides: Unpin,

§

impl<'a, T, R> UnsafeUnpin for TypedTensorViewMut<'a, T, R>

§

impl<'a, T, R = DynRank> !UnwindSafe for TypedTensorViewMut<'a, T, R>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> MaybeSend for T
where T: Send,

§

impl<T> MaybeSendSync for T
where T: Send + Sync,

§

impl<T> MaybeSync for T
where T: Sync,