Tensor

Struct Tensor 

Source
pub struct Tensor<C: Memorable, const D: usize> { /* private fields */ }
Expand description

A tensor struct that holds data in an aligned memory buffer.

Implementations§

Source§

impl<C: Memorable, const D: usize> Tensor<C, D>

Source

pub fn new(data: MemoryBuffer<C>, dims: [usize; D], strides: [usize; D]) -> Self

Creates a new tensor from a memory buffer with specified dimensions and strides.

§Arguments
  • data - The memory buffer containing the tensor data
  • dims - Array specifying the size of each dimension
  • strides - Array specifying the stride for each dimension
§Panics
  • If any dimension or stride is zero
  • If the data buffer is not large enough for the specified dimensions and strides
Source

pub fn zeros(dims: [usize; D]) -> Self

Creates a new tensor with all elements initialized to zero, with specified shape.

§Arguments
  • dims - A slice of usize containing the size of each dimension.
§Returns
  • An new tensor with specified shape, filled with zeros.
§Panics
  • If the length of dims is not equal to the number of dimensions of the tensor.
§Examples

let test_tensor = Tensor::<f64, 2>::zeros([3, 4]);

for i in 0..3 {
    for j in 0..4 {
        assert_eq!(test_tensor.get(&[i, j]), &0.0);
    }
}
Source

pub fn dims(&self) -> &[usize; D]

Returns a reference to the dimensions of the tensor.

Source

pub fn strides(&self) -> &[usize; D]

Returns a reference to the strides of the tensor.

Source

pub fn rank(&self) -> usize

Returns the rank (number of dimensions) of the tensor.

Source

pub fn num_elements(&self) -> usize

Returns the total number of elements in the tensor.

Source

pub fn as_ptr(&self) -> *const C

Returns a raw pointer to the tensor’s data.

Source

pub fn as_ptr_mut(&mut self) -> *mut C

Returns a mutable raw pointer to the tensor’s data.

Source

pub fn as_ref(&self) -> TensorRef<'_, C, D>

Returns an immutable reference to the tensor.

Source

pub fn as_mut(&mut self) -> TensorMut<'_, C, D>

Returns a mutable reference to the tensor.

Source

pub fn get(&self, indices: &[usize; D]) -> &C

Returns a reference to an element at the given indices.

§Panics

Panics if the indices are out of bounds.

Source

pub fn get_mut(&mut self, indices: &[usize; D]) -> &mut C

Returns a mutable reference to an element at the given indices.

§Panics

Panics if the indices are out of bounds.

Source

pub unsafe fn get_unchecked(&self, indices: &[usize; D]) -> &C

Returns an immutable reference to an element at the given indices, without performing bounds checks.

§Safety

Calling this method with out-of-bounds indices is undefined behavior.

Source

pub unsafe fn get_mut_unchecked(&mut self, indices: &[usize; D]) -> &mut C

Returns a mutable reference to an element at the given indices, without performing bounds checks.

§Safety

Calling this method with out-of-bounds indices is undefined behavior.

Source

pub unsafe fn ptr_at(&self, indices: &[usize; D]) -> *const C

Returns a raw pointer to an element at the given indices, without performing bounds checks.

§Safety

Calling this method with out-of-bounds indices is undefined behavior.

Source

pub unsafe fn ptr_at_mut(&mut self, indices: &[usize; D]) -> *mut C

Returns a mutable raw pointer to an element at the given indices, without performing bounds checks.

§Safety

Calling this method with out-of-bounds indices is undefined behavior.

Source

pub fn from_slice(slice: &[C], dims: [usize; D]) -> Self

Creates a new Tensor from a flat Vec and its dimensions.

This is a convenience constructor that automatically converts the Vec into a MemoryBuffer and then calls the new constructor.

§Panics

Panics if the total number of elements implied by dimensions (product of all dimension sizes) does not match the length of the data_vec.

§Examples
let tensor_from_slice = Tensor::from_slice(&vec![10, 20, 30, 40], [2, 2]);
assert_eq!(tensor_from_slice.dims(), &[2, 2]);
assert_eq!(tensor_from_slice.strides(), &[2, 1]);
Source

pub fn from_slice_with_strides( slice: &[C], dims: [usize; D], strides: [usize; D], ) -> Self

Creates a new Tensor from a slice of data, explicit dimensions, and strides.

This constructor allows for creating tensors with custom stride patterns, which can be useful for representing views or sub-tensors of larger data structures without copying the underlying data.

§Panics

Panics if:

  • The dimensions and strides arrays do not have the same number of elements as D.
  • The total number of elements implied by dimensions and strides (i.e., the maximum flat index + 1) exceeds the length of the slice.
  • Any stride is zero unless its corresponding dimension is also zero.
§Arguments
  • slice - The underlying data slice.
  • dimensions - An array of usize defining the size of each dimension.
  • strides - An array of usize defining the stride for each dimension.
§Examples
// Create a 2x3 tensor from a slice with custom strides
let data = vec![1, 2, 3, 4, 5, 6];
let tensor = Tensor::from_slice_with_strides(
    &data,
    [2, 3], // 2 rows, 3 columns
    [3, 1], // Stride for rows is 3 elements, for columns is 1 element
);
assert_eq!(tensor.dims(), &[2, 3]);
assert_eq!(tensor.strides(), &[3, 1]);
assert_eq!(tensor.get(&[0, 0]), &1);
assert_eq!(tensor.get(&[0, 1]), &2);
assert_eq!(tensor.get(&[1, 0]), &4);

// Creating a column vector view from a larger matrix's data
let matrix_data = vec![1, 2, 3, 4, 5, 6, 7, 8, 9]; // A 3x3 matrix's data
// View the second column (elements 2, 5, 8) as a 3x1 tensor
let column_view = Tensor::from_slice_with_strides(
    &matrix_data,
    [3, 1], // 3 rows, 1 column
    [3, 1], // Stride to next row is 3, stride to next column is 1 (but only 1 column)
);
assert_eq!(column_view.dims(), &[3, 1]);
assert_eq!(column_view.strides(), &[3, 1]);
// Note: This example is slightly misleading as the slice itself doesn't change for the column.
// A more accurate example for strides would involve a sub-view that skips elements.
// This specific case would be more typical for `TensorRef`.
Source

pub fn zeros_with_strides(dims: &[usize; D], strides: &[usize; D]) -> Self

Creates a new tensor with all elements initialized to zero, with specified shape and strides.

§Arguments
  • dims - A slice of usize containing the size of each dimension
  • strides - A slice of usize containing the stride for each dimension.
§Returns
  • A new tensor with specified shape and strides, filled with zeros.
§Panics
  • If the length of dims or strides is not equal to the number of dimensions of the tensor.
  • If the size of any dimension is zero but the corresponding stride is non-zero.
  • If the size of any dimension is non-zero but the corresponding stride is zero.
§Examples

let test_tensor = Tensor::<f64, 2>::zeros_with_strides(&[3, 4], &[4, 1]);

for i in 0..3 {
    for j in 0..4 {
        assert_eq!(test_tensor.get(&[i, j]), &0.0);
    }
}
Source§

impl<C: Memorable> Tensor<C, 4>

Source

pub fn subtensor_ref(&self, m: usize) -> TensorRef<'_, C, 3>

Returns an immutable view of a 3D subtensor at the given index.

Source

pub fn subtensor_mut(&mut self, m: usize) -> TensorMut<'_, C, 3>

Returns a mutable view of a 3D subtensor at the given index.

Source

pub unsafe fn subtensor_ref_unchecked(&self, m: usize) -> TensorRef<'_, C, 3>

Returns an immutable view of a 3D subtensor at the given index without bounds checking.

§Safety

Caller must ensure that m is within bounds.

Source

pub unsafe fn subtensor_mut_unchecked( &mut self, m: usize, ) -> TensorMut<'_, C, 3>

Returns a mutable view of a 3D subtensor at the given index without bounds checking.

