matrix 0.22.0

The package provides a matrix laboratory.
Documentation
use random::{self, Source};
use test::Bencher;

use matrix::format::compressed::Variant;
use matrix::format::{Compressed, Conventional};
use matrix::operation::MultiplyInto;

#[bench]
fn multiply_left_0010(b: &mut Bencher) {
    multiply_left(10, 10, b);
}

#[bench]
fn multiply_left_0100(b: &mut Bencher) {
    multiply_left(100, 100, b);
}

#[bench]
fn multiply_left_1000(b: &mut Bencher) {
    multiply_left(1000, 1000, b);
}

#[bench]
fn multiply_left_0010_dense(b: &mut Bencher) {
    multiply_left_dense(10, 10, b);
}

#[bench]
fn multiply_left_0100_dense(b: &mut Bencher) {
    multiply_left_dense(100, 100, b);
}

#[bench]
fn multiply_left_1000_dense(b: &mut Bencher) {
    multiply_left_dense(1000, 1000, b);
}

#[bench]
fn multiply_right_0010(b: &mut Bencher) {
    multiply_right(10, 10, b);
}

#[bench]
fn multiply_right_0100(b: &mut Bencher) {
    multiply_right(100, 100, b);
}

#[bench]
fn multiply_right_1000(b: &mut Bencher) {
    multiply_right(1000, 1000, b);
}

#[bench]
fn multiply_right_0010_dense(b: &mut Bencher) {
    multiply_right_dense(10, 10, b);
}

#[bench]
fn multiply_right_0100_dense(b: &mut Bencher) {
    multiply_right_dense(100, 100, b);
}

#[bench]
fn multiply_right_1000_dense(b: &mut Bencher) {
    multiply_right_dense(1000, 1000, b);
}

fn multiply_left(size: usize, nonzeros: usize, bencher: &mut Bencher) {
    let left = make_compressed(size, size, nonzeros);
    let right = make_conventional(size, size);
    let mut result = Conventional::new(size);
    bencher.iter(|| left.multiply_into(&right, &mut result));
}

fn multiply_left_dense(size: usize, nonzeros: usize, bencher: &mut Bencher) {
    let left = Conventional::from(make_compressed(size, size, nonzeros));
    let right = make_conventional(size, size);
    let mut result = Conventional::new(size);
    bencher.iter(|| left.multiply_into(&right, &mut result));
}

fn multiply_right(size: usize, nonzeros: usize, bencher: &mut Bencher) {
    let left = make_conventional(size, size);
    let right = make_compressed(size, size, nonzeros);
    let mut result = Conventional::new(size);
    bencher.iter(|| left.multiply_into(&right, &mut result));
}

fn multiply_right_dense(size: usize, nonzeros: usize, bencher: &mut Bencher) {
    let left = make_conventional(size, size);
    let right = Conventional::from(&make_compressed(size, size, nonzeros));
    let mut result = Conventional::new(size);
    bencher.iter(|| left.multiply_into(&right, &mut result));
}

fn make_compressed(rows: usize, columns: usize, nonzeros: usize) -> Compressed<f64> {
    let mut source = random::default().seed([42, 69]);
    let mut matrix = Compressed::with_capacity((rows, columns), Variant::Column, nonzeros);
    for _ in 0..nonzeros {
        let i = source.read::<u64>() as usize % rows;
        let j = source.read::<u64>() as usize % columns;
        matrix.set((i, j), source.read::<f64>());
    }
    matrix
}

fn make_conventional(rows: usize, columns: usize) -> Conventional<f64> {
    let mut source = random::default().seed([69, 42]);
    let values = source.iter().take(rows * columns).collect::<Vec<f64>>();
    Conventional::from_vec((rows, columns), values)
}