35#ifndef _BLAZE_MATH_EXPRESSIONS_SMATSMATKRONEXPR_H_
36#define _BLAZE_MATH_EXPRESSIONS_SMATSMATKRONEXPR_H_
87 :
public MatMatKronExpr< SparseMatrix< SMatSMatKronExpr<MT1,MT2>, false > >
107 static constexpr bool returnExpr = ( !IsTemporary_v<RN1> && !IsTemporary_v<RN2> );
194 inline size_t rows() const noexcept {
205 return lhs_.columns() *
rhs_.columns();
215 return lhs_.nonZeros() *
rhs_.nonZeros();
256 template<
typename T >
257 inline bool canAlias(
const T* alias )
const noexcept {
258 return (
lhs_.canAlias( alias ) ||
rhs_.canAlias( alias ) );
268 template<
typename T >
269 inline bool isAliased(
const T* alias )
const noexcept {
270 return (
lhs_.isAliased( alias ) ||
rhs_.isAliased( alias ) );
292 template<
typename MT
313 const size_t M( B.rows() );
314 const size_t N( B.columns() );
316 for(
size_t i=0UL; i<A.rows(); ++i )
317 for(
size_t k=0UL; k<M; ++k )
318 for(
auto aelem=A.begin(i); aelem!=A.end(i); ++aelem )
319 for(
auto belem=B.begin(k); belem!=B.end(k); ++belem )
320 (*lhs)(i*M+k,aelem->index()*N+belem->index()) = aelem->value() * belem->value();
338 template<
typename MT >
358 const size_t M( B.rows() );
359 const size_t N( B.columns() );
361 for(
size_t i=0UL; i<A.rows(); ++i ) {
362 for(
size_t k=0UL; k<M; ++k ) {
363 for(
auto aelem=A.begin(i); aelem!=A.end(i); ++aelem )
364 for(
auto belem=B.begin(k); belem!=B.end(k); ++belem )
365 (*lhs).append( i*M+k, aelem->index()*N+belem->index(), aelem->value() * belem->value(),
true );
366 (*lhs).finalize( i*M+k );
386 template<
typename MT >
387 friend inline void assign( SparseMatrix<MT,true>& lhs,
const SMatSMatKronExpr& rhs )
394 if( rhs.rows() == 0UL || rhs.columns() == 0UL ) {
406 const size_t M( B.rows() );
407 const size_t N( B.columns() );
410 std::vector<size_t> lnonzeros( A.columns(), 0UL );
411 for(
size_t i=0UL; i<A.rows(); ++i ) {
412 const auto aend( A.end(i) );
413 for(
auto aelem=A.begin(i); aelem!=aend; ++aelem ) {
414 ++lnonzeros[aelem->index()];
419 std::vector<size_t> rnonzeros( N, 0UL );
420 for(
size_t i=0UL; i<M; ++i ) {
421 const auto bend( B.end(i) );
422 for(
auto belem=B.begin(i); belem!=bend; ++belem ) {
423 ++rnonzeros[belem->index()];
428 for(
size_t i=0UL; i<A.columns(); ++i ) {
429 for(
size_t j=0UL; j<N; ++j ) {
430 (*lhs).reserve( i*N+j, lnonzeros[i]*rnonzeros[j] );
435 for(
size_t i=0UL; i<A.rows(); ++i )
436 for(
size_t k=0UL; k<M; ++k )
437 for(
auto aelem=A.begin(i); aelem!=A.end(i); ++aelem )
438 for(
auto belem=B.begin(k); belem!=B.end(k); ++belem )
439 (*lhs).append( i*M+k, aelem->index()*N+belem->index(), aelem->value() * belem->value(),
true );
457 template<
typename MT
459 friend inline void addAssign( DenseMatrix<MT,SO2>& lhs,
const SMatSMatKronExpr& rhs )
466 if( rhs.rows() == 0UL || rhs.columns() == 0UL ) {
478 const size_t M( B.rows() );
479 const size_t N( B.columns() );
481 for(
size_t i=0UL; i<A.rows(); ++i )
482 for(
size_t k=0UL; k<M; ++k )
483 for(
auto aelem=A.begin(i); aelem!=A.end(i); ++aelem )
484 for(
auto belem=B.begin(k); belem!=B.end(k); ++belem )
485 (*lhs)(i*M+k,aelem->index()*N+belem->index()) += aelem->value() * belem->value();
507 template<
typename MT
509 friend inline void subAssign( DenseMatrix<MT,SO2>& lhs,
const SMatSMatKronExpr& rhs )
516 if( rhs.rows() == 0UL || rhs.columns() == 0UL ) {
528 const size_t M( B.rows() );
529 const size_t N( B.columns() );
531 for(
size_t i=0UL; i<A.rows(); ++i )
532 for(
size_t k=0UL; k<M; ++k )
533 for(
auto aelem=A.begin(i); aelem!=A.end(i); ++aelem )
534 for(
auto belem=B.begin(k); belem!=B.end(k); ++belem )
535 (*lhs)(i*M+k,aelem->index()*N+belem->index()) -= aelem->value() * belem->value();
557 template<
typename MT
559 friend inline void schurAssign( DenseMatrix<MT,SO2>& lhs,
const SMatSMatKronExpr& rhs )
566 if( rhs.rows() == 0UL || rhs.columns() == 0UL ) {
578 const size_t M( B.rows() );
579 const size_t N( B.columns() );
581 for(
size_t i=0UL; i<A.rows(); ++i ) {
582 for(
size_t k=0UL; k<M; ++k )
586 for(
auto aelem=A.begin(i); aelem!=A.end(i); ++aelem ) {
587 for(
auto belem=B.begin(k); belem!=B.end(k); ++belem, ++j ) {
588 const size_t index( aelem->index()*N+belem->index() );
589 for( ; j<index; ++j )
590 reset( (*lhs)(i*M+k,j) );
591 (*lhs)(i*M+k,j) *= aelem->value() * belem->value();
595 for( ; j<(*lhs).columns(); ++j )
596 reset( (*lhs)(i*M+k,j) );
651template<
typename MT1
653 ,
DisableIf_t< ( IsIdentity_v<MT1> && IsIdentity_v<MT2> ) ||
654 ( IsZero_v<MT1> || IsZero_v<MT2> ) >* =
nullptr >
655inline const SMatSMatKronExpr<MT1,MT2>
656 smatsmatkron(
const SparseMatrix<MT1,false>& lhs,
const SparseMatrix<MT2,false>& rhs )
660 return SMatSMatKronExpr<MT1,MT2>( *lhs, *rhs );
679template<
typename MT1
681 , EnableIf_t< IsIdentity_v<MT1> && IsIdentity_v<MT2> >* =
nullptr >
683 smatsmatkron(
const SparseMatrix<MT1,false>& lhs,
const SparseMatrix<MT2,false>& rhs )
687 using ReturnType =
const KronTrait_t< ResultType_t<MT1>, ResultType_t<MT2> >;
692 return ReturnType( (*lhs).rows()*(*rhs).rows() );
711template<
typename MT1
713 , EnableIf_t< IsZero_v<MT1> || IsZero_v<MT2> >* =
nullptr >
715 smatsmatkron(
const SparseMatrix<MT1,false>& lhs,
const SparseMatrix<MT2,false>& rhs )
719 using ReturnType =
const KronTrait_t< ResultType_t<MT1>, ResultType_t<MT2> >;
724 return ReturnType( (*lhs).rows()*(*rhs).rows(), (*lhs).columns()*(*rhs).columns() );
753template<
typename MT1
760 return smatsmatkron( *lhs, *rhs );
Header file for auxiliary alias declarations.
typename T::CompositeType CompositeType_t
Alias declaration for nested CompositeType type definitions.
Definition: Aliases.h:110
typename T::ReturnType ReturnType_t
Alias declaration for nested ReturnType type definitions.
Definition: Aliases.h:470
typename T::ResultType ResultType_t
Alias declaration for nested ResultType type definitions.
Definition: Aliases.h:450
typename T::ElementType ElementType_t
Alias declaration for nested ElementType type definitions.
Definition: Aliases.h:190
typename T::OppositeType OppositeType_t
Alias declaration for nested OppositeType type definitions.
Definition: Aliases.h:310
typename T::TransposeType TransposeType_t
Alias declaration for nested TransposeType type definitions.
Definition: Aliases.h:550
Header file for run time assertion macros.
Header file for the EnableIf class template.
Header file for the function trace functionality.
Constraint on the data type.
Header file for the If class template.
Header file for the IsExpression type trait class.
Header file for the IsIdentity type trait.
Header file for the IsTemporary type trait class.
Header file for the Kron product trait.
Constraints on the storage order of matrix types.
Constraint on the data type.
Base class for dense matrices.
Definition: DenseMatrix.h:82
Expression object for sparse matrix-sparse matrix Kronecker product.
Definition: SMatSMatKronExpr.h:89
const If_t< returnExpr, ExprReturnType, ElementType > ReturnType
Return type for expression template evaluations.
Definition: SMatSMatKronExpr.h:127
ResultType_t< MT1 > RT1
Result type of the left-hand side sparse matrix expression.
Definition: SMatSMatKronExpr.h:92
RightOperand rhs_
Right-hand side sparse matrix of the Kronecker product expression.
Definition: SMatSMatKronExpr.h:277
size_t nonZeros() const
Returns the number of non-zero elements in the sparse matrix.
Definition: SMatSMatKronExpr.h:214
ReturnType_t< MT1 > RN1
Return type of the left-hand side sparse matrix expression.
Definition: SMatSMatKronExpr.h:94
decltype(std::declval< RN1 >() *std::declval< RN2 >()) ExprReturnType
Expression return type for the subscript operator.
Definition: SMatSMatKronExpr.h:110
SMatSMatKronExpr(const MT1 &lhs, const MT2 &rhs) noexcept
Constructor for the SMatSMatKronExpr class.
Definition: SMatSMatKronExpr.h:150
CompositeType_t< MT2 > CT2
Composite type of the right-hand side sparse matrix expression.
Definition: SMatSMatKronExpr.h:97
bool canAlias(const T *alias) const noexcept
Returns whether the expression can alias with the given address alias.
Definition: SMatSMatKronExpr.h:257
static constexpr bool returnExpr
Compilation switch for the selection of the subscript operator return type.
Definition: SMatSMatKronExpr.h:107
ElementType_t< ResultType > ElementType
Resulting element type.
Definition: SMatSMatKronExpr.h:124
If_t< IsExpression_v< MT1 >, const MT1, const MT1 & > LeftOperand
Composite type of the left-hand side sparse matrix expression.
Definition: SMatSMatKronExpr.h:133
const ResultType CompositeType
Data type for composite expression templates.
Definition: SMatSMatKronExpr.h:130
LeftOperand lhs_
Left-hand side sparse matrix of the Kronecker product expression.
Definition: SMatSMatKronExpr.h:276
If_t< IsExpression_v< MT2 >, const MT2, const MT2 & > RightOperand
Composite type of the right-hand side sparse matrix expression.
Definition: SMatSMatKronExpr.h:136
ResultType_t< MT2 > RT2
Result type of the right-hand side sparse matrix expression.
Definition: SMatSMatKronExpr.h:93
RightOperand rightOperand() const noexcept
Returns the right-hand side sparse matrix operand.
Definition: SMatSMatKronExpr.h:245
CompositeType_t< MT1 > CT1
Composite type of the left-hand side sparse matrix expression.
Definition: SMatSMatKronExpr.h:96
size_t columns() const noexcept
Returns the current number of columns of the matrix.
Definition: SMatSMatKronExpr.h:204
ReturnType at(size_t i, size_t j) const
Checked access to the matrix elements.
Definition: SMatSMatKronExpr.h:178
bool isAliased(const T *alias) const noexcept
Returns whether the expression is aliased with the given address alias.
Definition: SMatSMatKronExpr.h:269
OppositeType_t< ResultType > OppositeType
Result type with opposite storage order for expression template evaluations.
Definition: SMatSMatKronExpr.h:122
static constexpr bool smpAssignable
Compilation switch for the expression template assignment strategy.
Definition: SMatSMatKronExpr.h:141
TransposeType_t< ResultType > TransposeType
Transpose type for expression template evaluations.
Definition: SMatSMatKronExpr.h:123
ReturnType operator()(size_t i, size_t j) const
2D-access to the matrix elements.
Definition: SMatSMatKronExpr.h:163
size_t rows() const noexcept
Returns the current number of rows of the matrix.
Definition: SMatSMatKronExpr.h:194
ReturnType_t< MT2 > RN2
Return type of the right-hand side sparse matrix expression.
Definition: SMatSMatKronExpr.h:95
KronTrait_t< RT1, RT2 > ResultType
Result type for expression template evaluations.
Definition: SMatSMatKronExpr.h:121
LeftOperand leftOperand() const noexcept
Returns the left-hand side sparse matrix operand.
Definition: SMatSMatKronExpr.h:235
size_t nonZeros(size_t i) const
Returns the number of non-zero elements in the specified row.
Definition: SMatSMatKronExpr.h:225
Base class for sparse matrices.
Definition: SparseMatrix.h:77
Constraint on the data type.
Constraint on the data type.
Header file for the Computation base class.
Header file for the MatMatKronExpr base class.
Header file for the SparseMatrix base class.
decltype(auto) serial(const DenseMatrix< MT, SO > &dm)
Forces the serial evaluation of the given dense matrix expression dm.
Definition: DMatSerialExpr.h:812
decltype(auto) kron(const DenseMatrix< MT1, SO1 > &lhs, const DenseMatrix< MT2, SO2 > &rhs)
Computes the Kronecker product of two dense matrices ( ).
Definition: DMatDMatKronExpr.h:957
#define BLAZE_CONSTRAINT_MUST_BE_ROW_MAJOR_MATRIX_TYPE(T)
Constraint on the data type.
Definition: RowMajorMatrix.h:61
#define BLAZE_CONSTRAINT_MUST_NOT_BE_ZERO_TYPE(T)
Constraint on the data type.
Definition: Zero.h:81
#define BLAZE_CONSTRAINT_MUST_BE_SPARSE_MATRIX_TYPE(T)
Constraint on the data type.
Definition: SparseMatrix.h:61
#define BLAZE_CONSTRAINT_MUST_FORM_VALID_MATMATKRONEXPR(T1, T2)
Constraint on the data type.
Definition: MatMatKronExpr.h:102
#define BLAZE_CONSTRAINT_MUST_BE_IDENTITY_MATRIX_TYPE(T)
Constraint on the data type.
Definition: Identity.h:60
#define BLAZE_CONSTRAINT_MUST_BE_ZERO_TYPE(T)
Constraint on the data type.
Definition: Zero.h:61
typename KronTrait< T1, T2 >::Type KronTrait_t
Auxiliary alias declaration for the KronTrait class template.
Definition: KronTrait.h:137
constexpr void reset(Matrix< MT, SO > &matrix)
Resetting the given matrix.
Definition: Matrix.h:806
#define BLAZE_INTERNAL_ASSERT(expr, msg)
Run time assertion macro for internal checks.
Definition: Assert.h:101
typename If< Condition >::template Type< T1, T2 > If_t
Auxiliary alias template for the If class template.
Definition: If.h:108
#define BLAZE_THROW_OUT_OF_RANGE(MESSAGE)
Macro for the emission of a std::out_of_range exception.
Definition: Exception.h:331
typename EnableIf<!Condition, T >::Type DisableIf_t
Auxiliary type for the EnableIf class template.
Definition: EnableIf.h:175
#define BLAZE_FUNCTION_TRACE
Function trace macro.
Definition: FunctionTrace.h:94
Header file for the exception macros of the math module.
Constraints on the storage order of matrix types.
Header file for the reset shim.
Header file for the serial shim.
Base class for all compute expression templates.
Definition: Computation.h:68
Base class for all matrix/matrix Kronecker expression templates.
Definition: MatMatKronExpr.h:69
Header file for the IsZero type trait.
Header file for basic type definitions.