LowerMatrix.h
Go to the documentation of this file.
1 //=================================================================================================
33 //=================================================================================================
34 
35 #ifndef _BLAZE_MATH_ADAPTORS_LOWERMATRIX_H_
36 #define _BLAZE_MATH_ADAPTORS_LOWERMATRIX_H_
37 
38 
39 //*************************************************************************************************
40 // Includes
41 //*************************************************************************************************
42 
43 #include <blaze/math/Aliases.h>
55 #include <blaze/math/Exception.h>
56 #include <blaze/math/Forward.h>
57 #include <blaze/math/Functions.h>
83 #include <blaze/util/Assert.h>
84 #include <blaze/util/EnableIf.h>
86 #include <blaze/util/TrueType.h>
88 #include <blaze/util/Unused.h>
89 
90 
91 namespace blaze {
92 
93 //=================================================================================================
94 //
95 // LOWERMATRIX OPERATORS
96 //
97 //=================================================================================================
98 
99 //*************************************************************************************************
102 template< typename MT, bool SO, bool DF >
103 inline void reset( LowerMatrix<MT,SO,DF>& m );
104 
105 template< typename MT, bool SO, bool DF >
106 inline void reset( LowerMatrix<MT,SO,DF>& m, size_t i );
107 
108 template< typename MT, bool SO, bool DF >
109 inline void clear( LowerMatrix<MT,SO,DF>& m );
110 
111 template< bool RF, typename MT, bool SO, bool DF >
112 inline bool isDefault( const LowerMatrix<MT,SO,DF>& m );
113 
114 template< typename MT, bool SO, bool DF >
115 inline bool isIntact( const LowerMatrix<MT,SO,DF>& m );
116 
117 template< typename MT, bool SO, bool DF >
118 inline void swap( LowerMatrix<MT,SO,DF>& a, LowerMatrix<MT,SO,DF>& b ) noexcept;
120 //*************************************************************************************************
121 
122 
123 //*************************************************************************************************
130 template< typename MT // Type of the adapted matrix
131  , bool SO // Storage order of the adapted matrix
132  , bool DF > // Density flag
133 inline void reset( LowerMatrix<MT,SO,DF>& m )
134 {
135  m.reset();
136 }
137 //*************************************************************************************************
138 
139 
140 //*************************************************************************************************
153 template< typename MT // Type of the adapted matrix
154  , bool SO // Storage order of the adapted matrix
155  , bool DF > // Density flag
156 inline void reset( LowerMatrix<MT,SO,DF>& m, size_t i )
157 {
158  m.reset( i );
159 }
160 //*************************************************************************************************
161 
162 
163 //*************************************************************************************************
170 template< typename MT // Type of the adapted matrix
171  , bool SO // Storage order of the adapted matrix
172  , bool DF > // Density flag
173 inline void clear( LowerMatrix<MT,SO,DF>& m )
174 {
175  m.clear();
176 }
177 //*************************************************************************************************
178 
179 
180 //*************************************************************************************************
208 template< bool RF // Relaxation flag
209  , typename MT // Type of the adapted matrix
210  , bool SO // Storage order of the adapted matrix
211  , bool DF > // Density flag
212 inline bool isDefault( const LowerMatrix<MT,SO,DF>& m )
213 {
214  return isDefault<RF>( m.matrix_ );
215 }
216 //*************************************************************************************************
217 
218 
219 //*************************************************************************************************
240 template< typename MT // Type of the adapted matrix
241  , bool SO // Storage order of the adapted matrix
242  , bool DF > // Density flag
243 inline bool isIntact( const LowerMatrix<MT,SO,DF>& m )
244 {
245  return m.isIntact();
246 }
247 //*************************************************************************************************
248 
249 
250 //*************************************************************************************************
258 template< typename MT // Type of the adapted matrix
259  , bool SO // Storage order of the adapted matrix
260  , bool DF > // Density flag
261 inline void swap( LowerMatrix<MT,SO,DF>& a, LowerMatrix<MT,SO,DF>& b ) noexcept
262 {
263  a.swap( b );
264 }
265 //*************************************************************************************************
266 
267 
268 //*************************************************************************************************
291 template< InversionFlag IF // Inversion algorithm
292  , typename MT // Type of the dense matrix
293  , bool SO > // Storage order of the dense matrix
294 inline void invert( LowerMatrix<MT,SO,true>& m )
295 {
297 
298  if( IF == asUniUpper ) {
299  BLAZE_INTERNAL_ASSERT( isIdentity( m ), "Violation of preconditions detected" );
300  return;
301  }
302 
303  constexpr InversionFlag flag( ( IF == byLU || IF == asGeneral || IF == asLower )
304  ? ( asLower )
305  : ( ( IF == asUniLower )
306  ?( asUniLower )
307  :( asDiagonal ) ) );
308 
309  invert<flag>( derestrict( m ) );
310 
311  BLAZE_INTERNAL_ASSERT( isIntact( m ), "Broken invariant detected" );
312 }
314 //*************************************************************************************************
315 
316 
317 //*************************************************************************************************
336 template< typename MT1, bool SO1, typename MT2, typename MT3, typename MT4, bool SO2 >
337 inline void lu( const LowerMatrix<MT1,SO1,true>& A, DenseMatrix<MT2,SO1>& L,
339 {
341 
346 
351 
352  typedef ElementType_<MT3> ET3;
353  typedef ElementType_<MT4> ET4;
354 
355  const size_t n( (~A).rows() );
356 
357  DerestrictTrait_<MT3> U2( derestrict( ~U ) );
358 
359  (~L) = A;
360 
361  resize( ~U, n, n );
362  reset( U2 );
363 
364  resize( ~P, n, n );
365  reset( ~P );
366 
367  for( size_t i=0UL; i<n; ++i ) {
368  U2(i,i) = ET3(1);
369  (~P)(i,i) = ET4(1);
370  }
371 }
373 //*************************************************************************************************
374 
375 
376 //*************************************************************************************************
392 template< typename MT // Type of the adapted matrix
393  , bool SO // Storage order of the adapted matrix
394  , bool DF // Density flag
395  , typename VT > // Type of the right-hand side dense vector
396 inline bool tryAssign( const LowerMatrix<MT,SO,DF>& lhs,
397  const DenseVector<VT,false>& rhs, size_t row, size_t column )
398 {
400 
401  BLAZE_INTERNAL_ASSERT( row <= lhs.rows(), "Invalid row access index" );
402  BLAZE_INTERNAL_ASSERT( column <= lhs.columns(), "Invalid column access index" );
403  BLAZE_INTERNAL_ASSERT( (~rhs).size() <= lhs.rows() - row, "Invalid number of rows" );
404 
405  UNUSED_PARAMETER( lhs );
406 
407  if( column <= row )
408  return true;
409 
410  const size_t iend( min( column - row, (~rhs).size() ) );
411 
412  for( size_t i=0UL; i<iend; ++i ) {
413  if( !isDefault( (~rhs)[i] ) )
414  return false;
415  }
416 
417  return true;
418 }
420 //*************************************************************************************************
421 
422 
423 //*************************************************************************************************
439 template< typename MT // Type of the adapted matrix
440  , bool SO // Storage order of the adapted matrix
441  , bool DF // Density flag
442  , typename VT > // Type of the right-hand side dense vector
443 inline bool tryAssign( const LowerMatrix<MT,SO,DF>& lhs,
444  const DenseVector<VT,true>& rhs, size_t row, size_t column )
445 {
447 
448  BLAZE_INTERNAL_ASSERT( row <= lhs.rows(), "Invalid row access index" );
449  BLAZE_INTERNAL_ASSERT( column <= lhs.columns(), "Invalid column access index" );
450  BLAZE_INTERNAL_ASSERT( (~rhs).size() <= lhs.columns() - column, "Invalid number of columns" );
451 
452  UNUSED_PARAMETER( lhs );
453 
454  const size_t ibegin( ( row < column )?( 0UL ):( row - column + 1UL ) );
455 
456  for( size_t i=ibegin; i<(~rhs).size(); ++i ) {
457  if( !isDefault( (~rhs)[i] ) )
458  return false;
459  }
460 
461  return true;
462 }
464 //*************************************************************************************************
465 
466 
467 //*************************************************************************************************
483 template< typename MT // Type of the adapted matrix
484  , bool SO // Storage order of the adapted matrix
485  , bool DF // Density flag
486  , typename VT > // Type of the right-hand side sparse vector
487 inline bool tryAssign( const LowerMatrix<MT,SO,DF>& lhs,
488  const SparseVector<VT,false>& rhs, size_t row, size_t column )
489 {
491 
492  BLAZE_INTERNAL_ASSERT( row <= lhs.rows(), "Invalid row access index" );
493  BLAZE_INTERNAL_ASSERT( column <= lhs.columns(), "Invalid column access index" );
494  BLAZE_INTERNAL_ASSERT( (~rhs).size() <= lhs.rows() - row, "Invalid number of rows" );
495 
496  UNUSED_PARAMETER( lhs );
497 
498  typedef typename VT::ConstIterator RhsIterator;
499 
500  if( column <= row )
501  return true;
502 
503  const RhsIterator last( (~rhs).lowerBound( column - row ) );
504 
505  for( RhsIterator element=(~rhs).begin(); element!=last; ++element ) {
506  if( !isDefault( element->value() ) )
507  return false;
508  }
509 
510  return true;
511 }
513 //*************************************************************************************************
514 
515 
516 //*************************************************************************************************
532 template< typename MT // Type of the adapted matrix
533  , bool SO // Storage order of the adapted matrix
534  , bool DF // Density flag
535  , typename VT > // Type of the right-hand side sparse vector
536 inline bool tryAssign( const LowerMatrix<MT,SO,DF>& lhs,
537  const SparseVector<VT,true>& rhs, size_t row, size_t column )
538 {
540 
541  BLAZE_INTERNAL_ASSERT( row <= lhs.rows(), "Invalid row access index" );
542  BLAZE_INTERNAL_ASSERT( column <= lhs.columns(), "Invalid column access index" );
543  BLAZE_INTERNAL_ASSERT( (~rhs).size() <= lhs.columns() - column, "Invalid number of columns" );
544 
545  UNUSED_PARAMETER( lhs );
546 
547  typedef typename VT::ConstIterator RhsIterator;
548 
549  const RhsIterator last( (~rhs).end() );
550  RhsIterator element( (~rhs).lowerBound( ( row < column )?( 0UL ):( row - column + 1UL ) ) );
551 
552  for( ; element!=last; ++element ) {
553  if( !isDefault( element->value() ) )
554  return false;
555  }
556 
557  return true;
558 }
560 //*************************************************************************************************
561 
562 
563 //*************************************************************************************************
579 template< typename MT1 // Type of the adapted matrix
580  , bool SO // Storage order of the adapted matrix
581  , bool DF // Density flag
582  , typename MT2 > // Type of the right-hand side dense matrix
583 inline bool tryAssign( const LowerMatrix<MT1,SO,DF>& lhs,
584  const DenseMatrix<MT2,false>& rhs, size_t row, size_t column )
585 {
587 
588  BLAZE_INTERNAL_ASSERT( row <= lhs.rows(), "Invalid row access index" );
589  BLAZE_INTERNAL_ASSERT( column <= lhs.columns(), "Invalid column access index" );
590  BLAZE_INTERNAL_ASSERT( (~rhs).rows() <= lhs.rows() - row, "Invalid number of rows" );
591  BLAZE_INTERNAL_ASSERT( (~rhs).columns() <= lhs.columns() - column, "Invalid number of columns" );
592 
593  UNUSED_PARAMETER( lhs );
594 
595  const size_t M( (~rhs).rows() );
596  const size_t N( (~rhs).columns() );
597 
598  if( row + 1UL >= column + N )
599  return true;
600 
601  const size_t iend( min( column + N - row - 1UL, M ) );
602 
603  for( size_t i=0UL; i<iend; ++i )
604  {
605  const bool containsDiagonal( row + i >= column );
606  const size_t jbegin( ( containsDiagonal )?( row + i - column + 1UL ):( 0UL ) );
607 
608  for( size_t j=jbegin; j<N; ++j ) {
609  if( !isDefault( (~rhs)(i,j) ) )
610  return false;
611  }
612  }
613 
614  return true;
615 }
617 //*************************************************************************************************
618 
619 
620 //*************************************************************************************************
636 template< typename MT1 // Type of the adapted matrix
637  , bool SO // Storage order of the adapted matrix
638  , bool DF // Density flag
639  , typename MT2 > // Type of the right-hand side dense matrix
640 inline bool tryAssign( const LowerMatrix<MT1,SO,DF>& lhs,
641  const DenseMatrix<MT2,true>& rhs, size_t row, size_t column )
642 {
644 
645  BLAZE_INTERNAL_ASSERT( row <= lhs.rows(), "Invalid row access index" );
646  BLAZE_INTERNAL_ASSERT( column <= lhs.columns(), "Invalid column access index" );
647  BLAZE_INTERNAL_ASSERT( (~rhs).rows() <= lhs.rows() - row, "Invalid number of rows" );
648  BLAZE_INTERNAL_ASSERT( (~rhs).columns() <= lhs.columns() - column, "Invalid number of columns" );
649 
650  UNUSED_PARAMETER( lhs );
651 
652  const size_t M( (~rhs).rows() );
653  const size_t N( (~rhs).columns() );
654 
655  if( row + 1UL >= column + N )
656  return true;
657 
658  const size_t jbegin( ( row < column )?( 0UL ):( row - column + 1UL ) );
659 
660  for( size_t j=jbegin; j<N; ++j )
661  {
662  const size_t iend( min( column + j - row, M ) );
663 
664  for( size_t i=0UL; i<iend; ++i ) {
665  if( !isDefault( (~rhs)(i,j) ) )
666  return false;
667  }
668  }
669 
670  return true;
671 }
673 //*************************************************************************************************
674 
675 
676 //*************************************************************************************************
692 template< typename MT1 // Type of the adapted matrix
693  , bool SO // Storage order of the adapted matrix
694  , bool DF // Density flag
695  , typename MT2 > // Type of the right-hand side sparse matrix
696 inline bool tryAssign( const LowerMatrix<MT1,SO,DF>& lhs,
697  const SparseMatrix<MT2,false>& rhs, size_t row, size_t column )
698 {
700 
701  BLAZE_INTERNAL_ASSERT( row <= lhs.rows(), "Invalid row access index" );
702  BLAZE_INTERNAL_ASSERT( column <= lhs.columns(), "Invalid column access index" );
703  BLAZE_INTERNAL_ASSERT( (~rhs).rows() <= lhs.rows() - row, "Invalid number of rows" );
704  BLAZE_INTERNAL_ASSERT( (~rhs).columns() <= lhs.columns() - column, "Invalid number of columns" );
705 
706  UNUSED_PARAMETER( lhs );
707 
708  typedef typename MT2::ConstIterator RhsIterator;
709 
710  const size_t M( (~rhs).rows() );
711  const size_t N( (~rhs).columns() );
712 
713  if( row + 1UL >= column + N )
714  return true;
715 
716  const size_t iend( min( column + N - row - 1UL, M ) );
717 
718  for( size_t i=0UL; i<iend; ++i )
719  {
720  const bool containsDiagonal( row + i >= column );
721  const size_t index( ( containsDiagonal )?( row + i - column + 1UL ):( 0UL ) );
722 
723  const RhsIterator last( (~rhs).end(i) );
724  RhsIterator element( (~rhs).lowerBound( i, index ) );
725 
726  for( ; element!=last; ++element ) {
727  if( !isDefault( element->value() ) )
728  return false;
729  }
730  }
731 
732  return true;
733 }
735 //*************************************************************************************************
736 
737 
738 //*************************************************************************************************
754 template< typename MT1 // Type of the adapted matrix
755  , bool SO // Storage order of the adapted matrix
756  , bool DF // Density flag
757  , typename MT2 > // Type of the right-hand side sparse matrix
758 inline bool tryAssign( const LowerMatrix<MT1,SO,DF>& lhs,
759  const SparseMatrix<MT2,true>& rhs, size_t row, size_t column )
760 {
762 
763  BLAZE_INTERNAL_ASSERT( row <= lhs.rows(), "Invalid row access index" );
764  BLAZE_INTERNAL_ASSERT( column <= lhs.columns(), "Invalid column access index" );
765  BLAZE_INTERNAL_ASSERT( (~rhs).rows() <= lhs.rows() - row, "Invalid number of rows" );
766  BLAZE_INTERNAL_ASSERT( (~rhs).columns() <= lhs.columns() - column, "Invalid number of columns" );
767 
768  UNUSED_PARAMETER( lhs );
769 
770  typedef typename MT2::ConstIterator RhsIterator;
771 
772  const size_t M( (~rhs).rows() );
773  const size_t N( (~rhs).columns() );
774 
775  if( row + 1UL >= column + N )
776  return true;
777 
778  const size_t jbegin( ( row < column )?( 0UL ):( row - column + 1UL ) );
779 
780  for( size_t j=jbegin; j<N; ++j )
781  {
782  const size_t index( column + j - row );
783  const RhsIterator last( (~rhs).lowerBound( min( index, M ), j ) );
784 
785  for( RhsIterator element=(~rhs).begin(j); element!=last; ++element ) {
786  if( !isDefault( element->value() ) )
787  return false;
788  }
789  }
790 
791  return true;
792 }
794 //*************************************************************************************************
795 
796 
797 //*************************************************************************************************
813 template< typename MT // Type of the adapted matrix
814  , bool SO // Storage order of the adapted matrix
815  , bool DF // Density flag
816  , typename VT // Type of the right-hand side vector
817  , bool TF > // Transpose flag of the right-hand side vector
818 inline bool tryAddAssign( const LowerMatrix<MT,SO,DF>& lhs,
819  const Vector<VT,TF>& rhs, size_t row, size_t column )
820 {
821  return tryAssign( lhs, ~rhs, row, column );
822 }
824 //*************************************************************************************************
825 
826 
827 //*************************************************************************************************
843 template< typename MT1 // Type of the adapted matrix
844  , bool SO1 // Storage order of the adapted matrix
845  , bool DF // Density flag
846  , typename MT2 // Type of the right-hand side matrix
847  , bool SO2 > // Storage order of the right-hand side matrix
848 inline bool tryAddAssign( const LowerMatrix<MT1,SO1,DF>& lhs,
849  const Matrix<MT2,SO2>& rhs, size_t row, size_t column )
850 {
851  return tryAssign( lhs, ~rhs, row, column );
852 }
854 //*************************************************************************************************
855 
856 
857 //*************************************************************************************************
873 template< typename MT // Type of the adapted matrix
874  , bool SO // Storage order of the adapted matrix
875  , bool DF // Density flag
876  , typename VT // Type of the right-hand side vector
877  , bool TF > // Transpose flag of the right-hand side vector
878 inline bool trySubAssign( const LowerMatrix<MT,SO,DF>& lhs,
879  const Vector<VT,TF>& rhs, size_t row, size_t column )
880 {
881  return tryAssign( lhs, ~rhs, row, column );
882 }
884 //*************************************************************************************************
885 
886 
887 //*************************************************************************************************
903 template< typename MT1 // Type of the adapted matrix
904  , bool SO1 // Storage order of the adapted matrix
905  , bool DF // Density flag
906  , typename MT2 // Type of the right-hand side matrix
907  , bool SO2 > // Storage order of the right-hand side matrix
908 inline bool trySubAssign( const LowerMatrix<MT1,SO1,DF>& lhs,
909  const Matrix<MT2,SO2>& rhs, size_t row, size_t column )
910 {
911  return tryAssign( lhs, ~rhs, row, column );
912 }
914 //*************************************************************************************************
915 
916 
917 //*************************************************************************************************
931 template< typename MT // Type of the adapted matrix
932  , bool SO // Storage order of the adapted matrix
933  , bool DF > // Density flag
934 inline MT& derestrict( LowerMatrix<MT,SO,DF>& m )
935 {
936  return m.matrix_;
937 }
939 //*************************************************************************************************
940 
941 
942 
943 
944 //=================================================================================================
945 //
946 // ROWS SPECIALIZATIONS
947 //
948 //=================================================================================================
949 
950 //*************************************************************************************************
952 template< typename MT, bool SO, bool DF >
953 struct Rows< LowerMatrix<MT,SO,DF> > : public Rows<MT>
954 {};
956 //*************************************************************************************************
957 
958 
959 
960 
961 //=================================================================================================
962 //
963 // COLUMNS SPECIALIZATIONS
964 //
965 //=================================================================================================
966 
967 //*************************************************************************************************
969 template< typename MT, bool SO, bool DF >
970 struct Columns< LowerMatrix<MT,SO,DF> > : public Columns<MT>
971 {};
973 //*************************************************************************************************
974 
975 
976 
977 
978 //=================================================================================================
979 //
980 // ISSQUARE SPECIALIZATIONS
981 //
982 //=================================================================================================
983 
984 //*************************************************************************************************
986 template< typename MT, bool SO, bool DF >
987 struct IsSquare< LowerMatrix<MT,SO,DF> > : public TrueType
988 {};
990 //*************************************************************************************************
991 
992 
993 
994 
995 //=================================================================================================
996 //
997 // ISLOWER SPECIALIZATIONS
998 //
999 //=================================================================================================
1000 
1001 //*************************************************************************************************
1003 template< typename MT, bool SO, bool DF >
1004 struct IsLower< LowerMatrix<MT,SO,DF> > : public TrueType
1005 {};
1007 //*************************************************************************************************
1008 
1009 
1010 
1011 
1012 //=================================================================================================
1013 //
1014 // ISADAPTOR SPECIALIZATIONS
1015 //
1016 //=================================================================================================
1017 
1018 //*************************************************************************************************
1020 template< typename MT, bool SO, bool DF >
1021 struct IsAdaptor< LowerMatrix<MT,SO,DF> > : public TrueType
1022 {};
1024 //*************************************************************************************************
1025 
1026 
1027 
1028 
1029 //=================================================================================================
1030 //
1031 // ISRESTRICTED SPECIALIZATIONS
1032 //
1033 //=================================================================================================
1034 
1035 //*************************************************************************************************
1037 template< typename MT, bool SO, bool DF >
1038 struct IsRestricted< LowerMatrix<MT,SO,DF> > : public TrueType
1039 {};
1041 //*************************************************************************************************
1042 
1043 
1044 
1045 
1046 //=================================================================================================
1047 //
1048 // HASCONSTDATAACCESS SPECIALIZATIONS
1049 //
1050 //=================================================================================================
1051 
1052 //*************************************************************************************************
1054 template< typename MT, bool SO >
1055 struct HasConstDataAccess< LowerMatrix<MT,SO,true> > : public TrueType
1056 {};
1058 //*************************************************************************************************
1059 
1060 
1061 
1062 
1063 //=================================================================================================
1064 //
1065 // ISALIGNED SPECIALIZATIONS
1066 //
1067 //=================================================================================================
1068 
1069 //*************************************************************************************************
1071 template< typename MT, bool SO, bool DF >
1072 struct IsAligned< LowerMatrix<MT,SO,DF> > : public BoolConstant< IsAligned<MT>::value >
1073 {};
1075 //*************************************************************************************************
1076 
1077 
1078 
1079 
1080 //=================================================================================================
1081 //
1082 // ISPADDED SPECIALIZATIONS
1083 //
1084 //=================================================================================================
1085 
1086 //*************************************************************************************************
1088 template< typename MT, bool SO, bool DF >
1089 struct IsPadded< LowerMatrix<MT,SO,DF> > : public BoolConstant< IsPadded<MT>::value >
1090 {};
1092 //*************************************************************************************************
1093 
1094 
1095 
1096 
1097 //=================================================================================================
1098 //
1099 // ISRESIZABLE SPECIALIZATIONS
1100 //
1101 //=================================================================================================
1102 
1103 //*************************************************************************************************
1105 template< typename MT, bool SO, bool DF >
1106 struct IsResizable< LowerMatrix<MT,SO,DF> > : public BoolConstant< IsResizable<MT>::value >
1107 {};
1109 //*************************************************************************************************
1110 
1111 
1112 
1113 
1114 //=================================================================================================
1115 //
1116 // REMOVEADAPTOR SPECIALIZATIONS
1117 //
1118 //=================================================================================================
1119 
1120 //*************************************************************************************************
1122 template< typename MT, bool SO, bool DF >
1123 struct RemoveAdaptor< LowerMatrix<MT,SO,DF> >
1124 {
1125  using Type = MT;
1126 };
1128 //*************************************************************************************************
1129 
1130 
1131 
1132 
1133 //=================================================================================================
1134 //
1135 // DERESTRICTTRAIT SPECIALIZATIONS
1136 //
1137 //=================================================================================================
1138 
1139 //*************************************************************************************************
1141 template< typename MT, bool SO, bool DF >
1142 struct DerestrictTrait< LowerMatrix<MT,SO,DF> >
1143 {
1144  using Type = MT&;
1145 };
1147 //*************************************************************************************************
1148 
1149 
1150 
1151 
1152 //=================================================================================================
1153 //
1154 // ADDTRAIT SPECIALIZATIONS
1155 //
1156 //=================================================================================================
1157 
1158 //*************************************************************************************************
1160 template< typename MT, bool SO1, bool DF, typename T, size_t M, size_t N, bool SO2 >
1161 struct AddTrait< LowerMatrix<MT,SO1,DF>, StaticMatrix<T,M,N,SO2> >
1162 {
1164 };
1165 
1166 template< typename T, size_t M, size_t N, bool SO1, typename MT, bool SO2, bool DF >
1167 struct AddTrait< StaticMatrix<T,M,N,SO1>, LowerMatrix<MT,SO2,DF> >
1168 {
1169  using Type = AddTrait_< StaticMatrix<T,M,N,SO1>, MT >;
1170 };
1171 
1172 template< typename MT, bool SO1, bool DF, typename T, size_t M, size_t N, bool SO2 >
1173 struct AddTrait< LowerMatrix<MT,SO1,DF>, HybridMatrix<T,M,N,SO2> >
1174 {
1176 };
1177 
1178 template< typename T, size_t M, size_t N, bool SO1, typename MT, bool SO2, bool DF >
1179 struct AddTrait< HybridMatrix<T,M,N,SO1>, LowerMatrix<MT,SO2,DF> >
1180 {
1181  using Type = AddTrait_< HybridMatrix<T,M,N,SO1>, MT >;
1182 };
1183 
1184 template< typename MT, bool SO1, bool DF, typename T, bool SO2 >
1185 struct AddTrait< LowerMatrix<MT,SO1,DF>, DynamicMatrix<T,SO2> >
1186 {
1187  using Type = AddTrait_< MT, DynamicMatrix<T,SO2> >;
1188 };
1189 
1190 template< typename T, bool SO1, typename MT, bool SO2, bool DF >
1191 struct AddTrait< DynamicMatrix<T,SO1>, LowerMatrix<MT,SO2,DF> >
1192 {
1193  using Type = AddTrait_< DynamicMatrix<T,SO1>, MT >;
1194 };
1195 
1196 template< typename MT, bool SO1, bool DF, typename T, bool AF, bool PF, bool SO2 >
1197 struct AddTrait< LowerMatrix<MT,SO1,DF>, CustomMatrix<T,AF,PF,SO2> >
1198 {
1200 };
1201 
1202 template< typename T, bool AF, bool PF, bool SO1, typename MT, bool SO2, bool DF >
1203 struct AddTrait< CustomMatrix<T,AF,PF,SO1>, LowerMatrix<MT,SO2,DF> >
1204 {
1205  using Type = AddTrait_< CustomMatrix<T,AF,PF,SO1>, MT >;
1206 };
1207 
1208 template< typename MT, bool SO1, bool DF, typename T, bool SO2 >
1209 struct AddTrait< LowerMatrix<MT,SO1,DF>, CompressedMatrix<T,SO2> >
1210 {
1212 };
1213 
1214 template< typename T, bool SO1, typename MT, bool SO2, bool DF >
1215 struct AddTrait< CompressedMatrix<T,SO1>, LowerMatrix<MT,SO2,DF> >
1216 {
1217  using Type = AddTrait_< CompressedMatrix<T,SO1>, MT >;
1218 };
1219 
1220 template< typename MT1, bool SO1, bool DF1, typename MT2, bool SO2, bool DF2, bool NF >
1221 struct AddTrait< LowerMatrix<MT1,SO1,DF1>, SymmetricMatrix<MT2,SO2,DF2,NF> >
1222 {
1223  using Type = AddTrait_<MT1,MT2>;
1224 };
1225 
1226 template< typename MT1, bool SO1, bool DF1, bool NF, typename MT2, bool SO2, bool DF2 >
1227 struct AddTrait< SymmetricMatrix<MT1,SO1,DF1,NF>, LowerMatrix<MT2,SO2,DF2> >
1228 {
1229  using Type = AddTrait_<MT1,MT2>;
1230 };
1231 
1232 template< typename MT1, bool SO1, bool DF1, typename MT2, bool SO2, bool DF2 >
1233 struct AddTrait< LowerMatrix<MT1,SO1,DF1>, HermitianMatrix<MT2,SO2,DF2> >
1234 {
1235  using Type = AddTrait_<MT1,MT2>;
1236 };
1237 
1238 template< typename MT1, bool SO1, bool DF1, typename MT2, bool SO2, bool DF2 >
1239 struct AddTrait< HermitianMatrix<MT1,SO1,DF1>, LowerMatrix<MT2,SO2,DF2> >
1240 {
1241  using Type = AddTrait_<MT1,MT2>;
1242 };
1243 
1244 template< typename MT1, bool SO1, bool DF1, typename MT2, bool SO2, bool DF2 >
1245 struct AddTrait< LowerMatrix<MT1,SO1,DF1>, LowerMatrix<MT2,SO2,DF2> >
1246 {
1247  using Type = LowerMatrix< AddTrait_<MT1,MT2> >;
1248 };
1250 //*************************************************************************************************
1251 
1252 
1253 
1254 
1255 //=================================================================================================
1256 //
1257 // SUBTRAIT SPECIALIZATIONS
1258 //
1259 //=================================================================================================
1260 
1261 //*************************************************************************************************
1263 template< typename MT, bool SO1, bool DF, typename T, size_t M, size_t N, bool SO2 >
1264 struct SubTrait< LowerMatrix<MT,SO1,DF>, StaticMatrix<T,M,N,SO2> >
1265 {
1267 };
1268 
1269 template< typename T, size_t M, size_t N, bool SO1, typename MT, bool SO2, bool DF >
1270 struct SubTrait< StaticMatrix<T,M,N,SO1>, LowerMatrix<MT,SO2,DF> >
1271 {
1272  using Type = SubTrait_< StaticMatrix<T,M,N,SO1>, MT >;
1273 };
1274 
1275 template< typename MT, bool SO1, bool DF, typename T, size_t M, size_t N, bool SO2 >
1276 struct SubTrait< LowerMatrix<MT,SO1,DF>, HybridMatrix<T,M,N,SO2> >
1277 {
1279 };
1280 
1281 template< typename T, size_t M, size_t N, bool SO1, typename MT, bool SO2, bool DF >
1282 struct SubTrait< HybridMatrix<T,M,N,SO1>, LowerMatrix<MT,SO2,DF> >
1283 {
1284  using Type = SubTrait_< HybridMatrix<T,M,N,SO1>, MT >;
1285 };
1286 
1287 template< typename MT, bool SO1, bool DF, typename T, bool SO2 >
1288 struct SubTrait< LowerMatrix<MT,SO1,DF>, DynamicMatrix<T,SO2> >
1289 {
1290  using Type = SubTrait_< MT, DynamicMatrix<T,SO2> >;
1291 };
1292 
1293 template< typename T, bool SO1, typename MT, bool SO2, bool DF >
1294 struct SubTrait< DynamicMatrix<T,SO1>, LowerMatrix<MT,SO2,DF> >
1295 {
1296  using Type = SubTrait_< DynamicMatrix<T,SO1>, MT >;
1297 };
1298 
1299 template< typename MT, bool SO1, bool DF, typename T, bool AF, bool PF, bool SO2 >
1300 struct SubTrait< LowerMatrix<MT,SO1,DF>, CustomMatrix<T,AF,PF,SO2> >
1301 {
1303 };
1304 
1305 template< typename T, bool AF, bool PF, bool SO1, typename MT, bool SO2, bool DF >
1306 struct SubTrait< CustomMatrix<T,AF,PF,SO1>, LowerMatrix<MT,SO2,DF> >
1307 {
1308  using Type = SubTrait_< CustomMatrix<T,AF,PF,SO1>, MT >;
1309 };
1310 
1311 template< typename MT, bool SO1, bool DF, typename T, bool SO2 >
1312 struct SubTrait< LowerMatrix<MT,SO1,DF>, CompressedMatrix<T,SO2> >
1313 {
1315 };
1316 
1317 template< typename T, bool SO1, typename MT, bool SO2, bool DF >
1318 struct SubTrait< CompressedMatrix<T,SO1>, LowerMatrix<MT,SO2,DF> >
1319 {
1320  using Type = SubTrait_< CompressedMatrix<T,SO1>, MT >;
1321 };
1322 
1323 template< typename MT1, bool SO1, bool DF1, typename MT2, bool SO2, bool DF2, bool NF >
1324 struct SubTrait< LowerMatrix<MT1,SO1,DF1>, SymmetricMatrix<MT2,SO2,DF2,NF> >
1325 {
1326  using Type = SubTrait_<MT1,MT2>;
1327 };
1328 
1329 template< typename MT1, bool SO1, bool DF1, bool NF, typename MT2, bool SO2, bool DF2 >
1330 struct SubTrait< SymmetricMatrix<MT1,SO1,DF1,NF>, LowerMatrix<MT2,SO2,DF2> >
1331 {
1332  using Type = SubTrait_<MT1,MT2>;
1333 };
1334 
1335 template< typename MT1, bool SO1, bool DF1, typename MT2, bool SO2, bool DF2 >
1336 struct SubTrait< LowerMatrix<MT1,SO1,DF1>, HermitianMatrix<MT2,SO2,DF2> >
1337 {
1338  using Type = SubTrait_<MT1,MT2>;
1339 };
1340 
1341 template< typename MT1, bool SO1, bool DF1, typename MT2, bool SO2, bool DF2 >
1342 struct SubTrait< HermitianMatrix<MT1,SO1,DF1>, LowerMatrix<MT2,SO2,DF2> >
1343 {
1344  using Type = SubTrait_<MT1,MT2>;
1345 };
1346 
1347 template< typename MT1, bool SO1, bool DF1, typename MT2, bool SO2, bool DF2 >
1348 struct SubTrait< LowerMatrix<MT1,SO1,DF1>, LowerMatrix<MT2,SO2,DF2> >
1349 {
1350  using Type = LowerMatrix< SubTrait_<MT1,MT2> >;
1351 };
1353 //*************************************************************************************************
1354 
1355 
1356 
1357 
1358 //=================================================================================================
1359 //
1360 // MULTTRAIT SPECIALIZATIONS
1361 //
1362 //=================================================================================================
1363 
1364 //*************************************************************************************************
1366 template< typename MT, bool SO, bool DF, typename T >
1367 struct MultTrait< LowerMatrix<MT,SO,DF>, T, EnableIf_< IsNumeric<T> > >
1368 {
1369  using Type = LowerMatrix< MultTrait_<MT,T> >;
1370 };
1371 
1372 template< typename T, typename MT, bool SO, bool DF >
1373 struct MultTrait< T, LowerMatrix<MT,SO,DF>, EnableIf_< IsNumeric<T> > >
1374 {
1375  using Type = LowerMatrix< MultTrait_<T,MT> >;
1376 };
1377 
1378 template< typename MT, bool SO, bool DF, typename T, size_t N >
1379 struct MultTrait< LowerMatrix<MT,SO,DF>, StaticVector<T,N,false> >
1380 {
1382 };
1383 
1384 template< typename T, size_t N, typename MT, bool SO, bool DF >
1385 struct MultTrait< StaticVector<T,N,true>, LowerMatrix<MT,SO,DF> >
1386 {
1387  using Type = MultTrait_< StaticVector<T,N,true>, MT >;
1388 };
1389 
1390 template< typename MT, bool SO, bool DF, typename T, size_t N >
1391 struct MultTrait< LowerMatrix<MT,SO,DF>, HybridVector<T,N,false> >
1392 {
1394 };
1395 
1396 template< typename T, size_t N, typename MT, bool SO, bool DF >
1397 struct MultTrait< HybridVector<T,N,true>, LowerMatrix<MT,SO,DF> >
1398 {
1399  using Type = MultTrait_< HybridVector<T,N,true>, MT >;
1400 };
1401 
1402 template< typename MT, bool SO, bool DF, typename T >
1403 struct MultTrait< LowerMatrix<MT,SO,DF>, DynamicVector<T,false> >
1404 {
1406 };
1407 
1408 template< typename T, typename MT, bool SO, bool DF >
1409 struct MultTrait< DynamicVector<T,true>, LowerMatrix<MT,SO,DF> >
1410 {
1411  using Type = MultTrait_< DynamicVector<T,true>, MT >;
1412 };
1413 
1414 template< typename MT, bool SO, bool DF, typename T, bool AF, bool PF >
1415 struct MultTrait< LowerMatrix<MT,SO,DF>, CustomVector<T,AF,PF,false> >
1416 {
1418 };
1419 
1420 template< typename T, bool AF, bool PF, typename MT, bool SO, bool DF >
1421 struct MultTrait< CustomVector<T,AF,PF,true>, LowerMatrix<MT,SO,DF> >
1422 {
1423  using Type = MultTrait_< CustomVector<T,AF,PF,true>, MT >;
1424 };
1425 
1426 template< typename MT, bool SO, bool DF, typename T >
1427 struct MultTrait< LowerMatrix<MT,SO,DF>, CompressedVector<T,false> >
1428 {
1430 };
1431 
1432 template< typename T, typename MT, bool SO, bool DF >
1433 struct MultTrait< CompressedVector<T,true>, LowerMatrix<MT,SO,DF> >
1434 {
1435  using Type = MultTrait_< CompressedVector<T,true>, MT >;
1436 };
1437 
1438 template< typename MT, bool SO1, bool DF, typename T, size_t M, size_t N, bool SO2 >
1439 struct MultTrait< LowerMatrix<MT,SO1,DF>, StaticMatrix<T,M,N,SO2> >
1440 {
1442 };
1443 
1444 template< typename T, size_t M, size_t N, bool SO1, typename MT, bool SO2, bool DF >
1445 struct MultTrait< StaticMatrix<T,M,N,SO1>, LowerMatrix<MT,SO2,DF> >
1446 {
1447  using Type = MultTrait_< StaticMatrix<T,M,N,SO1>, MT >;
1448 };
1449 
1450 template< typename MT, bool SO1, bool DF, typename T, size_t M, size_t N, bool SO2 >
1451 struct MultTrait< LowerMatrix<MT,SO1,DF>, HybridMatrix<T,M,N,SO2> >
1452 {
1454 };
1455 
1456 template< typename T, size_t M, size_t N, bool SO1, typename MT, bool SO2, bool DF >
1457 struct MultTrait< HybridMatrix<T,M,N,SO1>, LowerMatrix<MT,SO2,DF> >
1458 {
1459  using Type = MultTrait_< HybridMatrix<T,M,N,SO1>, MT >;
1460 };
1461 
1462 template< typename MT, bool SO1, bool DF, typename T, bool SO2 >
1463 struct MultTrait< LowerMatrix<MT,SO1,DF>, DynamicMatrix<T,SO2> >
1464 {
1465  using Type = MultTrait_< MT, DynamicMatrix<T,SO2> >;
1466 };
1467 
1468 template< typename T, bool SO1, typename MT, bool SO2, bool DF >
1469 struct MultTrait< DynamicMatrix<T,SO1>, LowerMatrix<MT,SO2,DF> >
1470 {
1471  using Type = MultTrait_< DynamicMatrix<T,SO1>, MT >;
1472 };
1473 
1474 template< typename MT, bool SO1, bool DF, typename T, bool AF, bool PF, bool SO2 >
1475 struct MultTrait< LowerMatrix<MT,SO1,DF>, CustomMatrix<T,AF,PF,SO2> >
1476 {
1478 };
1479 
1480 template< typename T, bool AF, bool PF, bool SO1, typename MT, bool SO2, bool DF >
1481 struct MultTrait< CustomMatrix<T,AF,PF,SO1>, LowerMatrix<MT,SO2,DF> >
1482 {
1483  using Type = MultTrait_< CustomMatrix<T,AF,PF,SO1>, MT >;
1484 };
1485 
1486 template< typename MT, bool SO1, bool DF, typename T, bool SO2 >
1487 struct MultTrait< LowerMatrix<MT,SO1,DF>, CompressedMatrix<T,SO2> >
1488 {
1490 };
1491 
1492 template< typename T, bool SO1, typename MT, bool SO2, bool DF >
1493 struct MultTrait< CompressedMatrix<T,SO1>, LowerMatrix<MT,SO2,DF> >
1494 {
1495  using Type = MultTrait_< CompressedMatrix<T,SO1>, MT >;
1496 };
1497 
1498 template< typename MT1, bool SO1, bool DF1, typename MT2, bool SO2, bool DF2, bool NF >
1499 struct MultTrait< LowerMatrix<MT1,SO1,DF1>, SymmetricMatrix<MT2,SO2,DF2,NF> >
1500 {
1501  using Type = MultTrait_<MT1,MT2>;
1502 };
1503 
1504 template< typename MT1, bool SO1, bool DF1, bool NF, typename MT2, bool SO2, bool DF2 >
1505 struct MultTrait< SymmetricMatrix<MT1,SO1,DF1,NF>, LowerMatrix<MT2,SO2,DF2> >
1506 {
1507  using Type = MultTrait_<MT1,MT2>;
1508 };
1509 
1510 template< typename MT1, bool SO1, bool DF1, typename MT2, bool SO2, bool DF2 >
1511 struct MultTrait< LowerMatrix<MT1,SO1,DF1>, HermitianMatrix<MT2,SO2,DF2> >
1512 {
1513  using Type = MultTrait_<MT1,MT2>;
1514 };
1515 
1516 template< typename MT1, bool SO1, bool DF1, typename MT2, bool SO2, bool DF2 >
1517 struct MultTrait< HermitianMatrix<MT1,SO1,DF1>, LowerMatrix<MT2,SO2,DF2> >
1518 {
1519  using Type = MultTrait_<MT1,MT2>;
1520 };
1521 
1522 template< typename MT1, bool SO1, bool DF1, typename MT2, bool SO2, bool DF2 >
1523 struct MultTrait< LowerMatrix<MT1,SO1,DF1>, LowerMatrix<MT2,SO2,DF2> >
1524 {
1525  using Type = LowerMatrix< MultTrait_<MT1,MT2> >;
1526 };
1528 //*************************************************************************************************
1529 
1530 
1531 
1532 
1533 //=================================================================================================
1534 //
1535 // DIVTRAIT SPECIALIZATIONS
1536 //
1537 //=================================================================================================
1538 
1539 //*************************************************************************************************
1541 template< typename MT, bool SO, bool DF, typename T >
1542 struct DivTrait< LowerMatrix<MT,SO,DF>, T, EnableIf_< IsNumeric<T> > >
1543 {
1544  using Type = LowerMatrix< DivTrait_<MT,T> >;
1545 };
1547 //*************************************************************************************************
1548 
1549 
1550 
1551 
1552 //=================================================================================================
1553 //
1554 // FOREACHTRAIT SPECIALIZATIONS
1555 //
1556 //=================================================================================================
1557 
1558 //*************************************************************************************************
1560 template< typename MT, bool SO, bool DF >
1561 struct ForEachTrait< LowerMatrix<MT,SO,DF>, Abs >
1562 {
1563  using Type = LowerMatrix< ForEachTrait_<MT,Abs> >;
1564 };
1565 
1566 template< typename MT, bool SO, bool DF >
1567 struct ForEachTrait< LowerMatrix<MT,SO,DF>, Floor >
1568 {
1569  using Type = LowerMatrix< ForEachTrait_<MT,Floor> >;
1570 };
1571 
1572 template< typename MT, bool SO, bool DF >
1573 struct ForEachTrait< LowerMatrix<MT,SO,DF>, Ceil >
1574 {
1575  using Type = LowerMatrix< ForEachTrait_<MT,Ceil> >;
1576 };
1577 
1578 template< typename MT, bool SO, bool DF >
1579 struct ForEachTrait< LowerMatrix<MT,SO,DF>, Conj >
1580 {
1581  using Type = LowerMatrix< ForEachTrait_<MT,Conj> >;
1582 };
1583 
1584 template< typename MT, bool SO, bool DF >
1585 struct ForEachTrait< LowerMatrix<MT,SO,DF>, Real >
1586 {
1587  using Type = LowerMatrix< ForEachTrait_<MT,Real> >;
1588 };
1589 
1590 template< typename MT, bool SO, bool DF >
1591 struct ForEachTrait< LowerMatrix<MT,SO,DF>, Imag >
1592 {
1593  using Type = LowerMatrix< ForEachTrait_<MT,Imag> >;
1594 };
1595 
1596 template< typename MT, bool SO, bool DF >
1597 struct ForEachTrait< LowerMatrix<MT,SO,DF>, Sin >
1598 {
1599  using Type = LowerMatrix< ForEachTrait_<MT,Sin> >;
1600 };
1601 
1602 template< typename MT, bool SO, bool DF >
1603 struct ForEachTrait< LowerMatrix<MT,SO,DF>, Asin >
1604 {
1605  using Type = LowerMatrix< ForEachTrait_<MT,Asin> >;
1606 };
1607 
1608 template< typename MT, bool SO, bool DF >
1609 struct ForEachTrait< LowerMatrix<MT,SO,DF>, Sinh >
1610 {
1611  using Type = LowerMatrix< ForEachTrait_<MT,Sinh> >;
1612 };
1613 
1614 template< typename MT, bool SO, bool DF >
1615 struct ForEachTrait< LowerMatrix<MT,SO,DF>, Asinh >
1616 {
1617  using Type = LowerMatrix< ForEachTrait_<MT,Asinh> >;
1618 };
1619 
1620 template< typename MT, bool SO, bool DF >
1621 struct ForEachTrait< LowerMatrix<MT,SO,DF>, Tan >
1622 {
1623  using Type = LowerMatrix< ForEachTrait_<MT,Tan> >;
1624 };
1625 
1626 template< typename MT, bool SO, bool DF >
1627 struct ForEachTrait< LowerMatrix<MT,SO,DF>, Atan >
1628 {
1629  using Type = LowerMatrix< ForEachTrait_<MT,Atan> >;
1630 };
1631 
1632 template< typename MT, bool SO, bool DF >
1633 struct ForEachTrait< LowerMatrix<MT,SO,DF>, Tanh >
1634 {
1635  using Type = LowerMatrix< ForEachTrait_<MT,Tanh> >;
1636 };
1637 
1638 template< typename MT, bool SO, bool DF >
1639 struct ForEachTrait< LowerMatrix<MT,SO,DF>, Atanh >
1640 {
1641  using Type = LowerMatrix< ForEachTrait_<MT,Atanh> >;
1642 };
1643 
1644 template< typename MT, bool SO, bool DF >
1645 struct ForEachTrait< LowerMatrix<MT,SO,DF>, Erf >
1646 {
1647  using Type = LowerMatrix< ForEachTrait_<MT,Erf> >;
1648 };
1650 //*************************************************************************************************
1651 
1652 
1653 
1654 
1655 //=================================================================================================
1656 //
1657 // HIGHTYPE SPECIALIZATIONS
1658 //
1659 //=================================================================================================
1660 
1661 //*************************************************************************************************
1663 template< typename MT1, bool SO1, bool DF1, typename MT2, bool SO2, bool DF2 >
1664 struct HighType< LowerMatrix<MT1,SO1,DF1>, LowerMatrix<MT2,SO2,DF2> >
1665 {
1667 };
1669 //*************************************************************************************************
1670 
1671 
1672 
1673 
1674 //=================================================================================================
1675 //
1676 // LOWTYPE SPECIALIZATIONS
1677 //
1678 //=================================================================================================
1679 
1680 //*************************************************************************************************
1682 template< typename MT1, bool SO1, bool DF1, typename MT2, bool SO2, bool DF2 >
1683 struct LowType< LowerMatrix<MT1,SO1,DF1>, LowerMatrix<MT2,SO2,DF2> >
1684 {
1686 };
1688 //*************************************************************************************************
1689 
1690 
1691 
1692 
1693 //=================================================================================================
1694 //
1695 // SUBMATRIXTRAIT SPECIALIZATIONS
1696 //
1697 //=================================================================================================
1698 
1699 //*************************************************************************************************
1701 template< typename MT, bool SO, bool DF >
1702 struct SubmatrixTrait< LowerMatrix<MT,SO,DF> >
1703 {
1704  using Type = SubmatrixTrait_<MT>;
1705 };
1707 //*************************************************************************************************
1708 
1709 
1710 
1711 
1712 //=================================================================================================
1713 //
1714 // ROWTRAIT SPECIALIZATIONS
1715 //
1716 //=================================================================================================
1717 
1718 //*************************************************************************************************
1720 template< typename MT, bool SO, bool DF >
1721 struct RowTrait< LowerMatrix<MT,SO,DF> >
1722 {
1723  using Type = RowTrait_<MT>;
1724 };
1726 //*************************************************************************************************
1727 
1728 
1729 
1730 
1731 //=================================================================================================
1732 //
1733 // COLUMNTRAIT SPECIALIZATIONS
1734 //
1735 //=================================================================================================
1736 
1737 //*************************************************************************************************
1739 template< typename MT, bool SO, bool DF >
1740 struct ColumnTrait< LowerMatrix<MT,SO,DF> >
1741 {
1742  using Type = ColumnTrait_<MT>;
1743 };
1745 //*************************************************************************************************
1746 
1747 } // namespace blaze
1748 
1749 #endif
Header file for auxiliary alias declarations.
Header file for mathematical functions.
typename DerestrictTrait< T >::Type DerestrictTrait_
Auxiliary alias declaration for the DerestrictTrait type trait.The DerestrictTrait_ alias declaration...
Definition: DerestrictTrait.h:110
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.
Header file for the subtraction trait.
Flag for the inversion of a diagonal matrix.
Definition: InversionFlag.h:115
Flag for the inversion of a general matrix (same as byLU).
Definition: InversionFlag.h:108
Header file for the row trait.
Base template for the SubmatrixTrait class.
Definition: SubmatrixTrait.h:118
Flag for the inversion of a upper unitriangular matrix.
Definition: InversionFlag.h:114
Base template for the ColumnTrait class.
Definition: ColumnTrait.h:117
Flag for the inversion of a lower unitriangular matrix.
Definition: InversionFlag.h:112
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
Header file for the dense matrix inversion flags.
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
Compile time check for lower triangular matrices.This type trait tests whether or not the given templ...
Definition: IsLower.h:88
#define BLAZE_CONSTRAINT_MUST_NOT_BE_UNITRIANGULAR_MATRIX_TYPE(T)
Constraint on the data type.In case the given data type T is a lower or upper unitriangular matrix ty...
Definition: UniTriangular.h:81
typename MultTrait< T1, T2 >::Type MultTrait_
Auxiliary alias declaration for the MultTrait class template.The MultTrait_ alias declaration provide...
Definition: MultTrait.h:245
Constraint on the data type.
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
bool isIdentity(const DenseMatrix< MT, SO > &dm)
Checks if the give dense matrix is an identity matrix.
Definition: DenseMatrix.h:1679
Constraint on the data type.
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
void invert(const HermitianProxy< MT > &proxy)
In-place inversion of the represented element.
Definition: HermitianProxy.h:741
Base template for the RowTrait class.
Definition: RowTrait.h:117
Constraint on the data type.
Header file for the LowType type trait.
Flag for the inversion of a lower triangular matrix.
Definition: InversionFlag.h:111
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
Flag for the LU-based matrix inversion.
Definition: InversionFlag.h:103
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
void lu(const DenseMatrix< MT1, SO1 > &A, DenseMatrix< MT2, SO1 > &L, DenseMatrix< MT3, SO1 > &U, Matrix< MT4, SO2 > &P)
LU decomposition of the given dense matrix.
Definition: LU.h:219
Header file for the Columns type trait.
Header file for the implementation of a fixed-size matrix.
typename T::ElementType ElementType_
Alias declaration for nested ElementType type definitions.The ElementType_ alias declaration provides...
Definition: Aliases.h:163
Base class for N-dimensional dense vectors.The DenseVector class is a base class for all arbitrarily ...
Definition: DenseVector.h:70
Header file for the IsLower type trait.
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
Header file for the exception macros of the math module.
#define BLAZE_CONSTRAINT_MUST_NOT_BE_UPPER_MATRIX_TYPE(T)
Constraint on the data type.In case the given data type T is a upper triangular matrix type...
Definition: Upper.h:81
BLAZE_ALWAYS_INLINE void resize(Matrix< MT, SO > &matrix, size_t rows, size_t columns, bool preserve=true)
Changing the size of the matrix.
Definition: Matrix.h:544
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.
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.
Constraint on the data type.
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
#define BLAZE_CONSTRAINT_MUST_NOT_BE_SYMMETRIC_MATRIX_TYPE(T)
Constraint on the data type.In case the given data type T is a symmetric matrix type, a compilation error is created.
Definition: Symmetric.h:79
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.
Constraint on the data type.
#define BLAZE_CONSTRAINT_MUST_NOT_BE_LOWER_MATRIX_TYPE(T)
Constraint on the data type.In case the given data type T is a lower triangular matrix type...
Definition: Lower.h:81
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_BE_BLAS_COMPATIBLE_TYPE(T)
Constraint on the data type.In case the given data type T is not a BLAS compatible data type (i...
Definition: BLASCompatible.h:61
Constraint on the data type.
#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
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.
LowerMatrix specialization for sparse matrices.
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 isDivisor shim.
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
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
#define BLAZE_CONSTRAINT_MUST_NOT_BE_HERMITIAN_MATRIX_TYPE(T)
Constraint on the data type.In case the given data type T is an Hermitian matrix type, a compilation error is created.
Definition: Hermitian.h:79
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
InversionFlag
Inversion flag.The InversionFlag type enumeration represents the different types of matrix inversion ...
Definition: InversionFlag.h:101
#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
LowerMatrix specialization for dense matrices.
Header file for the HighType type trait.
Header file for the TrueType type/value trait base class.