| Crates.io | oxiblas-sparse |
| lib.rs | oxiblas-sparse |
| version | 0.1.2 |
| created_at | 2025-12-27 22:21:06.806677+00 |
| updated_at | 2025-12-29 21:02:21.526246+00 |
| description | Sparse matrix support for OxiBLAS |
| homepage | |
| repository | https://github.com/cool-japan/oxiblas |
| max_upload_size | |
| id | 2007922 |
| size | 1,504,327 |
Sparse matrix operations, iterative solvers, and preconditioners for OxiBLAS
oxiblas-sparse provides comprehensive sparse linear algebra functionality including 9 storage formats, iterative solvers, advanced preconditioners, and sparse eigenvalue/SVD algorithms.
[dependencies]
oxiblas-sparse = "0.1"
use oxiblas_sparse::{CsrMatrix, CooMatrix};
// From COO (easy construction)
let mut coo = CooMatrix::<f64>::new(1000, 1000);
coo.push(0, 0, 4.0);
coo.push(0, 1, -1.0);
coo.push(1, 0, -1.0);
coo.push(1, 1, 4.0);
// ... add more elements
// Convert to CSR (efficient operations)
let csr = CsrMatrix::from_coo(&coo);
// Matrix-vector multiplication
let x = vec![1.0; 1000];
let y = csr.matvec(&x);
use oxiblas_sparse::{CsrMatrix, gmres};
// Solve Ax = b using GMRES
let a = CsrMatrix::from_...;
let b = vec![/*...*/];
let result = gmres(&a, &b,
1e-10, // tolerance
100, // max iterations
30, // restart
None, // no preconditioner
)?;
println!("Solution: {:?}", result.x);
println!("Residual: {}", result.residual);
println!("Iterations: {}", result.iterations);
use oxiblas_sparse::{CsrMatrix, IluPreconditioner, pcg};
let a = CsrMatrix::from_...;
let b = vec![/*...*/];
// Create ILU preconditioner
let ilu = IluPreconditioner::compute(&a, 0.01)?; // drop tolerance
// Solve with preconditioned CG
let result = pcg(&a, &b,
&ilu, // preconditioner
1e-10, // tolerance
1000, // max iterations
)?;
use oxiblas_sparse::{CsrMatrix, AmgPreconditioner, pcg};
let a = CsrMatrix::from_...;
let b = vec![/*...*/];
// Create AMG preconditioner (multilevel)
let amg = AmgPreconditioner::build(&a, AmgConfig {
max_levels: 10,
coarsening: CoarseningType::RugeStuben,
smoother: SmootherType::GaussSeidel,
..Default::default()
})?;
// Solve with AMG-preconditioned CG
let result = pcg(&a, &b, &amg, 1e-10, 1000)?;
use oxiblas_sparse::{CsrMatrix, lanczos};
let a = CsrMatrix::from_...;
// Compute largest eigenvalues using Lanczos
let result = lanczos(&a,
10, // number of eigenvalues
100, // max iterations
1e-10, // tolerance
)?;
println!("Eigenvalues: {:?}", result.eigenvalues);
println!("Eigenvectors: {:?}", result.eigenvectors);
use oxiblas_sparse::{CsrMatrix, rcm_ordering};
let a = CsrMatrix::from_...;
// Reverse Cuthill-McKee ordering (bandwidth reduction)
let perm = rcm_ordering(&a)?;
// Reorder matrix: P*A*P^T
let a_reordered = a.permute(&perm, &perm)?;
// Significant bandwidth reduction for better cache performance!
| Matrix Type | Solver | Preconditioner | Iterations |
|---|---|---|---|
| Poisson 2D (10K unknowns) | CG | None | ~7000 |
| Poisson 2D (10K unknowns) | CG | ILU(0) | ~150 |
| Poisson 2D (10K unknowns) | CG | AMG | ~15 |
| General (sparse) | GMRES(30) | None | ~500 |
| General (sparse) | FGMRES(30) | ILUT | ~80 |
| Format | Non-zeros | Memory (vs Dense) |
|---|---|---|
| CSR | 1M | 0.001% |
| COO | 1M | 0.0015% |
| Dense equivalent | 1M | 100% |
For a 1000×1000 matrix with 1M non-zeros, sparse format uses ~1000× less memory!
oxiblas-sparse/
├── formats/
│ ├── csr.rs # CSR format
│ ├── csc.rs # CSC format
│ ├── coo.rs # COO format
│ ├── ell.rs # ELL format
│ ├── dia.rs # DIA format
│ └── ...
├── solvers/
│ ├── gmres.rs # GMRES solver
│ ├── cg.rs # Conjugate Gradient
│ ├── bicgstab.rs # BiCGStab
│ ├── minres.rs # MINRES
│ └── ...
├── precond/
│ ├── ilu.rs # Incomplete LU
│ ├── ic.rs # Incomplete Cholesky
│ ├── amg.rs # Algebraic Multigrid
│ ├── spai.rs # Sparse Approximate Inverse
│ └── ...
├── eigen/
│ ├── lanczos.rs # Lanczos method
│ ├── arnoldi.rs # Arnoldi iteration
│ └── ...
└── reorder/
├── rcm.rs # Reverse Cuthill-McKee
├── amd.rs # Approximate Minimum Degree
└── ...
cargo run --example sparse_matrices
cargo bench --package oxiblas-benchmarks --bench sparse_ops
cargo bench --package oxiblas-benchmarks --bench sparse_eigen_svd
oxiblas-core - Core traitsoxiblas-blas - Dense BLASoxiblas-lapack - Dense decompositionsoxiblas - Meta-crateLicensed under MIT or Apache-2.0 at your option.