ha-ndarray 0.5.0

A hardware-accelerated n-dimensional array
Documentation
use ha_ndarray::*;

#[test]
fn test_concat() -> Result<(), Error> {
    let first = ArrayBuf::new(vec![1, 2, 3], shape![1, 3])?;
    let second = ArrayBuf::new(vec![4, 5, 6], shape![1, 3])?;

    let concatenated = Array::concat(vec![first, second])?;
    assert_eq!(
        concatenated.buffer()?.to_slice()?.into_vec(),
        vec![1, 2, 3, 4, 5, 6]
    );

    assert_eq!(concatenated.shape(), &[2, 3]);

    Ok(())
}

#[test]
fn test_transpose_concat() -> Result<(), Error> {
    let first = ArrayBuf::new(vec![1, 2, 3, 4, 5, 6], shape![2, 3])?;
    let second = ArrayBuf::new(vec![7, 8, 9, 10, 11, 12], shape![2, 3])?;
    let concatenated = Array::transpose_concat(vec![first, second], 1)?;

    assert_eq!(concatenated.shape(), &[2, 6]);

    assert_eq!(
        concatenated.buffer()?.to_slice()?.into_vec(),
        vec![1, 2, 3, 7, 8, 9, 4, 5, 6, 10, 11, 12],
    );

    Ok(())
}

#[test]
fn test_range() -> Result<(), Error> {
    use rayon::prelude::*;

    let size = 1_000_000;

    let expected = ArrayBuf::new(
        (0..size)
            .into_par_iter()
            .map(|n| n as f32 * 0.5)
            .collect::<Vec<f32>>(),
        shape![size],
    )?;

    let actual = ArrayOp::range(0f32, 500_000f32, shape![1_000_000])?;

    assert!(expected.eq(actual)?.all()?);

    Ok(())
}

#[test]
fn test_random_normal() -> Result<(), Error> {
    let size = 1_000_000;
    let array = ArrayOp::random_normal(size)?;

    assert_eq!(array.as_ref().sum_all()? as usize / size, 0);
    assert!(array.as_ref().gt_scalar(1.)?.any()?);
    assert!(array.lt_scalar(-1.)?.any()?);

    Ok(())
}

#[test]
fn test_random_uniform() -> Result<(), Error> {
    let size = 1_000_000;
    let array = ArrayOp::random_uniform(size)?;

    assert_eq!(array.as_ref().sum_all()? as usize / size, 0);
    assert!(array.as_ref().ge_scalar(-1.)?.all()?);
    assert!(array.le_scalar(1.)?.all()?);

    Ok(())
}