pub struct Tensor<T: CoordinateSystem, U: Variance>{ /* private fields */ }
Expand description
Struct representing a tensor.
A tensor is anchored at a given point and has coordinates
represented in the system defined by the generic parameter
T
. The variance of the tensor (meaning its rank and types
of its indices) is defined by V
. This allows Rust
to decide at compile time whether two tensors are legal
to be added / multiplied / etc.
It is only OK to perform an operation on two tensors if they belong to the same coordinate system.
Implementations§
Source§impl<T> Tensor<T, ContravariantIndex>
impl<T> Tensor<T, ContravariantIndex>
Source§impl<T> Tensor<T, CovariantIndex>
impl<T> Tensor<T, CovariantIndex>
Source§impl<T, V> Tensor<T, V>where
T: CoordinateSystem,
V: Variance,
T::Dimension: Pow<V::Rank>,
Exp<T::Dimension, V::Rank>: ArrayLength<f64>,
impl<T, V> Tensor<T, V>where
T: CoordinateSystem,
V: Variance,
T::Dimension: Pow<V::Rank>,
Exp<T::Dimension, V::Rank>: ArrayLength<f64>,
Sourcepub fn coords_array(&self) -> &GenericArray<f64, Exp<T::Dimension, V::Rank>>
pub fn coords_array(&self) -> &GenericArray<f64, Exp<T::Dimension, V::Rank>>
Returns the tensor’s coordinates as an array
Sourcepub fn get_coord(i: &[usize]) -> usize
pub fn get_coord(i: &[usize]) -> usize
Converts a set of tensor indices passed as a slice into a single index for the internal array.
The length of the slice (the number of indices) has to be compatible with the rank of the tensor.
Sourcepub fn get_variance() -> Vec<IndexType>
pub fn get_variance() -> Vec<IndexType>
Returns the variance of the tensor, that is, the list of the index types. A vector would return vec![Contravariant], a metric tensor: vec![Covariant, Covariant].
Sourcepub fn get_num_coords() -> usize
pub fn get_num_coords() -> usize
Returns the number of coordinates of the tensor (equal to [Dimension]^[Rank])
Sourcepub fn new(
point: Point<T>,
coords: GenericArray<f64, Exp<T::Dimension, V::Rank>>,
) -> Tensor<T, V>
pub fn new( point: Point<T>, coords: GenericArray<f64, Exp<T::Dimension, V::Rank>>, ) -> Tensor<T, V>
Creates a tensor at a given point with the coordinates defined by the array.
The number of elements in the array must be equal to the number of coordinates of the tensor.
One-dimensional array represents an n-dimensional tensor in such a way, that the last index is the one that is changing the most often, i.e. the sequence is as follows: (0,0,…,0), (0,0,…,1), (0,0,…,2), …, (0,0,…,1,0), (0,0,…,1,1), … etc.
Sourcepub fn from_slice(point: Point<T>, slice: &[f64]) -> Tensor<T, V>
pub fn from_slice(point: Point<T>, slice: &[f64]) -> Tensor<T, V>
Creates a tensor at a given point with the coordinates defined by the slice.
The number of elements in the slice must be equal to the number of coordinates of the tensor.
One-dimensional slice represents an n-dimensional tensor in such a way, that the last index is the one that is changing the most often, i.e. the sequence is as follows: (0,0,…,0), (0,0,…,1), (0,0,…,2), …, (0,0,…,1,0), (0,0,…,1,1), … etc.
Sourcepub fn trace<Ul, Uh>(&self) -> Tensor<T, Contracted<V, Ul, Uh>>where
Ul: Unsigned,
Uh: Unsigned,
V: Contract<Ul, Uh>,
<Contracted<V, Ul, Uh> as Variance>::Rank: ArrayLength<usize>,
T::Dimension: Pow<<Contracted<V, Ul, Uh> as Variance>::Rank>,
Exp<T::Dimension, <Contracted<V, Ul, Uh> as Variance>::Rank>: ArrayLength<f64>,
pub fn trace<Ul, Uh>(&self) -> Tensor<T, Contracted<V, Ul, Uh>>where
Ul: Unsigned,
Uh: Unsigned,
V: Contract<Ul, Uh>,
<Contracted<V, Ul, Uh> as Variance>::Rank: ArrayLength<usize>,
T::Dimension: Pow<<Contracted<V, Ul, Uh> as Variance>::Rank>,
Exp<T::Dimension, <Contracted<V, Ul, Uh> as Variance>::Rank>: ArrayLength<f64>,
Contracts two indices
The indices must be of opposite types. This is checked at compile time.
Source§impl<T, U> Tensor<T, U>where
T: CoordinateSystem,
U: Variance,
U::Rank: ArrayLength<usize>,
T::Dimension: Pow<U::Rank>,
Exp<T::Dimension, U::Rank>: ArrayLength<f64>,
impl<T, U> Tensor<T, U>where
T: CoordinateSystem,
U: Variance,
U::Rank: ArrayLength<usize>,
T::Dimension: Pow<U::Rank>,
Exp<T::Dimension, U::Rank>: ArrayLength<f64>,
Sourcepub fn iter_coords(&self) -> CoordIterator<U>
pub fn iter_coords(&self) -> CoordIterator<U>
Returns an iterator over the coordinates of the tensor.
Source§impl<T, Ul, Ur> Tensor<T, (Ul, Ur)>where
T: CoordinateSystem,
Ul: TensorIndex + OtherIndex,
Ur: TensorIndex + OtherIndex,
Add1<Ul::Rank>: Unsigned + Add<B1>,
Add1<Ur::Rank>: Unsigned + Add<B1>,
Add1<<<Ul as OtherIndex>::Output as Variance>::Rank>: Unsigned + Add<B1>,
Add1<<<Ur as OtherIndex>::Output as Variance>::Rank>: Unsigned + Add<B1>,
<(Ul, Ur) as Variance>::Rank: ArrayLength<usize>,
T::Dimension: Pow<Add1<Ul::Rank>> + Pow<Add1<Ur::Rank>> + ArrayLength<usize> + Pow<Add1<<<Ul as OtherIndex>::Output as Variance>::Rank>> + Pow<Add1<<<Ur as OtherIndex>::Output as Variance>::Rank>>,
Exp<T::Dimension, Add1<Ul::Rank>>: ArrayLength<f64>,
Exp<T::Dimension, Add1<Ur::Rank>>: ArrayLength<f64>,
Exp<T::Dimension, Add1<<<Ul as OtherIndex>::Output as Variance>::Rank>>: ArrayLength<f64>,
Exp<T::Dimension, Add1<<<Ur as OtherIndex>::Output as Variance>::Rank>>: ArrayLength<f64>,
impl<T, Ul, Ur> Tensor<T, (Ul, Ur)>where
T: CoordinateSystem,
Ul: TensorIndex + OtherIndex,
Ur: TensorIndex + OtherIndex,
Add1<Ul::Rank>: Unsigned + Add<B1>,
Add1<Ur::Rank>: Unsigned + Add<B1>,
Add1<<<Ul as OtherIndex>::Output as Variance>::Rank>: Unsigned + Add<B1>,
Add1<<<Ur as OtherIndex>::Output as Variance>::Rank>: Unsigned + Add<B1>,
<(Ul, Ur) as Variance>::Rank: ArrayLength<usize>,
T::Dimension: Pow<Add1<Ul::Rank>> + Pow<Add1<Ur::Rank>> + ArrayLength<usize> + Pow<Add1<<<Ul as OtherIndex>::Output as Variance>::Rank>> + Pow<Add1<<<Ur as OtherIndex>::Output as Variance>::Rank>>,
Exp<T::Dimension, Add1<Ul::Rank>>: ArrayLength<f64>,
Exp<T::Dimension, Add1<Ur::Rank>>: ArrayLength<f64>,
Exp<T::Dimension, Add1<<<Ul as OtherIndex>::Output as Variance>::Rank>>: ArrayLength<f64>,
Exp<T::Dimension, Add1<<<Ur as OtherIndex>::Output as Variance>::Rank>>: ArrayLength<f64>,
Sourcepub fn unit(p: Point<T>) -> Tensor<T, (Ul, Ur)>
pub fn unit(p: Point<T>) -> Tensor<T, (Ul, Ur)>
Returns a unit matrix (1 on the diagonal, 0 everywhere else)
Sourcepub fn inverse(
&self,
) -> Option<Tensor<T, (<Ul as OtherIndex>::Output, <Ur as OtherIndex>::Output)>>
pub fn inverse( &self, ) -> Option<Tensor<T, (<Ul as OtherIndex>::Output, <Ur as OtherIndex>::Output)>>
Function calculating the inverse of self
using the LU ddecomposition.
The return value is an Option
, since self
may be non-invertible -
in such a case, None is returned
Trait Implementations§
Source§impl<T, U> Add for Tensor<T, U>where
T: CoordinateSystem,
U: Variance,
T::Dimension: Pow<U::Rank>,
Exp<T::Dimension, U::Rank>: ArrayLength<f64>,
impl<T, U> Add for Tensor<T, U>where
T: CoordinateSystem,
U: Variance,
T::Dimension: Pow<U::Rank>,
Exp<T::Dimension, U::Rank>: ArrayLength<f64>,
Source§impl<T, U> AddAssign for Tensor<T, U>where
T: CoordinateSystem,
U: Variance,
T::Dimension: Pow<U::Rank>,
Exp<T::Dimension, U::Rank>: ArrayLength<f64>,
impl<T, U> AddAssign for Tensor<T, U>where
T: CoordinateSystem,
U: Variance,
T::Dimension: Pow<U::Rank>,
Exp<T::Dimension, U::Rank>: ArrayLength<f64>,
Source§fn add_assign(&mut self, rhs: Tensor<T, U>)
fn add_assign(&mut self, rhs: Tensor<T, U>)
+=
operation. Read moreSource§impl<T, U> Clone for Tensor<T, U>where
T: CoordinateSystem,
U: Variance,
T::Dimension: Pow<U::Rank>,
Exp<T::Dimension, U::Rank>: ArrayLength<f64>,
impl<T, U> Clone for Tensor<T, U>where
T: CoordinateSystem,
U: Variance,
T::Dimension: Pow<U::Rank>,
Exp<T::Dimension, U::Rank>: ArrayLength<f64>,
Source§impl<T, U> Div<f64> for Tensor<T, U>where
T: CoordinateSystem,
U: Variance,
T::Dimension: Pow<U::Rank>,
Exp<T::Dimension, U::Rank>: ArrayLength<f64>,
impl<T, U> Div<f64> for Tensor<T, U>where
T: CoordinateSystem,
U: Variance,
T::Dimension: Pow<U::Rank>,
Exp<T::Dimension, U::Rank>: ArrayLength<f64>,
Source§impl<T, U> DivAssign<f64> for Tensor<T, U>where
T: CoordinateSystem,
U: Variance,
T::Dimension: Pow<U::Rank>,
Exp<T::Dimension, U::Rank>: ArrayLength<f64>,
impl<T, U> DivAssign<f64> for Tensor<T, U>where
T: CoordinateSystem,
U: Variance,
T::Dimension: Pow<U::Rank>,
Exp<T::Dimension, U::Rank>: ArrayLength<f64>,
Source§fn div_assign(&mut self, rhs: f64)
fn div_assign(&mut self, rhs: f64)
/=
operation. Read moreSource§impl<'a, T, U> Index<&'a [usize]> for Tensor<T, U>where
T: CoordinateSystem,
U: Variance,
T::Dimension: Pow<U::Rank>,
Exp<T::Dimension, U::Rank>: ArrayLength<f64>,
impl<'a, T, U> Index<&'a [usize]> for Tensor<T, U>where
T: CoordinateSystem,
U: Variance,
T::Dimension: Pow<U::Rank>,
Exp<T::Dimension, U::Rank>: ArrayLength<f64>,
Source§impl<'a, T, U> Index<usize> for Tensor<T, U>where
T: CoordinateSystem,
U: Variance,
T::Dimension: Pow<U::Rank>,
Exp<T::Dimension, U::Rank>: ArrayLength<f64>,
impl<'a, T, U> Index<usize> for Tensor<T, U>where
T: CoordinateSystem,
U: Variance,
T::Dimension: Pow<U::Rank>,
Exp<T::Dimension, U::Rank>: ArrayLength<f64>,
Source§impl<'a, T, U> IndexMut<&'a [usize]> for Tensor<T, U>where
T: CoordinateSystem,
U: Variance,
T::Dimension: Pow<U::Rank>,
Exp<T::Dimension, U::Rank>: ArrayLength<f64>,
impl<'a, T, U> IndexMut<&'a [usize]> for Tensor<T, U>where
T: CoordinateSystem,
U: Variance,
T::Dimension: Pow<U::Rank>,
Exp<T::Dimension, U::Rank>: ArrayLength<f64>,
Source§impl<'a, T, U> IndexMut<usize> for Tensor<T, U>where
T: CoordinateSystem,
U: Variance,
T::Dimension: Pow<U::Rank>,
Exp<T::Dimension, U::Rank>: ArrayLength<f64>,
impl<'a, T, U> IndexMut<usize> for Tensor<T, U>where
T: CoordinateSystem,
U: Variance,
T::Dimension: Pow<U::Rank>,
Exp<T::Dimension, U::Rank>: ArrayLength<f64>,
Source§impl<T, U, V, Ul, Uh> InnerProduct<Tensor<T, V>, Ul, Uh> for Tensor<T, U>where
T: CoordinateSystem,
U: Variance + Concat<V>,
V: Variance,
Ul: Unsigned,
Uh: Unsigned,
T::Dimension: Pow<U::Rank> + Pow<V::Rank> + Pow<<Contracted<Joined<U, V>, Ul, Uh> as Variance>::Rank>,
Exp<T::Dimension, U::Rank>: ArrayLength<f64>,
Exp<T::Dimension, V::Rank>: ArrayLength<f64>,
Joined<U, V>: Contract<Ul, Uh>,
<Contracted<Joined<U, V>, Ul, Uh> as Variance>::Rank: ArrayLength<usize>,
Exp<T::Dimension, <Contracted<Joined<U, V>, Ul, Uh> as Variance>::Rank>: ArrayLength<f64>,
impl<T, U, V, Ul, Uh> InnerProduct<Tensor<T, V>, Ul, Uh> for Tensor<T, U>where
T: CoordinateSystem,
U: Variance + Concat<V>,
V: Variance,
Ul: Unsigned,
Uh: Unsigned,
T::Dimension: Pow<U::Rank> + Pow<V::Rank> + Pow<<Contracted<Joined<U, V>, Ul, Uh> as Variance>::Rank>,
Exp<T::Dimension, U::Rank>: ArrayLength<f64>,
Exp<T::Dimension, V::Rank>: ArrayLength<f64>,
Joined<U, V>: Contract<Ul, Uh>,
<Contracted<Joined<U, V>, Ul, Uh> as Variance>::Rank: ArrayLength<usize>,
Exp<T::Dimension, <Contracted<Joined<U, V>, Ul, Uh> as Variance>::Rank>: ArrayLength<f64>,
Source§impl<T, U> Mul<Tensor<T, U>> for f64where
T: CoordinateSystem,
U: Variance,
T::Dimension: Pow<U::Rank>,
Exp<T::Dimension, U::Rank>: ArrayLength<f64>,
impl<T, U> Mul<Tensor<T, U>> for f64where
T: CoordinateSystem,
U: Variance,
T::Dimension: Pow<U::Rank>,
Exp<T::Dimension, U::Rank>: ArrayLength<f64>,
Source§impl<T, U, V> Mul<Tensor<T, V>> for Tensor<T, U>where
T: CoordinateSystem,
U: Variance + Concat<V>,
V: Variance,
U::Rank: ArrayLength<usize>,
V::Rank: ArrayLength<usize>,
T::Dimension: Pow<U::Rank> + Pow<V::Rank> + Pow<<Joined<U, V> as Variance>::Rank>,
Exp<T::Dimension, U::Rank>: ArrayLength<f64>,
Exp<T::Dimension, V::Rank>: ArrayLength<f64>,
Joined<U, V>: Variance,
Exp<T::Dimension, <Joined<U, V> as Variance>::Rank>: ArrayLength<f64>,
impl<T, U, V> Mul<Tensor<T, V>> for Tensor<T, U>where
T: CoordinateSystem,
U: Variance + Concat<V>,
V: Variance,
U::Rank: ArrayLength<usize>,
V::Rank: ArrayLength<usize>,
T::Dimension: Pow<U::Rank> + Pow<V::Rank> + Pow<<Joined<U, V> as Variance>::Rank>,
Exp<T::Dimension, U::Rank>: ArrayLength<f64>,
Exp<T::Dimension, V::Rank>: ArrayLength<f64>,
Joined<U, V>: Variance,
Exp<T::Dimension, <Joined<U, V> as Variance>::Rank>: ArrayLength<f64>,
Source§impl<T, U> Mul<f64> for Tensor<T, U>where
T: CoordinateSystem,
U: Variance,
T::Dimension: Pow<U::Rank>,
Exp<T::Dimension, U::Rank>: ArrayLength<f64>,
impl<T, U> Mul<f64> for Tensor<T, U>where
T: CoordinateSystem,
U: Variance,
T::Dimension: Pow<U::Rank>,
Exp<T::Dimension, U::Rank>: ArrayLength<f64>,
Source§impl<T, U> MulAssign<f64> for Tensor<T, U>where
T: CoordinateSystem,
U: Variance,
T::Dimension: Pow<U::Rank>,
Exp<T::Dimension, U::Rank>: ArrayLength<f64>,
impl<T, U> MulAssign<f64> for Tensor<T, U>where
T: CoordinateSystem,
U: Variance,
T::Dimension: Pow<U::Rank>,
Exp<T::Dimension, U::Rank>: ArrayLength<f64>,
Source§fn mul_assign(&mut self, rhs: f64)
fn mul_assign(&mut self, rhs: f64)
*=
operation. Read moreSource§impl<T, U> Sub for Tensor<T, U>where
T: CoordinateSystem,
U: Variance,
T::Dimension: Pow<U::Rank>,
Exp<T::Dimension, U::Rank>: ArrayLength<f64>,
impl<T, U> Sub for Tensor<T, U>where
T: CoordinateSystem,
U: Variance,
T::Dimension: Pow<U::Rank>,
Exp<T::Dimension, U::Rank>: ArrayLength<f64>,
Source§impl<T, U> SubAssign for Tensor<T, U>where
T: CoordinateSystem,
U: Variance,
T::Dimension: Pow<U::Rank>,
Exp<T::Dimension, U::Rank>: ArrayLength<f64>,
impl<T, U> SubAssign for Tensor<T, U>where
T: CoordinateSystem,
U: Variance,
T::Dimension: Pow<U::Rank>,
Exp<T::Dimension, U::Rank>: ArrayLength<f64>,
Source§fn sub_assign(&mut self, rhs: Tensor<T, U>)
fn sub_assign(&mut self, rhs: Tensor<T, U>)
-=
operation. Read more