![test](https://github.com/code-sam/graphblas_sparse_linear_algebra/actions/workflows/test_main.yml/badge.svg?branch=main) # graphblas_sparse_linear_algebra Rust wrapper for SuiteSparse:GraphBLAS ## Minimum example ```rust use graphblas_sparse_linear_algebra::collections::sparse_matrix::operations::{ FromMatrixElementList, GetSparseMatrixElementValue, }; use graphblas_sparse_linear_algebra::collections::sparse_matrix::{ MatrixElementList, Size, SparseMatrix, }; use graphblas_sparse_linear_algebra::collections::Collection; use graphblas_sparse_linear_algebra::context::Context; use graphblas_sparse_linear_algebra::operators::apply::{ ApplyBinaryOperator, BinaryOperatorApplier, }; use graphblas_sparse_linear_algebra::operators::binary_operator::{Assignment, First}; use graphblas_sparse_linear_algebra::operators::mask::SelectEntireMatrix; use graphblas_sparse_linear_algebra::operators::options::{ OptionsForOperatorWithMatrixAsFirstArgument, OptionsForOperatorWithMatrixAsSecondArgument, }; fn main() { let context = Context::init_default().unwrap(); let element_list = MatrixElementList::::from_element_vector(vec![ (1, 1, 1).into(), (2, 1, 2).into(), (4, 2, 4).into(), (5, 2, 5).into(), ]); let matrix_size: Size = (10, 15).into(); let matrix = SparseMatrix::::from_element_list( context.clone(), matrix_size, element_list, &First::::new(), ) .unwrap(); let mut product_matrix = SparseMatrix::::new(context.clone(), matrix_size).unwrap(); let operator = BinaryOperatorApplier::new(); let first_argument = 10; operator .apply_with_matrix_as_left_argument( &matrix, &First::::new(), first_argument, &Assignment::new(), &mut product_matrix, &SelectEntireMatrix::new(context.clone()), &OptionsForOperatorWithMatrixAsFirstArgument::new_default(), ) .unwrap(); println!("{}", product_matrix); assert_eq!(product_matrix.number_of_stored_elements().unwrap(), 4); assert_eq!(product_matrix.element_value(2, 1).unwrap(), Some(2)); assert_eq!(product_matrix.element_value(9, 1).unwrap(), None); let operator = BinaryOperatorApplier::new(); let second_argument = 10; operator .apply_with_matrix_as_right_argument( second_argument, &First::::new(), &matrix, &Assignment::new(), &mut product_matrix, &SelectEntireMatrix::new(context), &OptionsForOperatorWithMatrixAsSecondArgument::new_default(), ) .unwrap(); println!("{}", matrix); println!("{}", product_matrix); assert_eq!(product_matrix.number_of_stored_elements().unwrap(), 4); assert_eq!(product_matrix.element_value(2, 1).unwrap(), Some(10)); assert_eq!(product_matrix.element_value(9, 1).unwrap(), None); } ``` ## Dependencies graphblas_sparse_linear_algebra uses the [SuiteSparse:GraphBLAS](https://github.com/DrTimothyAldenDavis/GraphBLAS) implementation developed by Timothy A. Davis. ## Building from source Please make sure to meet the requirements for building [suitesparse_graphblas_sys](https://crates.io/crates/suitesparse_graphblas_sys). ## Compatibility graphblas_sparse_linear_algebra is mostly compatible with the GraphBLAS specification version 2.0 and uses SuiteSparse:GraphBLAS v8.2.0. ## Contributing Awesome, contributions are welcome. Graphblas_sparse_linear_algebra and your contribution may be relicensed and integrated into commercial software in the future. Therefore, you will be asked to agree to the [Contributor License Agreement](https://github.com/code-sam/graphblas_sparse_linear_algebra/blob/main/Contributor_License_Agreement.md) when you make a pull request. ## Licensing graphblas_sparse_linear_algebra is licensed under [Creative Commons Attribution Non Commercial 4.0 International](https://creativecommons.org/licenses/by-nc/4.0/legalcode). For other licensing options, please contact Sam Dekker.