diff --git a/include/armadillo_bits/SpMat_meat.hpp b/include/armadillo_bits/SpMat_meat.hpp index 6551bc40..266f6d95 100644 --- a/include/armadillo_bits/SpMat_meat.hpp +++ b/include/armadillo_bits/SpMat_meat.hpp @@ -1806,7 +1806,7 @@ SpMat::SpMat(const SpGlue& X) arma_type_check(( is_same_type< eT, typename T1::elem_type >::no )); - spglue_type::apply(*this, X); + spglue_type::apply(static_cast< SpMat_noalias& >(*this), X); sync_csc(); // in case apply() used element accessors invalidate_cache(); // in case apply() modified the CSC representation diff --git a/include/armadillo_bits/spglue_minus_bones.hpp b/include/armadillo_bits/spglue_minus_bones.hpp index 0dec724c..27b7e2ea 100644 --- a/include/armadillo_bits/spglue_minus_bones.hpp +++ b/include/armadillo_bits/spglue_minus_bones.hpp @@ -27,6 +27,9 @@ struct spglue_minus template inline static void apply(SpMat& out, const SpGlue& X); + template + inline static void apply(SpMat_noalias& out, const SpGlue& X); + template inline static void apply_noalias(SpMat& result, const SpProxy& pa, const SpProxy& pb); diff --git a/include/armadillo_bits/spglue_minus_meat.hpp b/include/armadillo_bits/spglue_minus_meat.hpp index 6527137d..71c68c6d 100644 --- a/include/armadillo_bits/spglue_minus_meat.hpp +++ b/include/armadillo_bits/spglue_minus_meat.hpp @@ -51,6 +51,21 @@ spglue_minus::apply(SpMat& out, const SpGlue +inline +void +spglue_minus::apply(SpMat_noalias& out, const SpGlue& X) + { + arma_debug_sigprint(); + + const SpProxy pa(X.A); + const SpProxy pb(X.B); + + spglue_minus::apply_noalias(out, pa, pb); + } + + + template inline void diff --git a/include/armadillo_bits/spglue_plus_bones.hpp b/include/armadillo_bits/spglue_plus_bones.hpp index e9ca17be..55d39a7f 100644 --- a/include/armadillo_bits/spglue_plus_bones.hpp +++ b/include/armadillo_bits/spglue_plus_bones.hpp @@ -27,6 +27,9 @@ struct spglue_plus template inline static void apply(SpMat& out, const SpGlue& X); + template + inline static void apply(SpMat_noalias& out, const SpGlue& X); + template inline static void apply_noalias(SpMat& out, const SpProxy& pa, const SpProxy& pb); diff --git a/include/armadillo_bits/spglue_plus_meat.hpp b/include/armadillo_bits/spglue_plus_meat.hpp index 78021396..a594da44 100644 --- a/include/armadillo_bits/spglue_plus_meat.hpp +++ b/include/armadillo_bits/spglue_plus_meat.hpp @@ -51,6 +51,21 @@ spglue_plus::apply(SpMat& out, const SpGlue +inline +void +spglue_plus::apply(SpMat_noalias& out, const SpGlue& X) + { + arma_debug_sigprint(); + + const SpProxy pa(X.A); + const SpProxy pb(X.B); + + spglue_plus::apply_noalias(out, pa, pb); + } + + + template inline void diff --git a/include/armadillo_bits/spglue_schur_bones.hpp b/include/armadillo_bits/spglue_schur_bones.hpp index f32a5880..0f532f0e 100644 --- a/include/armadillo_bits/spglue_schur_bones.hpp +++ b/include/armadillo_bits/spglue_schur_bones.hpp @@ -27,6 +27,9 @@ struct spglue_schur template inline static void apply(SpMat& out, const SpGlue& X); + template + inline static void apply(SpMat_noalias& out, const SpGlue& X); + template inline static void apply_noalias(SpMat& out, const SpProxy& pa, const SpProxy& pb); diff --git a/include/armadillo_bits/spglue_schur_meat.hpp b/include/armadillo_bits/spglue_schur_meat.hpp index f9ad2725..29a24667 100644 --- a/include/armadillo_bits/spglue_schur_meat.hpp +++ b/include/armadillo_bits/spglue_schur_meat.hpp @@ -51,6 +51,21 @@ spglue_schur::apply(SpMat& out, const SpGlue +inline +void +spglue_schur::apply(SpMat_noalias& out, const SpGlue& X) + { + arma_debug_sigprint(); + + const SpProxy pa(X.A); + const SpProxy pb(X.B); + + spglue_schur::apply_noalias(out, pa, pb); + } + + + template inline void diff --git a/include/armadillo_bits/spglue_times_bones.hpp b/include/armadillo_bits/spglue_times_bones.hpp index e55b7855..c068026f 100644 --- a/include/armadillo_bits/spglue_times_bones.hpp +++ b/include/armadillo_bits/spglue_times_bones.hpp @@ -37,6 +37,12 @@ struct spglue_times template inline static void apply(SpMat& out, const SpGlue,T2,spglue_times>& X); + template + inline static void apply(SpMat_noalias& out, const SpGlue& X); + + template + inline static void apply(SpMat_noalias& out, const SpGlue,T2,spglue_times>& X); + template inline static void apply_noalias(SpMat& c, const SpMat& x, const SpMat& y); }; diff --git a/include/armadillo_bits/spglue_times_meat.hpp b/include/armadillo_bits/spglue_times_meat.hpp index 41ead933..7ef77e6c 100644 --- a/include/armadillo_bits/spglue_times_meat.hpp +++ b/include/armadillo_bits/spglue_times_meat.hpp @@ -83,6 +83,38 @@ spglue_times::apply(SpMat& out, const SpGlue +inline +void +spglue_times::apply(SpMat_noalias& out, const SpGlue& X) + { + arma_debug_sigprint(); + + const unwrap_spmat UA(X.A); + const unwrap_spmat UB(X.B); + + spglue_times::apply_noalias(out, UA.M, UB.M); + } + + + +template +inline +void +spglue_times::apply(SpMat_noalias& out, const SpGlue,T2,spglue_times>& X) + { + arma_debug_sigprint(); + + const unwrap_spmat UA(X.A.m); + const unwrap_spmat UB(X.B); + + spglue_times::apply_noalias(out, UA.M, UB.M); + + out *= X.A.aux; + } + + + template inline void