blasoxide 0.3.2

BLAS implementation in rust
Documentation
#![deny(warnings)]

use blasoxide::*;

const SIZES: [usize; 5] = [251, 501, 1001, 2001, 4001];
const STRIDES: [(usize, usize); 6] = [(1, 1), (1, 7), (7, 1), (7, 11), (11, 7), (11, 11)];

#[test]
fn test_drotg() {
    assert_eq!(drotg(0., 0.), (0., 0., 1., 0.));
    assert_eq!(drotg(-4., 3.), (-5., -0.6, 0.8, -0.6));
    assert_eq!(drotg(4., 3.), (5., 0.6, 0.8, 0.6));
    assert_eq!(drotg(-4., -3.), (-5., 0.6, 0.8, 0.6));
    assert_eq!(drotg(4., -3.), (5., -0.6, 0.8, -0.6));
    assert_eq!(drotg(-3., 4.), (5., 1. / -0.6, -0.6, 0.8));
    assert_eq!(drotg(3., 4.), (5., 1. / 0.6, 0.6, 0.8));
}

fn drot_driver(n: usize, incx: usize, incy: usize, c: f64, s: f64) {
    let mut x = vec![2.; n * incx];
    let mut y = vec![3.; n * incy];

    unsafe {
        drot(n, x.as_mut_ptr(), incx, y.as_mut_ptr(), incy, c, s);
    }

    for (i, xi) in x.into_iter().enumerate() {
        if i % incx == 0 {
            assert_eq!(xi, 2. * c + 3. * s);
        } else {
            assert_eq!(xi, 2.);
        }
    }

    for (i, yi) in y.into_iter().enumerate() {
        if i % incy == 0 {
            assert_eq!(yi, 3. * c - 2. * s);
        } else {
            assert_eq!(yi, 3.);
        }
    }
}

#[test]
fn test_drot() {
    for &n in SIZES.iter() {
        for &(incx, incy) in STRIDES.iter() {
            drot_driver(n, incx, incy, 5., 4.);
        }
    }
}

fn dswap_driver(n: usize, incx: usize, incy: usize) {
    let mut x = vec![2.; n * incx];
    let mut y = vec![3.; n * incy];

    unsafe {
        dswap(n, x.as_mut_ptr(), incx, y.as_mut_ptr(), incy);
    }

    for (i, xi) in x.into_iter().enumerate() {
        if i % incx == 0 {
            assert_eq!(xi, 3.);
        } else {
            assert_eq!(xi, 2.);
        }
    }

    for (i, yi) in y.into_iter().enumerate() {
        if i % incy == 0 {
            assert_eq!(yi, 2.);
        } else {
            assert_eq!(yi, 3.);
        }
    }
}

#[test]
fn test_dswap() {
    for &n in SIZES.iter() {
        for &(incx, incy) in STRIDES.iter() {
            dswap_driver(n, incx, incy);
        }
    }
}

fn dscal_driver(n: usize, incx: usize) {
    let mut x = vec![2.; n * incx];

    unsafe {
        dscal(n, 7., x.as_mut_ptr(), incx);
    }

    for (i, xi) in x.into_iter().enumerate() {
        if i % incx == 0 {
            assert_eq!(xi, 14.);
        } else {
            assert_eq!(xi, 2.);
        }
    }
}

#[test]
fn test_dscal() {
    for &n in SIZES.iter() {
        for &(incx, _) in STRIDES.iter() {
            dscal_driver(n, incx);
        }
    }
}

fn dcopy_driver(n: usize, incx: usize, incy: usize) {
    let x = vec![2.; n * incx];
    let mut y = vec![3.; n * incy];

    unsafe {
        dcopy(n, x.as_ptr(), incx, y.as_mut_ptr(), incy);
    }

    for (i, yi) in y.into_iter().enumerate() {
        if i % incy == 0 {
            assert_eq!(yi, 2.);
        } else {
            assert_eq!(yi, 3.);
        }
    }
}

#[test]
fn test_dcopy() {
    for &n in SIZES.iter() {
        for &(incx, incy) in STRIDES.iter() {
            dcopy_driver(n, incx, incy);
        }
    }
}

fn daxpy_driver(n: usize, incx: usize, incy: usize) {
    let x = vec![2.; n * incx];
    let mut y = vec![3.; n * incy];

    unsafe {
        daxpy(n, 7., x.as_ptr(), incx, y.as_mut_ptr(), incy);
    }

    for (i, yi) in y.into_iter().enumerate() {
        if i % incy == 0 {
            assert_eq!(yi, 17.);
        } else {
            assert_eq!(yi, 3.);
        }
    }
}

#[test]
fn test_daxpy() {
    for &n in SIZES.iter() {
        for &(incx, incy) in STRIDES.iter() {
            daxpy_driver(n, incx, incy);
        }
    }
}

fn ddot_driver(n: usize, incx: usize, incy: usize) {
    let x = vec![2.; n * incx];
    let y = vec![3.; n * incy];

    unsafe {
        assert_eq!(ddot(n, x.as_ptr(), incx, y.as_ptr(), incy), n as f64 * 6.);
    }
}

#[test]
fn test_ddot() {
    for &n in SIZES.iter() {
        for &(incx, incy) in STRIDES.iter() {
            ddot_driver(n, incx, incy);
        }
    }
}

fn dnrm2_driver(n: usize, incx: usize) {
    let x = vec![2.; n * incx];

    unsafe {
        assert_eq!(dnrm2(n, x.as_ptr(), incx), (4. * n as f64).sqrt());
    }
}

#[test]
fn test_dnrm2() {
    for &n in SIZES.iter() {
        for &(incx, _) in STRIDES.iter() {
            dnrm2_driver(n, incx);
        }
    }
}

fn dasum_driver(n: usize, incx: usize) {
    let x = vec![-2.; n * incx];

    unsafe {
        assert_eq!(dasum(n, x.as_ptr(), incx), 2. * n as f64);
    }
}

#[test]
fn test_dasum() {
    for &n in SIZES.iter() {
        for &(incx, _) in STRIDES.iter() {
            dasum_driver(n, incx);
        }
    }
}

fn idamax_driver(n: usize, incx: usize) {
    let mut x = vec![-2.; n * incx];

    x[incx] = 2.;

    unsafe {
        assert_eq!(idamax(n, x.as_ptr(), incx), 0);
    }

    x[incx * 2] = -3.;

    unsafe {
        assert_eq!(idamax(n, x.as_ptr(), incx), 2);
    }
}

#[test]
fn test_idamax() {
    for &n in SIZES.iter() {
        for &(incx, _) in STRIDES.iter() {
            idamax_driver(n, incx);
        }
    }
}