From 250cad9a8d8a6ea8d32e970433f69700da7a01cf Mon Sep 17 00:00:00 2001 From: conrad Date: Wed, 9 Feb 2022 00:10:38 +1000 Subject: [PATCH] speed up compilation for default settings --- include/armadillo_bits/fn_solve.hpp | 46 +++++++++++++++- include/armadillo_bits/glue_solve_bones.hpp | 21 +++++++- include/armadillo_bits/glue_solve_meat.hpp | 59 +++++++++++++++++---- 3 files changed, 112 insertions(+), 14 deletions(-) diff --git a/include/armadillo_bits/fn_solve.hpp b/include/armadillo_bits/fn_solve.hpp index 43d9bd0c..82c96f4a 100644 --- a/include/armadillo_bits/fn_solve.hpp +++ b/include/armadillo_bits/fn_solve.hpp @@ -25,6 +25,48 @@ // solve_gen +template +arma_warn_unused +inline +typename enable_if2< is_supported_blas_type::value, const Glue >::result +solve + ( + const Base& A, + const Base& B + ) + { + arma_extra_debug_sigprint(); + + return Glue(A.get_ref(), B.get_ref()); + } + + + +template +inline +typename enable_if2< is_supported_blas_type::value, bool >::result +solve + ( + Mat& out, + const Base& A, + const Base& B + ) + { + arma_extra_debug_sigprint(); + + const bool status = glue_solve_gen_default::apply(out, A.get_ref(), B.get_ref()); + + if(status == false) + { + out.soft_reset(); + arma_debug_warn_level(3, "solve(): solution not found"); + } + + return status; + } + + + template arma_warn_unused inline @@ -33,7 +75,7 @@ solve ( const Base& A, const Base& B, - const solve_opts::opts& opts = solve_opts::none + const solve_opts::opts& opts ) { arma_extra_debug_sigprint(); @@ -51,7 +93,7 @@ solve Mat& out, const Base& A, const Base& B, - const solve_opts::opts& opts = solve_opts::none + const solve_opts::opts& opts ) { arma_extra_debug_sigprint(); diff --git a/include/armadillo_bits/glue_solve_bones.hpp b/include/armadillo_bits/glue_solve_bones.hpp index b3031e6d..cd1f8f7f 100644 --- a/include/armadillo_bits/glue_solve_bones.hpp +++ b/include/armadillo_bits/glue_solve_bones.hpp @@ -22,6 +22,25 @@ +class glue_solve_gen_default + { + public: + + template + struct traits + { + static constexpr bool is_row = false; + static constexpr bool is_col = T2::is_col; + static constexpr bool is_xvec = false; + }; + + template inline static void apply(Mat& out, const Glue& X); + + template inline static bool apply(Mat& out, const Base& A_expr, const Base& B_expr); + }; + + + class glue_solve_gen { public: @@ -36,7 +55,7 @@ class glue_solve_gen template inline static void apply(Mat& out, const Glue& X); - template inline static bool apply(Mat& out, const Base& A_expr, const Base& B_expr, const uword flags); + template inline static bool apply(Mat& out, const Base& A_expr, const Base& B_expr, const uword flags); }; diff --git a/include/armadillo_bits/glue_solve_meat.hpp b/include/armadillo_bits/glue_solve_meat.hpp index 0dbf41a9..a80d8c2b 100644 --- a/include/armadillo_bits/glue_solve_meat.hpp +++ b/include/armadillo_bits/glue_solve_meat.hpp @@ -21,6 +21,40 @@ +// +// glue_solve_gen_default + + +template +inline +void +glue_solve_gen_default::apply(Mat& out, const Glue& X) + { + arma_extra_debug_sigprint(); + + const bool status = glue_solve_gen_default::apply(out, X.A, X.B); + + if(status == false) + { + out.soft_reset(); + arma_stop_runtime_error("solve(): solution not found"); + } + } + + + +template +inline +bool +glue_solve_gen_default::apply(Mat& out, const Base& A_expr, const Base& B_expr) + { + arma_extra_debug_sigprint(); + + return glue_solve_gen::apply( out, A_expr, B_expr, uword(0)); + } + + + // // glue_solve_gen @@ -43,7 +77,7 @@ glue_solve_gen::apply(Mat& out, const Glue +template inline bool glue_solve_gen::apply(Mat& out, const Base& A_expr, const Base& B_expr, const uword flags) @@ -52,16 +86,19 @@ glue_solve_gen::apply(Mat& out, const Base& A_expr, const Base typedef typename get_pod_type::result T; - const bool fast = bool(flags & solve_opts::flag_fast ); - const bool equilibrate = bool(flags & solve_opts::flag_equilibrate ); - const bool no_approx = bool(flags & solve_opts::flag_no_approx ); - const bool no_band = bool(flags & solve_opts::flag_no_band ); - const bool no_sympd = bool(flags & solve_opts::flag_no_sympd ); - const bool allow_ugly = bool(flags & solve_opts::flag_allow_ugly ); - const bool likely_sympd = bool(flags & solve_opts::flag_likely_sympd); - const bool refine = bool(flags & solve_opts::flag_refine ); - const bool no_trimat = bool(flags & solve_opts::flag_no_trimat ); - const bool force_approx = bool(flags & solve_opts::flag_force_approx); + if(has_user_flags == true ) { arma_extra_debug_print("glue_solve_gen::apply(): has_user_flags == true"); } + if(has_user_flags == false) { arma_extra_debug_print("glue_solve_gen::apply(): has_user_flags == false"); } + + const bool fast = has_user_flags && bool(flags & solve_opts::flag_fast ); + const bool equilibrate = has_user_flags && bool(flags & solve_opts::flag_equilibrate ); + const bool no_approx = has_user_flags && bool(flags & solve_opts::flag_no_approx ); + const bool no_band = has_user_flags && bool(flags & solve_opts::flag_no_band ); + const bool no_sympd = has_user_flags && bool(flags & solve_opts::flag_no_sympd ); + const bool allow_ugly = has_user_flags && bool(flags & solve_opts::flag_allow_ugly ); + const bool likely_sympd = has_user_flags && bool(flags & solve_opts::flag_likely_sympd); + const bool refine = has_user_flags && bool(flags & solve_opts::flag_refine ); + const bool no_trimat = has_user_flags && bool(flags & solve_opts::flag_no_trimat ); + const bool force_approx = has_user_flags && bool(flags & solve_opts::flag_force_approx); arma_extra_debug_print("glue_solve_gen::apply(): enabled flags:");