StrictlyLowerMatrix.h
Go to the documentation of this file.
1 //=================================================================================================
33 //=================================================================================================
34 
35 #ifndef _BLAZE_MATH_ADAPTORS_STRICTLYLOWERMATRIX_H_
36 #define _BLAZE_MATH_ADAPTORS_STRICTLYLOWERMATRIX_H_
37 
38 
39 //*************************************************************************************************
40 // Includes
41 //*************************************************************************************************
42 
49 #include <blaze/math/Forward.h>
50 #include <blaze/math/Functions.h>
74 #include <blaze/util/Assert.h>
75 #include <blaze/util/EnableIf.h>
77 #include <blaze/util/TrueType.h>
79 #include <blaze/util/Unused.h>
80 
81 
82 namespace blaze {
83 
84 //=================================================================================================
85 //
86 // STRICTLYLOWERMATRIX OPERATORS
87 //
88 //=================================================================================================
89 
90 //*************************************************************************************************
93 template< typename MT, bool SO, bool DF >
94 inline void reset( StrictlyLowerMatrix<MT,SO,DF>& m );
95 
96 template< typename MT, bool SO, bool DF >
97 inline void reset( StrictlyLowerMatrix<MT,SO,DF>& m, size_t i );
98 
99 template< typename MT, bool SO, bool DF >
100 inline void clear( StrictlyLowerMatrix<MT,SO,DF>& m );
101 
102 template< bool RF, typename MT, bool SO, bool DF >
103 inline bool isDefault( const StrictlyLowerMatrix<MT,SO,DF>& m );
104 
105 template< typename MT, bool SO, bool DF >
106 inline bool isIntact( const StrictlyLowerMatrix<MT,SO,DF>& m );
107 
108 template< typename MT, bool SO, bool DF >
109 inline void swap( StrictlyLowerMatrix<MT,SO,DF>& a, StrictlyLowerMatrix<MT,SO,DF>& b ) noexcept;
111 //*************************************************************************************************
112 
113 
114 //*************************************************************************************************
121 template< typename MT // Type of the adapted matrix
122  , bool SO // Storage order of the adapted matrix
123  , bool DF > // Density flag
125 {
126  m.reset();
127 }
128 //*************************************************************************************************
129 
130 
131 //*************************************************************************************************
144 template< typename MT // Type of the adapted matrix
145  , bool SO // Storage order of the adapted matrix
146  , bool DF > // Density flag
147 inline void reset( StrictlyLowerMatrix<MT,SO,DF>& m, size_t i )
148 {
149  m.reset( i );
150 }
151 //*************************************************************************************************
152 
153 
154 //*************************************************************************************************
161 template< typename MT // Type of the adapted matrix
162  , bool SO // Storage order of the adapted matrix
163  , bool DF > // Density flag
165 {
166  m.clear();
167 }
168 //*************************************************************************************************
169 
170 
171 //*************************************************************************************************
182 template< bool RF // Relaxation flag
183  , typename MT // Type of the adapted matrix
184  , bool SO // Storage order of the adapted matrix
185  , bool DF > // Density flag
186 inline bool isDefault_backend( const StrictlyLowerMatrix<MT,SO,DF>& m, TrueType )
187 {
188  return ( m.rows() == 0UL );
189 }
191 //*************************************************************************************************
192 
193 
194 //*************************************************************************************************
205 template< bool RF // Relaxation flag
206  , typename MT // Type of the adapted matrix
207  , bool SO // Storage order of the adapted matrix
208  , bool DF > // Density flag
209 inline bool isDefault_backend( const StrictlyLowerMatrix<MT,SO,DF>& m, FalseType )
210 {
211  if( SO ) {
212  for( size_t j=0UL; j<m.columns(); ++j ) {
213  for( size_t i=j+1UL; i<m.rows(); ++i ) {
214  if( !isDefault<RF>( m(i,j) ) )
215  return false;
216  }
217  }
218  }
219  else {
220  for( size_t i=1UL; i<m.rows(); ++i ) {
221  for( size_t j=0UL; j<i; ++j ) {
222  if( !isDefault<RF>( m(i,j) ) )
223  return false;
224  }
225  }
226  }
227 
228  return true;
229 }
231 //*************************************************************************************************
232 
233 
234 //*************************************************************************************************
260 template< bool RF // Relaxation flag
261  , typename MT // Type of the adapted matrix
262  , bool SO // Storage order of the adapted matrix
263  , bool DF > // Density flag
265 {
266  return isDefault_backend<RF>( m, typename IsResizable<MT>::Type() );
267 }
268 //*************************************************************************************************
269 
270 
271 //*************************************************************************************************
292 template< typename MT // Type of the adapted matrix
293  , bool SO // Storage order of the adapted matrix
294  , bool DF > // Density flag
296 {
297  return m.isIntact();
298 }
299 //*************************************************************************************************
300 
301 
302 //*************************************************************************************************
310 template< typename MT // Type of the adapted matrix
311  , bool SO // Storage order of the adapted matrix
312  , bool DF > // Density flag
314 {
315  a.swap( b );
316 }
317 //*************************************************************************************************
318 
319 
320 //*************************************************************************************************
337 template< typename MT // Type of the adapted matrix
338  , bool SO // Storage order of the adapted matrix
339  , bool DF // Density flag
340  , typename VT > // Type of the right-hand side dense vector
341 inline bool tryAssign( const StrictlyLowerMatrix<MT,SO,DF>& lhs,
342  const DenseVector<VT,false>& rhs, size_t row, size_t column )
343 {
345 
346  BLAZE_INTERNAL_ASSERT( row <= lhs.rows(), "Invalid row access index" );
347  BLAZE_INTERNAL_ASSERT( column <= lhs.columns(), "Invalid column access index" );
348  BLAZE_INTERNAL_ASSERT( (~rhs).size() <= lhs.rows() - row, "Invalid number of rows" );
349 
350  UNUSED_PARAMETER( lhs );
351 
352  if( column < row )
353  return true;
354 
355  const size_t iend( min( column - row + 1UL, (~rhs).size() ) );
356 
357  for( size_t i=0UL; i<iend; ++i ) {
358  if( !isDefault( (~rhs)[i] ) )
359  return false;
360  }
361 
362  return true;
363 }
365 //*************************************************************************************************
366 
367 
368 //*************************************************************************************************
385 template< typename MT // Type of the adapted matrix
386  , bool SO // Storage order of the adapted matrix
387  , bool DF // Density flag
388  , typename VT > // Type of the right-hand side dense vector
389 inline bool tryAssign( const StrictlyLowerMatrix<MT,SO,DF>& lhs,
390  const DenseVector<VT,true>& rhs, size_t row, size_t column )
391 {
393 
394  BLAZE_INTERNAL_ASSERT( row <= lhs.rows(), "Invalid row access index" );
395  BLAZE_INTERNAL_ASSERT( column <= lhs.columns(), "Invalid column access index" );
396  BLAZE_INTERNAL_ASSERT( (~rhs).size() <= lhs.columns() - column, "Invalid number of columns" );
397 
398  UNUSED_PARAMETER( lhs );
399 
400  const size_t ibegin( ( row <= column )?( 0UL ):( row - column ) );
401 
402  for( size_t i=ibegin; i<(~rhs).size(); ++i ) {
403  if( !isDefault( (~rhs)[i] ) )
404  return false;
405  }
406 
407  return true;
408 }
410 //*************************************************************************************************
411 
412 
413 //*************************************************************************************************
430 template< typename MT // Type of the adapted matrix
431  , bool SO // Storage order of the adapted matrix
432  , bool DF // Density flag
433  , typename VT > // Type of the right-hand side sparse vector
434 inline bool tryAssign( const StrictlyLowerMatrix<MT,SO,DF>& lhs,
435  const SparseVector<VT,false>& rhs, size_t row, size_t column )
436 {
438 
439  BLAZE_INTERNAL_ASSERT( row <= lhs.rows(), "Invalid row access index" );
440  BLAZE_INTERNAL_ASSERT( column <= lhs.columns(), "Invalid column access index" );
441  BLAZE_INTERNAL_ASSERT( (~rhs).size() <= lhs.rows() - row, "Invalid number of rows" );
442 
443  UNUSED_PARAMETER( lhs );
444 
445  typedef typename VT::ConstIterator RhsIterator;
446 
447  if( column < row )
448  return true;
449 
450  const RhsIterator last( (~rhs).lowerBound( column - row + 1UL ) );
451 
452  for( RhsIterator element=(~rhs).begin(); element!=last; ++element ) {
453  if( !isDefault( element->value() ) )
454  return false;
455  }
456 
457  return true;
458 }
460 //*************************************************************************************************
461 
462 
463 //*************************************************************************************************
480 template< typename MT // Type of the adapted matrix
481  , bool SO // Storage order of the adapted matrix
482  , bool DF // Density flag
483  , typename VT > // Type of the right-hand side sparse vector
484 inline bool tryAssign( const StrictlyLowerMatrix<MT,SO,DF>& lhs,
485  const SparseVector<VT,true>& rhs, size_t row, size_t column )
486 {
488 
489  BLAZE_INTERNAL_ASSERT( row <= lhs.rows(), "Invalid row access index" );
490  BLAZE_INTERNAL_ASSERT( column <= lhs.columns(), "Invalid column access index" );
491  BLAZE_INTERNAL_ASSERT( (~rhs).size() <= lhs.columns() - column, "Invalid number of columns" );
492 
493  UNUSED_PARAMETER( lhs );
494 
495  typedef typename VT::ConstIterator RhsIterator;
496 
497  const RhsIterator last( (~rhs).end() );
498  RhsIterator element( (~rhs).lowerBound( ( row <= column )?( 0UL ):( row - column ) ) );
499 
500  for( ; element!=last; ++element ) {
501  if( !isDefault( element->value() ) )
502  return false;
503  }
504 
505  return true;
506 }
508 //*************************************************************************************************
509 
510 
511 //*************************************************************************************************
528 template< typename MT1 // Type of the adapted matrix
529  , bool SO // Storage order of the adapted matrix
530  , bool DF // Density flag
531  , typename MT2 > // Type of the right-hand side dense matrix
532 inline bool tryAssign( const StrictlyLowerMatrix<MT1,SO,DF>& lhs,
533  const DenseMatrix<MT2,false>& rhs, size_t row, size_t column )
534 {
536 
537  BLAZE_INTERNAL_ASSERT( row <= lhs.rows(), "Invalid row access index" );
538  BLAZE_INTERNAL_ASSERT( column <= lhs.columns(), "Invalid column access index" );
539  BLAZE_INTERNAL_ASSERT( (~rhs).rows() <= lhs.rows() - row, "Invalid number of rows" );
540  BLAZE_INTERNAL_ASSERT( (~rhs).columns() <= lhs.columns() - column, "Invalid number of columns" );
541 
542  UNUSED_PARAMETER( lhs );
543 
544  const size_t M( (~rhs).rows() );
545  const size_t N( (~rhs).columns() );
546 
547  if( row + 1UL >= column + N )
548  return true;
549 
550  const size_t iend( min( column + N - row, M ) );
551 
552  for( size_t i=0UL; i<iend; ++i )
553  {
554  const bool containsDiagonal( row + i >= column );
555  const size_t jbegin( ( containsDiagonal )?( row + i - column ):( 0UL ) );
556 
557  for( size_t j=jbegin; j<N; ++j ) {
558  if( !isDefault( (~rhs)(i,j) ) )
559  return false;
560  }
561  }
562 
563  return true;
564 }
566 //*************************************************************************************************
567 
568 
569 //*************************************************************************************************
586 template< typename MT1 // Type of the adapted matrix
587  , bool SO // Storage order of the adapted matrix
588  , bool DF // Density flag
589  , typename MT2 > // Type of the right-hand side dense matrix
590 inline bool tryAssign( const StrictlyLowerMatrix<MT1,SO,DF>& lhs,
591  const DenseMatrix<MT2,true>& rhs, size_t row, size_t column )
592 {
594 
595  BLAZE_INTERNAL_ASSERT( row <= lhs.rows(), "Invalid row access index" );
596  BLAZE_INTERNAL_ASSERT( column <= lhs.columns(), "Invalid column access index" );
597  BLAZE_INTERNAL_ASSERT( (~rhs).rows() <= lhs.rows() - row, "Invalid number of rows" );
598  BLAZE_INTERNAL_ASSERT( (~rhs).columns() <= lhs.columns() - column, "Invalid number of columns" );
599 
600  UNUSED_PARAMETER( lhs );
601 
602  const size_t M( (~rhs).rows() );
603  const size_t N( (~rhs).columns() );
604 
605  if( row + 1UL >= column + N )
606  return true;
607 
608  const size_t jbegin( ( row <= column )?( 0UL ):( row - column ) );
609 
610  for( size_t j=jbegin; j<N; ++j )
611  {
612  const size_t iend( min( column + j - row + 1UL, M ) );
613 
614  for( size_t i=0UL; i<iend; ++i ) {
615  if( !isDefault( (~rhs)(i,j) ) )
616  return false;
617  }
618  }
619 
620  return true;
621 }
623 //*************************************************************************************************
624 
625 
626 //*************************************************************************************************
643 template< typename MT1 // Type of the adapted matrix
644  , bool SO // Storage order of the adapted matrix
645  , bool DF // Density flag
646  , typename MT2 > // Type of the right-hand side sparse matrix
647 inline bool tryAssign( const StrictlyLowerMatrix<MT1,SO,DF>& lhs,
648  const SparseMatrix<MT2,false>& rhs, size_t row, size_t column )
649 {
651 
652  BLAZE_INTERNAL_ASSERT( row <= lhs.rows(), "Invalid row access index" );
653  BLAZE_INTERNAL_ASSERT( column <= lhs.columns(), "Invalid column access index" );
654  BLAZE_INTERNAL_ASSERT( (~rhs).rows() <= lhs.rows() - row, "Invalid number of rows" );
655  BLAZE_INTERNAL_ASSERT( (~rhs).columns() <= lhs.columns() - column, "Invalid number of columns" );
656 
657  UNUSED_PARAMETER( lhs );
658 
659  typedef typename MT2::ConstIterator RhsIterator;
660 
661  const size_t M( (~rhs).rows() );
662  const size_t N( (~rhs).columns() );
663 
664  if( row + 1UL >= column + N )
665  return true;
666 
667  const size_t iend( min( column + N - row, M ) );
668 
669  for( size_t i=0UL; i<iend; ++i )
670  {
671  const bool containsDiagonal( row + i >= column );
672  const size_t index( ( containsDiagonal )?( row + i - column ):( 0UL ) );
673 
674  const RhsIterator last( (~rhs).end(i) );
675  RhsIterator element( (~rhs).lowerBound( i, index ) );
676 
677  for( ; element!=last; ++element ) {
678  if( !isDefault( element->value() ) )
679  return false;
680  }
681  }
682 
683  return true;
684 }
686 //*************************************************************************************************
687 
688 
689 //*************************************************************************************************
706 template< typename MT1 // Type of the adapted matrix
707  , bool SO // Storage order of the adapted matrix
708  , bool DF // Density flag
709  , typename MT2 > // Type of the right-hand side sparse matrix
710 inline bool tryAssign( const StrictlyLowerMatrix<MT1,SO,DF>& lhs,
711  const SparseMatrix<MT2,true>& rhs, size_t row, size_t column )
712 {
714 
715  BLAZE_INTERNAL_ASSERT( row <= lhs.rows(), "Invalid row access index" );
716  BLAZE_INTERNAL_ASSERT( column <= lhs.columns(), "Invalid column access index" );
717  BLAZE_INTERNAL_ASSERT( (~rhs).rows() <= lhs.rows() - row, "Invalid number of rows" );
718  BLAZE_INTERNAL_ASSERT( (~rhs).columns() <= lhs.columns() - column, "Invalid number of columns" );
719 
720  UNUSED_PARAMETER( lhs );
721 
722  typedef typename MT2::ConstIterator RhsIterator;
723 
724  const size_t M( (~rhs).rows() );
725  const size_t N( (~rhs).columns() );
726 
727  if( row + 1UL >= column + N )
728  return true;
729 
730  const size_t jbegin( ( row < column )?( 0UL ):( row - column ) );
731 
732  for( size_t j=jbegin; j<N; ++j )
733  {
734  const size_t index( column + j - row + 1UL );
735  const RhsIterator last( (~rhs).lowerBound( min( index, M ), j ) );
736 
737  for( RhsIterator element=(~rhs).begin(j); element!=last; ++element ) {
738  if( !isDefault( element->value() ) )
739  return false;
740  }
741  }
742 
743  return true;
744 }
746 //*************************************************************************************************
747 
748 
749 //*************************************************************************************************
766 template< typename MT // Type of the adapted matrix
767  , bool SO // Storage order of the adapted matrix
768  , bool DF // Density flag
769  , typename VT // Type of the right-hand side vector
770  , bool TF > // Transpose flag of the right-hand side vector
771 inline bool tryAddAssign( const StrictlyLowerMatrix<MT,SO,DF>& lhs,
772  const Vector<VT,TF>& rhs, size_t row, size_t column )
773 {
774  return tryAssign( lhs, ~rhs, row, column );
775 }
777 //*************************************************************************************************
778 
779 
780 //*************************************************************************************************
797 template< typename MT1 // Type of the adapted matrix
798  , bool SO1 // Storage order of the adapted matrix
799  , bool DF // Density flag
800  , typename MT2 // Type of the right-hand side matrix
801  , bool SO2 > // Storage order of the right-hand side matrix
802 inline bool tryAddAssign( const StrictlyLowerMatrix<MT1,SO1,DF>& lhs,
803  const Matrix<MT2,SO2>& rhs, size_t row, size_t column )
804 {
805  return tryAssign( lhs, ~rhs, row, column );
806 }
808 //*************************************************************************************************
809 
810 
811 //*************************************************************************************************
828 template< typename MT // Type of the adapted matrix
829  , bool SO // Storage order of the adapted matrix
830  , bool DF // Density flag
831  , typename VT // Type of the right-hand side vector
832  , bool TF > // Transpose flag of the right-hand side vector
833 inline bool trySubAssign( const StrictlyLowerMatrix<MT,SO,DF>& lhs,
834  const Vector<VT,TF>& rhs, size_t row, size_t column )
835 {
836  return tryAssign( lhs, ~rhs, row, column );
837 }
839 //*************************************************************************************************
840 
841 
842 //*************************************************************************************************
859 template< typename MT1 // Type of the adapted matrix
860  , bool SO1 // Storage order of the adapted matrix
861  , bool DF // Density flag
862  , typename MT2 // Type of the right-hand side matrix
863  , bool SO2 > // Storage order of the right-hand side matrix
864 inline bool trySubAssign( const StrictlyLowerMatrix<MT1,SO1,DF>& lhs,
865  const Matrix<MT2,SO2>& rhs, size_t row, size_t column )
866 {
867  return tryAssign( lhs, ~rhs, row, column );
868 }
870 //*************************************************************************************************
871 
872 
873 //*************************************************************************************************
887 template< typename MT // Type of the adapted matrix
888  , bool SO // Storage order of the adapted matrix
889  , bool DF > // Density flag
890 inline MT& derestrict( StrictlyLowerMatrix<MT,SO,DF>& m )
891 {
892  return m.matrix_;
893 }
895 //*************************************************************************************************
896 
897 
898 
899 
900 //=================================================================================================
901 //
902 // ROWS SPECIALIZATIONS
903 //
904 //=================================================================================================
905 
906 //*************************************************************************************************
908 template< typename MT, bool SO, bool DF >
909 struct Rows< StrictlyLowerMatrix<MT,SO,DF> > : public Rows<MT>
910 {};
912 //*************************************************************************************************
913 
914 
915 
916 
917 //=================================================================================================
918 //
919 // COLUMNS SPECIALIZATIONS
920 //
921 //=================================================================================================
922 
923 //*************************************************************************************************
925 template< typename MT, bool SO, bool DF >
926 struct Columns< StrictlyLowerMatrix<MT,SO,DF> > : public Columns<MT>
927 {};
929 //*************************************************************************************************
930 
931 
932 
933 
934 //=================================================================================================
935 //
936 // ISSQUARE SPECIALIZATIONS
937 //
938 //=================================================================================================
939 
940 //*************************************************************************************************
942 template< typename MT, bool SO, bool DF >
943 struct IsSquare< StrictlyLowerMatrix<MT,SO,DF> > : public TrueType
944 {};
946 //*************************************************************************************************
947 
948 
949 
950 
951 //=================================================================================================
952 //
953 // ISSTRICTLYLOWER SPECIALIZATIONS
954 //
955 //=================================================================================================
956 
957 //*************************************************************************************************
959 template< typename MT, bool SO, bool DF >
960 struct IsStrictlyLower< StrictlyLowerMatrix<MT,SO,DF> > : public TrueType
961 {};
963 //*************************************************************************************************
964 
965 
966 
967 
968 //=================================================================================================
969 //
970 // ISADAPTOR SPECIALIZATIONS
971 //
972 //=================================================================================================
973 
974 //*************************************************************************************************
976 template< typename MT, bool SO, bool DF >
977 struct IsAdaptor< StrictlyLowerMatrix<MT,SO,DF> > : public TrueType
978 {};
980 //*************************************************************************************************
981 
982 
983 
984 
985 //=================================================================================================
986 //
987 // ISRESTRICTED SPECIALIZATIONS
988 //
989 //=================================================================================================
990 
991 //*************************************************************************************************
993 template< typename MT, bool SO, bool DF >
994 struct IsRestricted< StrictlyLowerMatrix<MT,SO,DF> > : public TrueType
995 {};
997 //*************************************************************************************************
998 
999 
1000 
1001 
1002 //=================================================================================================
1003 //
1004 // HASCONSTDATAACCESS SPECIALIZATIONS
1005 //
1006 //=================================================================================================
1007 
1008 //*************************************************************************************************
1010 template< typename MT, bool SO >
1011 struct HasConstDataAccess< StrictlyLowerMatrix<MT,SO,true> > : public TrueType
1012 {};
1014 //*************************************************************************************************
1015 
1016 
1017 
1018 
1019 //=================================================================================================
1020 //
1021 // ISALIGNED SPECIALIZATIONS
1022 //
1023 //=================================================================================================
1024 
1025 //*************************************************************************************************
1027 template< typename MT, bool SO, bool DF >
1028 struct IsAligned< StrictlyLowerMatrix<MT,SO,DF> > : public BoolConstant< IsAligned<MT>::value >
1029 {};
1031 //*************************************************************************************************
1032 
1033 
1034 
1035 
1036 //=================================================================================================
1037 //
1038 // ISPADDED SPECIALIZATIONS
1039 //
1040 //=================================================================================================
1041 
1042 //*************************************************************************************************
1044 template< typename MT, bool SO, bool DF >
1045 struct IsPadded< StrictlyLowerMatrix<MT,SO,DF> > : public BoolConstant< IsPadded<MT>::value >
1046 {};
1048 //*************************************************************************************************
1049 
1050 
1051 
1052 
1053 //=================================================================================================
1054 //
1055 // ISRESIZABLE SPECIALIZATIONS
1056 //
1057 //=================================================================================================
1058 
1059 //*************************************************************************************************
1061 template< typename MT, bool SO, bool DF >
1062 struct IsResizable< StrictlyLowerMatrix<MT,SO,DF> > : public BoolConstant< IsResizable<MT>::value >
1063 {};
1065 //*************************************************************************************************
1066 
1067 
1068 
1069 
1070 //=================================================================================================
1071 //
1072 // REMOVEADAPTOR SPECIALIZATIONS
1073 //
1074 //=================================================================================================
1075 
1076 //*************************************************************************************************
1078 template< typename MT, bool SO, bool DF >
1079 struct RemoveAdaptor< StrictlyLowerMatrix<MT,SO,DF> >
1080 {
1081  using Type = MT;
1082 };
1084 //*************************************************************************************************
1085 
1086 
1087 
1088 
1089 //=================================================================================================
1090 //
1091 // DERESTRICTTRAIT SPECIALIZATIONS
1092 //
1093 //=================================================================================================
1094 
1095 //*************************************************************************************************
1097 template< typename MT, bool SO, bool DF >
1098 struct DerestrictTrait< StrictlyLowerMatrix<MT,SO,DF> >
1099 {
1100  using Type = MT&;
1101 };
1103 //*************************************************************************************************
1104 
1105 
1106 
1107 
1108 //=================================================================================================
1109 //
1110 // ADDTRAIT SPECIALIZATIONS
1111 //
1112 //=================================================================================================
1113 
1114 //*************************************************************************************************
1116 template< typename MT, bool SO1, bool DF, typename T, size_t M, size_t N, bool SO2 >
1117 struct AddTrait< StrictlyLowerMatrix<MT,SO1,DF>, StaticMatrix<T,M,N,SO2> >
1118 {
1120 };
1121 
1122 template< typename T, size_t M, size_t N, bool SO1, typename MT, bool SO2, bool DF >
1123 struct AddTrait< StaticMatrix<T,M,N,SO1>, StrictlyLowerMatrix<MT,SO2,DF> >
1124 {
1125  using Type = AddTrait_< StaticMatrix<T,M,N,SO1>, MT >;
1126 };
1127 
1128 template< typename MT, bool SO1, bool DF, typename T, size_t M, size_t N, bool SO2 >
1129 struct AddTrait< StrictlyLowerMatrix<MT,SO1,DF>, HybridMatrix<T,M,N,SO2> >
1130 {
1132 };
1133 
1134 template< typename T, size_t M, size_t N, bool SO1, typename MT, bool SO2, bool DF >
1135 struct AddTrait< HybridMatrix<T,M,N,SO1>, StrictlyLowerMatrix<MT,SO2,DF> >
1136 {
1137  using Type = AddTrait_< HybridMatrix<T,M,N,SO1>, MT >;
1138 };
1139 
1140 template< typename MT, bool SO1, bool DF, typename T, bool SO2 >
1141 struct AddTrait< StrictlyLowerMatrix<MT,SO1,DF>, DynamicMatrix<T,SO2> >
1142 {
1143  using Type = AddTrait_< MT, DynamicMatrix<T,SO2> >;
1144 };
1145 
1146 template< typename T, bool SO1, typename MT, bool SO2, bool DF >
1147 struct AddTrait< DynamicMatrix<T,SO1>, StrictlyLowerMatrix<MT,SO2,DF> >
1148 {
1149  using Type = AddTrait_< DynamicMatrix<T,SO1>, MT >;
1150 };
1151 
1152 template< typename MT, bool SO1, bool DF, typename T, bool AF, bool PF, bool SO2 >
1153 struct AddTrait< StrictlyLowerMatrix<MT,SO1,DF>, CustomMatrix<T,AF,PF,SO2> >
1154 {
1156 };
1157 
1158 template< typename T, bool AF, bool PF, bool SO1, typename MT, bool SO2, bool DF >
1159 struct AddTrait< CustomMatrix<T,AF,PF,SO1>, StrictlyLowerMatrix<MT,SO2,DF> >
1160 {
1161  using Type = AddTrait_< CustomMatrix<T,AF,PF,SO1>, MT >;
1162 };
1163 
1164 template< typename MT, bool SO1, bool DF, typename T, bool SO2 >
1165 struct AddTrait< StrictlyLowerMatrix<MT,SO1,DF>, CompressedMatrix<T,SO2> >
1166 {
1168 };
1169 
1170 template< typename T, bool SO1, typename MT, bool SO2, bool DF >
1171 struct AddTrait< CompressedMatrix<T,SO1>, StrictlyLowerMatrix<MT,SO2,DF> >
1172 {
1173  using Type = AddTrait_< CompressedMatrix<T,SO1>, MT >;
1174 };
1175 
1176 template< typename MT1, bool SO1, bool DF1, typename MT2, bool SO2, bool DF2, bool NF >
1177 struct AddTrait< StrictlyLowerMatrix<MT1,SO1,DF1>, SymmetricMatrix<MT2,SO2,DF2,NF> >
1178 {
1179  using Type = AddTrait_<MT1,MT2>;
1180 };
1181 
1182 template< typename MT1, bool SO1, bool DF1, bool NF, typename MT2, bool SO2, bool DF2 >
1183 struct AddTrait< SymmetricMatrix<MT1,SO1,DF1,NF>, StrictlyLowerMatrix<MT2,SO2,DF2> >
1184 {
1185  using Type = AddTrait_<MT1,MT2>;
1186 };
1187 
1188 template< typename MT1, bool SO1, bool DF1, typename MT2, bool SO2, bool DF2 >
1189 struct AddTrait< StrictlyLowerMatrix<MT1,SO1,DF1>, HermitianMatrix<MT2,SO2,DF2> >
1190 {
1191  using Type = AddTrait_<MT1,MT2>;
1192 };
1193 
1194 template< typename MT1, bool SO1, bool DF1, typename MT2, bool SO2, bool DF2 >
1195 struct AddTrait< HermitianMatrix<MT1,SO1,DF1>, StrictlyLowerMatrix<MT2,SO2,DF2> >
1196 {
1197  using Type = AddTrait_<MT1,MT2>;
1198 };
1199 
1200 template< typename MT1, bool SO1, bool DF1, typename MT2, bool SO2, bool DF2 >
1201 struct AddTrait< StrictlyLowerMatrix<MT1,SO1,DF1>, LowerMatrix<MT2,SO2,DF2> >
1202 {
1203  using Type = LowerMatrix< AddTrait_<MT1,MT2> >;
1204 };
1205 
1206 template< typename MT1, bool SO1, bool DF1, typename MT2, bool SO2, bool DF2 >
1207 struct AddTrait< LowerMatrix<MT1,SO1,DF1>, StrictlyLowerMatrix<MT2,SO2,DF2> >
1208 {
1209  using Type = LowerMatrix< AddTrait_<MT1,MT2> >;
1210 };
1211 
1212 template< typename MT1, bool SO1, bool DF1, typename MT2, bool SO2, bool DF2 >
1213 struct AddTrait< StrictlyLowerMatrix<MT1,SO1,DF1>, UniLowerMatrix<MT2,SO2,DF2> >
1214 {
1215  using Type = UniLowerMatrix< AddTrait_<MT1,MT2> >;
1216 };
1217 
1218 template< typename MT1, bool SO1, bool DF1, typename MT2, bool SO2, bool DF2 >
1219 struct AddTrait< UniLowerMatrix<MT1,SO1,DF1>, StrictlyLowerMatrix<MT2,SO2,DF2> >
1220 {
1221  using Type = UniLowerMatrix< AddTrait_<MT1,MT2> >;
1222 };
1223 
1224 template< typename MT1, bool SO1, bool DF1, typename MT2, bool SO2, bool DF2 >
1225 struct AddTrait< StrictlyLowerMatrix<MT1,SO1,DF1>, StrictlyLowerMatrix<MT2,SO2,DF2> >
1226 {
1228 };
1230 //*************************************************************************************************
1231 
1232 
1233 
1234 
1235 //=================================================================================================
1236 //
1237 // SUBTRAIT SPECIALIZATIONS
1238 //
1239 //=================================================================================================
1240 
1241 //*************************************************************************************************
1243 template< typename MT, bool SO1, bool DF, typename T, size_t M, size_t N, bool SO2 >
1244 struct SubTrait< StrictlyLowerMatrix<MT,SO1,DF>, StaticMatrix<T,M,N,SO2> >
1245 {
1247 };
1248 
1249 template< typename T, size_t M, size_t N, bool SO1, typename MT, bool SO2, bool DF >
1250 struct SubTrait< StaticMatrix<T,M,N,SO1>, StrictlyLowerMatrix<MT,SO2,DF> >
1251 {
1252  using Type = SubTrait_< StaticMatrix<T,M,N,SO1>, MT >;
1253 };
1254 
1255 template< typename MT, bool SO1, bool DF, typename T, size_t M, size_t N, bool SO2 >
1256 struct SubTrait< StrictlyLowerMatrix<MT,SO1,DF>, HybridMatrix<T,M,N,SO2> >
1257 {
1259 };
1260 
1261 template< typename T, size_t M, size_t N, bool SO1, typename MT, bool SO2, bool DF >
1262 struct SubTrait< HybridMatrix<T,M,N,SO1>, StrictlyLowerMatrix<MT,SO2,DF> >
1263 {
1264  using Type = SubTrait_< HybridMatrix<T,M,N,SO1>, MT >;
1265 };
1266 
1267 template< typename MT, bool SO1, bool DF, typename T, bool SO2 >
1268 struct SubTrait< StrictlyLowerMatrix<MT,SO1,DF>, DynamicMatrix<T,SO2> >
1269 {
1270  using Type = SubTrait_< MT, DynamicMatrix<T,SO2> >;
1271 };
1272 
1273 template< typename T, bool SO1, typename MT, bool SO2, bool DF >
1274 struct SubTrait< DynamicMatrix<T,SO1>, StrictlyLowerMatrix<MT,SO2,DF> >
1275 {
1276  using Type = SubTrait_< DynamicMatrix<T,SO1>, MT >;
1277 };
1278 
1279 template< typename MT, bool SO1, bool DF, typename T, bool AF, bool PF, bool SO2 >
1280 struct SubTrait< StrictlyLowerMatrix<MT,SO1,DF>, CustomMatrix<T,AF,PF,SO2> >
1281 {
1283 };
1284 
1285 template< typename T, bool AF, bool PF, bool SO1, typename MT, bool SO2, bool DF >
1286 struct SubTrait< CustomMatrix<T,AF,PF,SO1>, StrictlyLowerMatrix<MT,SO2,DF> >
1287 {
1288  using Type = SubTrait_< CustomMatrix<T,AF,PF,SO1>, MT >;
1289 };
1290 
1291 template< typename MT, bool SO1, bool DF, typename T, bool SO2 >
1292 struct SubTrait< StrictlyLowerMatrix<MT,SO1,DF>, CompressedMatrix<T,SO2> >
1293 {
1295 };
1296 
1297 template< typename T, bool SO1, typename MT, bool SO2, bool DF >
1298 struct SubTrait< CompressedMatrix<T,SO1>, StrictlyLowerMatrix<MT,SO2,DF> >
1299 {
1300  using Type = SubTrait_< CompressedMatrix<T,SO1>, MT >;
1301 };
1302 
1303 template< typename MT1, bool SO1, bool DF1, typename MT2, bool SO2, bool DF2, bool NF >
1304 struct SubTrait< StrictlyLowerMatrix<MT1,SO1,DF1>, SymmetricMatrix<MT2,SO2,DF2,NF> >
1305 {
1306  using Type = SubTrait_<MT1,MT2>;
1307 };
1308 
1309 template< typename MT1, bool SO1, bool DF1, bool NF, typename MT2, bool SO2, bool DF2 >
1310 struct SubTrait< SymmetricMatrix<MT1,SO1,DF1,NF>, StrictlyLowerMatrix<MT2,SO2,DF2> >
1311 {
1312  using Type = SubTrait_<MT1,MT2>;
1313 };
1314 
1315 template< typename MT1, bool SO1, bool DF1, typename MT2, bool SO2, bool DF2 >
1316 struct SubTrait< StrictlyLowerMatrix<MT1,SO1,DF1>, HermitianMatrix<MT2,SO2,DF2> >
1317 {
1318  using Type = SubTrait_<MT1,MT2>;
1319 };
1320 
1321 template< typename MT1, bool SO1, bool DF1, typename MT2, bool SO2, bool DF2 >
1322 struct SubTrait< HermitianMatrix<MT1,SO1,DF1>, StrictlyLowerMatrix<MT2,SO2,DF2> >
1323 {
1324  using Type = SubTrait_<MT1,MT2>;
1325 };
1326 
1327 template< typename MT1, bool SO1, bool DF1, typename MT2, bool SO2, bool DF2 >
1328 struct SubTrait< StrictlyLowerMatrix<MT1,SO1,DF1>, LowerMatrix<MT2,SO2,DF2> >
1329 {
1330  using Type = LowerMatrix< SubTrait_<MT1,MT2> >;
1331 };
1332 
1333 template< typename MT1, bool SO1, bool DF1, typename MT2, bool SO2, bool DF2 >
1334 struct SubTrait< LowerMatrix<MT1,SO1,DF1>, StrictlyLowerMatrix<MT2,SO2,DF2> >
1335 {
1336  using Type = LowerMatrix< SubTrait_<MT1,MT2> >;
1337 };
1338 
1339 template< typename MT1, bool SO1, bool DF1, typename MT2, bool SO2, bool DF2 >
1340 struct SubTrait< StrictlyLowerMatrix<MT1,SO1,DF1>, UniLowerMatrix<MT2,SO2,DF2> >
1341 {
1342  using Type = LowerMatrix< SubTrait_<MT1,MT2> >;
1343 };
1344 
1345 template< typename MT1, bool SO1, bool DF1, typename MT2, bool SO2, bool DF2 >
1346 struct SubTrait< UniLowerMatrix<MT1,SO1,DF1>, StrictlyLowerMatrix<MT2,SO2,DF2> >
1347 {
1348  using Type = UniLowerMatrix< SubTrait_<MT1,MT2> >;
1349 };
1350 
1351 template< typename MT1, bool SO1, bool DF1, typename MT2, bool SO2, bool DF2 >
1352 struct SubTrait< StrictlyLowerMatrix<MT1,SO1,DF1>, StrictlyLowerMatrix<MT2,SO2,DF2> >
1353 {
1355 };
1357 //*************************************************************************************************
1358 
1359 
1360 
1361 
1362 //=================================================================================================
1363 //
1364 // MULTTRAIT SPECIALIZATIONS
1365 //
1366 //=================================================================================================
1367 
1368 //*************************************************************************************************
1370 template< typename MT, bool SO, bool DF, typename T >
1371 struct MultTrait< StrictlyLowerMatrix<MT,SO,DF>, T, EnableIf_< IsNumeric<T> > >
1372 {
1374 };
1375 
1376 template< typename T, typename MT, bool SO, bool DF >
1377 struct MultTrait< T, StrictlyLowerMatrix<MT,SO,DF>, EnableIf_< IsNumeric<T> > >
1378 {
1380 };
1381 
1382 template< typename MT, bool SO, bool DF, typename T, size_t N >
1383 struct MultTrait< StrictlyLowerMatrix<MT,SO,DF>, StaticVector<T,N,false> >
1384 {
1386 };
1387 
1388 template< typename T, size_t N, typename MT, bool SO, bool DF >
1389 struct MultTrait< StaticVector<T,N,true>, StrictlyLowerMatrix<MT,SO,DF> >
1390 {
1391  using Type = MultTrait_< StaticVector<T,N,true>, MT >;
1392 };
1393 
1394 template< typename MT, bool SO, bool DF, typename T, size_t N >
1395 struct MultTrait< StrictlyLowerMatrix<MT,SO,DF>, HybridVector<T,N,false> >
1396 {
1398 };
1399 
1400 template< typename T, size_t N, typename MT, bool SO, bool DF >
1401 struct MultTrait< HybridVector<T,N,true>, StrictlyLowerMatrix<MT,SO,DF> >
1402 {
1403  using Type = MultTrait_< HybridVector<T,N,true>, MT >;
1404 };
1405 
1406 template< typename MT, bool SO, bool DF, typename T >
1407 struct MultTrait< StrictlyLowerMatrix<MT,SO,DF>, DynamicVector<T,false> >
1408 {
1410 };
1411 
1412 template< typename T, typename MT, bool SO, bool DF >
1413 struct MultTrait< DynamicVector<T,true>, StrictlyLowerMatrix<MT,SO,DF> >
1414 {
1415  using Type = MultTrait_< DynamicVector<T,true>, MT >;
1416 };
1417 
1418 template< typename MT, bool SO, bool DF, typename T, bool AF, bool PF >
1419 struct MultTrait< StrictlyLowerMatrix<MT,SO,DF>, CustomVector<T,AF,PF,false> >
1420 {
1422 };
1423 
1424 template< typename T, bool AF, bool PF, typename MT, bool SO, bool DF >
1425 struct MultTrait< CustomVector<T,AF,PF,true>, StrictlyLowerMatrix<MT,SO,DF> >
1426 {
1427  using Type = MultTrait_< CustomVector<T,AF,PF,true>, MT >;
1428 };
1429 
1430 template< typename MT, bool SO, bool DF, typename T >
1431 struct MultTrait< StrictlyLowerMatrix<MT,SO,DF>, CompressedVector<T,false> >
1432 {
1434 };
1435 
1436 template< typename T, typename MT, bool SO, bool DF >
1437 struct MultTrait< CompressedVector<T,true>, StrictlyLowerMatrix<MT,SO,DF> >
1438 {
1439  using Type = MultTrait_< CompressedVector<T,true>, MT >;
1440 };
1441 
1442 template< typename MT, bool SO1, bool DF, typename T, size_t M, size_t N, bool SO2 >
1443 struct MultTrait< StrictlyLowerMatrix<MT,SO1,DF>, StaticMatrix<T,M,N,SO2> >
1444 {
1446 };
1447 
1448 template< typename T, size_t M, size_t N, bool SO1, typename MT, bool SO2, bool DF >
1449 struct MultTrait< StaticMatrix<T,M,N,SO1>, StrictlyLowerMatrix<MT,SO2,DF> >
1450 {
1451  using Type = MultTrait_< StaticMatrix<T,M,N,SO1>, MT >;
1452 };
1453 
1454 template< typename MT, bool SO1, bool DF, typename T, size_t M, size_t N, bool SO2 >
1455 struct MultTrait< StrictlyLowerMatrix<MT,SO1,DF>, HybridMatrix<T,M,N,SO2> >
1456 {
1458 };
1459 
1460 template< typename T, size_t M, size_t N, bool SO1, typename MT, bool SO2, bool DF >
1461 struct MultTrait< HybridMatrix<T,M,N,SO1>, StrictlyLowerMatrix<MT,SO2,DF> >
1462 {
1463  using Type = MultTrait_< HybridMatrix<T,M,N,SO1>, MT >;
1464 };
1465 
1466 template< typename MT, bool SO1, bool DF, typename T, bool SO2 >
1467 struct MultTrait< StrictlyLowerMatrix<MT,SO1,DF>, DynamicMatrix<T,SO2> >
1468 {
1469  using Type = MultTrait_< MT, DynamicMatrix<T,SO2> >;
1470 };
1471 
1472 template< typename T, bool SO1, typename MT, bool SO2, bool DF >
1473 struct MultTrait< DynamicMatrix<T,SO1>, StrictlyLowerMatrix<MT,SO2,DF> >
1474 {
1475  using Type = MultTrait_< DynamicMatrix<T,SO1>, MT >;
1476 };
1477 
1478 template< typename MT, bool SO1, bool DF, typename T, bool AF, bool PF, bool SO2 >
1479 struct MultTrait< StrictlyLowerMatrix<MT,SO1,DF>, CustomMatrix<T,AF,PF,SO2> >
1480 {
1482 };
1483 
1484 template< typename T, bool AF, bool PF, bool SO1, typename MT, bool SO2, bool DF >
1485 struct MultTrait< CustomMatrix<T,AF,PF,SO1>, StrictlyLowerMatrix<MT,SO2,DF> >
1486 {
1487  using Type = MultTrait_< CustomMatrix<T,AF,PF,SO1>, MT >;
1488 };
1489 
1490 template< typename MT, bool SO1, bool DF, typename T, bool SO2 >
1491 struct MultTrait< StrictlyLowerMatrix<MT,SO1,DF>, CompressedMatrix<T,SO2> >
1492 {
1494 };
1495 
1496 template< typename T, bool SO1, typename MT, bool SO2, bool DF >
1497 struct MultTrait< CompressedMatrix<T,SO1>, StrictlyLowerMatrix<MT,SO2,DF> >
1498 {
1499  using Type = MultTrait_< CompressedMatrix<T,SO1>, MT >;
1500 };
1501 
1502 template< typename MT1, bool SO1, bool DF1, typename MT2, bool SO2, bool DF2, bool NF >
1503 struct MultTrait< StrictlyLowerMatrix<MT1,SO1,DF1>, SymmetricMatrix<MT2,SO2,DF2,NF> >
1504 {
1505  using Type = MultTrait_<MT1,MT2>;
1506 };
1507 
1508 template< typename MT1, bool SO1, bool DF1, bool NF, typename MT2, bool SO2, bool DF2 >
1509 struct MultTrait< SymmetricMatrix<MT1,SO1,DF1,NF>, StrictlyLowerMatrix<MT2,SO2,DF2> >
1510 {
1511  using Type = MultTrait_<MT1,MT2>;
1512 };
1513 
1514 template< typename MT1, bool SO1, bool DF1, typename MT2, bool SO2, bool DF2 >
1515 struct MultTrait< StrictlyLowerMatrix<MT1,SO1,DF1>, HermitianMatrix<MT2,SO2,DF2> >
1516 {
1517  using Type = MultTrait_<MT1,MT2>;
1518 };
1519 
1520 template< typename MT1, bool SO1, bool DF1, typename MT2, bool SO2, bool DF2 >
1521 struct MultTrait< HermitianMatrix<MT1,SO1,DF1>, StrictlyLowerMatrix<MT2,SO2,DF2> >
1522 {
1523  using Type = MultTrait_<MT1,MT2>;
1524 };
1525 
1526 template< typename MT1, bool SO1, bool DF1, typename MT2, bool SO2, bool DF2 >
1527 struct MultTrait< StrictlyLowerMatrix<MT1,SO1,DF1>, LowerMatrix<MT2,SO2,DF2> >
1528 {
1530 };
1531 
1532 template< typename MT1, bool SO1, bool DF1, typename MT2, bool SO2, bool DF2 >
1533 struct MultTrait< LowerMatrix<MT1,SO1,DF1>, StrictlyLowerMatrix<MT2,SO2,DF2> >
1534 {
1536 };
1537 
1538 template< typename MT1, bool SO1, bool DF1, typename MT2, bool SO2, bool DF2 >
1539 struct MultTrait< StrictlyLowerMatrix<MT1,SO1,DF1>, UniLowerMatrix<MT2,SO2,DF2> >
1540 {
1542 };
1543 
1544 template< typename MT1, bool SO1, bool DF1, typename MT2, bool SO2, bool DF2 >
1545 struct MultTrait< UniLowerMatrix<MT1,SO1,DF1>, StrictlyLowerMatrix<MT2,SO2,DF2> >
1546 {
1548 };
1549 
1550 template< typename MT1, bool SO1, bool DF1, typename MT2, bool SO2, bool DF2 >
1551 struct MultTrait< StrictlyLowerMatrix<MT1,SO1,DF1>, StrictlyLowerMatrix<MT2,SO2,DF2> >
1552 {
1554 };
1556 //*************************************************************************************************
1557 
1558 
1559 
1560 
1561 //=================================================================================================
1562 //
1563 // DIVTRAIT SPECIALIZATIONS
1564 //
1565 //=================================================================================================
1566 
1567 //*************************************************************************************************
1569 template< typename MT, bool SO, bool DF, typename T >
1570 struct DivTrait< StrictlyLowerMatrix<MT,SO,DF>, T, EnableIf_< IsNumeric<T> > >
1571 {
1572  using Type = StrictlyLowerMatrix< DivTrait_<MT,T> >;
1573 };
1575 //*************************************************************************************************
1576 
1577 
1578 
1579 
1580 //=================================================================================================
1581 //
1582 // FOREACHTRAIT SPECIALIZATIONS
1583 //
1584 //=================================================================================================
1585 
1586 //*************************************************************************************************
1588 template< typename MT, bool SO, bool DF >
1589 struct ForEachTrait< StrictlyLowerMatrix<MT,SO,DF>, Abs >
1590 {
1592 };
1593 
1594 template< typename MT, bool SO, bool DF >
1595 struct ForEachTrait< StrictlyLowerMatrix<MT,SO,DF>, Floor >
1596 {
1598 };
1599 
1600 template< typename MT, bool SO, bool DF >
1601 struct ForEachTrait< StrictlyLowerMatrix<MT,SO,DF>, Ceil >
1602 {
1604 };
1605 
1606 template< typename MT, bool SO, bool DF >
1607 struct ForEachTrait< StrictlyLowerMatrix<MT,SO,DF>, Conj >
1608 {
1610 };
1611 
1612 template< typename MT, bool SO, bool DF >
1613 struct ForEachTrait< StrictlyLowerMatrix<MT,SO,DF>, Real >
1614 {
1616 };
1617 
1618 template< typename MT, bool SO, bool DF >
1619 struct ForEachTrait< StrictlyLowerMatrix<MT,SO,DF>, Imag >
1620 {
1622 };
1623 
1624 template< typename MT, bool SO, bool DF >
1625 struct ForEachTrait< StrictlyLowerMatrix<MT,SO,DF>, Sin >
1626 {
1628 };
1629 
1630 template< typename MT, bool SO, bool DF >
1631 struct ForEachTrait< StrictlyLowerMatrix<MT,SO,DF>, Asin >
1632 {
1634 };
1635 
1636 template< typename MT, bool SO, bool DF >
1637 struct ForEachTrait< StrictlyLowerMatrix<MT,SO,DF>, Sinh >
1638 {
1640 };
1641 
1642 template< typename MT, bool SO, bool DF >
1643 struct ForEachTrait< StrictlyLowerMatrix<MT,SO,DF>, Asinh >
1644 {
1646 };
1647 
1648 template< typename MT, bool SO, bool DF >
1649 struct ForEachTrait< StrictlyLowerMatrix<MT,SO,DF>, Tan >
1650 {
1652 };
1653 
1654 template< typename MT, bool SO, bool DF >
1655 struct ForEachTrait< StrictlyLowerMatrix<MT,SO,DF>, Atan >
1656 {
1658 };
1659 
1660 template< typename MT, bool SO, bool DF >
1661 struct ForEachTrait< StrictlyLowerMatrix<MT,SO,DF>, Tanh >
1662 {
1664 };
1665 
1666 template< typename MT, bool SO, bool DF >
1667 struct ForEachTrait< StrictlyLowerMatrix<MT,SO,DF>, Atanh >
1668 {
1670 };
1671 
1672 template< typename MT, bool SO, bool DF >
1673 struct ForEachTrait< StrictlyLowerMatrix<MT,SO,DF>, Erf >
1674 {
1676 };
1678 //*************************************************************************************************
1679 
1680 
1681 
1682 
1683 //=================================================================================================
1684 //
1685 // HIGHTYPE SPECIALIZATIONS
1686 //
1687 //=================================================================================================
1688 
1689 //*************************************************************************************************
1691 template< typename MT1, bool SO1, bool DF1, typename MT2, bool SO2, bool DF2 >
1692 struct HighType< StrictlyLowerMatrix<MT1,SO1,DF1>, StrictlyLowerMatrix<MT2,SO2,DF2> >
1693 {
1695 };
1697 //*************************************************************************************************
1698 
1699 
1700 
1701 
1702 //=================================================================================================
1703 //
1704 // LOWTYPE SPECIALIZATIONS
1705 //
1706 //=================================================================================================
1707 
1708 //*************************************************************************************************
1710 template< typename MT1, bool SO1, bool DF1, typename MT2, bool SO2, bool DF2 >
1711 struct LowType< StrictlyLowerMatrix<MT1,SO1,DF1>, StrictlyLowerMatrix<MT2,SO2,DF2> >
1712 {
1714 };
1716 //*************************************************************************************************
1717 
1718 
1719 
1720 
1721 //=================================================================================================
1722 //
1723 // SUBMATRIXTRAIT SPECIALIZATIONS
1724 //
1725 //=================================================================================================
1726 
1727 //*************************************************************************************************
1729 template< typename MT, bool SO, bool DF >
1730 struct SubmatrixTrait< StrictlyLowerMatrix<MT,SO,DF> >
1731 {
1732  using Type = SubmatrixTrait_<MT>;
1733 };
1735 //*************************************************************************************************
1736 
1737 
1738 
1739 
1740 //=================================================================================================
1741 //
1742 // ROWTRAIT SPECIALIZATIONS
1743 //
1744 //=================================================================================================
1745 
1746 //*************************************************************************************************
1748 template< typename MT, bool SO, bool DF >
1749 struct RowTrait< StrictlyLowerMatrix<MT,SO,DF> >
1750 {
1751  using Type = RowTrait_<MT>;
1752 };
1754 //*************************************************************************************************
1755 
1756 
1757 
1758 
1759 //=================================================================================================
1760 //
1761 // COLUMNTRAIT SPECIALIZATIONS
1762 //
1763 //=================================================================================================
1764 
1765 //*************************************************************************************************
1767 template< typename MT, bool SO, bool DF >
1768 struct ColumnTrait< StrictlyLowerMatrix<MT,SO,DF> >
1769 {
1770  using Type = ColumnTrait_<MT>;
1771 };
1773 //*************************************************************************************************
1774 
1775 } // namespace blaze
1776 
1777 #endif
Header file for the implementation of the base template of the UniLowerMatrix.
Header file for mathematical functions.
Compile time check for low-level access to constant data.This type trait tests whether the given data...
Definition: HasConstDataAccess.h:75
Header file for the Rows type trait.
Header file for the UNUSED_PARAMETER function template.
StrictlyLowerMatrix specialization for sparse matrices.
Header file for the subtraction trait.
Header file for the implementation of the base template of the StrictlyLowerMatrix.
Header file for the row trait.
Base template for the SubmatrixTrait class.
Definition: SubmatrixTrait.h:118
Base template for the ColumnTrait class.
Definition: ColumnTrait.h:117
typename RowTrait< MT >::Type RowTrait_
Auxiliary alias declaration for the RowTrait type trait.The RowTrait_ alias declaration provides a co...
Definition: RowTrait.h:152
BLAZE_ALWAYS_INLINE size_t size(const Vector< VT, TF > &vector) noexcept
Returns the current size/dimension of the vector.
Definition: Vector.h:261
Generic wrapper for a compile time constant integral value.The IntegralConstant class template repres...
Definition: IntegralConstant.h:71
Matrix adapter for lower triangular matrices.
Definition: Forward.h:48
BLAZE_ALWAYS_INLINE MT::Iterator begin(Matrix< MT, SO > &matrix, size_t i)
Returns an iterator to the first element of row/column i.
Definition: Matrix.h:194
void reset(const DiagonalProxy< MT > &proxy)
Resetting the represented element to the default initial values.
Definition: DiagonalProxy.h:533
const ElementType_< MT > min(const DenseMatrix< MT, SO > &dm)
Returns the smallest element of the dense matrix.
Definition: DenseMatrix.h:1755
typename MultTrait< T1, T2 >::Type MultTrait_
Auxiliary alias declaration for the MultTrait class template.The MultTrait_ alias declaration provide...
Definition: MultTrait.h:245
Base class for dense matrices.The DenseMatrix class is a base class for all dense matrix classes...
Definition: DenseMatrix.h:71
Base class for sparse matrices.The SparseMatrix class is a base class for all sparse matrix classes...
Definition: Forward.h:119
Compile time check for data types with restricted data access.This type trait tests whether the given...
Definition: IsRestricted.h:82
Header file for the IsSquare type trait.
Compile time check for the alignment of data types.This type trait tests whether the given data type ...
Definition: IsAligned.h:87
Base template for the RowTrait class.
Definition: RowTrait.h:117
Header file for the LowType type trait.
Base template for the HighType type trait.
Definition: HighType.h:133
Header file for the multiplication trait.
Namespace of the Blaze C++ math library.
Definition: Blaze.h:57
StrictlyLowerMatrix specialization for dense matrices.
Base template for the ForEachTrait class.The ForEachTrait class template offers the possibility to se...
Definition: ForEachTrait.h:79
Header file for all forward declarations of the math module.
const Element * ConstIterator
Iterator over constant elements.
Definition: CompressedMatrix.h:2939
Compile time check for data types with padding.This type trait tests whether the given data type empl...
Definition: IsPadded.h:76
Header file for the Columns type trait.
Base class for N-dimensional dense vectors.The DenseVector class is a base class for all arbitrarily ...
Definition: DenseVector.h:70
Compile time check for square matrices.This type trait tests whether or not the given template parame...
Definition: IsSquare.h:88
Header file for the IsAligned type trait.
BLAZE_ALWAYS_INLINE size_t columns(const Matrix< MT, SO > &matrix) noexcept
Returns the current number of columns of the matrix.
Definition: Matrix.h:336
DisableIf_< Or< IsComputation< MT >, IsTransExpr< MT >, IsDeclExpr< MT > >, RowExprTrait_< MT > > row(Matrix< MT, SO > &matrix, size_t index)
Creating a view on a specific row of the given matrix.
Definition: Row.h:128
BLAZE_ALWAYS_INLINE MT::Iterator end(Matrix< MT, SO > &matrix, size_t i)
Returns an iterator just past the last element of row/column i.
Definition: Matrix.h:260
Header file for the RemoveAdaptor type trait.
Constraint on the data type.
Compile time check for adaptors.This type trait tests whether the given template parameter is an adap...
Definition: IsAdaptor.h:88
DisableIf_< Or< IsComputation< MT >, IsTransExpr< MT >, IsDeclExpr< MT > >, ColumnExprTrait_< MT > > column(Matrix< MT, SO > &matrix, size_t index)
Creating a view on a specific column of the given matrix.
Definition: Column.h:128
Header file for the EnableIf class template.
Header file for the IsStrictlyLower type trait.
void clear(const DiagonalProxy< MT > &proxy)
Clearing the represented element.
Definition: DiagonalProxy.h:553
Header file for the IsPadded type trait.
Header file for the IsAdaptor type trait.
Header file for the DerestrictTrait class template.
Header file for the IsNumeric type trait.
Base template for the LowType type trait.
Definition: LowType.h:133
Header file for the HasConstDataAccess type trait.
Compile time check for resizable data types.This type trait tests whether the given data type is a re...
Definition: IsResizable.h:75
Header file for run time assertion macros.
Base template for the AddTrait class.
Definition: AddTrait.h:143
Base template for the MultTrait class.
Definition: MultTrait.h:143
Header file for the addition trait.
Header file for the division trait.
Header file for the submatrix trait.
Matrix adapter for strictly lower triangular matrices.
Definition: Forward.h:50
Header file for the column trait.
Header file for the isDefault shim.
void swap(DiagonalMatrix< MT, SO, DF > &a, DiagonalMatrix< MT, SO, DF > &b) noexcept
Swapping the contents of two matrices.
Definition: DiagonalMatrix.h:267
Base class for matrices.The Matrix class is a base class for all dense and sparse matrix classes with...
Definition: Forward.h:94
#define BLAZE_CONSTRAINT_MUST_NOT_REQUIRE_EVALUATION(T)
Constraint on the data type.In case the given data type T requires an intermediate evaluation within ...
Definition: RequiresEvaluation.h:81
typename SubmatrixTrait< MT >::Type SubmatrixTrait_
Auxiliary alias declaration for the SubmatrixTrait type trait.The SubmatrixTrait_ alias declaration p...
Definition: SubmatrixTrait.h:153
Evaluation of the return type of the derestrict function.Via this type trait it is possible to evalua...
Definition: DerestrictTrait.h:73
Base template for the DivTrait class.
Definition: DivTrait.h:143
typename ColumnTrait< MT >::Type ColumnTrait_
Auxiliary alias declaration for the ColumnTrait type trait.The ColumnTrait_ alias declaration provide...
Definition: ColumnTrait.h:152
Compile time check for strictly lower triangular matrices.This type trait tests whether or not the gi...
Definition: IsStrictlyLower.h:86
BLAZE_ALWAYS_INLINE size_t rows(const Matrix< MT, SO > &matrix) noexcept
Returns the current number of rows of the matrix.
Definition: Matrix.h:320
Removal of top level adaptor types.In case the given type is an adaptor type (SymmetricMatrix, LowerMatrix, UpperMatrix, ...), the RemoveAdaptor type trait removes the adaptor and extracts the contained general matrix type. Else the given type is returned as is. Note that cv-qualifiers are preserved.
Definition: RemoveAdaptor.h:76
Base class for N-dimensional vectors.The Vector class is a base class for all arbitrarily sized (N-di...
Definition: Forward.h:164
Header file for the implementation of the base template of the LowerMatrix.
typename SubTrait< T1, T2 >::Type SubTrait_
Auxiliary alias declaration for the SubTrait class template.The SubTrait_ alias declaration provides ...
Definition: SubTrait.h:245
Header file for the for-each trait.
Base class for sparse vectors.The SparseVector class is a base class for all arbitrarily sized (N-dim...
Definition: Forward.h:120
Header file for the IntegralConstant class template.
Compile time evaluation of the number of columns of a matrix.The Columns type trait evaluates the num...
Definition: Columns.h:76
Matrix adapter for lower unitriangular matrices.
Definition: Forward.h:53
bool isIntact(const DiagonalMatrix< MT, SO, DF > &m)
Returns whether the invariants of the given diagonal matrix are intact.
Definition: DiagonalMatrix.h:249
Compile time evaluation of the number of rows of a matrix.The Rows type trait evaluates the number of...
Definition: Rows.h:76
bool isDefault(const DiagonalProxy< MT > &proxy)
Returns whether the represented element is in default state.
Definition: DiagonalProxy.h:573
Base template for the SubTrait class.
Definition: SubTrait.h:143
void UNUSED_PARAMETER(const Args &...)
Suppression of unused parameter warnings.
Definition: Unused.h:81
Header file for the IsResizable type trait.
Header file for the IsRestricted type trait.
typename AddTrait< T1, T2 >::Type AddTrait_
Auxiliary alias declaration for the AddTrait class template.The AddTrait_ alias declaration provides ...
Definition: AddTrait.h:245
#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 HighType type trait.
Header file for the TrueType type/value trait base class.