35 #ifndef _BLAZE_MATH_EXPRESSIONS_DMATNORMEXPR_H_ 36 #define _BLAZE_MATH_EXPRESSIONS_DMATNORMEXPR_H_ 100 struct DMatNormHelper
104 using ET = ElementType_t<MT>;
107 using CT = RemoveReference_t< CompositeType_t<MT> >;
111 static constexpr
bool value =
112 ( useOptimizedKernels &&
114 If_t< HasSIMDEnabled_v<Abs> && HasSIMDEnabled_v<Power>
115 , And_t< GetSIMDEnabled<Abs,ET>, GetSIMDEnabled<Power,ET> >
116 , And_t< HasLoad<Abs>, HasLoad<Power> > >::value &&
117 HasSIMDAdd_v< ElementType_t<CT>, ElementType_t<CT> > );
147 template<
typename MT
151 inline decltype(
auto) norm_backend( const DenseMatrix<MT,false>& dm, Abs
abs, Power power, Root root,
FalseType )
153 using CT = CompositeType_t<MT>;
154 using ET = ElementType_t<MT>;
155 using RT = decltype(
evaluate( root( std::declval<ET>() ) ) );
157 if( (~dm).
rows() == 0UL || (~dm).
columns() == 0UL )
return RT();
161 const size_t M( tmp.rows() );
162 const size_t N( tmp.columns() );
164 ET
norm( power(
abs( tmp(0UL,0UL) ) ) );
169 for( ; (j+4UL) <= N; j+=4UL ) {
170 norm += power(
abs( tmp(0UL,j ) ) ) + power(
abs( tmp(0UL,j+1UL) ) ) +
171 power(
abs( tmp(0UL,j+2UL) ) ) + power(
abs( tmp(0UL,j+3UL) ) );
173 for( ; (j+2UL) <= N; j+=2UL ) {
174 norm += power(
abs( tmp(0UL,j) ) ) + power(
abs( tmp(0UL,j+1UL) ) );
177 norm += power(
abs( tmp(0UL,j) ) );
181 for(
size_t i=1UL; i<M; ++i )
185 for( ; (j+4UL) <= N; j+=4UL ) {
186 norm += power(
abs( tmp(i,j ) ) ) + power(
abs( tmp(i,j+1UL) ) ) +
187 power(
abs( tmp(i,j+2UL) ) ) + power(
abs( tmp(i,j+3UL) ) );
189 for( ; (j+2UL) <= N; j+=2UL ) {
190 norm += power(
abs( tmp(i,j) ) ) + power(
abs( tmp(i,j+1UL) ) );
193 norm += power(
abs( tmp(i,j) ) );
218 template<
typename MT
222 inline decltype(
auto) norm_backend( const DenseMatrix<MT,true>& dm, Abs
abs, Power power, Root root,
FalseType )
224 using CT = CompositeType_t<MT>;
225 using ET = ElementType_t<MT>;
226 using RT = decltype(
evaluate( root( std::declval<ET>() ) ) );
228 if( (~dm).
rows() == 0UL || (~dm).
columns() == 0UL )
return RT();
232 const size_t M( tmp.rows() );
233 const size_t N( tmp.columns() );
235 ET
norm( power(
abs( tmp(0UL,0UL) ) ) );
240 for( ; (i+4UL) <= M; i+=4UL ) {
241 norm += power(
abs( tmp(i ,0UL) ) ) + power(
abs( tmp(i+1UL,0UL) ) ) +
242 power(
abs( tmp(i+2UL,0UL) ) ) + power(
abs( tmp(i+3UL,0UL) ) );
244 for( ; (i+2UL) <= M; i+=2UL ) {
245 norm += power(
abs( tmp(i,0UL) ) ) + power(
abs( tmp(i+1UL,0UL) ) );
248 norm += power(
abs( tmp(i,0UL) ) );
252 for(
size_t j=1UL; j<N; ++j )
256 for( ; (i+4UL) <= M; i+=4UL ) {
257 norm += power(
abs( tmp(i ,j) ) ) + power(
abs( tmp(i+1UL,j) ) ) +
258 power(
abs( tmp(i+2UL,j) ) ) + power(
abs( tmp(i+3UL,j) ) );
260 for( ; (i+2UL) <= M; i+=2UL ) {
261 norm += power(
abs( tmp(i,j) ) ) + power(
abs( tmp(i+1UL,j) ) );
264 norm += power(
abs( tmp(i,j) ) );
289 template<
typename MT
293 inline decltype(
auto) norm_backend( const DenseMatrix<MT,false>& dm, Abs
abs, Power power, Root root,
TrueType )
295 using CT = CompositeType_t<MT>;
296 using ET = ElementType_t<MT>;
297 using RT = decltype(
evaluate( root( std::declval<ET>() ) ) );
301 if( (~dm).
rows() == 0UL || (~dm).
columns() == 0UL )
return RT();
305 const size_t M( tmp.rows() );
306 const size_t N( tmp.columns() );
308 constexpr
bool remainder( !usePadding || !
IsPadded_v< RemoveReference_t<CT> > );
310 const size_t jpos( ( remainder )?( N &
size_t(-SIMDSIZE) ):( N ) );
313 SIMDTrait_t<ET> xmm1, xmm2, xmm3, xmm4;
316 for(
size_t i=0UL; i<M; ++i )
320 for( ; (j+SIMDSIZE*3UL) < jpos; j+=SIMDSIZE*4UL ) {
321 xmm1 += power(
abs( tmp.load(i,j ) ) );
322 xmm2 += power(
abs( tmp.load(i,j+SIMDSIZE ) ) );
323 xmm3 += power(
abs( tmp.load(i,j+SIMDSIZE*2UL) ) );
324 xmm4 += power(
abs( tmp.load(i,j+SIMDSIZE*3UL) ) );
326 for( ; (j+SIMDSIZE) < jpos; j+=SIMDSIZE*2UL ) {
327 xmm1 += power(
abs( tmp.load(i,j ) ) );
328 xmm2 += power(
abs( tmp.load(i,j+SIMDSIZE) ) );
330 for( ; j<jpos; j+=SIMDSIZE ) {
331 xmm1 += power(
abs( tmp.load(i,j) ) );
333 for( ; remainder && j<N; ++j ) {
334 norm += power(
abs( tmp(i,j) ) );
338 norm +=
sum( xmm1 + xmm2 + xmm3 + xmm4 );
361 template<
typename MT
365 inline decltype(
auto) norm_backend( const DenseMatrix<MT,true>& dm, Abs
abs, Power power, Root root,
TrueType )
367 using CT = CompositeType_t<MT>;
368 using ET = ElementType_t<MT>;
369 using RT = decltype(
evaluate( root( std::declval<ET>() ) ) );
373 if( (~dm).
rows() == 0UL || (~dm).
columns() == 0UL )
return RT();
377 const size_t M( tmp.rows() );
378 const size_t N( tmp.columns() );
380 constexpr
bool remainder( !usePadding || !
IsPadded_v< RemoveReference_t<CT> > );
382 const size_t ipos( ( remainder )?( M &
size_t(-SIMDSIZE) ):( M ) );
385 SIMDTrait_t<ET> xmm1, xmm2, xmm3, xmm4;
388 for(
size_t j=0UL; j<N; ++j )
392 for( ; (i+SIMDSIZE*3UL) < ipos; i+=SIMDSIZE*4UL ) {
393 xmm1 += power(
abs( tmp.load(i ,j) ) );
394 xmm2 += power(
abs( tmp.load(i+SIMDSIZE ,j) ) );
395 xmm3 += power(
abs( tmp.load(i+SIMDSIZE*2UL,j) ) );
396 xmm4 += power(
abs( tmp.load(i+SIMDSIZE*3UL,j) ) );
398 for( ; (i+SIMDSIZE) < ipos; i+=SIMDSIZE*2UL ) {
399 xmm1 += power(
abs( tmp.load(i ,j) ) );
400 xmm2 += power(
abs( tmp.load(i+SIMDSIZE,j) ) );
402 for( ; i<ipos; i+=SIMDSIZE ) {
403 xmm1 += power(
abs( tmp.load(i,j) ) );
405 for( ; remainder && i<M; ++i ) {
406 norm += power(
abs( tmp(i,j) ) );
410 norm +=
sum( xmm1 + xmm2 + xmm3 + xmm4 );
439 template<
typename MT
444 decltype(
auto) norm_backend( const DenseMatrix<MT,SO>& dm, Abs
abs, Power power, Root root )
446 return norm_backend( ~dm,
abs, power, root,
Bool_t< DMatNormHelper<MT,Abs,Power>::value >() );
467 template<
typename MT
493 template<
typename MT
519 template<
typename MT
545 template<
typename MT
571 template<
typename MT
597 template<
typename MT
628 template<
typename MT
639 return norm_backend( ~dm,
Abs(), UnaryPow(
Pow(), p ), UnaryPow(
Pow(),
inv( p ) ) );
671 using Norm =
typename TypeAt< Norms,
min( P-1UL, 4UL ) >::Type;
673 return Norm()( ~dm );
693 template<
typename MT
719 template<
typename MT
Header file for the Pow functor.
decltype(auto) sqrNorm(const DenseMatrix< MT, SO > &dm)
Computes the squared L2 norm for the given dense matrix.
Definition: DMatNormExpr.h:495
BoolConstant< false > FalseType
Type/value traits base class.The FalseType class is used as base class for type traits and value trai...
Definition: IntegralConstant.h:121
Header file for the Sqrt functor.
Header file for auxiliary alias declarations.
#define BLAZE_USER_ASSERT(expr, msg)
Run time assertion macro for user checks.In case of an invalid run time expression,...
Definition: Assert.h:117
Generic wrapper for the cbrt() function.
Definition: Cbrt.h:81
Generic wrapper for the squared abs() function.
Definition: SqrAbs.h:85
Header file for the HasLoad type trait.
Header file for basic type definitions.
decltype(auto) l3Norm(const DenseMatrix< MT, SO > &dm)
Computes the L3 norm for the given dense matrix.
Definition: DMatNormExpr.h:573
Header file for the Pow2 functor.
decltype(auto) l2Norm(const DenseMatrix< MT, SO > &dm)
Computes the L2 norm for the given dense matrix.
Definition: DMatNormExpr.h:547
decltype(auto) l4Norm(const DenseMatrix< MT, SO > &dm)
Computes the L4 norm for the given dense matrix.
Definition: DMatNormExpr.h:599
Header file for the isZero shim.
Header file for the Bind2nd functor.
Header file for the And_t alias template.
decltype(auto) lpNorm(const DenseMatrix< MT, SO > &dm, ST p)
Computes the Lp norm for the given dense matrix.
Definition: DMatNormExpr.h:631
Header file for the invert shim.
Generic wrapper for the qdrt() function.
Definition: Qdrt.h:82
BoolConstant< true > TrueType
Type traits base class.The TrueType class is used as base class for type traits and value traits that...
Definition: IntegralConstant.h:132
System settings for performance optimizations.
#define BLAZE_STATIC_ASSERT_MSG(expr, msg)
Compile time assertion macro.In case of an invalid compile time expression, a compilation error is cr...
Definition: StaticAssert.h:123
const MT::ResultType evaluate(const Matrix< MT, SO > &matrix)
Evaluates the given matrix expression.
Definition: Matrix.h:912
constexpr size_t columns(const Matrix< MT, SO > &matrix) noexcept
Returns the current number of columns of the matrix.
Definition: Matrix.h:514
Header file for the Cbrt functor.
Header file for the LpNorm functor.
Base class for dense matrices.The DenseMatrix class is a base class for all dense matrix classes....
Definition: DenseMatrix.h:81
bool isZero(const DiagonalProxy< MT > &proxy)
Returns whether the represented element is 0.
Definition: DiagonalProxy.h:677
Generic wrapper for the abs() function.
Definition: Abs.h:83
Generic wrapper for the sqrt() function.
Definition: Sqrt.h:83
Header file for the multiplication trait.
Namespace of the Blaze C++ math library.
Definition: Blaze.h:58
Header file for the L4Norm functor.
Header file for the If class template.
Header file for the SqrAbs functor.
Header file for the UnderlyingBuiltin type trait.
decltype(auto) l1Norm(const DenseMatrix< MT, SO > &dm)
Computes the L1 norm for the given dense matrix.
Definition: DMatNormExpr.h:521
decltype(auto) min(const DenseMatrix< MT1, SO1 > &lhs, const DenseMatrix< MT2, SO2 > &rhs)
Computes the componentwise minimum of the dense matrices lhs and rhs.
Definition: DMatDMatMapExpr.h:1162
decltype(auto) sum(const DenseMatrix< MT, SO > &dm)
Reduces the given dense matrix by means of addition.
Definition: DMatReduceExpr.h:2147
Header file for the HasSIMDAdd type trait.
Header file for the DenseMatrix base class.
decltype(auto) inv(const DenseMatrix< MT, SO > &dm)
Calculation of the inverse of the given dense matrix.
Definition: DMatInvExpr.h:423
Header file for all SIMD functionality.
Header file for the L2Norm functor.
Implementation of a type list.The TypeList class template represents a list of data types of arbitrar...
Definition: TypeList.h:119
Generic wrapper for the null function.
Definition: Noop.h:60
decltype(auto) max(const DenseMatrix< MT1, SO1 > &lhs, const DenseMatrix< MT2, SO2 > &rhs)
Computes the componentwise maximum of the dense matrices lhs and rhs.
Definition: DMatDMatMapExpr.h:1198
IntegralConstant< bool, B > Bool_t
Compile time integral constant wrapper for bool.The Bool_t alias template represents an integral wrap...
Definition: IntegralConstant.h:153
Header file for the Abs functor.
Header file for the IsPadded type trait.
decltype(auto) abs(const DenseMatrix< MT, SO > &dm)
Applies the abs() function to each single element of the dense matrix dm.
Definition: DMatMapExpr.h:1156
decltype(auto) maxNorm(const DenseMatrix< MT, SO > &dm)
Computes the maximum norm for the given dense matrix.
Definition: DMatNormExpr.h:721
typename MultTrait< T1, T2 >::Type MultTrait_t
Auxiliary alias declaration for the MultTrait class template.The MultTrait_t alias declaration provid...
Definition: MultTrait.h:240
Header file for the evaluate shim.
Header file for the IsSIMDEnabled type trait.
Generic wrapper for the pow2() function.
Definition: Pow2.h:78
constexpr bool IsPadded_v
Auxiliary variable template for the IsPadded type trait.The IsPadded_v variable template provides a c...
Definition: IsPadded.h:134
Header file for run time assertion macros.
Generic wrapper for the pow() function.
Definition: Pow.h:63
Indexing a type list.The TypeAt class can be used to access a type list at a specified position to qu...
Definition: TypeAt.h:75
Header file for the Unique class template.
#define BLAZE_FUNCTION_TRACE
Function trace macro.This macro can be used to reliably trace function calls. In case function tracin...
Definition: FunctionTrace.h:94
Generic wrapper for a binary operation with fixed 2nd argument.
Definition: Bind2nd.h:65
constexpr size_t size(const Matrix< MT, SO > &matrix) noexcept
Returns the total number of elements of the matrix.
Definition: Matrix.h:530
Header file for the HasMember type traits.
Header file for the Noop functor.
constexpr size_t rows(const Matrix< MT, SO > &matrix) noexcept
Returns the current number of rows of the matrix.
Definition: Matrix.h:498
Header file for the RemoveReference type trait.
decltype(auto) norm(const DenseMatrix< MT, SO > &dm)
Computes the L2 norm for the given dense matrix.
Definition: DMatNormExpr.h:469
decltype(auto) linfNorm(const DenseMatrix< MT, SO > &dm)
Computes the infinity norm for the given dense matrix.
Definition: DMatNormExpr.h:695
Generic wrapper for the pow3() function.
Definition: Pow3.h:78
Header file for the L3Norm functor.
Header file for the IntegralConstant class template.
Header file for the L1Norm functor.
Header file for the Qdrt functor.
#define BLAZE_INTERNAL_ASSERT(expr, msg)
Run time assertion macro for internal checks.In case of an invalid run time expression,...
Definition: Assert.h:101
Header file for the Pow3 functor.
Header file for the function trace functionality.