35 #ifndef _BLAZE_MATH_EXPRESSIONS_DMATNORMEXPR_H_ 36 #define _BLAZE_MATH_EXPRESSIONS_DMATNORMEXPR_H_ 101 struct DMatNormHelper
105 using ET = ElementType_t<MT>;
108 using CT = RemoveReference_t< CompositeType_t<MT> >;
112 static constexpr
bool value =
113 ( useOptimizedKernels &&
115 If_t< HasSIMDEnabled_v<Abs> && HasSIMDEnabled_v<Power>
116 , And< GetSIMDEnabled<Abs,ET>, GetSIMDEnabled<Power,ET> >
117 , And< HasLoad<Abs>, HasLoad<Power> > >::value &&
118 HasSIMDAdd_v< ElementType_t<CT>, ElementType_t<CT> > );
148 template<
typename MT
152 inline decltype(
auto) norm_backend( const DenseMatrix<MT,false>& dm, Abs
abs, Power power, Root root,
FalseType )
154 using CT = CompositeType_t<MT>;
155 using ET = ElementType_t<MT>;
156 using RT = decltype(
evaluate( root( std::declval<ET>() ) ) );
158 if( (~dm).
rows() == 0UL || (~dm).
columns() == 0UL )
return RT();
162 const size_t M( tmp.rows() );
163 const size_t N( tmp.columns() );
165 ET
norm( power(
abs( tmp(0UL,0UL) ) ) );
170 for( ; (j+4UL) <= N; j+=4UL ) {
171 norm += power(
abs( tmp(0UL,j ) ) ) + power(
abs( tmp(0UL,j+1UL) ) ) +
172 power(
abs( tmp(0UL,j+2UL) ) ) + power(
abs( tmp(0UL,j+3UL) ) );
174 for( ; (j+2UL) <= N; j+=2UL ) {
175 norm += power(
abs( tmp(0UL,j) ) ) + power(
abs( tmp(0UL,j+1UL) ) );
178 norm += power(
abs( tmp(0UL,j) ) );
182 for(
size_t i=1UL; i<M; ++i )
186 for( ; (j+4UL) <= N; j+=4UL ) {
187 norm += power(
abs( tmp(i,j ) ) ) + power(
abs( tmp(i,j+1UL) ) ) +
188 power(
abs( tmp(i,j+2UL) ) ) + power(
abs( tmp(i,j+3UL) ) );
190 for( ; (j+2UL) <= N; j+=2UL ) {
191 norm += power(
abs( tmp(i,j) ) ) + power(
abs( tmp(i,j+1UL) ) );
194 norm += power(
abs( tmp(i,j) ) );
219 template<
typename MT
223 inline decltype(
auto) norm_backend( const DenseMatrix<MT,true>& dm, Abs
abs, Power power, Root root,
FalseType )
225 using CT = CompositeType_t<MT>;
226 using ET = ElementType_t<MT>;
227 using RT = decltype(
evaluate( root( std::declval<ET>() ) ) );
229 if( (~dm).
rows() == 0UL || (~dm).
columns() == 0UL )
return RT();
233 const size_t M( tmp.rows() );
234 const size_t N( tmp.columns() );
236 ET
norm( power(
abs( tmp(0UL,0UL) ) ) );
241 for( ; (i+4UL) <= M; i+=4UL ) {
242 norm += power(
abs( tmp(i ,0UL) ) ) + power(
abs( tmp(i+1UL,0UL) ) ) +
243 power(
abs( tmp(i+2UL,0UL) ) ) + power(
abs( tmp(i+3UL,0UL) ) );
245 for( ; (i+2UL) <= M; i+=2UL ) {
246 norm += power(
abs( tmp(i,0UL) ) ) + power(
abs( tmp(i+1UL,0UL) ) );
249 norm += power(
abs( tmp(i,0UL) ) );
253 for(
size_t j=1UL; j<N; ++j )
257 for( ; (i+4UL) <= M; i+=4UL ) {
258 norm += power(
abs( tmp(i ,j) ) ) + power(
abs( tmp(i+1UL,j) ) ) +
259 power(
abs( tmp(i+2UL,j) ) ) + power(
abs( tmp(i+3UL,j) ) );
261 for( ; (i+2UL) <= M; i+=2UL ) {
262 norm += power(
abs( tmp(i,j) ) ) + power(
abs( tmp(i+1UL,j) ) );
265 norm += power(
abs( tmp(i,j) ) );
290 template<
typename MT
294 inline decltype(
auto) norm_backend( const DenseMatrix<MT,false>& dm, Abs
abs, Power power, Root root,
TrueType )
296 using CT = CompositeType_t<MT>;
297 using ET = ElementType_t<MT>;
298 using RT = decltype(
evaluate( root( std::declval<ET>() ) ) );
302 if( (~dm).
rows() == 0UL || (~dm).
columns() == 0UL )
return RT();
306 const size_t M( tmp.rows() );
307 const size_t N( tmp.columns() );
309 constexpr
bool remainder( !usePadding || !
IsPadded_v< RemoveReference_t<CT> > );
311 const size_t jpos( ( remainder )?( N &
size_t(-SIMDSIZE) ):( N ) );
314 SIMDTrait_t<ET> xmm1, xmm2, xmm3, xmm4;
317 for(
size_t i=0UL; i<M; ++i )
321 for( ; (j+SIMDSIZE*3UL) < jpos; j+=SIMDSIZE*4UL ) {
322 xmm1 += power(
abs( tmp.load(i,j ) ) );
323 xmm2 += power(
abs( tmp.load(i,j+SIMDSIZE ) ) );
324 xmm3 += power(
abs( tmp.load(i,j+SIMDSIZE*2UL) ) );
325 xmm4 += power(
abs( tmp.load(i,j+SIMDSIZE*3UL) ) );
327 for( ; (j+SIMDSIZE) < jpos; j+=SIMDSIZE*2UL ) {
328 xmm1 += power(
abs( tmp.load(i,j ) ) );
329 xmm2 += power(
abs( tmp.load(i,j+SIMDSIZE) ) );
331 for( ; j<jpos; j+=SIMDSIZE ) {
332 xmm1 += power(
abs( tmp.load(i,j) ) );
334 for( ; remainder && j<N; ++j ) {
335 norm += power(
abs( tmp(i,j) ) );
339 norm +=
sum( xmm1 + xmm2 + xmm3 + xmm4 );
362 template<
typename MT
366 inline decltype(
auto) norm_backend( const DenseMatrix<MT,true>& dm, Abs
abs, Power power, Root root,
TrueType )
368 using CT = CompositeType_t<MT>;
369 using ET = ElementType_t<MT>;
370 using RT = decltype(
evaluate( root( std::declval<ET>() ) ) );
374 if( (~dm).
rows() == 0UL || (~dm).
columns() == 0UL )
return RT();
378 const size_t M( tmp.rows() );
379 const size_t N( tmp.columns() );
381 constexpr
bool remainder( !usePadding || !
IsPadded_v< RemoveReference_t<CT> > );
383 const size_t ipos( ( remainder )?( M &
size_t(-SIMDSIZE) ):( M ) );
386 SIMDTrait_t<ET> xmm1, xmm2, xmm3, xmm4;
389 for(
size_t j=0UL; j<N; ++j )
393 for( ; (i+SIMDSIZE*3UL) < ipos; i+=SIMDSIZE*4UL ) {
394 xmm1 += power(
abs( tmp.load(i ,j) ) );
395 xmm2 += power(
abs( tmp.load(i+SIMDSIZE ,j) ) );
396 xmm3 += power(
abs( tmp.load(i+SIMDSIZE*2UL,j) ) );
397 xmm4 += power(
abs( tmp.load(i+SIMDSIZE*3UL,j) ) );
399 for( ; (i+SIMDSIZE) < ipos; i+=SIMDSIZE*2UL ) {
400 xmm1 += power(
abs( tmp.load(i ,j) ) );
401 xmm2 += power(
abs( tmp.load(i+SIMDSIZE,j) ) );
403 for( ; i<ipos; i+=SIMDSIZE ) {
404 xmm1 += power(
abs( tmp.load(i,j) ) );
406 for( ; remainder && i<M; ++i ) {
407 norm += power(
abs( tmp(i,j) ) );
411 norm +=
sum( xmm1 + xmm2 + xmm3 + xmm4 );
440 template<
typename MT
445 decltype(
auto) norm_backend( const DenseMatrix<MT,SO>& dm, Abs
abs, Power power, Root root )
447 return norm_backend( ~dm,
abs, power, root,
Bool< DMatNormHelper<MT,Abs,Power>::value >() );
468 template<
typename MT
494 template<
typename MT
520 template<
typename MT
546 template<
typename MT
572 template<
typename MT
598 template<
typename MT
629 template<
typename MT
671 using Norm =
typename TypeAt< Norms,
min( P-1UL, 4UL ) >::Type;
673 return Norm()( ~dm );
693 template<
typename MT
decltype(auto) sqrNorm(const DenseMatrix< MT, SO > &dm)
Computes the squared L2 norm for the given dense matrix.
Definition: DMatNormExpr.h:496
BoolConstant< false > FalseType
Type/value traits base class.The FalseType class is used as base class for type traits and value trai...
Definition: FalseType.h:61
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, the program execution is terminated. The BLAZE_USER_ASSERT macro can be disabled by setting the BLAZE_USER_ASSERT flag to zero or by defining NDEBUG during the compilation.
Definition: Assert.h:117
Generic wrapper for the cbrt() function.
Definition: Cbrt.h:80
Generic wrapper for the squared abs() function.
Definition: SqrAbs.h:84
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:574
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:548
Header file for the FalseType type/value trait base class.
decltype(auto) l4Norm(const DenseMatrix< MT, SO > &dm)
Computes the L4 norm for the given dense matrix.
Definition: DMatNormExpr.h:600
Header file for the isZero shim.
Header file for the And class template.
Generic wrapper for the pow() function with fixed exponent.
Definition: Forward.h:129
decltype(auto) lpNorm(const DenseMatrix< MT, SO > &dm, ST p)
Computes the Lp norm for the given dense matrix.
Definition: DMatNormExpr.h:632
Header file for the invert shim.
Generic wrapper for the qdrt() function.
Definition: Qdrt.h:81
BoolConstant< true > TrueType
Type traits base class.The TrueType class is used as base class for type traits and value traits that...
Definition: TrueType.h:61
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:80
bool isZero(const DiagonalProxy< MT > &proxy)
Returns whether the represented element is 0.
Definition: DiagonalProxy.h:673
Generic wrapper for the abs() function.
Definition: Abs.h:82
IntegralConstant< bool, C > Bool
Compile time integral constant wrapper for bool.The Bool class template represents an integral wrappe...
Definition: Bool.h:70
Generic wrapper for the sqrt() function.
Definition: Sqrt.h:82
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:522
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:1147
decltype(auto) sum(const DenseMatrix< MT, SO > &dm)
Reduces the given dense matrix by means of addition.
Definition: DMatReduceExpr.h:2146
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:59
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:1179
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:1152
decltype(auto) maxNorm(const DenseMatrix< MT, SO > &dm)
Computes the maximum norm for the given dense matrix.
Definition: DMatNormExpr.h:695
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:77
Header file for run time assertion macros.
Indexing a type list.The TypeAt class can be used to access a type list at a specified position to qu...
Definition: TypeAt.h:76
Header file for the Unique class template.
Header file for the UnaryPow functor.
constexpr bool IsPadded_v
Auxiliary variable template for the IsPadded type trait.The IsPadded_v variable template provides a c...
Definition: IsPadded.h:135
#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
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:470
Generic wrapper for the pow3() function.
Definition: Pow3.h:77
Header file for the L3Norm functor.
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, the program execution is terminated. The BLAZE_INTERNAL_ASSERT macro can be disabled by setting the BLAZE_USER_ASSERTION flag to zero or by defining NDEBUG during the compilation.
Definition: Assert.h:101
Header file for the Bool class template.
Header file for the Pow3 functor.
Header file for the TrueType type/value trait base class.
Header file for the function trace functionality.