pub struct AdTensor<T: Scalar>(pub AdValue<Tensor<T>>);Expand description
Tensor newtype carrying AD mode information.
§Examples
use ad_tensors_rs::{AdMode, AdTensor};
use tenferro_tensor::{MemoryOrder, Tensor};
let t = Tensor::<f64>::from_slice(&[1.0, 2.0], &[2], MemoryOrder::ColumnMajor).unwrap();
let x: AdTensor<f64> = t.into();
assert_eq!(x.mode(), AdMode::Primal);Tuple Fields§
§0: AdValue<Tensor<T>>Implementations§
Source§impl<T: Scalar> AdTensor<T>
impl<T: Scalar> AdTensor<T>
Sourcepub fn new_primal(tensor: Tensor<T>) -> Self
pub fn new_primal(tensor: Tensor<T>) -> Self
Creates a primal tensor.
§Examples
use ad_tensors_rs::AdTensor;
use tenferro_tensor::{MemoryOrder, Tensor};
let t = Tensor::<f64>::from_slice(&[1.0], &[1], MemoryOrder::ColumnMajor).unwrap();
let x = AdTensor::new_primal(t);
assert_eq!(x.dims(), &[1]);Sourcepub fn new_forward(primal: Tensor<T>, tangent: Tensor<T>) -> Self
pub fn new_forward(primal: Tensor<T>, tangent: Tensor<T>) -> Self
Creates a forward-mode tensor.
§Examples
use ad_tensors_rs::{AdMode, AdTensor};
use tenferro_tensor::{MemoryOrder, Tensor};
let primal = Tensor::<f64>::from_slice(&[1.0], &[1], MemoryOrder::ColumnMajor).unwrap();
let tangent = Tensor::<f64>::from_slice(&[0.1], &[1], MemoryOrder::ColumnMajor).unwrap();
let x = AdTensor::new_forward(primal, tangent);
assert_eq!(x.mode(), AdMode::Forward);Sourcepub fn new_reverse(
primal: Tensor<T>,
node: NodeId,
tape: TapeId,
tangent: Option<Tensor<T>>,
) -> Self
pub fn new_reverse( primal: Tensor<T>, node: NodeId, tape: TapeId, tangent: Option<Tensor<T>>, ) -> Self
Creates a reverse-mode tensor.
§Examples
use ad_tensors_rs::{AdMode, AdTensor, NodeId, TapeId};
use tenferro_tensor::{MemoryOrder, Tensor};
let primal = Tensor::<f64>::from_slice(&[1.0], &[1], MemoryOrder::ColumnMajor).unwrap();
let x = AdTensor::new_reverse(primal, NodeId(8), TapeId(3), None);
assert_eq!(x.mode(), AdMode::Reverse);Sourcepub fn mode(&self) -> AdMode
pub fn mode(&self) -> AdMode
Returns AD mode.
§Examples
use ad_tensors_rs::{AdMode, AdTensor};
use tenferro_tensor::{MemoryOrder, Tensor};
let t = Tensor::<f64>::from_slice(&[1.0], &[1], MemoryOrder::ColumnMajor).unwrap();
let x = AdTensor::new_primal(t);
assert_eq!(x.mode(), AdMode::Primal);Sourcepub fn as_value(&self) -> &AdValue<Tensor<T>>
pub fn as_value(&self) -> &AdValue<Tensor<T>>
Returns reference to underlying AdValue.
§Examples
use ad_tensors_rs::{AdTensor, AdValue};
use tenferro_tensor::{MemoryOrder, Tensor};
let t = Tensor::<f64>::from_slice(&[1.0], &[1], MemoryOrder::ColumnMajor).unwrap();
let x = AdTensor::new_primal(t);
assert!(matches!(x.as_value(), AdValue::Primal(_)));Sourcepub fn into_value(self) -> AdValue<Tensor<T>>
pub fn into_value(self) -> AdValue<Tensor<T>>
Consumes wrapper and returns the underlying AdValue.
§Examples
use ad_tensors_rs::{AdTensor, AdValue};
use tenferro_tensor::{MemoryOrder, Tensor};
let t = Tensor::<f64>::from_slice(&[1.0], &[1], MemoryOrder::ColumnMajor).unwrap();
let x = AdTensor::new_primal(t).into_value();
assert!(matches!(x, AdValue::Primal(_)));Sourcepub fn primal(&self) -> &Tensor<T>
pub fn primal(&self) -> &Tensor<T>
Returns primal tensor reference.
§Examples
use ad_tensors_rs::AdTensor;
use tenferro_tensor::{MemoryOrder, Tensor};
let t = Tensor::<f64>::from_slice(&[1.0, 2.0], &[2], MemoryOrder::ColumnMajor).unwrap();
let x = AdTensor::new_primal(t);
assert_eq!(x.primal().dims(), &[2]);Sourcepub fn tangent(&self) -> Option<&Tensor<T>>
pub fn tangent(&self) -> Option<&Tensor<T>>
Returns tangent tensor reference when available.
§Examples
use ad_tensors_rs::AdTensor;
use tenferro_tensor::{MemoryOrder, Tensor};
let primal = Tensor::<f64>::from_slice(&[1.0], &[1], MemoryOrder::ColumnMajor).unwrap();
let tangent = Tensor::<f64>::from_slice(&[0.5], &[1], MemoryOrder::ColumnMajor).unwrap();
let x = AdTensor::new_forward(primal, tangent);
assert_eq!(x.tangent().unwrap().dims(), &[1]);Sourcepub fn dims(&self) -> &[usize]
pub fn dims(&self) -> &[usize]
Returns dimensions of the primal tensor.
§Examples
use ad_tensors_rs::AdTensor;
use tenferro_tensor::{MemoryOrder, Tensor};
let t = Tensor::<f64>::from_slice(&[1.0, 2.0], &[2], MemoryOrder::ColumnMajor).unwrap();
let x = AdTensor::new_primal(t);
assert_eq!(x.dims(), &[2]);Sourcepub fn ndim(&self) -> usize
pub fn ndim(&self) -> usize
Returns number of dimensions of the primal tensor.
§Examples
use ad_tensors_rs::AdTensor;
use tenferro_tensor::{MemoryOrder, Tensor};
let t = Tensor::<f64>::from_slice(&[1.0, 2.0], &[2], MemoryOrder::ColumnMajor).unwrap();
let x = AdTensor::new_primal(t);
assert_eq!(x.ndim(), 1);Sourcepub fn len(&self) -> usize
pub fn len(&self) -> usize
Returns total number of elements in the primal tensor.
§Examples
use ad_tensors_rs::AdTensor;
use tenferro_tensor::{MemoryOrder, Tensor};
let t = Tensor::<f64>::from_slice(&[1.0, 2.0], &[2], MemoryOrder::ColumnMajor).unwrap();
let x = AdTensor::new_primal(t);
assert_eq!(x.len(), 2);Sourcepub fn is_empty(&self) -> bool
pub fn is_empty(&self) -> bool
Returns true when primal tensor has zero elements.
§Examples
use ad_tensors_rs::AdTensor;
use tenferro_tensor::{MemoryOrder, Tensor};
let t = Tensor::<f64>::from_slice(&[], &[0], MemoryOrder::ColumnMajor).unwrap();
let x = AdTensor::new_primal(t);
assert!(x.is_empty());Trait Implementations§
Source§impl<T: Clone + Scalar> Differentiable for AdTensor<T>
impl<T: Clone + Scalar> Differentiable for AdTensor<T>
Auto Trait Implementations§
impl<T> Freeze for AdTensor<T>
impl<T> !RefUnwindSafe for AdTensor<T>
impl<T> Send for AdTensor<T>
impl<T> Sync for AdTensor<T>
impl<T> Unpin for AdTensor<T>
impl<T> !UnwindSafe for AdTensor<T>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> DistributionExt for Twhere
T: ?Sized,
impl<T> DistributionExt for Twhere
T: ?Sized,
fn rand<T>(&self, rng: &mut (impl Rng + ?Sized)) -> Twhere
Self: Distribution<T>,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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