diff --git a/include/armadillo_bits/arma_config.hpp b/include/armadillo_bits/arma_config.hpp index 0b534e04..a9eee6b6 100644 --- a/include/armadillo_bits/arma_config.hpp +++ b/include/armadillo_bits/arma_config.hpp @@ -44,6 +44,20 @@ struct arma_config #endif + #if defined(ARMA_OPTIMISE_BAND) + static constexpr bool optimise_band = true; + #else + static constexpr bool optimise_band = false; + #endif + + + #if defined(ARMA_OPTIMISE_SYMPD) + static constexpr bool optimise_sympd = true; + #else + static constexpr bool optimise_sympd = false; + #endif + + #if defined(ARMA_OPTIMISE_INVEXPR) static constexpr bool optimise_invexpr = true; #else diff --git a/include/armadillo_bits/glue_solve_meat.hpp b/include/armadillo_bits/glue_solve_meat.hpp index 83fcc2d2..95f2f01a 100644 --- a/include/armadillo_bits/glue_solve_meat.hpp +++ b/include/armadillo_bits/glue_solve_meat.hpp @@ -143,20 +143,12 @@ glue_solve_gen_full::apply(Mat& out, const Base& A_expr, const Base& out, const Base& X) return auxlib::rcond_trimat(A, layout); } - #if defined(ARMA_OPTIMISE_SYMPD) - const bool try_sympd = auxlib::crippled_lapack(A) ? false : sympd_helper::guess_sympd(A); - #else - const bool try_sympd = false; - #endif + const bool try_sympd = arma_config::optimise_sympd && (auxlib::crippled_lapack(A) ? false : sympd_helper::guess_sympd(A)); if(try_sympd) { diff --git a/include/armadillo_bits/op_expmat_meat.hpp b/include/armadillo_bits/op_expmat_meat.hpp index 38b84a52..0451f3da 100644 --- a/include/armadillo_bits/op_expmat_meat.hpp +++ b/include/armadillo_bits/op_expmat_meat.hpp @@ -86,11 +86,7 @@ op_expmat::apply_direct(Mat& out, const Base& out, const Base& out, typename T1::po return auxlib::inv_tr_rcond(out, out_rcond, ((is_triu_expr || is_triu_mat) ? uword(0) : uword(1))); } - #if defined(ARMA_OPTIMISE_SYMPD) - const bool try_sympd = (auxlib::crippled_lapack(out)) ? false : sympd_helper::guess_sympd(out); - #else - const bool try_sympd = false; - #endif + const bool try_sympd = arma_config::optimise_sympd && ((auxlib::crippled_lapack(out)) ? false : sympd_helper::guess_sympd(out)); if(try_sympd) { diff --git a/include/armadillo_bits/op_log_det_meat.hpp b/include/armadillo_bits/op_log_det_meat.hpp index 35c045bc..ac6cecb9 100644 --- a/include/armadillo_bits/op_log_det_meat.hpp +++ b/include/armadillo_bits/op_log_det_meat.hpp @@ -56,11 +56,7 @@ op_log_det::apply_direct(typename T1::elem_type& out_val, typename T1::pod_type& if(is_triu || is_tril) { return op_log_det::apply_trimat(out_val, out_sign, A); } - // #if defined(ARMA_OPTIMISE_SYMPD) - // const bool try_sympd = sympd_helper::guess_sympd(A); - // #else - // const bool try_sympd = false; - // #endif + // const bool try_sympd = arma_config::optimise_sympd && sympd_helper::guess_sympd(A); // // if(try_sympd) // { diff --git a/include/armadillo_bits/op_logmat_meat.hpp b/include/armadillo_bits/op_logmat_meat.hpp index 3b66d9e8..da2edd2d 100644 --- a/include/armadillo_bits/op_logmat_meat.hpp +++ b/include/armadillo_bits/op_logmat_meat.hpp @@ -134,11 +134,7 @@ op_logmat::apply_direct(Mat< std::complex >& out, const return true; } - #if defined(ARMA_OPTIMISE_SYMPD) - const bool try_sympd = sympd_helper::guess_sympd(A); - #else - const bool try_sympd = false; - #endif + const bool try_sympd = arma_config::optimise_sympd && sympd_helper::guess_sympd(A); if(try_sympd) { @@ -307,11 +303,7 @@ op_logmat_cx::apply_direct(Mat& out, const Base& out, const Base (is_cx::yes ? uword(20) : uword(40))); + const bool is_arg_default = ((tol == T(0)) && (method_id == uword(0))); + + if( (arma_config::optimise_sympd) && (auxlib::crippled_lapack(A) == false) && (is_arg_default || is_sym_size_ok) ) + { + bool is_approx_sym = false; + bool is_approx_sympd = false; - const bool is_sym_size_ok = (n_rows > (is_cx::yes ? uword(20) : uword(40))); - const bool is_arg_default = ((tol == T(0)) && (method_id == uword(0))); + sympd_helper::analyse_matrix(is_approx_sym, is_approx_sympd, A); - if( (auxlib::crippled_lapack(A) == false) && (is_arg_default || is_sym_size_ok) ) - { - bool is_approx_sym = false; - bool is_approx_sympd = false; - - sympd_helper::analyse_matrix(is_approx_sym, is_approx_sympd, A); - - do_sym = is_sym_size_ok && ((is_cx::no) ? (is_approx_sym) : (is_approx_sym && is_approx_sympd)); - do_sympd = is_arg_default && is_approx_sympd; - } - #else - const bool do_sym = false; - const bool do_sympd = false; - #endif + do_sym = is_sym_size_ok && ((is_cx::no) ? (is_approx_sym) : (is_approx_sym && is_approx_sympd)); + do_sympd = is_arg_default && is_approx_sympd; + } if(do_sympd) { diff --git a/include/armadillo_bits/op_powmat_meat.hpp b/include/armadillo_bits/op_powmat_meat.hpp index db2c1c6d..a2190176 100644 --- a/include/armadillo_bits/op_powmat_meat.hpp +++ b/include/armadillo_bits/op_powmat_meat.hpp @@ -207,11 +207,7 @@ op_powmat_cx::apply_direct(Mat< std::complex >& out, cons return true; } - #if defined(ARMA_OPTIMISE_SYMPD) - const bool try_sympd = sympd_helper::guess_sympd(A); - #else - const bool try_sympd = false; - #endif + const bool try_sympd = arma_config::optimise_sympd && sympd_helper::guess_sympd(A); if(try_sympd) { diff --git a/include/armadillo_bits/op_rank_meat.hpp b/include/armadillo_bits/op_rank_meat.hpp index 3401c773..2116d009 100644 --- a/include/armadillo_bits/op_rank_meat.hpp +++ b/include/armadillo_bits/op_rank_meat.hpp @@ -42,21 +42,17 @@ op_rank::apply(uword& out, const Base& expr, const ty return op_rank::apply_diag(out, A, tol); } - #if defined(ARMA_OPTIMISE_SYMPD) - bool do_sym = false; + bool do_sym = false; + + if((arma_config::optimise_sympd) && (auxlib::crippled_lapack(A) == false) && (A.n_rows >= (is_cx::yes ? uword(64) : uword(128)))) + { + bool is_approx_sym = false; + bool is_approx_sympd = false; - if((auxlib::crippled_lapack(A) == false) && (A.n_rows >= (is_cx::yes ? uword(64) : uword(128)))) - { - bool is_approx_sym = false; - bool is_approx_sympd = false; - - sympd_helper::analyse_matrix(is_approx_sym, is_approx_sympd, A); - - do_sym = (is_cx::no) ? (is_approx_sym) : (is_approx_sym && is_approx_sympd); - } - #else - const bool do_sym = false; - #endif + sympd_helper::analyse_matrix(is_approx_sym, is_approx_sympd, A); + + do_sym = (is_cx::no) ? (is_approx_sym) : (is_approx_sym && is_approx_sympd); + } if(do_sym) { diff --git a/include/armadillo_bits/op_sqrtmat_meat.hpp b/include/armadillo_bits/op_sqrtmat_meat.hpp index 8ab62aff..465851b5 100644 --- a/include/armadillo_bits/op_sqrtmat_meat.hpp +++ b/include/armadillo_bits/op_sqrtmat_meat.hpp @@ -139,11 +139,7 @@ op_sqrtmat::apply_direct(Mat< std::complex >& out, const return true; } - #if defined(ARMA_OPTIMISE_SYMPD) - const bool try_sympd = sympd_helper::guess_sympd(A); - #else - const bool try_sympd = false; - #endif + const bool try_sympd = arma_config::optimise_sympd && sympd_helper::guess_sympd(A); if(try_sympd) { @@ -340,11 +336,7 @@ op_sqrtmat_cx::apply_direct(Mat& out, const Base