#bindings #solve #symbolic #numeric #suite-sparse #complex #umfpack

umfpack-rs

为 Rust 提供的一些 UMFPACK 绑定

1 个不稳定版本

0.0.1 2023 年 9 月 4 日

#11 in #suite-sparse


用于 2 crates

LGPL-2.1-only

745KB
960 行代码(不包括注释)

UMFPACK-rs

为 Rust 提供的一些 UMFPACK 绑定。

umfpack-rs 库提供对 SuiteSparse UMFPACK 程序的一些不安全绑定和安全包装。您可以使用包装函数解决稀疏线性系统,这些系统可以是实值(f64)使用 umfpack_di_{symbolic,numeric,solve})或复数值(Complex64)使用 umfpack_zi_{symbolic,numeric,solve})。

示例

请注意,Rust 包装器试图尽可能地接近 SuiteSparse C 代码,同时隐藏不安全操作。这意味着暴露的 API 可能不如预期那样干净。

#[allow(non_snake_case)]
fn main() {
    use umfpack::prelude::*;

    let n = 5;
    let Ap = vec![0, 2, 5, 9, 10, 12]; // column pointers of CSC sparse nxn matrix
    let Ai = vec![0, 1, 0, 2, 4, 1, 2, 3, 4, 2, 1, 4]; // row indices of CSC sparse matrix
    let Ax = vec![2.0, 3.0, 3.0, -1.0, 4.0, 4.0, -3.0, 1.0, 2.0, 2.0, 6.0, 1.0]; // values of CSC sparse matrix
    let b = vec![8.0, 45.0, -3.0, 3.0, 19.0]; // dense target
    let mut x = vec![0.0, 0.0, 0.0, 0.0, 0.0]; // initial value for unknown x
    let control = Control::new(); // default control parameters
    let mut info = Info::new(); // empty info buffer

    // solving the system Ax=b happens in three steps:

    // 1. Symbolic Analyzation of the sparse system
    let mut symbolic = Symbolic::new();
    umfpack_di_symbolic(
        n, // m
        n, // n
        &Ap,
        &Ai,
        &Ax,
        &mut symbolic,
        Some(&control),
        Some(&mut info),
    );

    // 2. Numeric Analyzation of the sparse system
    let mut numeric = Numeric::new();
    umfpack_di_numeric(
        &Ap,
        &Ai,
        &Ax,
        &symbolic,
        &mut numeric,
        Some(&control),
        Some(&mut info),
    );

    // 3. Solving of the sparse system
    umfpack_di_solve(
        UMFPACK::A, // solve the system Ax=b
        &Ap,
        &Ai,
        &Ax,
        &mut x,
        &b,
        &numeric,
        Some(&control),
        Some(&mut info),
    );

    println!("symbolic walltime: {}", info.umfpack_symbolic_walltime());
    println!("numeric walltime: {}", info.umfpack_numeric_walltime());
    println!("solve walltime: {}", info.umfpack_solve_walltime());

    for i in 0..(n as usize) {
        println!("x [{}] = {:.1}", i, x[i]);
    }
}
symbolic walltime: 0.000018095000086759683
numeric walltime: 0.0004187900001397793
solve walltime: 0.000003099999958067201
x [0] = 1.0
x [1] = 2.0
x [2] = 3.0
x [3] = 4.0
x [4] = 5.0

您可以在 examples 文件夹中找到更多示例(有时与 C++ 等价物一起)。要了解如何使用 UMFPACK,请阅读 用户指南快速入门 PDF

安装

cargo add umfpack-rs

许可证 & 信用

© Floris Laporte 2023, LGPL-2.1

此库销售、包装并静态链接到 SuiteSparse,LGPL-2.1。

依赖关系

~0.3–1.4MB
~34K SLoC