#![cfg(feature = "rblas")]
extern crate rblas;
#[macro_use] extern crate ndarray;
use rblas::Gemm;
use rblas::attribute::Transpose;
use ndarray::{
OwnedArray,
};
use ndarray::blas::AsBlas;
#[test]
fn strided_matrix() {
let (n, m) = (45, 33);
let mut a = OwnedArray::linspace(0., ((n * m) - 1) as f32, n as usize * m as usize ).into_shape((n, m)).unwrap();
let mut b = ndarray::linalg::eye(m);
let mut res = OwnedArray::zeros(a.dim());
Gemm::gemm(&1., Transpose::NoTrans, &a.blas(), Transpose::NoTrans, &b.blas(),
&0., &mut res.blas());
assert_eq!(res, a);
let mut aprim = a.to_shared().slice(s![0..12, 0..11]);
println!("{:?}", aprim.shape());
println!("{:?}", aprim.strides());
let mut b = ndarray::linalg::eye(aprim.shape()[1]);
let mut res = OwnedArray::zeros(aprim.dim());
Gemm::gemm(&1., Transpose::NoTrans, &aprim.blas(), Transpose::NoTrans, &b.blas(),
&0., &mut res.blas());
println!("{:?}", aprim);
println!("{:?}", b);
println!("{:?}", res);
println!("{:?}", &res - &aprim);
assert_eq!(res, aprim);
let (np, mp) = aprim.dim();
let mut res = OwnedArray::zeros((mp, np));
let mut b = ndarray::linalg::eye(np);
Gemm::gemm(&1., Transpose::Trans, &aprim.blas(), Transpose::NoTrans, &b.blas(),
&0., &mut res.blas());
let mut at = aprim.clone();
at.swap_axes(0, 1);
assert_eq!(at, res);
let mut abis = a.to_shared().slice(s![0..12, ..;2]);
println!("{:?}", abis.shape());
println!("{:?}", abis.strides());
let mut b = ndarray::linalg::eye(abis.shape()[1]);
let mut res = OwnedArray::zeros(abis.dim());
Gemm::gemm(&1., Transpose::NoTrans, &abis.blas(), Transpose::NoTrans, &b.blas(),
&0., &mut res.blas());
println!("{:?}", abis);
println!("{:?}", b);
println!("{:?}", res);
println!("{:?}", &res - &abis);
assert_eq!(res, abis);
}