Chris@49: // Copyright (C) 2008-2012 NICTA (www.nicta.com.au) Chris@49: // Copyright (C) 2008-2012 Conrad Sanderson Chris@49: // Copyright (C) 2009 Edmund Highcock Chris@49: // Copyright (C) 2011 James Sanders Chris@49: // Copyright (C) 2012 Eric Jon Sundstrom Chris@49: // Chris@49: // This Source Code Form is subject to the terms of the Mozilla Public Chris@49: // License, v. 2.0. If a copy of the MPL was not distributed with this Chris@49: // file, You can obtain one at http://mozilla.org/MPL/2.0/. Chris@49: Chris@49: Chris@49: //! \addtogroup auxlib Chris@49: //! @{ Chris@49: Chris@49: Chris@49: //! wrapper for accessing external functions defined in ATLAS, LAPACK or BLAS libraries Chris@49: class auxlib Chris@49: { Chris@49: public: Chris@49: Chris@49: Chris@49: template Chris@49: struct pos Chris@49: { Chris@49: static const uword n2 = row + col*2; Chris@49: static const uword n3 = row + col*3; Chris@49: static const uword n4 = row + col*4; Chris@49: }; Chris@49: Chris@49: Chris@49: // Chris@49: // inv Chris@49: Chris@49: template Chris@49: inline static bool inv(Mat& out, const Base& X, const bool slow = false); Chris@49: Chris@49: template Chris@49: inline static bool inv(Mat& out, const Mat& A, const bool slow = false); Chris@49: Chris@49: template Chris@49: inline static bool inv_noalias_tinymat(Mat& out, const Mat& X, const uword N); Chris@49: Chris@49: template Chris@49: inline static bool inv_inplace_tinymat(Mat& out, const uword N); Chris@49: Chris@49: template Chris@49: inline static bool inv_inplace_lapack(Mat& out); Chris@49: Chris@49: Chris@49: // Chris@49: // inv_tr Chris@49: Chris@49: template Chris@49: inline static bool inv_tr(Mat& out, const Base& X, const uword layout); Chris@49: Chris@49: Chris@49: // Chris@49: // inv_sym Chris@49: Chris@49: template Chris@49: inline static bool inv_sym(Mat& out, const Base& X, const uword layout); Chris@49: Chris@49: Chris@49: // Chris@49: // inv_sympd Chris@49: Chris@49: template Chris@49: inline static bool inv_sympd(Mat& out, const Base& X, const uword layout); Chris@49: Chris@49: Chris@49: // Chris@49: // det Chris@49: Chris@49: template Chris@49: inline static eT det(const Base& X, const bool slow = false); Chris@49: Chris@49: template Chris@49: inline static eT det_tinymat(const Mat& X, const uword N); Chris@49: Chris@49: template Chris@49: inline static eT det_lapack(const Mat& X, const bool make_copy); Chris@49: Chris@49: Chris@49: // Chris@49: // log_det Chris@49: Chris@49: template Chris@49: inline static bool log_det(eT& out_val, typename get_pod_type::result& out_sign, const Base& X); Chris@49: Chris@49: Chris@49: // Chris@49: // lu Chris@49: Chris@49: template Chris@49: inline static bool lu(Mat& L, Mat& U, podarray& ipiv, const Base& X); Chris@49: Chris@49: template Chris@49: inline static bool lu(Mat& L, Mat& U, Mat& P, const Base& X); Chris@49: Chris@49: template Chris@49: inline static bool lu(Mat& L, Mat& U, const Base& X); Chris@49: Chris@49: Chris@49: // Chris@49: // eig Chris@49: Chris@49: template Chris@49: inline static bool eig_sym(Col& eigval, const Base& X); Chris@49: Chris@49: template Chris@49: inline static bool eig_sym(Col& eigval, const Base,T1>& X); Chris@49: Chris@49: template Chris@49: inline static bool eig_sym(Col& eigval, Mat& eigvec, const Base& X); Chris@49: Chris@49: template Chris@49: inline static bool eig_sym(Col& eigval, Mat< std::complex >& eigvec, const Base,T1>& X); Chris@49: Chris@49: template Chris@49: inline static bool eig_sym_dc(Col& eigval, Mat& eigvec, const Base& X); Chris@49: Chris@49: template Chris@49: inline static bool eig_sym_dc(Col& eigval, Mat< std::complex >& eigvec, const Base,T1>& X); Chris@49: Chris@49: template Chris@49: inline static bool eig_gen(Col< std::complex >& eigval, Mat& l_eigvec, Mat& r_eigvec, const Base& X, const char side); Chris@49: Chris@49: template Chris@49: inline static bool eig_gen(Col< std::complex >& eigval, Mat< std::complex >& l_eigvec, Mat< std::complex >& r_eigvec, const Base< std::complex, T1 >& X, const char side); Chris@49: Chris@49: Chris@49: // Chris@49: // chol Chris@49: Chris@49: template Chris@49: inline static bool chol(Mat& out, const Base& X); Chris@49: Chris@49: Chris@49: // Chris@49: // qr Chris@49: Chris@49: template Chris@49: inline static bool qr(Mat& Q, Mat& R, const Base& X); Chris@49: Chris@49: template Chris@49: inline static bool qr_econ(Mat& Q, Mat& R, const Base& X); Chris@49: Chris@49: Chris@49: // Chris@49: // svd Chris@49: Chris@49: template Chris@49: inline static bool svd(Col& S, const Base& X, uword& n_rows, uword& n_cols); Chris@49: Chris@49: template Chris@49: inline static bool svd(Col& S, const Base, T1>& X, uword& n_rows, uword& n_cols); Chris@49: Chris@49: template Chris@49: inline static bool svd(Col& S, const Base& X); Chris@49: Chris@49: template Chris@49: inline static bool svd(Col& S, const Base, T1>& X); Chris@49: Chris@49: template Chris@49: inline static bool svd(Mat& U, Col& S, Mat& V, const Base& X); Chris@49: Chris@49: template Chris@49: inline static bool svd(Mat< std::complex >& U, Col& S, Mat< std::complex >& V, const Base< std::complex, T1>& X); Chris@49: Chris@49: template Chris@49: inline static bool svd_econ(Mat& U, Col& S, Mat& V, const Base& X, const char mode); Chris@49: Chris@49: template Chris@49: inline static bool svd_econ(Mat< std::complex >& U, Col& S, Mat< std::complex >& V, const Base< std::complex, T1>& X, const char mode); Chris@49: Chris@49: template Chris@49: inline static bool svd_dc(Mat& U, Col& S, Mat& V, const Base& X); Chris@49: Chris@49: template Chris@49: inline static bool svd_dc(Mat< std::complex >& U, Col& S, Mat< std::complex >& V, const Base< std::complex, T1>& X); Chris@49: Chris@49: Chris@49: // Chris@49: // solve Chris@49: Chris@49: template Chris@49: inline static bool solve (Mat& out, Mat& A, const Base& X, const bool slow = false); Chris@49: Chris@49: template Chris@49: inline static bool solve_od(Mat& out, Mat& A, const Base& X); Chris@49: Chris@49: template Chris@49: inline static bool solve_ud(Mat& out, Mat& A, const Base& X); Chris@49: Chris@49: Chris@49: // Chris@49: // solve_tr Chris@49: Chris@49: template Chris@49: inline static bool solve_tr(Mat& out, const Mat& A, const Mat& B, const uword layout); Chris@49: Chris@49: Chris@49: // Chris@49: // Schur decomposition Chris@49: Chris@49: template Chris@49: inline static bool schur_dec(Mat& Z, Mat& T, const Mat& A); Chris@49: Chris@49: template Chris@49: inline static bool schur_dec(Mat >& Z, Mat >& T, const Mat >& A); Chris@49: Chris@49: Chris@49: // Chris@49: // syl (solution of the Sylvester equation AX + XB = C) Chris@49: Chris@49: template Chris@49: inline static bool syl(Mat& X, const Mat& A, const Mat& B, const Mat& C); Chris@49: Chris@49: Chris@49: // Chris@49: // lyap (solution of the continuous Lyapunov equation AX + XA^H + Q = 0) Chris@49: Chris@49: template Chris@49: inline static bool lyap(Mat& X, const Mat& A, const Mat& Q); Chris@49: Chris@49: Chris@49: // Chris@49: // dlyap (solution of the discrete Lyapunov equation AXA^H - X + Q = 0) Chris@49: Chris@49: template Chris@49: inline static bool dlyap(Mat& X, const Mat& A, const Mat& Q); Chris@49: }; Chris@49: Chris@49: Chris@49: //! @}