SymmetricMatrix.h
Go to the documentation of this file.
1 //=================================================================================================
33 //=================================================================================================
34 
35 #ifndef _BLAZE_MATH_ADAPTORS_SYMMETRICMATRIX_H_
36 #define _BLAZE_MATH_ADAPTORS_SYMMETRICMATRIX_H_
37 
38 
39 //*************************************************************************************************
40 // Includes
41 //*************************************************************************************************
42 
51 #include <blaze/math/Forward.h>
52 #include <blaze/math/Functions.h>
72 #include <blaze/util/Assert.h>
73 #include <blaze/util/EnableIf.h>
74 #include <blaze/util/Exception.h>
77 #include <blaze/util/Unused.h>
79 
80 
81 namespace blaze {
82 
83 //=================================================================================================
84 //
85 // SYMMETRICMATRIX OPERATORS
86 //
87 //=================================================================================================
88 
89 //*************************************************************************************************
92 template< typename MT, bool SO, bool DF, bool NF >
93 inline void reset( SymmetricMatrix<MT,SO,DF,NF>& m );
94 
95 template< typename MT, bool SO, bool DF, bool NF >
96 inline void reset( SymmetricMatrix<MT,SO,DF,NF>& m, size_t i );
97 
98 template< typename MT, bool SO, bool DF, bool NF >
99 inline void clear( SymmetricMatrix<MT,SO,DF,NF>& m );
100 
101 template< typename MT, bool SO, bool DF, bool NF >
102 inline bool isDefault( const SymmetricMatrix<MT,SO,DF,NF>& m );
103 
104 template< typename MT, bool SO, bool DF, bool NF >
105 inline bool isIntact( const SymmetricMatrix<MT,SO,DF,NF>& m );
106 
107 template< typename MT, bool SO, bool DF, bool NF >
108 inline void swap( SymmetricMatrix<MT,SO,DF,NF>& a, SymmetricMatrix<MT,SO,DF,NF>& b ) /* throw() */;
110 //*************************************************************************************************
111 
112 
113 //*************************************************************************************************
120 template< typename MT // Type of the adapted matrix
121  , bool SO // Storage order of the adapted matrix
122  , bool DF // Density flag
123  , bool NF > // Numeric 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  , bool NF > // Numeric flag
148 inline void reset( SymmetricMatrix<MT,SO,DF,NF>& m, size_t i )
149 {
150  m.reset( i );
151 }
152 //*************************************************************************************************
153 
154 
155 //*************************************************************************************************
162 template< typename MT // Type of the adapted matrix
163  , bool SO // Storage order of the adapted matrix
164  , bool DF // Density flag
165  , bool NF > // Numeric flag
167 {
168  m.clear();
169 }
170 //*************************************************************************************************
171 
172 
173 //*************************************************************************************************
191 template< typename MT // Type of the adapted matrix
192  , bool SO // Storage order of the adapted matrix
193  , bool DF // Density flag
194  , bool NF > // Numeric flag
196 {
197  return isDefault( m.matrix_ );
198 }
199 //*************************************************************************************************
200 
201 
202 //*************************************************************************************************
223 template< typename MT // Type of the adapted matrix
224  , bool SO // Storage order of the adapted matrix
225  , bool DF // Density flag
226  , bool NF > // Numeric flag
227 inline bool isIntact( const SymmetricMatrix<MT,SO,DF,NF>& m )
228 {
229  return m.isIntact();
230 }
231 //*************************************************************************************************
232 
233 
234 //*************************************************************************************************
243 template< typename MT // Type of the adapted matrix
244  , bool SO // Storage order of the adapted matrix
245  , bool DF // Density flag
246  , bool NF > // Numeric flag
248 {
249  a.swap( b );
250 }
251 //*************************************************************************************************
252 
253 
254 //*************************************************************************************************
271 template< typename MT // Type of the dense matrix
272  , bool SO > // Storage order of the dense matrix
273 inline void invert2x2( SymmetricMatrix<MT,SO,true,true>& m )
274 {
276 
277  BLAZE_INTERNAL_ASSERT( m.rows() == 2UL, "Invalid number of rows detected" );
278  BLAZE_INTERNAL_ASSERT( m.columns() == 2UL, "Invalid number of columns detected" );
279 
280  typedef typename MT::ElementType ET;
281 
282  const MT& A( m.matrix_ );
283  MT& B( m.matrix_ );
284 
285  const ET det( A(0,0)*A(1,1) - A(0,1)*A(1,0) );
286 
287  if( isDefault( det ) ) {
288  BLAZE_THROW_INVALID_ARGUMENT( "Inversion of singular matrix failed" );
289  }
290 
291  const ET idet( ET(1) / det );
292  const ET a11( A(0,0) * idet );
293 
294  B(0,0) = A(1,1) * idet;
295  B(1,0) = -A(1,0) * idet;
296  B(0,1) = B(1,0);
297  B(1,1) = a11;
298 
299  BLAZE_INTERNAL_ASSERT( isIntact( m ), "Broken invariant detected" );
300 }
302 //*************************************************************************************************
303 
304 
305 //*************************************************************************************************
322 template< typename MT // Type of the dense matrix
323  , bool SO > // Storage order of the dense matrix
324 inline void invert3x3( SymmetricMatrix<MT,SO,true,true>& m )
325 {
327 
328  BLAZE_INTERNAL_ASSERT( m.rows() == 3UL, "Invalid number of rows detected" );
329  BLAZE_INTERNAL_ASSERT( m.columns() == 3UL, "Invalid number of columns detected" );
330 
331  typedef typename MT::ElementType ET;
332 
333  const StaticMatrix<ET,3UL,3UL,SO> A( m.matrix_ );
334  MT& B( m.matrix_ );
335 
336  B(0,0) = A(1,1)*A(2,2) - A(1,2)*A(2,1);
337  B(1,0) = A(1,2)*A(2,0) - A(1,0)*A(2,2);
338  B(2,0) = A(1,0)*A(2,1) - A(1,1)*A(2,0);
339 
340  const ET det( A(0,0)*B(0,0) + A(0,1)*B(1,0) + A(0,2)*B(2,0) );
341 
342  if( isDefault( det ) ) {
343  BLAZE_THROW_INVALID_ARGUMENT( "Inversion of singular matrix failed" );
344  }
345 
346  B(0,1) = B(1,0);
347  B(1,1) = A(0,0)*A(2,2) - A(0,2)*A(2,0);
348  B(2,1) = A(0,1)*A(2,0) - A(0,0)*A(2,1);
349  B(0,2) = B(2,0);
350  B(1,2) = B(2,1);
351  B(2,2) = A(0,0)*A(1,1) - A(0,1)*A(1,0);
352 
353  B /= det;
354 
355  BLAZE_INTERNAL_ASSERT( isIntact( m ), "Broken invariant detected" );
356 }
358 //*************************************************************************************************
359 
360 
361 //*************************************************************************************************
378 template< typename MT // Type of the dense matrix
379  , bool SO > // Storage order of the dense matrix
380 inline void invert4x4( SymmetricMatrix<MT,SO,true,true>& m )
381 {
383 
384  BLAZE_INTERNAL_ASSERT( m.rows() == 4UL, "Invalid number of rows detected" );
385  BLAZE_INTERNAL_ASSERT( m.columns() == 4UL, "Invalid number of columns detected" );
386 
387  typedef typename MT::ElementType ET;
388 
389  const StaticMatrix<ET,4UL,4UL,SO> A( m.matrix_ );
390  MT& B( m.matrix_ );
391 
392  ET tmp1( A(2,2)*A(3,3) - A(2,3)*A(3,2) );
393  ET tmp2( A(2,1)*A(3,3) - A(2,3)*A(3,1) );
394  ET tmp3( A(2,1)*A(3,2) - A(2,2)*A(3,1) );
395 
396  B(0,0) = A(1,1)*tmp1 - A(1,2)*tmp2 + A(1,3)*tmp3;
397  B(0,1) = A(0,2)*tmp2 - A(0,1)*tmp1 - A(0,3)*tmp3;
398 
399  ET tmp4( A(2,0)*A(3,3) - A(2,3)*A(3,0) );
400  ET tmp5( A(2,0)*A(3,2) - A(2,2)*A(3,0) );
401 
402  B(1,1) = A(0,0)*tmp1 - A(0,2)*tmp4 + A(0,3)*tmp5;
403 
404  tmp1 = A(2,0)*A(3,1) - A(2,1)*A(3,0);
405 
406  B(2,0) = A(1,0)*tmp2 - A(1,1)*tmp4 + A(1,3)*tmp1;
407  B(2,1) = A(0,1)*tmp4 - A(0,0)*tmp2 - A(0,3)*tmp1;
408  B(3,0) = A(1,1)*tmp5 - A(1,0)*tmp3 - A(1,2)*tmp1;
409  B(3,1) = A(0,0)*tmp3 - A(0,1)*tmp5 + A(0,2)*tmp1;
410 
411  tmp1 = A(0,1)*A(1,3) - A(0,3)*A(1,1);
412  tmp2 = A(0,1)*A(1,2) - A(0,2)*A(1,1);
413  tmp3 = A(0,0)*A(1,3) - A(0,3)*A(1,0);
414  tmp4 = A(0,0)*A(1,2) - A(0,2)*A(1,0);
415  tmp5 = A(0,0)*A(1,1) - A(0,1)*A(1,0);
416 
417  B(2,2) = A(3,0)*tmp1 - A(3,1)*tmp3 + A(3,3)*tmp5;
418  B(2,3) = A(2,1)*tmp3 - A(2,0)*tmp1 - A(2,3)*tmp5;
419  B(3,3) = A(2,0)*tmp2 - A(2,1)*tmp4 + A(2,2)*tmp5;
420 
421  B(0,2) = B(2,0);
422  B(0,3) = B(3,0);
423  B(1,0) = B(0,1);
424  B(1,2) = B(2,1);
425  B(1,3) = B(3,1);
426  B(3,2) = B(2,3);
427 
428  const ET det( A(0,0)*B(0,0) + A(0,1)*B(1,0) + A(0,2)*B(2,0) + A(0,3)*B(3,0) );
429 
430  if( isDefault( det ) ) {
431  BLAZE_THROW_INVALID_ARGUMENT( "Inversion of singular matrix failed" );
432  }
433 
434  B /= det;
435 
436  BLAZE_INTERNAL_ASSERT( isIntact( m ), "Broken invariant detected" );
437 }
439 //*************************************************************************************************
440 
441 
442 //*************************************************************************************************
459 template< typename MT // Type of the dense matrix
460  , bool SO > // Storage order of the dense matrix
461 inline void invert5x5( SymmetricMatrix<MT,SO,true,true>& m )
462 {
464 
465  BLAZE_INTERNAL_ASSERT( m.rows() == 5UL, "Invalid number of rows detected" );
466  BLAZE_INTERNAL_ASSERT( m.columns() == 5UL, "Invalid number of columns detected" );
467 
468  typedef typename MT::ElementType ET;
469 
470  const StaticMatrix<ET,5UL,5UL,SO> A( m.matrix_ );
471  MT& B( m.matrix_ );
472 
473  ET tmp1 ( A(3,3)*A(4,4) - A(3,4)*A(4,3) );
474  ET tmp2 ( A(3,2)*A(4,4) - A(3,4)*A(4,2) );
475  ET tmp3 ( A(3,2)*A(4,3) - A(3,3)*A(4,2) );
476  ET tmp4 ( A(3,1)*A(4,4) - A(3,4)*A(4,1) );
477  ET tmp5 ( A(3,1)*A(4,3) - A(3,3)*A(4,1) );
478  ET tmp6 ( A(3,1)*A(4,2) - A(3,2)*A(4,1) );
479  ET tmp7 ( A(3,0)*A(4,4) - A(3,4)*A(4,0) );
480  ET tmp8 ( A(3,0)*A(4,3) - A(3,3)*A(4,0) );
481  ET tmp9 ( A(3,0)*A(4,2) - A(3,2)*A(4,0) );
482  ET tmp10( A(3,0)*A(4,1) - A(3,1)*A(4,0) );
483 
484  ET tmp11( A(2,2)*tmp1 - A(2,3)*tmp2 + A(2,4)*tmp3 );
485  ET tmp12( A(2,1)*tmp1 - A(2,3)*tmp4 + A(2,4)*tmp5 );
486  ET tmp13( A(2,1)*tmp2 - A(2,2)*tmp4 + A(2,4)*tmp6 );
487  ET tmp14( A(2,1)*tmp3 - A(2,2)*tmp5 + A(2,3)*tmp6 );
488  ET tmp15( A(2,0)*tmp1 - A(2,3)*tmp7 + A(2,4)*tmp8 );
489  ET tmp16( A(2,0)*tmp2 - A(2,2)*tmp7 + A(2,4)*tmp9 );
490  ET tmp17( A(2,0)*tmp3 - A(2,2)*tmp8 + A(2,3)*tmp9 );
491 
492  B(0,0) = A(1,1)*tmp11 - A(1,2)*tmp12 + A(1,3)*tmp13 - A(1,4)*tmp14;
493  B(0,1) = - A(0,1)*tmp11 + A(0,2)*tmp12 - A(0,3)*tmp13 + A(0,4)*tmp14;
494  B(1,1) = A(0,0)*tmp11 - A(0,2)*tmp15 + A(0,3)*tmp16 - A(0,4)*tmp17;
495 
496  ET tmp18( A(2,0)*tmp4 - A(2,1)*tmp7 + A(2,4)*tmp10 );
497  ET tmp19( A(2,0)*tmp5 - A(2,1)*tmp8 + A(2,3)*tmp10 );
498  ET tmp20( A(2,0)*tmp6 - A(2,1)*tmp9 + A(2,2)*tmp10 );
499 
500  B(2,0) = A(1,0)*tmp12 - A(1,1)*tmp15 + A(1,3)*tmp18 - A(1,4)*tmp19;
501  B(2,1) = - A(0,0)*tmp12 + A(0,1)*tmp15 - A(0,3)*tmp18 + A(0,4)*tmp19;
502  B(3,0) = - A(1,0)*tmp13 + A(1,1)*tmp16 - A(1,2)*tmp18 + A(1,4)*tmp20;
503  B(3,1) = A(0,0)*tmp13 - A(0,1)*tmp16 + A(0,2)*tmp18 - A(0,4)*tmp20;
504  B(4,0) = A(1,0)*tmp14 - A(1,1)*tmp17 + A(1,2)*tmp19 - A(1,3)*tmp20;
505  B(4,1) = - A(0,0)*tmp14 + A(0,1)*tmp17 - A(0,2)*tmp19 + A(0,3)*tmp20;
506 
507  tmp11 = A(1,1)*tmp1 - A(1,3)*tmp4 + A(1,4)*tmp5;
508  tmp12 = A(1,0)*tmp1 - A(1,3)*tmp7 + A(1,4)*tmp8;
509  tmp13 = A(1,0)*tmp4 - A(1,1)*tmp7 + A(1,4)*tmp10;
510  tmp14 = A(1,0)*tmp5 - A(1,1)*tmp8 + A(1,3)*tmp10;
511 
512  B(2,2) = A(0,0)*tmp11 - A(0,1)*tmp12 + A(0,3)*tmp13 - A(0,4)*tmp14;
513 
514  tmp1 = A(0,2)*A(1,3) - A(0,3)*A(1,2);
515  tmp2 = A(0,1)*A(1,3) - A(0,3)*A(1,1);
516  tmp3 = A(0,1)*A(1,2) - A(0,2)*A(1,1);
517  tmp4 = A(0,0)*A(1,3) - A(0,3)*A(1,0);
518  tmp5 = A(0,0)*A(1,2) - A(0,2)*A(1,0);
519  tmp6 = A(0,0)*A(1,1) - A(0,1)*A(1,0);
520  tmp7 = A(0,2)*A(1,4) - A(0,4)*A(1,2);
521  tmp8 = A(0,1)*A(1,4) - A(0,4)*A(1,1);
522  tmp9 = A(0,0)*A(1,4) - A(0,4)*A(1,0);
523  tmp10 = A(0,3)*A(1,4) - A(0,4)*A(1,3);
524 
525  tmp11 = A(2,1)*tmp10 - A(2,3)*tmp8 + A(2,4)*tmp2;
526  tmp12 = A(2,1)*tmp7 - A(2,2)*tmp8 + A(2,4)*tmp3;
527  tmp13 = A(2,1)*tmp1 - A(2,2)*tmp2 + A(2,3)*tmp3;
528  tmp14 = A(2,0)*tmp10 - A(2,3)*tmp9 + A(2,4)*tmp4;
529  tmp15 = A(2,0)*tmp7 - A(2,2)*tmp9 + A(2,4)*tmp5;
530  tmp16 = A(2,0)*tmp1 - A(2,2)*tmp4 + A(2,3)*tmp5;
531  tmp17 = A(2,0)*tmp8 - A(2,1)*tmp9 + A(2,4)*tmp6;
532  tmp18 = A(2,0)*tmp2 - A(2,1)*tmp4 + A(2,3)*tmp6;
533  tmp19 = A(2,0)*tmp3 - A(2,1)*tmp5 + A(2,2)*tmp6;
534 
535  B(2,3) = A(4,0)*tmp11 - A(4,1)*tmp14 + A(4,3)*tmp17 - A(4,4)*tmp18;
536  B(2,4) = - A(3,0)*tmp11 + A(3,1)*tmp14 - A(3,3)*tmp17 + A(3,4)*tmp18;
537  B(3,3) = - A(4,0)*tmp12 + A(4,1)*tmp15 - A(4,2)*tmp17 + A(4,4)*tmp19;
538  B(3,4) = A(3,0)*tmp12 - A(3,1)*tmp15 + A(3,2)*tmp17 - A(3,4)*tmp19;
539  B(4,4) = - A(3,0)*tmp13 + A(3,1)*tmp16 - A(3,2)*tmp18 + A(3,3)*tmp19;
540 
541  B(0,2) = B(2,0);
542  B(0,3) = B(3,0);
543  B(0,4) = B(4,0);
544  B(1,0) = B(0,1);
545  B(1,2) = B(2,1);
546  B(1,3) = B(3,1);
547  B(1,4) = B(4,1);
548  B(3,2) = B(2,3);
549  B(4,2) = B(2,4);
550  B(4,3) = B(3,4);
551 
552  const ET det( A(0,0)*B(0,0) + A(0,1)*B(1,0) + A(0,2)*B(2,0) + A(0,3)*B(3,0) + A(0,4)*B(4,0) );
553 
554  if( isDefault( det ) ) {
555  BLAZE_THROW_INVALID_ARGUMENT( "Inversion of singular matrix failed" );
556  }
557 
558  B /= det;
559 
560  BLAZE_INTERNAL_ASSERT( isIntact( m ), "Broken invariant detected" );
561 }
563 //*************************************************************************************************
564 
565 
566 //*************************************************************************************************
583 template< typename MT // Type of the dense matrix
584  , bool SO > // Storage order of the dense matrix
585 inline void invert6x6( SymmetricMatrix<MT,SO,true,true>& m )
586 {
588 
589  BLAZE_INTERNAL_ASSERT( m.rows() == 6UL, "Invalid number of rows detected" );
590  BLAZE_INTERNAL_ASSERT( m.columns() == 6UL, "Invalid number of columns detected" );
591 
592  typedef typename MT::ElementType ET;
593 
594  const StaticMatrix<ET,6UL,6UL,SO> A( m.matrix_ );
595  MT& B( m.matrix_ );
596 
597  ET tmp1 ( A(4,4)*A(5,5) - A(4,5)*A(5,4) );
598  ET tmp2 ( A(4,3)*A(5,5) - A(4,5)*A(5,3) );
599  ET tmp3 ( A(4,3)*A(5,4) - A(4,4)*A(5,3) );
600  ET tmp4 ( A(4,2)*A(5,5) - A(4,5)*A(5,2) );
601  ET tmp5 ( A(4,2)*A(5,4) - A(4,4)*A(5,2) );
602  ET tmp6 ( A(4,2)*A(5,3) - A(4,3)*A(5,2) );
603  ET tmp7 ( A(4,1)*A(5,5) - A(4,5)*A(5,1) );
604  ET tmp8 ( A(4,1)*A(5,4) - A(4,4)*A(5,1) );
605  ET tmp9 ( A(4,1)*A(5,3) - A(4,3)*A(5,1) );
606  ET tmp10( A(4,1)*A(5,2) - A(4,2)*A(5,1) );
607  ET tmp11( A(4,0)*A(5,5) - A(4,5)*A(5,0) );
608  ET tmp12( A(4,0)*A(5,4) - A(4,4)*A(5,0) );
609  ET tmp13( A(4,0)*A(5,3) - A(4,3)*A(5,0) );
610  ET tmp14( A(4,0)*A(5,2) - A(4,2)*A(5,0) );
611  ET tmp15( A(4,0)*A(5,1) - A(4,1)*A(5,0) );
612 
613  ET tmp16( A(3,3)*tmp1 - A(3,4)*tmp2 + A(3,5)*tmp3 );
614  ET tmp17( A(3,2)*tmp1 - A(3,4)*tmp4 + A(3,5)*tmp5 );
615  ET tmp18( A(3,2)*tmp2 - A(3,3)*tmp4 + A(3,5)*tmp6 );
616  ET tmp19( A(3,2)*tmp3 - A(3,3)*tmp5 + A(3,4)*tmp6 );
617  ET tmp20( A(3,1)*tmp1 - A(3,4)*tmp7 + A(3,5)*tmp8 );
618  ET tmp21( A(3,1)*tmp2 - A(3,3)*tmp7 + A(3,5)*tmp9 );
619  ET tmp22( A(3,1)*tmp3 - A(3,3)*tmp8 + A(3,4)*tmp9 );
620  ET tmp23( A(3,1)*tmp4 - A(3,2)*tmp7 + A(3,5)*tmp10 );
621  ET tmp24( A(3,1)*tmp5 - A(3,2)*tmp8 + A(3,4)*tmp10 );
622  ET tmp25( A(3,1)*tmp6 - A(3,2)*tmp9 + A(3,3)*tmp10 );
623  ET tmp26( A(3,0)*tmp1 - A(3,4)*tmp11 + A(3,5)*tmp12 );
624  ET tmp27( A(3,0)*tmp2 - A(3,3)*tmp11 + A(3,5)*tmp13 );
625  ET tmp28( A(3,0)*tmp3 - A(3,3)*tmp12 + A(3,4)*tmp13 );
626  ET tmp29( A(3,0)*tmp4 - A(3,2)*tmp11 + A(3,5)*tmp14 );
627  ET tmp30( A(3,0)*tmp5 - A(3,2)*tmp12 + A(3,4)*tmp14 );
628  ET tmp31( A(3,0)*tmp6 - A(3,2)*tmp13 + A(3,3)*tmp14 );
629  ET tmp32( A(3,0)*tmp7 - A(3,1)*tmp11 + A(3,5)*tmp15 );
630  ET tmp33( A(3,0)*tmp8 - A(3,1)*tmp12 + A(3,4)*tmp15 );
631  ET tmp34( A(3,0)*tmp9 - A(3,1)*tmp13 + A(3,3)*tmp15 );
632  ET tmp35( A(3,0)*tmp10 - A(3,1)*tmp14 + A(3,2)*tmp15 );
633 
634  ET tmp36( A(2,2)*tmp16 - A(2,3)*tmp17 + A(2,4)*tmp18 - A(2,5)*tmp19 );
635  ET tmp37( A(2,1)*tmp16 - A(2,3)*tmp20 + A(2,4)*tmp21 - A(2,5)*tmp22 );
636  ET tmp38( A(2,1)*tmp17 - A(2,2)*tmp20 + A(2,4)*tmp23 - A(2,5)*tmp24 );
637  ET tmp39( A(2,1)*tmp18 - A(2,2)*tmp21 + A(2,3)*tmp23 - A(2,5)*tmp25 );
638  ET tmp40( A(2,1)*tmp19 - A(2,2)*tmp22 + A(2,3)*tmp24 - A(2,4)*tmp25 );
639  ET tmp41( A(2,0)*tmp16 - A(2,3)*tmp26 + A(2,4)*tmp27 - A(2,5)*tmp28 );
640  ET tmp42( A(2,0)*tmp17 - A(2,2)*tmp26 + A(2,4)*tmp29 - A(2,5)*tmp30 );
641  ET tmp43( A(2,0)*tmp18 - A(2,2)*tmp27 + A(2,3)*tmp29 - A(2,5)*tmp31 );
642  ET tmp44( A(2,0)*tmp19 - A(2,2)*tmp28 + A(2,3)*tmp30 - A(2,4)*tmp31 );
643 
644  B(0,0) = A(1,1)*tmp36 - A(1,2)*tmp37 + A(1,3)*tmp38 - A(1,4)*tmp39 + A(1,5)*tmp40;
645  B(0,1) = - A(0,1)*tmp36 + A(0,2)*tmp37 - A(0,3)*tmp38 + A(0,4)*tmp39 - A(0,5)*tmp40;
646  B(1,1) = A(0,0)*tmp36 - A(0,2)*tmp41 + A(0,3)*tmp42 - A(0,4)*tmp43 + A(0,5)*tmp44;
647 
648  ET tmp45( A(2,0)*tmp20 - A(2,1)*tmp26 + A(2,4)*tmp32 - A(2,5)*tmp33 );
649  ET tmp46( A(2,0)*tmp21 - A(2,1)*tmp27 + A(2,3)*tmp32 - A(2,5)*tmp34 );
650  ET tmp47( A(2,0)*tmp22 - A(2,1)*tmp28 + A(2,3)*tmp33 - A(2,4)*tmp34 );
651  ET tmp48( A(2,0)*tmp23 - A(2,1)*tmp29 + A(2,2)*tmp32 - A(2,5)*tmp35 );
652  ET tmp49( A(2,0)*tmp24 - A(2,1)*tmp30 + A(2,2)*tmp33 - A(2,4)*tmp35 );
653 
654  B(2,0) = A(1,0)*tmp37 - A(1,1)*tmp41 + A(1,3)*tmp45 - A(1,4)*tmp46 + A(1,5)*tmp47;
655  B(2,1) = - A(0,0)*tmp37 + A(0,1)*tmp41 - A(0,3)*tmp45 + A(0,4)*tmp46 - A(0,5)*tmp47;
656  B(3,0) = - A(1,0)*tmp38 + A(1,1)*tmp42 - A(1,2)*tmp45 + A(1,4)*tmp48 - A(1,5)*tmp49;
657  B(3,1) = A(0,0)*tmp38 - A(0,1)*tmp42 + A(0,2)*tmp45 - A(0,4)*tmp48 + A(0,5)*tmp49;
658 
659  ET tmp50( A(2,0)*tmp25 - A(2,1)*tmp31 + A(2,2)*tmp34 - A(2,3)*tmp35 );
660 
661  B(4,0) = A(1,0)*tmp39 - A(1,1)*tmp43 + A(1,2)*tmp46 - A(1,3)*tmp48 + A(1,5)*tmp50;
662  B(4,1) = - A(0,0)*tmp39 + A(0,1)*tmp43 - A(0,2)*tmp46 + A(0,3)*tmp48 - A(0,5)*tmp50;
663  B(5,0) = - A(1,0)*tmp40 + A(1,1)*tmp44 - A(1,2)*tmp47 + A(1,3)*tmp49 - A(1,4)*tmp50;
664  B(5,1) = A(0,0)*tmp40 - A(0,1)*tmp44 + A(0,2)*tmp47 - A(0,3)*tmp49 + A(0,4)*tmp50;
665 
666  tmp36 = A(1,1)*tmp16 - A(1,3)*tmp20 + A(1,4)*tmp21 - A(1,5)*tmp22;
667  tmp37 = A(1,1)*tmp17 - A(1,2)*tmp20 + A(1,4)*tmp23 - A(1,5)*tmp24;
668  tmp38 = A(1,0)*tmp16 - A(1,3)*tmp26 + A(1,4)*tmp27 - A(1,5)*tmp28;
669  tmp39 = A(1,0)*tmp17 - A(1,2)*tmp26 + A(1,4)*tmp29 - A(1,5)*tmp30;
670  tmp40 = A(1,0)*tmp20 - A(1,1)*tmp26 + A(1,4)*tmp32 - A(1,5)*tmp33;
671  tmp41 = A(1,0)*tmp21 - A(1,1)*tmp27 + A(1,3)*tmp32 - A(1,5)*tmp34;
672  tmp42 = A(1,0)*tmp22 - A(1,1)*tmp28 + A(1,3)*tmp33 - A(1,4)*tmp34;
673  tmp43 = A(1,0)*tmp23 - A(1,1)*tmp29 + A(1,2)*tmp32 - A(1,5)*tmp35;
674  tmp44 = A(1,0)*tmp24 - A(1,1)*tmp30 + A(1,2)*tmp33 - A(1,4)*tmp35;
675 
676  B(2,2) = A(0,0)*tmp36 - A(0,1)*tmp38 + A(0,3)*tmp40 - A(0,4)*tmp41 + A(0,5)*tmp42;
677  B(3,2) = - A(0,0)*tmp37 + A(0,1)*tmp39 - A(0,2)*tmp40 + A(0,4)*tmp43 - A(0,5)*tmp44;
678 
679  tmp1 = A(0,3)*A(1,4) - A(0,4)*A(1,3);
680  tmp2 = A(0,2)*A(1,4) - A(0,4)*A(1,2);
681  tmp3 = A(0,2)*A(1,3) - A(0,3)*A(1,2);
682  tmp4 = A(0,1)*A(1,4) - A(0,4)*A(1,1);
683  tmp5 = A(0,1)*A(1,3) - A(0,3)*A(1,1);
684  tmp6 = A(0,1)*A(1,2) - A(0,2)*A(1,1);
685  tmp7 = A(0,0)*A(1,4) - A(0,4)*A(1,0);
686  tmp8 = A(0,0)*A(1,3) - A(0,3)*A(1,0);
687  tmp9 = A(0,0)*A(1,2) - A(0,2)*A(1,0);
688  tmp10 = A(0,0)*A(1,1) - A(0,1)*A(1,0);
689  tmp11 = A(0,3)*A(1,5) - A(0,5)*A(1,3);
690  tmp12 = A(0,2)*A(1,5) - A(0,5)*A(1,2);
691  tmp13 = A(0,1)*A(1,5) - A(0,5)*A(1,1);
692  tmp14 = A(0,0)*A(1,5) - A(0,5)*A(1,0);
693  tmp15 = A(0,4)*A(1,5) - A(0,5)*A(1,4);
694 
695  tmp16 = A(2,3)*tmp15 - A(2,4)*tmp11 + A(2,5)*tmp1;
696  tmp17 = A(2,2)*tmp15 - A(2,4)*tmp12 + A(2,5)*tmp2;
697  tmp18 = A(2,2)*tmp11 - A(2,3)*tmp12 + A(2,5)*tmp3;
698  tmp19 = A(2,2)*tmp1 - A(2,3)*tmp2 + A(2,4)*tmp3;
699  tmp20 = A(2,1)*tmp15 - A(2,4)*tmp13 + A(2,5)*tmp4;
700  tmp21 = A(2,1)*tmp11 - A(2,3)*tmp13 + A(2,5)*tmp5;
701  tmp22 = A(2,1)*tmp1 - A(2,3)*tmp4 + A(2,4)*tmp5;
702  tmp23 = A(2,1)*tmp12 - A(2,2)*tmp13 + A(2,5)*tmp6;
703  tmp24 = A(2,1)*tmp2 - A(2,2)*tmp4 + A(2,4)*tmp6;
704  tmp25 = A(2,1)*tmp3 - A(2,2)*tmp5 + A(2,3)*tmp6;
705  tmp26 = A(2,0)*tmp15 - A(2,4)*tmp14 + A(2,5)*tmp7;
706  tmp27 = A(2,0)*tmp11 - A(2,3)*tmp14 + A(2,5)*tmp8;
707  tmp28 = A(2,0)*tmp1 - A(2,3)*tmp7 + A(2,4)*tmp8;
708  tmp29 = A(2,0)*tmp12 - A(2,2)*tmp14 + A(2,5)*tmp9;
709  tmp30 = A(2,0)*tmp2 - A(2,2)*tmp7 + A(2,4)*tmp9;
710  tmp31 = A(2,0)*tmp3 - A(2,2)*tmp8 + A(2,3)*tmp9;
711  tmp32 = A(2,0)*tmp13 - A(2,1)*tmp14 + A(2,5)*tmp10;
712  tmp33 = A(2,0)*tmp4 - A(2,1)*tmp7 + A(2,4)*tmp10;
713  tmp34 = A(2,0)*tmp5 - A(2,1)*tmp8 + A(2,3)*tmp10;
714  tmp35 = A(2,0)*tmp6 - A(2,1)*tmp9 + A(2,2)*tmp10;
715 
716  tmp36 = A(3,1)*tmp16 - A(3,3)*tmp20 + A(3,4)*tmp21 - A(3,5)*tmp22;
717  tmp37 = A(3,1)*tmp17 - A(3,2)*tmp20 + A(3,4)*tmp23 - A(3,5)*tmp24;
718  tmp38 = A(3,0)*tmp16 - A(3,3)*tmp26 + A(3,4)*tmp27 - A(3,5)*tmp28;
719  tmp39 = A(3,0)*tmp17 - A(3,2)*tmp26 + A(3,4)*tmp29 - A(3,5)*tmp30;
720  tmp40 = A(3,0)*tmp20 - A(3,1)*tmp26 + A(3,4)*tmp32 - A(3,5)*tmp33;
721  tmp41 = A(3,0)*tmp21 - A(3,1)*tmp27 + A(3,3)*tmp32 - A(3,5)*tmp34;
722  tmp42 = A(3,0)*tmp22 - A(3,1)*tmp28 + A(3,3)*tmp33 - A(3,4)*tmp34;
723  tmp43 = A(3,0)*tmp23 - A(3,1)*tmp29 + A(3,2)*tmp32 - A(3,5)*tmp35;
724  tmp44 = A(3,0)*tmp24 - A(3,1)*tmp30 + A(3,2)*tmp33 - A(3,4)*tmp35;
725 
726  B(2,4) = - A(5,0)*tmp36 + A(5,1)*tmp38 - A(5,3)*tmp40 + A(5,4)*tmp41 - A(5,5)*tmp42;
727  B(2,5) = A(4,0)*tmp36 - A(4,1)*tmp38 + A(4,3)*tmp40 - A(4,4)*tmp41 + A(4,5)*tmp42;
728  B(3,4) = A(5,0)*tmp37 - A(5,1)*tmp39 + A(5,2)*tmp40 - A(5,4)*tmp43 + A(5,5)*tmp44;
729  B(3,5) = - A(4,0)*tmp37 + A(4,1)*tmp39 - A(4,2)*tmp40 + A(4,4)*tmp43 - A(4,5)*tmp44;
730 
731  tmp36 = A(3,1)*tmp18 - A(3,2)*tmp21 + A(3,3)*tmp23 - A(3,5)*tmp25;
732  tmp37 = A(3,1)*tmp19 - A(3,2)*tmp22 + A(3,3)*tmp24 - A(3,4)*tmp25;
733  tmp38 = A(3,0)*tmp18 - A(3,2)*tmp27 + A(3,3)*tmp29 - A(3,5)*tmp31;
734  tmp39 = A(3,0)*tmp19 - A(3,2)*tmp28 + A(3,3)*tmp30 - A(3,4)*tmp31;
735  tmp40 = A(3,0)*tmp25 - A(3,1)*tmp31 + A(3,2)*tmp34 - A(3,3)*tmp35;
736 
737  B(4,4) = - A(5,0)*tmp36 + A(5,1)*tmp38 - A(5,2)*tmp41 + A(5,3)*tmp43 - A(5,5)*tmp40;
738  B(4,5) = A(4,0)*tmp36 - A(4,1)*tmp38 + A(4,2)*tmp41 - A(4,3)*tmp43 + A(4,5)*tmp40;
739  B(5,5) = - A(4,0)*tmp37 + A(4,1)*tmp39 - A(4,2)*tmp42 + A(4,3)*tmp44 - A(4,4)*tmp40;
740 
741  tmp36 = A(4,1)*tmp17 - A(4,2)*tmp20 + A(4,4)*tmp23 - A(4,5)*tmp24;
742  tmp37 = A(4,0)*tmp17 - A(4,2)*tmp26 + A(4,4)*tmp29 - A(4,5)*tmp30;
743  tmp38 = A(4,0)*tmp20 - A(4,1)*tmp26 + A(4,4)*tmp32 - A(4,5)*tmp33;
744  tmp39 = A(4,0)*tmp23 - A(4,1)*tmp29 + A(4,2)*tmp32 - A(4,5)*tmp35;
745  tmp40 = A(4,0)*tmp24 - A(4,1)*tmp30 + A(4,2)*tmp33 - A(4,4)*tmp35;
746 
747  B(3,3) = - A(5,0)*tmp36 + A(5,1)*tmp37 - A(5,2)*tmp38 + A(5,4)*tmp39 - A(5,5)*tmp40;
748 
749  B(0,2) = B(2,0);
750  B(0,3) = B(3,0);
751  B(0,4) = B(4,0);
752  B(0,5) = B(5,0);
753  B(1,0) = B(0,1);
754  B(1,2) = B(2,1);
755  B(1,3) = B(3,1);
756  B(1,4) = B(4,1);
757  B(1,5) = B(5,1);
758  B(2,3) = B(3,2);
759  B(4,2) = B(2,4);
760  B(4,3) = B(3,4);
761  B(5,2) = B(2,5);
762  B(5,3) = B(3,5);
763  B(5,4) = B(4,5);
764 
765  const ET det( A(0,0)*B(0,0) + A(0,1)*B(1,0) + A(0,2)*B(2,0) +
766  A(0,3)*B(3,0) + A(0,4)*B(4,0) + A(0,5)*B(5,0) );
767 
768  if( isDefault( det ) ) {
769  BLAZE_THROW_INVALID_ARGUMENT( "Inversion of singular matrix failed" );
770  }
771 
772  B /= det;
773 
774  BLAZE_INTERNAL_ASSERT( isIntact( m ), "Broken invariant detected" );
775 }
777 //*************************************************************************************************
778 
779 
780 //*************************************************************************************************
803 template< typename MT // Type of the dense matrix
804  , bool SO > // Storage order of the dense matrix
805 inline void invertByDefault( SymmetricMatrix<MT,SO,true,true>& m )
806 {
807  invertByLDLT( m );
808 }
810 //*************************************************************************************************
811 
812 
813 //*************************************************************************************************
836 template< typename MT // Type of the dense matrix
837  , bool SO > // Storage order of the dense matrix
838 inline void invertByLU( SymmetricMatrix<MT,SO,true,true>& m )
839 {
841 
842  MT tmp( m.matrix_ );
843  invertByLU( tmp );
844  move( m.matrix_, tmp );
845 
846  BLAZE_INTERNAL_ASSERT( isIntact( m ), "Broken invariant detected" );
847 }
849 //*************************************************************************************************
850 
851 
852 //*************************************************************************************************
875 template< typename MT // Type of the dense matrix
876  , bool SO > // Storage order of the dense matrix
877 inline void invertByLDLT( SymmetricMatrix<MT,SO,true,true>& m )
878 {
880 
881  MT tmp( m.matrix_ );
882  invertByLDLT( tmp );
883  move( m.matrix_, tmp );
884 
885  BLAZE_INTERNAL_ASSERT( isIntact( m ), "Broken invariant detected" );
886 }
888 //*************************************************************************************************
889 
890 
891 //*************************************************************************************************
914 template< typename MT // Type of the dense matrix
915  , bool SO > // Storage order of the dense matrix
916 inline void invertByLDLH( SymmetricMatrix<MT,SO,true,true>& m )
917 {
919 
920  MT tmp( m.matrix_ );
921  invertByLDLH( tmp );
922  move( m.matrix_, tmp );
923 
924  BLAZE_INTERNAL_ASSERT( isIntact( m ), "Broken invariant detected" );
925 }
927 //*************************************************************************************************
928 
929 
930 //*************************************************************************************************
953 template< typename MT // Type of the dense matrix
954  , bool SO > // Storage order of the dense matrix
955 inline void invertByLLH( SymmetricMatrix<MT,SO,true,true>& m )
956 {
958 
959  MT tmp( m.matrix_ );
960  invertByLLH( tmp );
961  move( m.matrix_, tmp );
962 
963  BLAZE_INTERNAL_ASSERT( isIntact( m ), "Broken invariant detected" );
964 }
966 //*************************************************************************************************
967 
968 
969 //*************************************************************************************************
985 template< typename MT1 // Type of the adapted matrix
986  , bool SO1 // Storage order of the adapted matrix
987  , bool DF // Density flag
988  , bool NF // Numeric flag
989  , typename MT2 // Type of the right-hand side matrix
990  , bool SO2 > // Storage order of the right-hand side matrix
991 inline bool tryAssign( const SymmetricMatrix<MT1,SO1,DF,NF>& lhs,
992  const Matrix<MT2,SO2>& rhs, size_t row, size_t column )
993 {
995 
996  BLAZE_INTERNAL_ASSERT( row <= lhs.rows(), "Invalid row access index" );
997  BLAZE_INTERNAL_ASSERT( column <= lhs.columns(), "Invalid column access index" );
998  BLAZE_INTERNAL_ASSERT( (~rhs).rows() <= lhs.rows() - row, "Invalid number of rows" );
999  BLAZE_INTERNAL_ASSERT( (~rhs).columns() <= lhs.columns() - column, "Invalid number of columns" );
1000 
1001  UNUSED_PARAMETER( lhs );
1002 
1003  const size_t M( (~rhs).rows() );
1004  const size_t N( (~rhs).columns() );
1005 
1006  if( ( row + M <= column ) || ( column + N <= row ) )
1007  return true;
1008 
1009  const bool lower( row > column );
1010  const size_t size ( min( row + M, column + N ) - ( lower ? row : column ) );
1011 
1012  if( size < 2UL )
1013  return true;
1014 
1015  const size_t subrow( lower ? 0UL : column - row );
1016  const size_t subcol( lower ? row - column : 0UL );
1017 
1018  return isSymmetric( submatrix( ~rhs, subrow, subcol, size, size ) );
1019 }
1021 //*************************************************************************************************
1022 
1023 
1024 //*************************************************************************************************
1040 template< typename MT1 // Type of the adapted matrix
1041  , bool SO1 // Storage order of the adapted matrix
1042  , bool DF // Density flag
1043  , bool NF // Numeric flag
1044  , typename MT2 // Type of the right-hand side matrix
1045  , bool SO2 > // Storage order of the right-hand side matrix
1046 inline bool tryAddAssign( const SymmetricMatrix<MT1,SO1,DF,NF>& lhs,
1047  const Matrix<MT2,SO2>& rhs, size_t row, size_t column )
1048 {
1049  return tryAssign( lhs, ~rhs, row, column );
1050 }
1052 //*************************************************************************************************
1053 
1054 
1055 //*************************************************************************************************
1072 template< typename MT1 // Type of the adapted matrix
1073  , bool SO1 // Storage order of the adapted matrix
1074  , bool DF // Density flag
1075  , bool NF // Numeric flag
1076  , typename MT2 // Type of the right-hand side matrix
1077  , bool SO2 > // Storage order of the right-hand side matrix
1078 inline bool trySubAssign( const SymmetricMatrix<MT1,SO1,DF,NF>& lhs,
1079  const Matrix<MT2,SO2>& rhs, size_t row, size_t column )
1080 {
1081  return tryAssign( lhs, ~rhs, row, column );
1082 }
1084 //*************************************************************************************************
1085 
1086 
1087 
1088 
1089 //=================================================================================================
1090 //
1091 // ROWS SPECIALIZATIONS
1092 //
1093 //=================================================================================================
1094 
1095 //*************************************************************************************************
1097 template< typename MT, bool SO, bool DF, bool NF >
1098 struct Rows< SymmetricMatrix<MT,SO,DF,NF> > : public Rows<MT>
1099 {};
1101 //*************************************************************************************************
1102 
1103 
1104 
1105 
1106 //=================================================================================================
1107 //
1108 // COLUMNS SPECIALIZATIONS
1109 //
1110 //=================================================================================================
1111 
1112 //*************************************************************************************************
1114 template< typename MT, bool SO, bool DF, bool NF >
1115 struct Columns< SymmetricMatrix<MT,SO,DF,NF> > : public Columns<MT>
1116 {};
1118 //*************************************************************************************************
1119 
1120 
1121 
1122 
1123 //=================================================================================================
1124 //
1125 // ISSQUARE SPECIALIZATIONS
1126 //
1127 //=================================================================================================
1128 
1129 //*************************************************************************************************
1131 template< typename MT, bool SO, bool DF, bool NF >
1132 struct IsSquare< SymmetricMatrix<MT,SO,DF,NF> > : public IsTrue<true>
1133 {};
1135 //*************************************************************************************************
1136 
1137 
1138 
1139 
1140 //=================================================================================================
1141 //
1142 // ISSYMMETRIC SPECIALIZATIONS
1143 //
1144 //=================================================================================================
1145 
1146 //*************************************************************************************************
1148 template< typename MT, bool SO, bool DF, bool NF >
1149 struct IsSymmetric< SymmetricMatrix<MT,SO,DF,NF> > : public IsTrue<true>
1150 {};
1152 //*************************************************************************************************
1153 
1154 
1155 
1156 
1157 //=================================================================================================
1158 //
1159 // ISHERMITIAN SPECIALIZATIONS
1160 //
1161 //=================================================================================================
1162 
1163 //*************************************************************************************************
1165 template< typename MT, bool SO, bool DF, bool NF >
1166 struct IsHermitian< SymmetricMatrix<MT,SO,DF,NF> >
1167  : public IsTrue< IsBuiltin<typename MT::ElementType>::value >
1168 {};
1170 //*************************************************************************************************
1171 
1172 
1173 
1174 
1175 //=================================================================================================
1176 //
1177 // ISADAPTOR SPECIALIZATIONS
1178 //
1179 //=================================================================================================
1180 
1181 //*************************************************************************************************
1183 template< typename MT, bool SO, bool DF, bool NF >
1184 struct IsAdaptor< SymmetricMatrix<MT,SO,DF,NF> > : public IsTrue<true>
1185 {};
1187 //*************************************************************************************************
1188 
1189 
1190 
1191 
1192 //=================================================================================================
1193 //
1194 // ISRESTRICTED SPECIALIZATIONS
1195 //
1196 //=================================================================================================
1197 
1198 //*************************************************************************************************
1200 template< typename MT, bool SO, bool DF, bool NF >
1201 struct IsRestricted< SymmetricMatrix<MT,SO,DF,NF> > : public IsTrue<true>
1202 {};
1204 //*************************************************************************************************
1205 
1206 
1207 
1208 
1209 //=================================================================================================
1210 //
1211 // HASCONSTDATAACCESS SPECIALIZATIONS
1212 //
1213 //=================================================================================================
1214 
1215 //*************************************************************************************************
1217 template< typename MT, bool SO, bool NF >
1218 struct HasConstDataAccess< SymmetricMatrix<MT,SO,true,NF> > : public IsTrue<true>
1219 {};
1221 //*************************************************************************************************
1222 
1223 
1224 
1225 
1226 //=================================================================================================
1227 //
1228 // ISALIGNED SPECIALIZATIONS
1229 //
1230 //=================================================================================================
1231 
1232 //*************************************************************************************************
1234 template< typename MT, bool SO, bool DF, bool NF >
1235 struct IsAligned< SymmetricMatrix<MT,SO,DF,NF> > : public IsTrue< IsAligned<MT>::value >
1236 {};
1238 //*************************************************************************************************
1239 
1240 
1241 
1242 
1243 //=================================================================================================
1244 //
1245 // ISPADDED SPECIALIZATIONS
1246 //
1247 //=================================================================================================
1248 
1249 //*************************************************************************************************
1251 template< typename MT, bool SO, bool DF, bool NF >
1252 struct IsPadded< SymmetricMatrix<MT,SO,DF,NF> > : public IsTrue< IsPadded<MT>::value >
1253 {};
1255 //*************************************************************************************************
1256 
1257 
1258 
1259 
1260 //=================================================================================================
1261 //
1262 // ISRESIZABLE SPECIALIZATIONS
1263 //
1264 //=================================================================================================
1265 
1266 //*************************************************************************************************
1268 template< typename MT, bool SO, bool DF, bool NF >
1269 struct IsResizable< SymmetricMatrix<MT,SO,DF,NF> > : public IsTrue< IsResizable<MT>::value >
1270 {};
1272 //*************************************************************************************************
1273 
1274 
1275 
1276 
1277 //=================================================================================================
1278 //
1279 // REMOVEADAPTOR SPECIALIZATIONS
1280 //
1281 //=================================================================================================
1282 
1283 //*************************************************************************************************
1285 template< typename MT, bool SO, bool DF, bool NF >
1286 struct RemoveAdaptor< SymmetricMatrix<MT,SO,DF,NF> >
1287 {
1288  typedef MT Type;
1289 };
1291 //*************************************************************************************************
1292 
1293 
1294 
1295 
1296 //=================================================================================================
1297 //
1298 // ADDTRAIT SPECIALIZATIONS
1299 //
1300 //=================================================================================================
1301 
1302 //*************************************************************************************************
1304 template< typename MT, bool SO1, bool DF, bool NF, typename T, size_t M, size_t N, bool SO2 >
1305 struct AddTrait< SymmetricMatrix<MT,SO1,DF,NF>, StaticMatrix<T,M,N,SO2> >
1306 {
1307  typedef typename AddTrait< MT, StaticMatrix<T,M,N,SO2> >::Type Type;
1308 };
1309 
1310 template< typename T, size_t M, size_t N, bool SO1, typename MT, bool SO2, bool DF, bool NF >
1311 struct AddTrait< StaticMatrix<T,M,N,SO1>, SymmetricMatrix<MT,SO2,DF,NF> >
1312 {
1313  typedef typename AddTrait< StaticMatrix<T,M,N,SO1>, MT >::Type Type;
1314 };
1315 
1316 template< typename MT, bool SO1, bool DF, bool NF, typename T, size_t M, size_t N, bool SO2 >
1317 struct AddTrait< SymmetricMatrix<MT,SO1,DF,NF>, HybridMatrix<T,M,N,SO2> >
1318 {
1319  typedef typename AddTrait< MT, HybridMatrix<T,M,N,SO2> >::Type Type;
1320 };
1321 
1322 template< typename T, size_t M, size_t N, bool SO1, typename MT, bool SO2, bool DF, bool NF >
1323 struct AddTrait< HybridMatrix<T,M,N,SO1>, SymmetricMatrix<MT,SO2,DF,NF> >
1324 {
1325  typedef typename AddTrait< HybridMatrix<T,M,N,SO1>, MT >::Type Type;
1326 };
1327 
1328 template< typename MT, bool SO1, bool DF, bool NF, typename T, bool SO2 >
1329 struct AddTrait< SymmetricMatrix<MT,SO1,DF,NF>, DynamicMatrix<T,SO2> >
1330 {
1331  typedef typename AddTrait< MT, DynamicMatrix<T,SO2> >::Type Type;
1332 };
1333 
1334 template< typename T, bool SO1, typename MT, bool SO2, bool DF, bool NF >
1335 struct AddTrait< DynamicMatrix<T,SO1>, SymmetricMatrix<MT,SO2,DF,NF> >
1336 {
1337  typedef typename AddTrait< DynamicMatrix<T,SO1>, MT >::Type Type;
1338 };
1339 
1340 template< typename MT, bool SO1, bool DF, bool NF, typename T, bool AF, bool PF, bool SO2 >
1341 struct AddTrait< SymmetricMatrix<MT,SO1,DF,NF>, CustomMatrix<T,AF,PF,SO2> >
1342 {
1343  typedef typename AddTrait< MT, CustomMatrix<T,AF,PF,SO2> >::Type Type;
1344 };
1345 
1346 template< typename T, bool AF, bool PF, bool SO1, typename MT, bool SO2, bool DF, bool NF >
1347 struct AddTrait< CustomMatrix<T,AF,PF,SO1>, SymmetricMatrix<MT,SO2,DF,NF> >
1348 {
1349  typedef typename AddTrait< CustomMatrix<T,AF,PF,SO1>, MT >::Type Type;
1350 };
1351 
1352 template< typename MT, bool SO1, bool DF, bool NF, typename T, bool SO2 >
1353 struct AddTrait< SymmetricMatrix<MT,SO1,DF,NF>, CompressedMatrix<T,SO2> >
1354 {
1355  typedef typename AddTrait< MT, CompressedMatrix<T,SO2> >::Type Type;
1356 };
1357 
1358 template< typename T, bool SO1, typename MT, bool SO2, bool DF, bool NF >
1359 struct AddTrait< CompressedMatrix<T,SO1>, SymmetricMatrix<MT,SO2,DF,NF> >
1360 {
1361  typedef typename AddTrait< CompressedMatrix<T,SO1>, MT >::Type Type;
1362 };
1363 
1364 template< typename MT1, bool SO1, bool DF1, bool NF1, typename MT2, bool SO2, bool DF2, bool NF2 >
1365 struct AddTrait< SymmetricMatrix<MT1,SO1,DF1,NF1>, SymmetricMatrix<MT2,SO2,DF2,NF2> >
1366 {
1367  typedef SymmetricMatrix< typename AddTrait<MT1,MT2>::Type > Type;
1368 };
1370 //*************************************************************************************************
1371 
1372 
1373 
1374 
1375 //=================================================================================================
1376 //
1377 // SUBTRAIT SPECIALIZATIONS
1378 //
1379 //=================================================================================================
1380 
1381 //*************************************************************************************************
1383 template< typename MT, bool SO1, bool DF, bool NF, typename T, size_t M, size_t N, bool SO2 >
1384 struct SubTrait< SymmetricMatrix<MT,SO1,DF,NF>, StaticMatrix<T,M,N,SO2> >
1385 {
1386  typedef typename SubTrait< MT, StaticMatrix<T,M,N,SO2> >::Type Type;
1387 };
1388 
1389 template< typename T, size_t M, size_t N, bool SO1, typename MT, bool SO2, bool DF, bool NF >
1390 struct SubTrait< StaticMatrix<T,M,N,SO1>, SymmetricMatrix<MT,SO2,DF,NF> >
1391 {
1392  typedef typename SubTrait< StaticMatrix<T,M,N,SO1>, MT >::Type Type;
1393 };
1394 
1395 template< typename MT, bool SO1, bool DF, bool NF, typename T, size_t M, size_t N, bool SO2 >
1396 struct SubTrait< SymmetricMatrix<MT,SO1,DF,NF>, HybridMatrix<T,M,N,SO2> >
1397 {
1398  typedef typename SubTrait< MT, HybridMatrix<T,M,N,SO2> >::Type Type;
1399 };
1400 
1401 template< typename T, size_t M, size_t N, bool SO1, typename MT, bool SO2, bool DF, bool NF >
1402 struct SubTrait< HybridMatrix<T,M,N,SO1>, SymmetricMatrix<MT,SO2,DF,NF> >
1403 {
1404  typedef typename SubTrait< HybridMatrix<T,M,N,SO1>, MT >::Type Type;
1405 };
1406 
1407 template< typename MT, bool SO1, bool DF, bool NF, typename T, bool SO2 >
1408 struct SubTrait< SymmetricMatrix<MT,SO1,DF,NF>, DynamicMatrix<T,SO2> >
1409 {
1410  typedef typename SubTrait< MT, DynamicMatrix<T,SO2> >::Type Type;
1411 };
1412 
1413 template< typename T, bool SO1, typename MT, bool SO2, bool DF, bool NF >
1414 struct SubTrait< DynamicMatrix<T,SO1>, SymmetricMatrix<MT,SO2,DF,NF> >
1415 {
1416  typedef typename SubTrait< DynamicMatrix<T,SO1>, MT >::Type Type;
1417 };
1418 
1419 template< typename MT, bool SO1, bool DF, bool NF, typename T, bool AF, bool PF, bool SO2 >
1420 struct SubTrait< SymmetricMatrix<MT,SO1,DF,NF>, CustomMatrix<T,AF,PF,SO2> >
1421 {
1422  typedef typename SubTrait< MT, CustomMatrix<T,AF,PF,SO2> >::Type Type;
1423 };
1424 
1425 template< typename T, bool AF, bool PF, bool SO1, typename MT, bool SO2, bool DF, bool NF >
1426 struct SubTrait< CustomMatrix<T,AF,PF,SO1>, SymmetricMatrix<MT,SO2,DF,NF> >
1427 {
1428  typedef typename SubTrait< CustomMatrix<T,AF,PF,SO1>, MT >::Type Type;
1429 };
1430 
1431 template< typename MT, bool SO1, bool DF, bool NF, typename T, bool SO2 >
1432 struct SubTrait< SymmetricMatrix<MT,SO1,DF,NF>, CompressedMatrix<T,SO2> >
1433 {
1434  typedef typename SubTrait< MT, CompressedMatrix<T,SO2> >::Type Type;
1435 };
1436 
1437 template< typename T, bool SO1, typename MT, bool SO2, bool DF, bool NF >
1438 struct SubTrait< CompressedMatrix<T,SO1>, SymmetricMatrix<MT,SO2,DF,NF> >
1439 {
1440  typedef typename SubTrait< CompressedMatrix<T,SO1>, MT >::Type Type;
1441 };
1442 
1443 template< typename MT1, bool SO1, bool DF1, bool NF1, typename MT2, bool SO2, bool DF2, bool NF2 >
1444 struct SubTrait< SymmetricMatrix<MT1,SO1,DF1,NF1>, SymmetricMatrix<MT2,SO2,DF2,NF2> >
1445 {
1446  typedef SymmetricMatrix< typename SubTrait<MT1,MT2>::Type > Type;
1447 };
1449 //*************************************************************************************************
1450 
1451 
1452 
1453 
1454 //=================================================================================================
1455 //
1456 // MULTTRAIT SPECIALIZATIONS
1457 //
1458 //=================================================================================================
1459 
1460 //*************************************************************************************************
1462 template< typename MT, bool SO, bool DF, bool NF, typename T >
1463 struct MultTrait< SymmetricMatrix<MT,SO,DF,NF>, T, typename EnableIf< IsNumeric<T> >::Type >
1464 {
1465  typedef SymmetricMatrix< typename MultTrait<MT,T>::Type > Type;
1466 };
1467 
1468 template< typename T, typename MT, bool SO, bool DF, bool NF >
1469 struct MultTrait< T, SymmetricMatrix<MT,SO,DF,NF>, typename EnableIf< IsNumeric<T> >::Type >
1470 {
1471  typedef SymmetricMatrix< typename MultTrait<T,MT>::Type > Type;
1472 };
1473 
1474 template< typename MT, bool SO, bool DF, bool NF, typename T, size_t N >
1475 struct MultTrait< SymmetricMatrix<MT,SO,DF,NF>, StaticVector<T,N,false> >
1476 {
1477  typedef typename MultTrait< MT, StaticVector<T,N,false> >::Type Type;
1478 };
1479 
1480 template< typename T, size_t N, typename MT, bool SO, bool DF, bool NF >
1481 struct MultTrait< StaticVector<T,N,true>, SymmetricMatrix<MT,SO,DF,NF> >
1482 {
1483  typedef typename MultTrait< StaticVector<T,N,true>, MT >::Type Type;
1484 };
1485 
1486 template< typename MT, bool SO, bool DF, bool NF, typename T, size_t N >
1487 struct MultTrait< SymmetricMatrix<MT,SO,DF,NF>, HybridVector<T,N,false> >
1488 {
1489  typedef typename MultTrait< MT, HybridVector<T,N,false> >::Type Type;
1490 };
1491 
1492 template< typename T, size_t N, typename MT, bool SO, bool DF, bool NF >
1493 struct MultTrait< HybridVector<T,N,true>, SymmetricMatrix<MT,SO,DF,NF> >
1494 {
1495  typedef typename MultTrait< HybridVector<T,N,true>, MT >::Type Type;
1496 };
1497 
1498 template< typename MT, bool SO, bool DF, bool NF, typename T >
1499 struct MultTrait< SymmetricMatrix<MT,SO,DF,NF>, DynamicVector<T,false> >
1500 {
1501  typedef typename MultTrait< MT, DynamicVector<T,false> >::Type Type;
1502 };
1503 
1504 template< typename T, typename MT, bool SO, bool DF, bool NF >
1505 struct MultTrait< DynamicVector<T,true>, SymmetricMatrix<MT,SO,DF,NF> >
1506 {
1507  typedef typename MultTrait< DynamicVector<T,true>, MT >::Type Type;
1508 };
1509 
1510 template< typename MT, bool SO, bool DF, bool NF, typename T, bool AF, bool PF >
1511 struct MultTrait< SymmetricMatrix<MT,SO,DF,NF>, CustomVector<T,AF,PF,false> >
1512 {
1513  typedef typename MultTrait< MT, CustomVector<T,AF,PF,false> >::Type Type;
1514 };
1515 
1516 template< typename T, bool AF, bool PF, typename MT, bool SO, bool DF, bool NF >
1517 struct MultTrait< CustomVector<T,AF,PF,true>, SymmetricMatrix<MT,SO,DF,NF> >
1518 {
1519  typedef typename MultTrait< CustomVector<T,AF,PF,true>, MT >::Type Type;
1520 };
1521 
1522 template< typename MT, bool SO, bool DF, bool NF, typename T >
1523 struct MultTrait< SymmetricMatrix<MT,SO,DF,NF>, CompressedVector<T,false> >
1524 {
1525  typedef typename MultTrait< MT, CompressedVector<T,false> >::Type Type;
1526 };
1527 
1528 template< typename T, typename MT, bool SO, bool DF, bool NF >
1529 struct MultTrait< CompressedVector<T,true>, SymmetricMatrix<MT,SO,DF,NF> >
1530 {
1531  typedef typename MultTrait< CompressedVector<T,true>, MT >::Type Type;
1532 };
1533 
1534 template< typename MT, bool SO1, bool DF, bool NF, typename T, size_t M, size_t N, bool SO2 >
1535 struct MultTrait< SymmetricMatrix<MT,SO1,DF,NF>, StaticMatrix<T,M,N,SO2> >
1536 {
1537  typedef typename MultTrait< MT, StaticMatrix<T,M,N,SO2> >::Type Type;
1538 };
1539 
1540 template< typename T, size_t M, size_t N, bool SO1, typename MT, bool SO2, bool DF, bool NF >
1541 struct MultTrait< StaticMatrix<T,M,N,SO1>, SymmetricMatrix<MT,SO2,DF,NF> >
1542 {
1543  typedef typename MultTrait< StaticMatrix<T,M,N,SO1>, MT >::Type Type;
1544 };
1545 
1546 template< typename MT, bool SO1, bool DF, bool NF, typename T, size_t M, size_t N, bool SO2 >
1547 struct MultTrait< SymmetricMatrix<MT,SO1,DF,NF>, HybridMatrix<T,M,N,SO2> >
1548 {
1549  typedef typename MultTrait< MT, HybridMatrix<T,M,N,SO2> >::Type Type;
1550 };
1551 
1552 template< typename T, size_t M, size_t N, bool SO1, typename MT, bool SO2, bool DF, bool NF >
1553 struct MultTrait< HybridMatrix<T,M,N,SO1>, SymmetricMatrix<MT,SO2,DF,NF> >
1554 {
1555  typedef typename MultTrait< HybridMatrix<T,M,N,SO1>, MT >::Type Type;
1556 };
1557 
1558 template< typename MT, bool SO1, bool DF, bool NF, typename T, bool SO2 >
1559 struct MultTrait< SymmetricMatrix<MT,SO1,DF,NF>, DynamicMatrix<T,SO2> >
1560 {
1561  typedef typename MultTrait< MT, DynamicMatrix<T,SO2> >::Type Type;
1562 };
1563 
1564 template< typename T, bool SO1, typename MT, bool SO2, bool DF, bool NF >
1565 struct MultTrait< DynamicMatrix<T,SO1>, SymmetricMatrix<MT,SO2,DF,NF> >
1566 {
1567  typedef typename MultTrait< DynamicMatrix<T,SO1>, MT >::Type Type;
1568 };
1569 
1570 template< typename MT, bool SO1, bool DF, bool NF, typename T, bool AF, bool PF, bool SO2 >
1571 struct MultTrait< SymmetricMatrix<MT,SO1,DF,NF>, CustomMatrix<T,AF,PF,SO2> >
1572 {
1573  typedef typename MultTrait< MT, CustomMatrix<T,AF,PF,SO2> >::Type Type;
1574 };
1575 
1576 template< typename T, bool AF, bool PF, bool SO1, typename MT, bool SO2, bool DF, bool NF >
1577 struct MultTrait< CustomMatrix<T,AF,PF,SO1>, SymmetricMatrix<MT,SO2,DF,NF> >
1578 {
1579  typedef typename MultTrait< DynamicMatrix<T,SO1>, MT >::Type Type;
1580 };
1581 
1582 template< typename MT, bool SO1, bool DF, bool NF, typename T, bool SO2 >
1583 struct MultTrait< SymmetricMatrix<MT,SO1,DF,NF>, CompressedMatrix<T,SO2> >
1584 {
1585  typedef typename MultTrait< MT, CompressedMatrix<T,SO2> >::Type Type;
1586 };
1587 
1588 template< typename T, bool SO1, typename MT, bool SO2, bool DF, bool NF >
1589 struct MultTrait< CompressedMatrix<T,SO1>, SymmetricMatrix<MT,SO2,DF,NF> >
1590 {
1591  typedef typename MultTrait< CompressedMatrix<T,SO1>, MT >::Type Type;
1592 };
1593 
1594 template< typename MT1, bool SO1, bool DF1, bool NF1, typename MT2, bool SO2, bool DF2, bool NF2 >
1595 struct MultTrait< SymmetricMatrix<MT1,SO1,DF1,NF1>, SymmetricMatrix<MT2,SO2,DF2,NF2> >
1596 {
1597  typedef typename MultTrait<MT1,MT2>::Type Type;
1598 };
1600 //*************************************************************************************************
1601 
1602 
1603 
1604 
1605 //=================================================================================================
1606 //
1607 // DIVTRAIT SPECIALIZATIONS
1608 //
1609 //=================================================================================================
1610 
1611 //*************************************************************************************************
1613 template< typename MT, bool SO, bool DF, bool NF, typename T >
1614 struct DivTrait< SymmetricMatrix<MT,SO,DF,NF>, T, typename EnableIf< IsNumeric<T> >::Type >
1615 {
1616  typedef SymmetricMatrix< typename DivTrait<MT,T>::Type > Type;
1617 };
1619 //*************************************************************************************************
1620 
1621 
1622 
1623 
1624 //=================================================================================================
1625 //
1626 // MATHTRAIT SPECIALIZATIONS
1627 //
1628 //=================================================================================================
1629 
1630 //*************************************************************************************************
1632 template< typename MT1, bool SO1, bool DF1, bool NF1, typename MT2, bool SO2, bool DF2, bool NF2 >
1633 struct MathTrait< SymmetricMatrix<MT1,SO1,DF1,NF1>, SymmetricMatrix<MT2,SO2,DF2,NF2> >
1634 {
1635  typedef SymmetricMatrix< typename MathTrait<MT1,MT2>::HighType > HighType;
1636  typedef SymmetricMatrix< typename MathTrait<MT1,MT2>::LowType > LowType;
1637 };
1639 //*************************************************************************************************
1640 
1641 
1642 
1643 
1644 //=================================================================================================
1645 //
1646 // SUBMATRIXTRAIT SPECIALIZATIONS
1647 //
1648 //=================================================================================================
1649 
1650 //*************************************************************************************************
1652 template< typename MT, bool SO, bool DF, bool NF >
1653 struct SubmatrixTrait< SymmetricMatrix<MT,SO,DF,NF> >
1654 {
1655  typedef typename SubmatrixTrait<MT>::Type Type;
1656 };
1658 //*************************************************************************************************
1659 
1660 
1661 
1662 
1663 //=================================================================================================
1664 //
1665 // ROWTRAIT SPECIALIZATIONS
1666 //
1667 //=================================================================================================
1668 
1669 //*************************************************************************************************
1671 template< typename MT, bool SO, bool DF, bool NF >
1672 struct RowTrait< SymmetricMatrix<MT,SO,DF,NF> >
1673 {
1674  typedef typename RowTrait<MT>::Type Type;
1675 };
1677 //*************************************************************************************************
1678 
1679 
1680 
1681 
1682 //=================================================================================================
1683 //
1684 // COLUMNTRAIT SPECIALIZATIONS
1685 //
1686 //=================================================================================================
1687 
1688 //*************************************************************************************************
1690 template< typename MT, bool SO, bool DF, bool NF >
1691 struct ColumnTrait< SymmetricMatrix<MT,SO,DF,NF> >
1692 {
1693  typedef typename ColumnTrait<MT>::Type Type;
1694 };
1696 //*************************************************************************************************
1697 
1698 } // namespace blaze
1699 
1700 #endif
#define BLAZE_THROW_INVALID_ARGUMENT(MESSAGE)
Macro for the emission of a std::invalid_argument exceptionThis macro encapsulates the default way of...
Definition: Exception.h:187
Header file for mathematical functions.
Header file for the Rows type trait.
Header file for the UNUSED_PARAMETER function template.
Header file for the subtraction trait.
BLAZE_ALWAYS_INLINE size_t size(const Vector< VT, TF > &vector)
Returns the current size/dimension of the vector.
Definition: Vector.h:252
Header file for the row trait.
bool isSymmetric(const DenseMatrix< MT, SO > &dm)
Checks if the given dense matrix is symmetric.
Definition: DenseMatrix.h:697
void reset(const DiagonalProxy< MT > &proxy)
Resetting the represented element to the default initial values.
Definition: DiagonalProxy.h:507
MT::ElementType det(const DenseMatrix< MT, SO > &dm)
Computation of the determinant of the given dense square matrix.
Definition: DMatDetExpr.h:382
BLAZE_ALWAYS_INLINE size_t rows(const Matrix< MT, SO > &matrix)
Returns the current number of rows of the matrix.
Definition: Matrix.h:308
DisableIf< Or< IsComputation< MT >, IsTransExpr< MT > >, typename ColumnExprTrait< MT >::Type >::Type column(Matrix< MT, SO > &matrix, size_t index)
Creating a view on a specific column of the given matrix.
Definition: Column.h:107
void UNUSED_PARAMETER(const T1 &)
Suppression of unused parameter warnings.
Definition: Unused.h:81
Matrix adapter for symmetric matrices.
Definition: Forward.h:52
void move(CustomMatrix< Type, AF, PF, SO > &dst, CustomMatrix< Type, AF, PF, SO > &src)
Moving the contents of one custom matrix to another.
Definition: CustomMatrix.h:6085
Header file for the implementation of the base template of the SymmetricMatrix.
bool isDefault(const DiagonalProxy< MT > &proxy)
Returns whether the represented element is in default state.
Definition: DiagonalProxy.h:547
Header file for the IsSquare type trait.
SymmetricMatrix specialization for dense matrices with non-numeric element type.
Header file for the multiplication trait.
Header file for the IsSymmetric type trait.
Namespace of the Blaze C++ math library.
Definition: Blaze.h:57
Header file for all forward declarations of the math module.
SymmetricMatrix specialization for sparse matrices with numeric element type.
const MT::ElementType min(const DenseMatrix< MT, SO > &dm)
Returns the smallest element of the dense matrix.
Definition: DenseMatrix.h:1682
Header file for the Columns type trait.
Header file for the implementation of a fixed-size matrix.
Type ElementType
Type of the sparse matrix elements.
Definition: CompressedMatrix.h:2586
Constraint on the data type.
Header file for the RemoveAdaptor type trait.
Constraint on the data type.
Header file for the EnableIf class template.
void clear(const DiagonalProxy< MT > &proxy)
Clearing the represented element.
Definition: DiagonalProxy.h:527
Header file for the IsPadded type trait.
Header file for the IsAdaptor type trait.
Header file for the IsNumeric type trait.
Header file for the HasConstDataAccess type trait.
DisableIf< Or< IsComputation< MT >, IsTransExpr< MT > >, typename RowExprTrait< MT >::Type >::Type row(Matrix< MT, SO > &matrix, size_t index)
Creating a view on a specific row of the given matrix.
Definition: Row.h:107
SymmetricMatrix specialization for sparse matrices with non-numeric element type. ...
Header file for run time assertion macros.
Header file for the addition trait.
Header file for the division trait.
Header file for the submatrix trait.
Header file for the column trait.
#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:79
#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:118
void swap(DiagonalMatrix< MT, SO, DF > &a, DiagonalMatrix< MT, SO, DF > &b)
Swapping the contents of two matrices.
Definition: DiagonalMatrix.h:256
SymmetricMatrix specialization for dense matrices with numeric element type.
Header file for the mathematical trait.
SubmatrixExprTrait< MT, unaligned >::Type submatrix(Matrix< MT, SO > &matrix, size_t row, size_t column, size_t m, size_t n)
Creating a view on a specific submatrix of the given matrix.
Definition: Submatrix.h:146
Header file for the IsBuiltin type trait.
Header file for the IsTrue value trait.
BLAZE_ALWAYS_INLINE size_t columns(const Matrix< MT, SO > &matrix)
Returns the current number of columns of the matrix.
Definition: Matrix.h:324
bool isIntact(const DiagonalMatrix< MT, SO, DF > &m)
Returns whether the invariants of the given diagonal matrix are intact.
Definition: DiagonalMatrix.h:237
Header file for exception macros.
Header file for the IsHermitian type trait.
Header file for the IsResizable type trait.
Header file for the IsRestricted type trait.
#define BLAZE_INTERNAL_ASSERT(expr, msg)
Run time assertion macro for internal checks.In case of an invalid run time expression, the program execution is terminated. The BLAZE_INTERNAL_ASSERT macro can be disabled by setting the BLAZE_USER_ASSERTION flag to zero or by defining NDEBUG during the compilation.
Definition: Assert.h:101