#![cfg_attr(not(feature = "std"), no_std)]
#![warn(missing_docs)]
#![warn(clippy::all)]
#![allow(clippy::module_name_repetitions)]
#![allow(clippy::similar_names)]
#![allow(clippy::too_many_lines)]
#![allow(clippy::must_use_candidate)]
#![allow(clippy::needless_range_loop)]
#[cfg(not(feature = "std"))]
extern crate alloc;
pub mod mat;
pub mod mat_mut;
pub mod mat_ref;
pub mod banded;
pub mod cow;
pub mod lazy;
pub mod ops;
pub mod packed;
pub mod prefetch;
pub mod symmetric;
pub mod triangular;
#[cfg(feature = "mmap")]
pub mod mmap;
#[cfg(feature = "nalgebra")]
pub mod nalgebra_compat;
pub use oxiblas_core::memory::{Alloc, Global};
pub use cow::CowMat;
pub use mat::Mat;
pub use mat_mut::MatMut;
pub use mat_ref::{DiagRef, MatRef};
pub use banded::{BandedMat, BandedMut, BandedRef, SymmetricBandedMat};
pub use packed::{PackedMat, PackedMut, PackedRef, TriangularKind};
pub use prefetch::{
CACHE_LINE_SIZE, MatrixPrefetcher, PREFETCH_DISTANCE_BYTES, PREFETCH_DISTANCE_LINES,
PrefetchLocality, prefetch_block, prefetch_column, prefetch_range_read, prefetch_range_write,
prefetch_read, prefetch_write,
};
pub use symmetric::{
HermitianMat, SymmetricMat, SymmetricMut, SymmetricRef, SymmetricView, SymmetricViewMut,
};
pub use triangular::{
DiagonalKind, TriangularMat, TriangularMut, TriangularRef, TriangularView, TriangularViewMut,
};
pub use lazy::{
ComplexExpr, ComplexScalar, Expr, ExprAdd, ExprConj, ExprFma, ExprGemm, ExprHermitian,
ExprLeaf, ExprMul, ExprNeg, ExprScale, ExprSub, ExprTranspose, LazyExt, fma, gemm,
};
#[cfg(feature = "mmap")]
pub use mmap::{
MmapBuilder, MmapError, MmapMat, MmapMatMut, read_dimensions, write_mat as write_mmap,
};
#[cfg(feature = "nalgebra")]
pub use nalgebra_compat::{
DMatrixOxiblasExt, MatNalgebraExt, dmatrix_to_mat, dmatrix_to_mat_mut, dmatrix_to_mat_ref,
dmatrix_view_to_mat, dvector_to_mat, mat_mut_to_dmatrix_view_mut, mat_ref_to_dmatrix,
mat_ref_to_dmatrix_view, mat_to_dmatrix, mat_to_dvector,
};
pub mod prelude {
pub use crate::{Alloc, Global};
pub use crate::cow::CowMat;
pub use crate::mat::Mat;
pub use crate::mat_mut::MatMut;
pub use crate::mat_ref::{DiagRef, MatRef};
pub use crate::banded::{BandedMat, SymmetricBandedMat};
pub use crate::packed::{PackedMat, TriangularKind};
pub use crate::symmetric::{HermitianMat, SymmetricMat};
pub use crate::triangular::{DiagonalKind, TriangularMat};
pub use crate::lazy::{ComplexExpr, Expr, LazyExt, fma as lazy_fma, gemm as lazy_gemm};
pub use crate::ops;
pub use crate::prefetch::MatrixPrefetcher;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_matrix_workflow() {
let mut m: Mat<f64> = Mat::zeros(3, 3);
for i in 0..3 {
m[(i, i)] = (i + 1) as f64;
}
let view = m.as_ref();
assert_eq!(view[(0, 0)], 1.0);
assert_eq!(view[(1, 1)], 2.0);
assert_eq!(view[(2, 2)], 3.0);
{
let mut view = m.as_mut();
view[(0, 1)] = 10.0;
}
assert_eq!(m[(0, 1)], 10.0);
}
#[test]
fn test_submatrix_views() {
let m: Mat<f64> = Mat::from_rows(&[
&[1.0, 2.0, 3.0, 4.0],
&[5.0, 6.0, 7.0, 8.0],
&[9.0, 10.0, 11.0, 12.0],
&[13.0, 14.0, 15.0, 16.0],
]);
let sub = m.as_ref().submatrix(1, 1, 2, 2);
assert_eq!(sub[(0, 0)], 6.0);
assert_eq!(sub[(0, 1)], 7.0);
assert_eq!(sub[(1, 0)], 10.0);
assert_eq!(sub[(1, 1)], 11.0);
}
#[test]
fn test_complex_matrix() {
use num_complex::Complex64;
let mut m: Mat<Complex64> = Mat::filled(2, 2, Complex64::new(0.0, 0.0));
m[(0, 0)] = Complex64::new(1.0, 2.0);
m[(1, 1)] = Complex64::new(3.0, 4.0);
assert_eq!(m[(0, 0)].re, 1.0);
assert_eq!(m[(0, 0)].im, 2.0);
assert_eq!(m[(1, 1)].re, 3.0);
assert_eq!(m[(1, 1)].im, 4.0);
}
}