extern crate blas_src;
extern crate lapack_src;
use rlst::dense::linalg::lapack::eigenvalue_decomposition::EigMode;
use rlst::{DynArray, EigenvalueDecomposition, EvaluateArray, dot_blas};
use rlst::{Inverse, c64};
fn main() {
let n = 11;
let mut a = DynArray::<f64, 2>::from_shape([n, n]);
a.fill_from_seed_equally_distributed(0);
let lam = a.eigenvalues().unwrap();
let (t, z) = a.schur().unwrap();
let actual = dot_blas!(z.r(), t.r(), z.r().conj().transpose().eval());
rlst::assert_array_relative_eq!(actual, a, 1E-10);
let (lam2, vr, vl) = a.eig(EigMode::BothEigenvectors).unwrap();
rlst::assert_array_relative_eq!(lam, lam2, 1E-10);
let a_complex = a.into_type::<c64>().eval();
let diag = rlst::diag!(lam2);
let vlh = vl.unwrap().conj().transpose().eval();
let actual = dot_blas!(vlh.inverse().unwrap(), dot_blas!(diag.r(), vlh));
rlst::assert_array_abs_diff_eq!(actual, a_complex, 1E-10);
let vr = vr.unwrap();
let actual = dot_blas!(vr.r(), dot_blas!(diag, vr.r().inverse().unwrap()));
rlst::assert_array_abs_diff_eq!(actual, a_complex, 1E-10);
}