# RBLAS [![MIT licensed](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE) [![crates.io](http://meritbadge.herokuapp.com/rblas)](https://crates.io/crates/rblas) Rust bindings and wrappers for BLAS (Basic Linear Algebra Subprograms). ## Overview RBLAS wraps each external call in a trait with the same name (but capitalized). This trait contains a single static method, of the same name. These traits are generic over the four main types of numbers BLAS supports: `f32`, `f64`, `Complex32`, and `Complex64`. For example the functions `cblas_saxpy`, `cblas_daxpy`, `cblas_caxypy`, and `cblas_zaxpy` are called with the function `Axpy::axpy`. Additionally, RBLAS introduces a few traits to shorten calls to these BLAS functions: `Vector` for types that implement vector-like characteristics and `Matrix` for types that implement matrix-like characteristics. The `Vector` trait is already implemented by `Vec` and `[]` types. [Documentation](http://mikkyang.github.io/rust-blas/doc/rblas/index.html) ## Installation By default, the library links with `blas` dynamically. To link to an alternate implementation, like OpenBLAS, use the environment variable `CARGO_BLAS`. If you've already built the bindings, you may need to clean and build again. ``` export CARGO_BLAS=openblas ``` ## Example ```rust extern crate rblas; use rblas::Dot; fn main() { let x = vec![1.0, -2.0, 3.0, 4.0]; let y = [1.0, 1.0, 1.0, 1.0, 7.0]; let d = Dot::dot(&x, &y[..x.len()]); assert_eq!(d, 6.0); } ``` ## Sugared Example ```rust #[macro_use] extern crate rblas as blas; use blas::math::Mat; use blas::{Matrix, Vector}; use blas::math::Marker::T; fn main() { let x = vec![1.0, 2.0]; let xr = &x as &Vector<_>; let i = mat![1.0, 0.0; 0.0, 1.0]; let ir = &i as &Matrix<_>; assert!(xr + &x == 2.0 * xr); assert!(ir * xr == x); let dot = (xr ^ T) * xr; assert!(dot == 5.0); } ```