avoid unnecessary alias checks
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user