more efficient handling of aliasing

This commit is contained in:
conrad
2026-07-02 22:34:59 +10:00
parent fe2930b966
commit c7ffb88d54
4 changed files with 77 additions and 0 deletions
@@ -27,6 +27,9 @@ struct op_diagmat
template<typename T1>
inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1,op_diagmat>& X);
template<typename T1>
inline static void apply(Mat_noalias<typename T1::elem_type>& out, const Op<T1,op_diagmat>& X);
template<typename T1>
inline static void apply(Mat<typename T1::elem_type>& out, const Proxy<T1>& P);
@@ -48,6 +51,9 @@ struct op_diagmat2
template<typename T1>
inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1,op_diagmat2>& X);
template<typename T1>
inline static void apply(Mat_noalias<typename T1::elem_type>& out, const Op<T1,op_diagmat2>& X);
template<typename T1>
inline static void apply(Mat<typename T1::elem_type>& out, const Proxy<T1>& P, const uword row_offset, const uword col_offset);
};
@@ -104,6 +104,20 @@ op_diagmat::apply(Mat<typename T1::elem_type>& out, const Op<T1, op_diagmat>& X)
template<typename T1>
inline
void
op_diagmat::apply(Mat_noalias<typename T1::elem_type>& out, const Op<T1, op_diagmat>& X)
{
arma_debug_sigprint();
const Proxy<T1> P(X.m);
op_diagmat::apply(out, P);
}
template<typename T1>
inline
void
@@ -701,6 +715,23 @@ op_diagmat2::apply(Mat<typename T1::elem_type>& out, const Op<T1, op_diagmat2>&
template<typename T1>
inline
void
op_diagmat2::apply(Mat_noalias<typename T1::elem_type>& out, const Op<T1, op_diagmat2>& X)
{
arma_debug_sigprint();
const uword row_offset = X.aux_uword_a;
const uword col_offset = X.aux_uword_b;
const Proxy<T1> P(X.m);
op_diagmat2::apply(out, P, row_offset, col_offset);
}
template<typename T1>
inline
void
@@ -27,6 +27,9 @@ struct op_diagvec
template<typename T1>
inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1,op_diagvec>& X);
template<typename T1>
inline static void apply(Mat_noalias<typename T1::elem_type>& out, const Op<T1,op_diagvec>& X);
template<typename T1>
inline static void apply_proxy(Mat<typename T1::elem_type>& out, const Proxy<T1>& P);
@@ -45,6 +48,9 @@ struct op_diagvec2
template<typename T1>
inline static void apply(Mat<typename T1::elem_type>& out, const Op<T1,op_diagvec2>& X);
template<typename T1>
inline static void apply(Mat_noalias<typename T1::elem_type>& out, const Op<T1,op_diagvec2>& X);
template<typename T1>
inline static void apply_proxy(Mat<typename T1::elem_type>& out, const Proxy<T1>& P, const uword row_offset, const uword col_offset);
};
@@ -48,6 +48,20 @@ op_diagvec::apply(Mat<typename T1::elem_type>& out, const Op<T1, op_diagvec>& X)
template<typename T1>
inline
void
op_diagvec::apply(Mat_noalias<typename T1::elem_type>& out, const Op<T1, op_diagvec>& X)
{
arma_debug_sigprint();
const Proxy<T1> P(X.m);
op_diagvec::apply_proxy(out, P);
}
template<typename T1>
inline
void
@@ -491,6 +505,26 @@ op_diagvec2::apply(Mat<typename T1::elem_type>& out, const Op<T1, op_diagvec2>&
template<typename T1>
inline
void
op_diagvec2::apply(Mat_noalias<typename T1::elem_type>& out, const Op<T1, op_diagvec2>& X)
{
arma_debug_sigprint();
const uword a = X.aux_uword_a;
const uword b = X.aux_uword_b;
const uword row_offset = (b > 0) ? a : 0;
const uword col_offset = (b == 0) ? a : 0;
const Proxy<T1> P(X.m);
op_diagvec2::apply_proxy(out, P, row_offset, col_offset);
}
template<typename T1>
inline
void