dfdx 0.13.0

Ergonomic auto differentiation in Rust, with pytorch like apis.
Documentation
use crate::{
    shapes::*,
    tensor::{Storage, Tensor, TensorFromVec, ZerosTensor},
};

use std::vec::Vec;

/// Generates a tensor with ordered data from 0 to `N`.
pub trait Arange<E: Dtype>: Storage<E> + ZerosTensor<E> + TensorFromVec<E> {
    /// Generates a tensor with ordered data from 0 to `N`.
    ///
    /// Const sized tensor:
    /// ```rust
    /// # use dfdx::{prelude::*, data::Arange};
    /// # let dev: Cpu = Default::default();
    /// let t: Tensor<Rank1<5>, f32, _> = dev.arange(Const::<5>);
    /// assert_eq!(t.array(), [0.0, 1.0, 2.0, 3.0, 4.0]);
    /// ```
    ///
    /// Runtime sized tensor:
    /// ```rust
    /// # use dfdx::{prelude::*, data::Arange};
    /// # let dev: Cpu = Default::default();
    /// let t: Tensor<(usize, ), f32, _> = dev.arange(5);
    /// assert_eq!(t.as_vec(), [0.0, 1.0, 2.0, 3.0, 4.0]);
    /// ```
    fn arange<Size: Dim>(&self, n: Size) -> Tensor<(Size,), E, Self> {
        let mut data = Vec::with_capacity(n.size());
        for i in 0..n.size() {
            data.push(E::from_usize(i).unwrap());
        }
        self.tensor_from_vec(data, (n,))
    }
}
impl<E: Dtype, D: ZerosTensor<E> + TensorFromVec<E>> Arange<E> for D {}