avoid unnecessary alias checks

This commit is contained in:
conrad
2025-10-10 13:09:07 +10:00
parent 0d53547bd7
commit 6b9b3ee8ca
9 changed files with 93 additions and 1 deletions
+1 -1
View File
@@ -1806,7 +1806,7 @@ SpMat<eT>::SpMat(const SpGlue<T1, T2, spglue_type>& 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<eT>& >(*this), X);
sync_csc(); // in case apply() used element accessors
invalidate_cache(); // in case apply() modified the CSC representation
@@ -27,6 +27,9 @@ struct spglue_minus
template<typename T1, typename T2>
inline static void apply(SpMat<typename T1::elem_type>& out, const SpGlue<T1,T2,spglue_minus>& X);
template<typename T1, typename T2>
inline static void apply(SpMat_noalias<typename T1::elem_type>& out, const SpGlue<T1,T2,spglue_minus>& X);
template<typename eT, typename T1, typename T2>
inline static void apply_noalias(SpMat<eT>& result, const SpProxy<T1>& pa, const SpProxy<T2>& pb);
@@ -51,6 +51,21 @@ spglue_minus::apply(SpMat<typename T1::elem_type>& out, const SpGlue<T1,T2,spglu
template<typename T1, typename T2>
inline
void
spglue_minus::apply(SpMat_noalias<typename T1::elem_type>& out, const SpGlue<T1,T2,spglue_minus>& X)
{
arma_debug_sigprint();
const SpProxy<T1> pa(X.A);
const SpProxy<T2> pb(X.B);
spglue_minus::apply_noalias(out, pa, pb);
}
template<typename eT, typename T1, typename T2>
inline
void
@@ -27,6 +27,9 @@ struct spglue_plus
template<typename T1, typename T2>
inline static void apply(SpMat<typename T1::elem_type>& out, const SpGlue<T1,T2,spglue_plus>& X);
template<typename T1, typename T2>
inline static void apply(SpMat_noalias<typename T1::elem_type>& out, const SpGlue<T1,T2,spglue_plus>& X);
template<typename eT, typename T1, typename T2>
inline static void apply_noalias(SpMat<eT>& out, const SpProxy<T1>& pa, const SpProxy<T2>& pb);
@@ -51,6 +51,21 @@ spglue_plus::apply(SpMat<typename T1::elem_type>& out, const SpGlue<T1,T2,spglue
template<typename T1, typename T2>
inline
void
spglue_plus::apply(SpMat_noalias<typename T1::elem_type>& out, const SpGlue<T1,T2,spglue_plus>& X)
{
arma_debug_sigprint();
const SpProxy<T1> pa(X.A);
const SpProxy<T2> pb(X.B);
spglue_plus::apply_noalias(out, pa, pb);
}
template<typename eT, typename T1, typename T2>
inline
void
@@ -27,6 +27,9 @@ struct spglue_schur
template<typename T1, typename T2>
inline static void apply(SpMat<typename T1::elem_type>& out, const SpGlue<T1,T2,spglue_schur>& X);
template<typename T1, typename T2>
inline static void apply(SpMat_noalias<typename T1::elem_type>& out, const SpGlue<T1,T2,spglue_schur>& X);
template<typename eT, typename T1, typename T2>
inline static void apply_noalias(SpMat<eT>& out, const SpProxy<T1>& pa, const SpProxy<T2>& pb);
@@ -51,6 +51,21 @@ spglue_schur::apply(SpMat<typename T1::elem_type>& out, const SpGlue<T1,T2,spglu
template<typename T1, typename T2>
inline
void
spglue_schur::apply(SpMat_noalias<typename T1::elem_type>& out, const SpGlue<T1,T2,spglue_schur>& X)
{
arma_debug_sigprint();
const SpProxy<T1> pa(X.A);
const SpProxy<T2> pb(X.B);
spglue_schur::apply_noalias(out, pa, pb);
}
template<typename eT, typename T1, typename T2>
inline
void
@@ -37,6 +37,12 @@ struct spglue_times
template<typename T1, typename T2>
inline static void apply(SpMat<typename T1::elem_type>& out, const SpGlue<SpOp<T1,spop_scalar_times>,T2,spglue_times>& X);
template<typename T1, typename T2>
inline static void apply(SpMat_noalias<typename T1::elem_type>& out, const SpGlue<T1,T2,spglue_times>& X);
template<typename T1, typename T2>
inline static void apply(SpMat_noalias<typename T1::elem_type>& out, const SpGlue<SpOp<T1,spop_scalar_times>,T2,spglue_times>& X);
template<typename eT>
inline static void apply_noalias(SpMat<eT>& c, const SpMat<eT>& x, const SpMat<eT>& y);
};
@@ -83,6 +83,38 @@ spglue_times::apply(SpMat<typename T1::elem_type>& out, const SpGlue<SpOp<T1,spo
template<typename T1, typename T2>
inline
void
spglue_times::apply(SpMat_noalias<typename T1::elem_type>& out, const SpGlue<T1,T2,spglue_times>& X)
{
arma_debug_sigprint();
const unwrap_spmat<T1> UA(X.A);
const unwrap_spmat<T2> UB(X.B);
spglue_times::apply_noalias(out, UA.M, UB.M);
}
template<typename T1, typename T2>
inline
void
spglue_times::apply(SpMat_noalias<typename T1::elem_type>& out, const SpGlue<SpOp<T1,spop_scalar_times>,T2,spglue_times>& X)
{
arma_debug_sigprint();
const unwrap_spmat<T1> UA(X.A.m);
const unwrap_spmat<T2> UB(X.B);
spglue_times::apply_noalias(out, UA.M, UB.M);
out *= X.A.aux;
}
template<typename eT>
inline
void