§Safety

Caller must ensure that m is within bounds.

Source§

impl<C: Memorable> Tensor<C, 3>

Source

pub fn subtensor_ref(&self, m: usize) -> MatRef<'_, C>

Returns an immutable matrix view of a 2D subtensor at the given index.

Source

pub fn subtensor_mut(&mut self, m: usize) -> MatMut<'_, C>

Returns a mutable matrix view of a 2D subtensor at the given index.

Source

pub unsafe fn subtensor_ref_unchecked(&self, m: usize) -> MatRef<'_, C>

Returns an immutable matrix view of a 2D subtensor at the given index without bounds checking.

§Safety

Caller must ensure that m is within bounds.

Source

pub unsafe fn subtensor_mut_unchecked(&mut self, m: usize) -> MatMut<'_, C>

Returns a mutable matrix view of a 2D subtensor at the given index without bounds checking.

§Safety

Caller must ensure that m is within bounds.

Source§

impl<C: Memorable> Tensor<C, 2>

Source

pub fn subtensor_ref(&self, m: usize) -> RowRef<'_, C>

Returns an immutable row view of a 1D subtensor at the given index.

Source

pub fn subtensor_mut(&mut self, m: usize) -> RowMut<'_, C>

Returns a mutable row view of a 1D subtensor at the given index.

Source

pub unsafe fn subtensor_ref_unchecked(&self, m: usize) -> RowRef<'_, C>

Returns an immutable row view of a 1D subtensor at the given index without bounds checking.

§Safety

Caller must ensure that m is within bounds.

Source

pub unsafe fn subtensor_mut_unchecked(&mut self, m: usize) -> RowMut<'_, C>

Returns a mutable row view of a 1D subtensor at the given index without bounds checking.

§Safety

Caller must ensure that m is within bounds.

Source§

impl<C: Memorable> Tensor<C, 1>

Source

pub fn subtensor_ref(&self, m: usize) -> &C

Returns an immutable reference to an element at the given index.

Source

pub fn subtensor_mut(&mut self, m: usize) -> &mut C

Returns a mutable reference to an element at the given index.

Source

pub unsafe fn subtensor_ref_unchecked(&self, m: usize) -> &C

Returns an immutable reference to an element at the given index without bounds checking.

§Safety

Caller must ensure that m is within bounds.

Source

pub unsafe fn subtensor_mut_unchecked(&mut self, m: usize) -> &mut C

Returns a mutable reference to an element at the given index without bounds checking.

§Safety

Caller must ensure that m is within bounds.

Trait Implementations§

Source§

impl<C: Display + Debug + Memorable, const D: usize> Debug for Tensor<C, D>

Source§

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

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

impl<C: Memorable, const D: usize> Index<[usize; D]> for Tensor<C, D>

Source§

type Output = C

The returned type after indexing.
Source§

fn index(&self, indices: [usize; D]) -> &Self::Output

Performs the indexing (container[index]) operation. Read more
Source§

impl<C: Memorable, const D: usize> IndexMut<[usize; D]> for Tensor<C, D>

Source§

fn index_mut(&mut self, indices: [usize; D]) -> &mut Self::Output

Performs the mutable indexing (container[index]) operation. Read more

Auto Trait Implementations§

§

impl<C, const D: usize> Freeze for Tensor<C, D>

§

impl<C, const D: usize> RefUnwindSafe for Tensor<C, D>
where C: RefUnwindSafe,

§

impl<C, const D: usize> Send for Tensor<C, D>
where C: Send,

§

impl<C, const D: usize> Sync for Tensor<C, D>
where C: Sync,

§

impl<C, const D: usize> Unpin for Tensor<C, D>
where C: Unpin,

§

impl<C, const D: usize> UnwindSafe for Tensor<C, D>

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> ByRef<T> for T

Source§

fn by_ref(&self) -> &T

Source§

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

Source§

fn rand<T>(&self, rng: &mut (impl Rng + ?Sized)) -> T
where Self: Distribution<T>,

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, 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.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V