35 #ifndef _BLAZE_MATH_VIEWS_BAND_H_ 36 #define _BLAZE_MATH_VIEWS_BAND_H_ 131 template< ptrdiff_t I
135 inline decltype(
auto)
band(
Matrix<MT,SO>& matrix, RBAs... args )
180 template< ptrdiff_t I
184 inline decltype(
auto)
band( const
Matrix<MT,SO>& matrix, RBAs... args )
208 template< ptrdiff_t I
212 inline decltype(
auto)
band(
Matrix<MT,SO>&& matrix, RBAs... args )
258 template<
typename MT
307 template<
typename MT
335 template<
typename MT
372 template<
typename MT
379 return band<0L>( ~matrix,
unchecked, args... );
407 template<
typename MT
414 return band<0L>( ~matrix,
unchecked, args... );
431 template<
typename MT
438 return band<0L>( ~matrix,
unchecked, args... );
463 template< ptrdiff_t... CBAs
466 inline decltype(
auto)
band( const MatMatAddExpr<MT>& matrix, RBAs... args )
470 return band<CBAs...>( (~matrix).leftOperand(), args... ) +
471 band<CBAs...>( (~matrix).rightOperand(), args... );
489 template< ptrdiff_t... CBAs
492 inline decltype(
auto)
band( const MatMatSubExpr<MT>& matrix, RBAs... args )
496 return band<CBAs...>( (~matrix).leftOperand(), args... ) -
497 band<CBAs...>( (~matrix).rightOperand(), args... );
514 template< ptrdiff_t... CBAs
517 inline decltype(
auto)
band( const SchurExpr<MT>& matrix, RBAs... args )
521 return band<CBAs...>( (~matrix).leftOperand(), args... ) *
522 band<CBAs...>( (~matrix).rightOperand(), args... );
538 template< ptrdiff_t I
540 inline decltype(
auto)
band( const VecTVecMultExpr<MT>& matrix )
544 decltype(
auto) leftOperand ( (~matrix).leftOperand() );
545 decltype(auto) rightOperand( (~matrix).rightOperand() );
547 const
size_t row ( I < 0L ? -I : 0UL );
548 const
size_t column( I >= 0L ? I : 0UL );
569 template< typename MT >
570 inline decltype(auto)
band( const VecTVecMultExpr<MT>& matrix, ptrdiff_t index )
574 decltype(
auto) leftOperand ( (~matrix).leftOperand() );
575 decltype(auto) rightOperand( (~matrix).rightOperand() );
577 const
size_t row ( index < 0L ? -index : 0UL );
578 const
size_t column( index >= 0L ? index : 0UL );
600 template< ptrdiff_t... CBAs
603 inline decltype(auto)
band( const MatScalarMultExpr<MT>& matrix, RBAs... args )
607 return band<CBAs...>( (~matrix).leftOperand(), args... ) * (~matrix).rightOperand();
625 template< ptrdiff_t... CBAs
628 inline decltype(
auto)
band( const MatScalarDivExpr<MT>& matrix, RBAs... args )
632 return band<CBAs...>( (~matrix).leftOperand(), args... ) / (~matrix).rightOperand();
650 template< ptrdiff_t... CBAs
653 inline decltype(
auto)
band( const MatMapExpr<MT>& matrix, RBAs... args )
657 return map( band<CBAs...>( (~matrix).operand(), args... ), (~matrix).operation() );
675 template< ptrdiff_t... CBAs
678 inline decltype(
auto)
band( const MatMatMapExpr<MT>& matrix, RBAs... args )
682 return map( band<CBAs...>( (~matrix).leftOperand(), args... ),
683 band<CBAs...>( (~matrix).rightOperand(), args... ),
684 (~matrix).operation() );
702 template< ptrdiff_t... CBAs
705 inline decltype(
auto)
band( const MatEvalExpr<MT>& matrix, RBAs... args )
709 return eval( band<CBAs...>( (~matrix).operand(), args... ) );
727 template< ptrdiff_t... CBAs
730 inline decltype(
auto)
band( const MatSerialExpr<MT>& matrix, RBAs... args )
734 return serial( band<CBAs...>( (~matrix).operand(), args... ) );
752 template< ptrdiff_t... CBAs
755 inline decltype(
auto)
band( const DeclExpr<MT>& matrix, RBAs... args )
759 return band<CBAs...>( (~matrix).operand(), args... );
777 template< ptrdiff_t... CBAs
780 inline decltype(
auto)
band( const MatTransExpr<MT>& matrix, RBAs... args )
784 return band<-CBAs...>( (~matrix).operand(), -args... );
802 template< ptrdiff_t... CBAs
806 inline decltype(
auto)
band( const VecExpandExpr<MT,CEAs...>& matrix, RBAs... args )
812 constexpr
bool TF( TransposeFlag_v<VT> );
814 const BandData<CBAs...> bd( args... );
816 const size_t index( TF ? bd.column() : bd.row() );
817 const size_t size (
min( (~matrix).
rows() - bd.row(), (~matrix).
columns() - bd.column() ) );
819 return subvector( transTo<defaultTransposeFlag>( (~matrix).operand() ), index,
size, args... );
853 inline decltype(
auto)
subvector( Band<MT,TF,DF,MF,I2>& b, RSAs... args )
857 constexpr
size_t row ( ( I2 >= 0L ? 0UL : -I2 ) + I1 );
858 constexpr
size_t column( ( I2 >= 0L ? I2 : 0UL ) + I1 );
860 return diagonal( submatrix<AF,row,column,N,N>( b.operand(), args... ),
unchecked );
887 inline decltype(
auto)
subvector( const Band<MT,TF,DF,MF,I2>& b, RSAs... args )
891 constexpr
size_t row ( ( I2 >= 0L ? 0UL : -I2 ) + I1 );
892 constexpr
size_t column( ( I2 >= 0L ? I2 : 0UL ) + I1 );
894 return diagonal( submatrix<AF,row,column,N,N>( b.operand(), args... ),
unchecked );
921 inline decltype(
auto)
subvector( Band<MT,TF,DF,MF,I2>&& b, RSAs... args )
925 constexpr
size_t row ( ( I2 >= 0L ? 0UL : -I2 ) + I1 );
926 constexpr
size_t column( ( I2 >= 0L ? I2 : 0UL ) + I1 );
928 return diagonal( submatrix<AF,row,column,N,N>( b.operand(), args... ),
unchecked );
953 inline decltype(
auto)
subvector( Band<MT,TF,DF,MF,CBAs...>& b, RSAs... args )
957 const SubvectorData<CSAs...> sd( args... );
959 const size_t row ( b.row() + sd.offset() );
960 const size_t column( b.column() + sd.offset() );
988 inline decltype(
auto)
subvector( const Band<MT,TF,DF,MF,CBAs...>& b, RSAs... args )
992 const SubvectorData<CSAs...> sd( args... );
994 const size_t row ( b.row() + sd.offset() );
995 const size_t column( b.column() + sd.offset() );
1022 ,
typename... RSAs >
1023 inline decltype(
auto)
subvector( Band<MT,TF,DF,MF,CBAs...>&& b, RSAs... args )
1027 const SubvectorData<CSAs...> sd( args... );
1029 const size_t row ( b.row() + sd.offset() );
1030 const size_t column( b.column() + sd.offset() );
1054 template<
typename MT
1058 , ptrdiff_t... CBAs >
1059 inline void reset( Band<MT,TF,DF,MF,CBAs...>&
band )
1075 template<
typename MT
1079 , ptrdiff_t... CBAs >
1080 inline void reset( Band<MT,TF,DF,MF,CBAs...>&&
band )
1098 template<
typename MT
1102 , ptrdiff_t... CBAs >
1103 inline void clear( Band<MT,TF,DF,MF,CBAs...>&
band )
1121 template<
typename MT
1125 , ptrdiff_t... CBAs >
1126 inline void clear( Band<MT,TF,DF,MF,CBAs...>&&
band )
1164 , ptrdiff_t... CBAs >
1165 inline bool isDefault(
const Band<MT,TF,true,MF,CBAs...>&
band )
1169 for(
size_t i=0UL; i<
band.size(); ++i )
1170 if( !isDefault<RF>(
band[i] ) )
return false;
1207 , ptrdiff_t... CBAs >
1208 inline bool isDefault(
const Band<MT,TF,false,MF,CBAs...>&
band )
1212 for(
const auto& element :
band )
1213 if( !isDefault<RF>( element.value() ) )
return false;
1238 template<
typename MT
1242 , ptrdiff_t... CBAs >
1243 inline bool isIntact(
const Band<MT,TF,DF,MF,CBAs...>&
band ) noexcept
1245 const ptrdiff_t index(
band.band() );
1247 return ( ( index >= 0L ||
size_t( -index ) <
band.operand().rows() ) &&
1248 ( index <= 0L ||
size_t( index ) <
band.operand().columns() ) &&
1268 template<
typename MT1
1272 , ptrdiff_t... CBAs1
1274 , ptrdiff_t... CBAs2 >
1275 inline auto isSame_backend(
const Band<MT1,TF,DF,MF,CBAs1...>& a,
1276 const Band<MT2,TF,DF,MF,CBAs2...>& b ) noexcept
1277 -> DisableIf_t< IsSubmatrix_v<MT1> || IsSubmatrix_v<MT2>,
bool >
1279 return (
isSame( a.operand(), b.operand() ) && ( a.band() == b.band() ) );
1298 template<
typename MT1
1302 , ptrdiff_t... CBAs1
1304 , ptrdiff_t... CBAs2 >
1305 inline auto isSame_backend(
const Band<MT1,TF,DF,MF,CBAs1...>& a,
1306 const Band<MT2,TF,DF,MF,CBAs2...>& b ) noexcept
1307 -> EnableIf_t< IsSubmatrix_v<MT1> && !IsSubmatrix_v<MT2>,
bool >
1309 return (
isSame( a.operand().operand(), b.operand() ) &&
1310 ( a.size() == b.size() ) &&
1311 ( a.row() + a.operand().row() == b.row() ) &&
1312 ( a.column() + a.operand().column() == b.column() ) );
1331 template<
typename MT1
1335 , ptrdiff_t... CBAs1
1337 , ptrdiff_t... CBAs2 >
1338 inline auto isSame_backend(
const Band<MT1,TF,DF,MF,CBAs1...>& a,
1339 const Band<MT2,TF,DF,MF,CBAs2...>& b ) noexcept
1340 -> EnableIf_t< !IsSubmatrix_v<MT1> && IsSubmatrix_v<MT2>,
bool >
1342 return (
isSame( a.operand(), b.operand().operand() ) &&
1343 ( a.size() == b.size() ) &&
1344 ( a.row() == b.row() + b.operand().row() ) &&
1345 ( a.column() == b.column() + b.operand().column() ) );
1364 template<
typename MT1
1368 , ptrdiff_t... CBAs1
1370 , ptrdiff_t... CBAs2 >
1371 inline auto isSame_backend(
const Band<MT1,TF,DF,MF,CBAs1...>& a,
1372 const Band<MT2,TF,DF,MF,CBAs2...>& b ) noexcept
1373 -> EnableIf_t< IsSubmatrix_v<MT1> && IsSubmatrix_v<MT2>,
bool >
1375 return (
isSame( a.operand().operand(), b.operand().operand() ) &&
1376 ( a.size() == b.size() ) &&
1377 ( a.row() + a.operand().row() == b.row() + b.operand().row() ) &&
1378 ( a.column() + a.operand().column() == b.column() + b.operand().column() ) );
1397 template<
typename MT1
1401 , ptrdiff_t... CBAs1
1403 , ptrdiff_t... CBAs2 >
1404 inline bool isSame(
const Band<MT1,TF,DF,MF,CBAs1...>& a,
1405 const Band<MT2,TF,DF,MF,CBAs2...>& b ) noexcept
1407 return isSame_backend( a, b );
1428 template<
typename MT
1434 inline bool trySet(
const Band<MT,TF,DF,MF,CBAs...>&
band,
size_t index,
const ET& value )
1438 return trySet(
band.operand(),
band.row()+index,
band.column()+index, value );
1459 template<
typename MT
1465 inline bool tryAdd(
const Band<MT,TF,DF,MF,CBAs...>&
band,
size_t index,
const ET& value )
1469 return tryAdd(
band.operand(),
band.row()+index,
band.column()+index, value );
1490 template<
typename MT
1496 inline bool trySub(
const Band<MT,TF,DF,MF,CBAs...>&
band,
size_t index,
const ET& value )
1500 return trySub(
band.operand(),
band.row()+index,
band.column()+index, value );
1521 template<
typename MT
1527 inline bool tryMult(
const Band<MT,TF,DF,MF,CBAs...>&
band,
size_t index,
const ET& value )
1531 return tryMult(
band.operand(),
band.row()+index,
band.column()+index, value );
1553 template<
typename MT
1560 tryMult(
const Band<MT,TF,DF,MF,CBAs...>&
band,
size_t index,
size_t size,
const ET& value )
1565 const size_t iend( index +
size );
1567 for(
size_t i=index; i<iend; ++i ) {
1568 if( !tryMult(
band.operand(),
band.row()+i,
band.column()+i, value ) )
1593 template<
typename MT
1599 inline bool tryDiv(
const Band<MT,TF,DF,MF,CBAs...>&
band,
size_t index,
const ET& value )
1603 return tryDiv(
band.operand(),
band.row()+index,
band.column()+index, value );
1625 template<
typename MT
1632 tryDiv(
const Band<MT,TF,DF,MF,CBAs...>&
band,
size_t index,
size_t size,
const ET& value )
1637 const size_t iend( index +
size );
1639 for(
size_t i=index; i<iend; ++i ) {
1640 if( !tryDiv(
band.operand(),
band.row()+i,
band.column()+i, value ) )
1665 template<
typename MT
1671 inline bool tryAssign(
const Band<MT,TF,DF,MF,CBAs...>& lhs,
1672 const Vector<VT,TF>& rhs,
size_t index )
1677 return tryAssign( lhs.operand(), ~rhs, lhs.band(), lhs.row()+index, lhs.column()+index );
1698 template<
typename MT
1704 inline bool tryAddAssign(
const Band<MT,TF,DF,MF,CBAs...>& lhs,
1705 const Vector<VT,TF>& rhs,
size_t index )
1710 return tryAddAssign( lhs.operand(), ~rhs, lhs.band(), lhs.row()+index, lhs.column()+index );
1731 template<
typename MT
1737 inline bool trySubAssign(
const Band<MT,TF,DF,MF,CBAs...>& lhs,
1738 const Vector<VT,TF>& rhs,
size_t index )
1743 return trySubAssign( lhs.operand(), ~rhs, lhs.band(), lhs.row()+index, lhs.column()+index );
1764 template<
typename MT
1770 inline bool tryMultAssign(
const Band<MT,TF,DF,MF,CBAs...>& lhs,
1771 const Vector<VT,TF>& rhs,
size_t index )
1776 return tryMultAssign( lhs.operand(), ~rhs, lhs.band(), lhs.row()+index, lhs.column()+index );
1797 template<
typename MT
1803 inline bool tryDivAssign(
const Band<MT,TF,DF,MF,CBAs...>& lhs,
1804 const Vector<VT,TF>& rhs,
size_t index )
1809 return tryDivAssign( lhs.operand(), ~rhs, lhs.band(), lhs.row()+index, lhs.column()+index );
1830 template<
typename MT
1835 inline decltype(
auto) derestrict( Band<MT,TF,DF,MF,I>& b )
1837 return band<I>( derestrict( b.operand() ),
unchecked );
1858 template<
typename MT
1863 inline decltype(
auto) derestrict( Band<MT,TF,DF,MF,I>&& b )
1865 return band<I>( derestrict( b.operand() ),
unchecked );
1886 template<
typename MT
1890 inline decltype(
auto) derestrict( Band<MT,TF,DF,MF>& b )
1892 return band( derestrict( b.operand() ), b.band(),
unchecked );
1913 template<
typename MT
1917 inline decltype(
auto) derestrict( Band<MT,TF,DF,MF>&& b )
1919 return band( derestrict( b.operand() ), b.band(),
unchecked );
1935 template<
typename MT,
bool TF,
bool DF,
bool MF, ptrdiff_t I >
1936 struct Size< Band<MT,TF,DF,MF,I>, 0UL >
1937 :
public If_t< ( Size_v<MT,0UL> >= 0L && Size_v<MT,1UL> >= 0L )
1938 ,
Minimum< PtrdiffT< Size_v<MT,0UL> - ( I >= 0L ? 0L : -I ) >
1939 ,
PtrdiffT< Size_v<MT,1UL> - ( I >= 0L ? I : 0L ) > >
1956 template<
typename MT,
bool TF,
bool DF,
bool MF, ptrdiff_t I >
1957 struct MaxSize< Band<MT,TF,DF,MF,I>, 0UL >
1958 :
public If_t< ( MaxSize_v<MT,0UL> >= 0L && MaxSize_v<MT,1UL> >= 0L )
1959 ,
Minimum< PtrdiffT< MaxSize_v<MT,0UL> - ( I >= 0L ? 0L : -I ) >
1960 ,
PtrdiffT< MaxSize_v<MT,1UL> - ( I >= 0L ? I : 0L ) > >
1977 template<
typename MT,
bool TF,
bool DF,
bool MF, ptrdiff_t... CBAs >
1978 struct IsRestricted< Band<MT,TF,DF,MF,CBAs...> >
1979 :
public IsRestricted<MT>
1995 template<
typename MT,
bool TF,
bool MF, ptrdiff_t... CBAs >
1996 struct HasConstDataAccess< Band<MT,TF,true,MF,CBAs...> >
1997 :
public HasConstDataAccess<MT>
2013 template<
typename MT,
bool TF,
bool MF, ptrdiff_t... CBAs >
2014 struct HasMutableDataAccess< Band<MT,TF,true,MF,CBAs...> >
2015 :
public HasMutableDataAccess<MT>
2031 template<
typename MT,
bool TF,
bool DF,
bool MF, ptrdiff_t... CBAs >
2032 struct IsOpposedView< Band<MT,TF,DF,MF,CBAs...> >
decltype(auto) subvector(Vector< VT, TF > &, RSAs...)
Creating a view on a specific subvector of the given vector.
Definition: Subvector.h:329
AlignmentFlag
Alignment flag for (un-)aligned vectors and matrices.Via these flags it is possible to specify subvec...
Definition: AlignmentFlag.h:62
Pointer difference type of the Blaze library.
Header file for auxiliary alias declarations.
decltype(auto) column(Matrix< MT, SO > &matrix, RCAs... args)
Creating a view on a specific column of the given matrix.
Definition: Column.h:133
Header file for the blaze::checked and blaze::unchecked instances.
bool isSame(const Matrix< MT1, SO1 > &a, const Matrix< MT2, SO2 > &b) noexcept
Returns whether the two given matrices represent the same observable state.
Definition: Matrix.h:992
Header file for basic type definitions.
typename If< Condition, T1, T2 >::Type If_t
Auxiliary alias declaration for the If class template.The If_t alias declaration provides a convenien...
Definition: If.h:109
Header file for the MatTransExpr base class.
void reset(const DiagonalProxy< MT > &proxy)
Resetting the represented element to the default initial values.
Definition: DiagonalProxy.h:591
constexpr Unchecked unchecked
Global Unchecked instance.The blaze::unchecked instance is an optional token for the creation of view...
Definition: Check.h:138
Header file for the MatEvalExpr base class.
typename RemoveReference< T >::Type RemoveReference_t
Auxiliary alias declaration for the RemoveReference type trait.The RemoveReference_t alias declaratio...
Definition: RemoveReference.h:95
Header file for the implementation of the Band base template.
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
Header file for the MaxSize type trait.
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 MatMapExpr base class.
Band specialization for sparse matrices.
Header file for the DisableIf class template.
Namespace of the Blaze C++ math library.
Definition: Blaze.h:58
#define BLAZE_ALWAYS_INLINE
Platform dependent setup of an enforced inline keyword.
Definition: Inline.h:85
Header file for the If class template.
Header file for the IsSubmatrix type trait.
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
Header file for the implementation of the SubvectorData class template.
Header file for the MatMatSubExpr base class.
decltype(auto) transTo(const DenseVector< VT, TF > &dv)
Conditional calculation of the transpose of the given dense vector.
Definition: DVecTransExpr.h:783
Header file for the IsOpposedView type trait.
Header file for the TransposeFlag type trait.
decltype(auto) eval(const DenseMatrix< MT, SO > &dm)
Forces the evaluation of the given dense matrix expression dm.
Definition: DMatEvalExpr.h:786
decltype(auto) diagonal(Matrix< MT, SO > &matrix, RDAs... args)
Creating a view on the diagonal of the given matrix.
Definition: Band.h:375
Header file for all forward declarations for expression class templates.
Header file for the MatSerialExpr base class.
Header file for the VecTVecMultExpr base class.
Header file for the EnableIf class template.
void clear(const DiagonalProxy< MT > &proxy)
Clearing the represented element.
Definition: DiagonalProxy.h:611
decltype(auto) band(Matrix< MT, SO > &matrix, RBAs... args)
Creating a view on a specific band of the given matrix.
Definition: Band.h:135
Header file for the HasConstDataAccess type trait.
IntegralConstant< ptrdiff_t, N > PtrdiffT
Compile time integral constant wrapper for ptrdiff_t.The PtrdiffT class template represents an integr...
Definition: PtrdiffT.h:72
Header file for the DeclExpr base class.
Header file for the Matrix base class.
Header file for the PtrdiffT class template.
Header file for all forward declarations for views.
Header file for the MatScalarMultExpr base class.
Header file for run time assertion macros.
Header file for the SchurExpr base class.
decltype(auto) row(Matrix< MT, SO > &, RRAs...)
Creating a view on a specific row of the given matrix.
Definition: Row.h:133
#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
Header file for the isDefault shim.
constexpr size_t size(const Matrix< MT, SO > &matrix) noexcept
Returns the total number of elements of the matrix.
Definition: Matrix.h:530
Base class for matrices.The Matrix class is a base class for all dense and sparse matrix classes with...
Definition: Forward.h:109
typename T::VectorType VectorType_t
Alias declaration for nested VectorType type definitions.The VectorType_t alias declaration provides ...
Definition: Aliases.h:510
decltype(auto) serial(const DenseMatrix< MT, SO > &dm)
Forces the serial evaluation of the given dense matrix expression dm.
Definition: DMatSerialExpr.h:808
Header file for the HasMutableDataAccess type trait.
Header file for the MatMatAddExpr base class.
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.
If_t< Less< T1, T2 >::value, T1, T2 > Minimum
Compile time value evaluation.The Minimum alias declaration selects the smaller of the two given temp...
Definition: Minimum.h:73
const Type & ReturnType
Return type for expression template evaluations.
Definition: CompressedMatrix.h:3081
Header file for the VecExpandExpr base class.
Band specialization for dense matrices.
Header file for the MatMatMapExpr base class.
Header file for the default transpose flag for all vectors of the Blaze library.
bool isIntact(const DiagonalMatrix< MT, SO, DF > &m)
Returns whether the invariants of the given diagonal matrix are intact.
Definition: DiagonalMatrix.h:263
bool isDefault(const DiagonalProxy< MT > &proxy)
Returns whether the represented element is in default state.
Definition: DiagonalProxy.h:631
Header file for the Minimum class template.
Header file for the MatScalarDivExpr base class.
Header file for the IsRestricted type trait.
Header file for the Size type trait.
#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 TrueType type/value trait base class.
Header file for the implementation of the BandData class template.
Header file for the function trace functionality.
decltype(auto) map(const DenseMatrix< MT1, SO > &lhs, const DenseMatrix< MT2, SO > &rhs, OP op)
Evaluates the given binary operation on each single element of the dense matrices lhs and rhs...
Definition: DMatDMatMapExpr.h:1110