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 library that provides a 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: