use std::iter;
pub fn to_csr<T: Copy + Sized>(nrow: usize, _ncol: usize, nnz: usize,
ai: &[usize], aj: &[usize], ax: &[T]) -> (Vec<usize>, Vec<usize>, Vec<T>) {
let mut bp: Vec<usize> = iter::repeat(0).take(nrow+1).collect();
let mut bj: Vec<usize> = iter::repeat(0).take(nnz).collect();
let mut bx: Vec<T> = Vec::with_capacity(nnz);
unsafe {
bx.set_len(nnz);
}
for n in 0 .. nnz {
bp[ai[n]] += 1;
}
let mut cumsum = 0;
for i in 0 .. nrow {
let temp = bp[i];
bp[i] = cumsum;
cumsum += temp;
}
bp[nrow] = nnz;
for n in 0 .. nnz {
let row = ai[n];
let dest = bp[row];
bj[dest] = aj[n];
bx[dest] = ax[n];
bp[row] += 1;
}
let mut last = 0;
for i in 0 .. nrow+1 {
let temp = bp[i];
bp[i] = last;
last = temp;
}
(bp, bj, bx)
}
pub fn to_csc<T: Copy + Sized>(nrow: usize, ncol: usize, nnz: usize, ai: &[usize], aj: &[usize], ax: &[T]) -> (Vec<usize>, Vec<usize>, Vec<T>) {
to_csr(ncol, nrow, nnz, aj, ai, ax)
}