umfpack-rs 0.0.1

Some UMFPACK bindings for rust
use num_complex::Complex64;
use umfpack::prelude::*;

fn main() {
    println!("\n--- rust output: ---\n");
    example2_rs();

    println!("\n\n--- C output: ---\n");
    example2_c();
}

#[allow(non_snake_case)]
fn example2_rs() {
    let n = 5;
    let Ap = vec![0, 2, 5, 9, 10, 12];
    let Ai = vec![0, 1, 0, 2, 4, 1, 2, 3, 4, 2, 1, 4];
    let Az = vec![
        Complex64 { re: 2.0, im: 1.0 },
        Complex64 { re: 3.0, im: 1.0 },
        Complex64 { re: 3.0, im: 1.0 },
        Complex64 { re: -1.0, im: 1.0 },
        Complex64 { re: 4.0, im: 1.0 },
        Complex64 { re: 4.0, im: 1.0 },
        Complex64 { re: -3.0, im: 1.0 },
        Complex64 { re: 1.0, im: 1.0 },
        Complex64 { re: 2.0, im: 1.0 },
        Complex64 { re: 2.0, im: 1.0 },
        Complex64 { re: 6.0, im: 1.0 },
        Complex64 { re: 1.0, im: 1.0 },
    ];
    let Bz = vec![
        Complex64 { re: 8.0, im: 3.0 },
        Complex64 { re: 45.0, im: 3.0 },
        Complex64 { re: -3.0, im: 3.0 },
        Complex64 { re: 3.0, im: 3.0 },
        Complex64 { re: 19.0, im: 3.0 },
    ];
    let mut Xz = vec![
        Complex64 { re: 0.0, im: 0.0 },
        Complex64 { re: 0.0, im: 0.0 },
        Complex64 { re: 0.0, im: 0.0 },
        Complex64 { re: 0.0, im: 0.0 },
        Complex64 { re: 0.0, im: 0.0 },
    ];

    let mut info = Info::new();
    let control = Control::new();
    let mut symbolic = Symbolic::new();
    umfpack_zi_symbolic(
        n,
        n,
        &Ap,
        &Ai,
        &Az,
        &mut symbolic,
        Some(&control),
        Some(&mut info),
    );

    let mut numeric = Numeric::new();
    umfpack_zi_numeric(
        &Ap,
        &Ai,
        &Az,
        &symbolic,
        &mut numeric,
        Some(&control),
        Some(&mut info),
    );

    umfpack_zi_solve(
        UMFPACK::A,
        &Ap,
        &Ai,
        &Az,
        &mut Xz,
        &Bz,
        &numeric,
        Some(&control),
        Some(&mut info),
    );

    for i in 0..(n as usize) {
        let p = if Xz[i].im < 0.0 { "" } else { "+" };
        println!("x [{}] = {:.1}{}{:.1}j", i, Xz[i].re, p, Xz[i].im);
    }

    println!("Solve time: {}", info.umfpack_solve_walltime());
}

#[allow(non_snake_case)]
fn example2_c() {
    unsafe {
        c::example2();
    }
}

mod c {
    extern "C" {
        pub fn example2();
    }
}