rapl

NOTE: rapl requires Nightly and is strictly intended for non-production purposes only. rapl utilizes certain unstable features that may result in unexpected behavior, and is not optimized for performance.

rapl is an experimental numerical computing Rust that provides an simple way of working with N-dimensional array, along with a wide range of mathematical functions to manipulate them. It takes inspiration from NumPy and APL, with the primary aim of achieving maximum ergonomic and user-friendliness while maintaining generality. Notably, it offers automatic Rank Polymorphic broadcasting between arrays of varying shapes and scalars as a built-in feature.

```Rust

![feature(genericconstexprs)]

use rapl::*; fn main() {     let a = Ndarr::from([1, 2, 3]);     let b = Ndarr::from([[1, 2, 3], [4, 5, 6], [7, 8, 9]]);     let r = a + b - 1;     assert_eq!(r, Ndarr::from([[1, 3, 5], [4, 6, 8], [7, 9, 11]])); } ```

Array initialization

There are multiple handy ways of initializing N-dimensional arrays (or Ndarr). - From Native Rust arrays to Ndarr. Rust let a = Ndarr::from(["a","b","c"]); let b = Ndarr::from([[1,2],[3,4]]); - From ranges. Rust let a = Ndarr::from(1..7).reshape(&[2,3]) - From &str Rust let chars = Ndarr::from("Hello rapl!"); //Ndarr<char,1> - Others: Rust let ones: Ndarr<f32, 2> = Ndarr::ones(&[4,4]); let zeros : Ndarr<i32, 3>= Ndarr::zeros(&[2,3,4]); let letter_a = Ndarr::fill("a", &[5]); let fold = Ndarr::new(data: &[0, 1, 2, 3], shape: [2, 2]).expect("Error initializing");

Element wise operations

asserteq!(a + b, Ndarr::from([[2,4],[0,0]])) Note: If the shapes are not equal `rapl` will automatically broadcast the arrays into a compatible shape (if it exist) and perform the operation. - Math operations including trigonometric functions Rust let x = Ndarr::from([-1.0 , -0.8, -0.6, -0.4, -0.2, 0.0, 0.2, 0.4, 0.6, 0.8, 1.0]); let sinx = &x.sin(); let cosx = &x.sin(); let tanhx = &x.tanh();

let abs_x = x.abs(); - Map function Rust let a = Ndarr::from([[1,2],[3,4]]); let mapped = a.map(|x| x**2-1); ```

Monadic tensor operations

asserteq!(arr.sliceat(1)[0], Ndarr::from([1,3])) - Reduce Rust let sumaxis = arr.clone().reduce(1, |x,y| x + y).unwrap(); asserteq!(sum_axis, Ndarr::from([6, 15])); //sum reduction ```

Diatic tensor operations

``` - Outer Product.

```Rust     let suits = Ndarr::from(["♣","♠","♥","♦"]);     let ranks = Ndarr::from(["2","3","4","5","6","7","8","9","10","J","Q","K","A"]);

    let addstr = |x: &str, y: &str| (x.toowned() + y);

    let deck = ops::outerproduct( addstr, ranks, suits).flatten(); //All cards in a deck ```

Features in development: