more efficient handling of aliasing

This commit is contained in:
conrad
2026-06-29 23:12:20 +10:00
parent 1441e9f1a0
commit c6f4af01d8
2 changed files with 33 additions and 1 deletions
@@ -26,6 +26,9 @@ struct spop_diagmat
template<typename T1>
inline static void apply(SpMat<typename T1::elem_type>& out, const SpOp<T1, spop_diagmat>& in);
template<typename T1>
inline static void apply(SpMat_noalias<typename T1::elem_type>& out, const SpOp<T1, spop_diagmat>& in);
template<typename T1>
inline static void apply_noalias(SpMat<typename T1::elem_type>& out, const SpBase<typename T1::elem_type, T1>& expr);
@@ -40,7 +43,6 @@ struct spop_diagmat
template<typename T1, typename T2>
inline static void apply_noalias(SpMat<typename T1::elem_type>& out, const SpGlue<T1,T2,spglue_times>& expr);
};
@@ -51,6 +53,9 @@ struct spop_diagmat2
template<typename T1>
inline static void apply(SpMat<typename T1::elem_type>& out, const SpOp<T1, spop_diagmat2>& in);
template<typename T1>
inline static void apply(SpMat_noalias<typename T1::elem_type>& out, const SpOp<T1, spop_diagmat2>& in);
template<typename eT>
inline static void apply_noalias(SpMat<eT>& out, const SpMat<eT>& X, const uword row_offset, const uword col_offset);
};
@@ -46,6 +46,18 @@ spop_diagmat::apply(SpMat<typename T1::elem_type>& out, const SpOp<T1, spop_diag
template<typename T1>
inline
void
spop_diagmat::apply(SpMat_noalias<typename T1::elem_type>& out, const SpOp<T1, spop_diagmat>& in)
{
arma_debug_sigprint();
spop_diagmat::apply_noalias(out, in.m);
}
template<typename T1>
inline
void
@@ -374,6 +386,21 @@ spop_diagmat2::apply(SpMat<typename T1::elem_type>& out, const SpOp<T1, spop_dia
template<typename T1>
inline
void
spop_diagmat2::apply(SpMat_noalias<typename T1::elem_type>& out, const SpOp<T1, spop_diagmat2>& in)
{
arma_debug_sigprint();
const uword row_offset = in.aux_uword_a;
const uword col_offset = in.aux_uword_b;
spop_diagmat2::apply_noalias(out, in.m, row_offset, col_offset);
}
template<typename eT>
inline
void