1 //=================================================================================================
2 /*!
3 //  \file src/mathtest/traits/reducetrait/ClassTest.cpp
4 //  \brief Source file for the ReduceTrait class test
5 //
6 //  Copyright (C) 2012-2020 Klaus Iglberger - All Rights Reserved
7 //
8 //  This file is part of the Blaze library. You can redistribute it and/or modify it under
9 //  the terms of the New (Revised) BSD License. Redistribution and use in source and binary
10 //  forms, with or without modification, are permitted provided that the following conditions
11 //  are met:
12 //
13 //  1. Redistributions of source code must retain the above copyright notice, this list of
14 //     conditions and the following disclaimer.
15 //  2. Redistributions in binary form must reproduce the above copyright notice, this list
16 //     of conditions and the following disclaimer in the documentation and/or other materials
17 //     provided with the distribution.
18 //  3. Neither the names of the Blaze development group nor the names of its contributors
19 //     may be used to endorse or promote products derived from this software without specific
20 //     prior written permission.
21 //
22 //  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
23 //  EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24 //  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
25 //  SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26 //  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
27 //  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
28 //  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 //  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
30 //  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
31 //  DAMAGE.
32 */
33 //=================================================================================================
34 
35 
36 //*************************************************************************************************
37 // Includes
38 //*************************************************************************************************
39 
40 #include <cstdlib>
41 #include <iostream>
42 #include <utility>
43 #include <blaze/math/CompressedMatrix.h>
44 #include <blaze/math/CompressedVector.h>
45 #include <blaze/math/CustomMatrix.h>
46 #include <blaze/math/CustomVector.h>
47 #include <blaze/math/DiagonalMatrix.h>
48 #include <blaze/math/DynamicMatrix.h>
49 #include <blaze/math/DynamicVector.h>
50 #include <blaze/math/HermitianMatrix.h>
51 #include <blaze/math/HybridMatrix.h>
52 #include <blaze/math/HybridVector.h>
53 #include <blaze/math/InitializerMatrix.h>
54 #include <blaze/math/InitializerVector.h>
55 #include <blaze/math/LowerMatrix.h>
56 #include <blaze/math/StaticMatrix.h>
57 #include <blaze/math/StaticVector.h>
58 #include <blaze/math/StrictlyLowerMatrix.h>
59 #include <blaze/math/StrictlyUpperMatrix.h>
60 #include <blaze/math/SymmetricMatrix.h>
61 #include <blaze/math/traits/ReduceTrait.h>
62 #include <blaze/math/typetraits/StorageOrder.h>
63 #include <blaze/math/UniformMatrix.h>
64 #include <blaze/math/UniformVector.h>
65 #include <blaze/math/UniLowerMatrix.h>
66 #include <blaze/math/UniUpperMatrix.h>
67 #include <blaze/math/UpperMatrix.h>
68 #include <blaze/math/ZeroMatrix.h>
69 #include <blaze/math/ZeroVector.h>
70 #include <blaze/util/Complex.h>
71 #include <blaze/util/typetraits/IsSame.h>
72 #include <blaze/util/typetraits/RemoveCVRef.h>
73 #include <blazetest/mathtest/traits/reducetrait/ClassTest.h>
74 
75 
76 namespace blazetest {
77 
78 namespace mathtest {
79 
80 namespace traits {
81 
82 namespace reducetrait {
83 
84 //=================================================================================================
85 //
86 //  CONSTRUCTORS
87 //
88 //=================================================================================================
89 
90 //*************************************************************************************************
91 /*!\brief Constructor for the ReduceTrait class test.
92 //
93 // \exception std::runtime_error Error detected.
94 */
ClassTest()95 ClassTest::ClassTest()
96 {
97    testTotalVectorReduction();
98    testTotalMatrixReduction();
99    testRowwiseMatrixReduction();
100    testColumnwiseMatrixReduction();
101 }
102 //*************************************************************************************************
103 
104 
105 
106 
107 //=================================================================================================
108 //
109 //  TEST FUNCTIONS
110 //
111 //=================================================================================================
112 
113 //*************************************************************************************************
114 /*!\brief Test of the 'ReduceTrait' class template for total vector reductions.
115 //
116 // \return void
117 // \exception std::runtime_error Error detected.
118 //
119 // This function performs a compile time test of the 'ReduceTrait' class template for total
120 // vector reductions. In case an error is detected, a compilation error is created.
121 */
testTotalVectorReduction()122 void ClassTest::testTotalVectorReduction()
123 {
124    using namespace blaze;
125    using OP = Add;
126 
127 
128    // StaticVector
129    {
130       {
131          using VT = StaticVector<int,3UL,columnVector>;
132          using RT = int;
133          static_assert( IsSame_v< ReduceTrait_t<VT,OP>, RT >, "Non-matching type detected" );
134       }
135       {
136          using VT = StaticVector<int,3UL,rowVector>;
137          using RT = int;
138          static_assert( IsSame_v< ReduceTrait_t<VT,OP>, RT >, "Non-matching type detected" );
139       }
140    }
141 
142    // HybridVector
143    {
144       {
145          using VT = HybridVector<int,3UL,columnVector>;
146          using RT = int;
147          static_assert( IsSame_v< ReduceTrait_t<VT,OP>, RT >, "Non-matching type detected" );
148       }
149       {
150          using VT = HybridVector<int,3UL,rowVector>;
151          using RT = int;
152          static_assert( IsSame_v< ReduceTrait_t<VT,OP>, RT >, "Non-matching type detected" );
153       }
154    }
155 
156    // DynamicVector
157    {
158       {
159          using VT = DynamicVector<int,columnVector>;
160          using RT = int;
161          static_assert( IsSame_v< ReduceTrait_t<VT,OP>, RT >, "Non-matching type detected" );
162       }
163       {
164          using VT = DynamicVector<int,rowVector>;
165          using RT = int;
166          static_assert( IsSame_v< ReduceTrait_t<VT,OP>, RT >, "Non-matching type detected" );
167       }
168    }
169 
170    // CustomVector
171    {
172       {
173          using VT = CustomVector<int,unaligned,unpadded,columnVector>;
174          using RT = int;
175          static_assert( IsSame_v< ReduceTrait_t<VT,OP>, RT >, "Non-matching type detected" );
176       }
177       {
178          using VT = CustomVector<int,unaligned,unpadded,rowVector>;
179          using RT = int;
180          static_assert( IsSame_v< ReduceTrait_t<VT,OP>, RT >, "Non-matching type detected" );
181       }
182    }
183 
184    // UniformVector
185    {
186       {
187          using VT = UniformVector<int,columnVector>;
188          using RT = int;
189          static_assert( IsSame_v< ReduceTrait_t<VT,OP>, RT >, "Non-matching type detected" );
190       }
191       {
192          using VT = UniformVector<int,rowVector>;
193          using RT = int;
194          static_assert( IsSame_v< ReduceTrait_t<VT,OP>, RT >, "Non-matching type detected" );
195       }
196    }
197 
198    // InitializerVector
199    {
200       {
201          using VT = InitializerVector<int,columnVector>;
202          using RT = int;
203          static_assert( IsSame_v< ReduceTrait_t<VT,OP>, RT >, "Non-matching type detected" );
204       }
205       {
206          using VT = InitializerVector<int,rowVector>;
207          using RT = int;
208          static_assert( IsSame_v< ReduceTrait_t<VT,OP>, RT >, "Non-matching type detected" );
209       }
210    }
211 
212    // CompressedVector
213    {
214       {
215          using VT = CompressedVector<int,columnVector>;
216          using RT = int;
217          static_assert( IsSame_v< ReduceTrait_t<VT,OP>, RT >, "Non-matching type detected" );
218       }
219       {
220          using VT = CompressedVector<int,rowVector>;
221          using RT = int;
222          static_assert( IsSame_v< ReduceTrait_t<VT,OP>, RT >, "Non-matching type detected" );
223       }
224    }
225 
226    // ZeroVector
227    {
228       {
229          using VT = ZeroVector<int,columnVector>;
230          using RT = int;
231          static_assert( IsSame_v< ReduceTrait_t<VT,OP>, RT >, "Non-matching type detected" );
232       }
233       {
234          using VT = ZeroVector<int,rowVector>;
235          using RT = int;
236          static_assert( IsSame_v< ReduceTrait_t<VT,OP>, RT >, "Non-matching type detected" );
237       }
238    }
239 }
240 //*************************************************************************************************
241 
242 
243 //*************************************************************************************************
244 /*!\brief Test of the 'ReduceTrait' class template for total matrix reductions.
245 //
246 // \return void
247 // \exception std::runtime_error Error detected.
248 //
249 // This function performs a compile time test of the 'ReduceTrait' class template for total
250 // matrix reductions. In case an error is detected, a compilation error is created.
251 */
testTotalMatrixReduction()252 void ClassTest::testTotalMatrixReduction()
253 {
254    using namespace blaze;
255    using OP = Add;
256 
257 
258    // StaticMatrix
259    {
260       {
261          using MT = StaticMatrix<int,3UL,5UL,rowMajor>;
262          using RT = int;
263          static_assert( IsSame_v< ReduceTrait_t<MT,OP>, RT >, "Non-matching type detected" );
264       }
265       {
266          using MT = StaticMatrix<int,3UL,5UL,columnMajor>;
267          using RT = int;
268          static_assert( IsSame_v< ReduceTrait_t<MT,OP>, RT >, "Non-matching type detected" );
269       }
270    }
271 
272    // HybridMatrix
273    {
274       {
275          using MT = HybridMatrix<int,3UL,5UL,rowMajor>;
276          using RT = int;
277          static_assert( IsSame_v< ReduceTrait_t<MT,OP>, RT >, "Non-matching type detected" );
278       }
279       {
280          using MT = HybridMatrix<int,3UL,5UL,columnMajor>;
281          using RT = int;
282          static_assert( IsSame_v< ReduceTrait_t<MT,OP>, RT >, "Non-matching type detected" );
283       }
284    }
285 
286    // DynamicMatrix
287    {
288       {
289          using MT = DynamicMatrix<int,rowMajor>;
290          using RT = int;
291          static_assert( IsSame_v< ReduceTrait_t<MT,OP>, RT >, "Non-matching type detected" );
292       }
293       {
294          using MT = DynamicMatrix<int,columnMajor>;
295          using RT = int;
296          static_assert( IsSame_v< ReduceTrait_t<MT,OP>, RT >, "Non-matching type detected" );
297       }
298    }
299 
300    // CustomMatrix
301    {
302       {
303          using MT = CustomMatrix<int,unaligned,unpadded,rowMajor>;
304          using RT = int;
305          static_assert( IsSame_v< ReduceTrait_t<MT,OP>, RT >, "Non-matching type detected" );
306       }
307       {
308          using MT = CustomMatrix<int,unaligned,unpadded,columnMajor>;
309          using RT = int;
310          static_assert( IsSame_v< ReduceTrait_t<MT,OP>, RT >, "Non-matching type detected" );
311       }
312    }
313 
314    // UniformMatrix
315    {
316       {
317          using MT = UniformMatrix<int,rowMajor>;
318          using RT = int;
319          static_assert( IsSame_v< ReduceTrait_t<MT,OP>, RT >, "Non-matching type detected" );
320       }
321       {
322          using MT = UniformMatrix<int,columnMajor>;
323          using RT = int;
324          static_assert( IsSame_v< ReduceTrait_t<MT,OP>, RT >, "Non-matching type detected" );
325       }
326    }
327 
328    // InitializerMatrix
329    {
330       {
331          using MT = InitializerMatrix<int>;
332          using RT = int;
333          static_assert( IsSame_v< ReduceTrait_t<MT,OP>, RT >, "Non-matching type detected" );
334       }
335    }
336 
337    // CompressedMatrix
338    {
339       {
340          using MT = CompressedMatrix<int,rowMajor>;
341          using RT = int;
342          static_assert( IsSame_v< ReduceTrait_t<MT,OP>, RT >, "Non-matching type detected" );
343       }
344       {
345          using MT = CompressedMatrix<int,columnMajor>;
346          using RT = int;
347          static_assert( IsSame_v< ReduceTrait_t<MT,OP>, RT >, "Non-matching type detected" );
348       }
349    }
350 
351    // IdentityMatrix
352    {
353       {
354          using MT = IdentityMatrix<int,rowMajor>;
355          using RT = int;
356          static_assert( IsSame_v< ReduceTrait_t<MT,OP>, RT >, "Non-matching type detected" );
357       }
358       {
359          using MT = IdentityMatrix<int,columnMajor>;
360          using RT = int;
361          static_assert( IsSame_v< ReduceTrait_t<MT,OP>, RT >, "Non-matching type detected" );
362       }
363    }
364 
365    // ZeroMatrix
366    {
367       {
368          using MT = ZeroMatrix<int,rowMajor>;
369          using RT = int;
370          static_assert( IsSame_v< ReduceTrait_t<MT,OP>, RT >, "Non-matching type detected" );
371       }
372       {
373          using MT = ZeroMatrix<int,columnMajor>;
374          using RT = int;
375          static_assert( IsSame_v< ReduceTrait_t<MT,OP>, RT >, "Non-matching type detected" );
376       }
377    }
378 
379    // SymmetricMatrix<DynamicMatrix> (real)
380    {
381       {
382          using MT = SymmetricMatrix< DynamicMatrix<int,rowMajor> >;
383          using RT = int;
384          static_assert( IsSame_v< ReduceTrait_t<MT,OP>, RT >, "Non-matching type detected" );
385       }
386       {
387          using MT = SymmetricMatrix< DynamicMatrix<int,columnMajor> >;
388          using RT = int;
389          static_assert( IsSame_v< ReduceTrait_t<MT,OP>, RT >, "Non-matching type detected" );
390       }
391    }
392 
393    // SymmetricMatrix<DynamicMatrix> (complex)
394    {
395       {
396          using MT = SymmetricMatrix< DynamicMatrix<complex<int>,rowMajor> >;
397          using RT = complex<int>;
398          static_assert( IsSame_v< ReduceTrait_t<MT,OP>, RT >, "Non-matching type detected" );
399       }
400       {
401          using MT = SymmetricMatrix< DynamicMatrix<complex<int>,columnMajor> >;
402          using RT = complex<int>;
403          static_assert( IsSame_v< ReduceTrait_t<MT,OP>, RT >, "Non-matching type detected" );
404       }
405    }
406 
407    // SymmetricMatrix<UniformMatrix> (real)
408    {
409       {
410          using MT = SymmetricMatrix< UniformMatrix<int,rowMajor> >;
411          using RT = int;
412          static_assert( IsSame_v< ReduceTrait_t<MT,OP>, RT >, "Non-matching type detected" );
413       }
414       {
415          using MT = SymmetricMatrix< UniformMatrix<int,columnMajor> >;
416          using RT = int;
417          static_assert( IsSame_v< ReduceTrait_t<MT,OP>, RT >, "Non-matching type detected" );
418       }
419    }
420 
421    // SymmetricMatrix<ZeroMatrix> (real)
422    {
423       {
424          using MT = SymmetricMatrix< ZeroMatrix<int,rowMajor> >;
425          using RT = int;
426          static_assert( IsSame_v< ReduceTrait_t<MT,OP>, RT >, "Non-matching type detected" );
427       }
428       {
429          using MT = SymmetricMatrix< ZeroMatrix<int,columnMajor> >;
430          using RT = int;
431          static_assert( IsSame_v< ReduceTrait_t<MT,OP>, RT >, "Non-matching type detected" );
432       }
433    }
434 
435    // HermitianMatrix<DynamicMatrix> (symmetric)
436    {
437       {
438          using MT = HermitianMatrix< DynamicMatrix<int,rowMajor> >;
439          using RT = int;
440          static_assert( IsSame_v< ReduceTrait_t<MT,OP>, RT >, "Non-matching type detected" );
441       }
442       {
443          using MT = HermitianMatrix< DynamicMatrix<int,columnMajor> >;
444          using RT = int;
445          static_assert( IsSame_v< ReduceTrait_t<MT,OP>, RT >, "Non-matching type detected" );
446       }
447    }
448 
449    // HermitianMatrix<DynamicMatrix> (Hermitian)
450    {
451       {
452          using MT = HermitianMatrix< DynamicMatrix<complex<int>,rowMajor> >;
453          using RT = complex<int>;
454          static_assert( IsSame_v< ReduceTrait_t<MT,OP>, RT >, "Non-matching type detected" );
455       }
456       {
457          using MT = HermitianMatrix< DynamicMatrix<complex<int>,columnMajor> >;
458          using RT = complex<int>;
459          static_assert( IsSame_v< ReduceTrait_t<MT,OP>, RT >, "Non-matching type detected" );
460       }
461    }
462 
463    // LowerMatrix<DynamicMatrix>
464    {
465       {
466          using MT = LowerMatrix< DynamicMatrix<int,rowMajor> >;
467          using RT = int;
468          static_assert( IsSame_v< ReduceTrait_t<MT,OP>, RT >, "Non-matching type detected" );
469       }
470       {
471          using MT = LowerMatrix< DynamicMatrix<int,columnMajor> >;
472          using RT = int;
473          static_assert( IsSame_v< ReduceTrait_t<MT,OP>, RT >, "Non-matching type detected" );
474       }
475    }
476 
477    // UniLowerMatrix<DynamicMatrix>
478    {
479       {
480          using MT = UniLowerMatrix< DynamicMatrix<int,rowMajor> >;
481          using RT = int;
482          static_assert( IsSame_v< ReduceTrait_t<MT,OP>, RT >, "Non-matching type detected" );
483       }
484       {
485          using MT = UniLowerMatrix< DynamicMatrix<int,columnMajor> >;
486          using RT = int;
487          static_assert( IsSame_v< ReduceTrait_t<MT,OP>, RT >, "Non-matching type detected" );
488       }
489    }
490 
491    // StrictlyLowerMatrix<DynamicMatrix>
492    {
493       {
494          using MT = StrictlyLowerMatrix< DynamicMatrix<int,rowMajor> >;
495          using RT = int;
496          static_assert( IsSame_v< ReduceTrait_t<MT,OP>, RT >, "Non-matching type detected" );
497       }
498       {
499          using MT = StrictlyLowerMatrix< DynamicMatrix<int,columnMajor> >;
500          using RT = int;
501          static_assert( IsSame_v< ReduceTrait_t<MT,OP>, RT >, "Non-matching type detected" );
502       }
503    }
504 
505    // UpperMatrix<DynamicMatrix>
506    {
507       {
508          using MT = UpperMatrix< DynamicMatrix<int,rowMajor> >;
509          using RT = int;
510          static_assert( IsSame_v< ReduceTrait_t<MT,OP>, RT >, "Non-matching type detected" );
511       }
512       {
513          using MT = UpperMatrix< DynamicMatrix<int,columnMajor> >;
514          using RT = int;
515          static_assert( IsSame_v< ReduceTrait_t<MT,OP>, RT >, "Non-matching type detected" );
516       }
517    }
518 
519    // UniUpperMatrix<DynamicMatrix>
520    {
521       {
522          using MT = UniUpperMatrix< DynamicMatrix<int,rowMajor> >;
523          using RT = int;
524          static_assert( IsSame_v< ReduceTrait_t<MT,OP>, RT >, "Non-matching type detected" );
525       }
526       {
527          using MT = UniUpperMatrix< DynamicMatrix<int,columnMajor> >;
528          using RT = int;
529          static_assert( IsSame_v< ReduceTrait_t<MT,OP>, RT >, "Non-matching type detected" );
530       }
531    }
532 
533    // StrictlyUpperMatrix<DynamicMatrix>
534    {
535       {
536          using MT = StrictlyUpperMatrix< DynamicMatrix<int,rowMajor> >;
537          using RT = int;
538          static_assert( IsSame_v< ReduceTrait_t<MT,OP>, RT >, "Non-matching type detected" );
539       }
540       {
541          using MT = StrictlyUpperMatrix< DynamicMatrix<int,columnMajor> >;
542          using RT = int;
543          static_assert( IsSame_v< ReduceTrait_t<MT,OP>, RT >, "Non-matching type detected" );
544       }
545    }
546 
547    // DiagonalMatrix<DynamicMatrix>
548    {
549       {
550          using MT = DiagonalMatrix< DynamicMatrix<int,rowMajor> >;
551          using RT = int;
552          static_assert( IsSame_v< ReduceTrait_t<MT,OP>, RT >, "Non-matching type detected" );
553       }
554       {
555          using MT = DiagonalMatrix< DynamicMatrix<int,columnMajor> >;
556          using RT = int;
557          static_assert( IsSame_v< ReduceTrait_t<MT,OP>, RT >, "Non-matching type detected" );
558       }
559    }
560 }
561 //*************************************************************************************************
562 
563 
564 //*************************************************************************************************
565 /*!\brief Test of the 'ReduceTrait' class template for rowwise matrix reductions.
566 //
567 // \return void
568 // \exception std::runtime_error Error detected.
569 //
570 // This function performs a compile time test of the 'ReduceTrait' class template for rowwise
571 // matrix reductions. In case an error is detected, a compilation error is created.
572 */
testRowwiseMatrixReduction()573 void ClassTest::testRowwiseMatrixReduction()
574 {
575    using namespace blaze;
576    using OP = Add;
577 
578 
579    // StaticMatrix
580    {
581       {
582          using MT = StaticMatrix<int,3UL,5UL,rowMajor>;
583          using RT = StaticVector<int,3UL,columnVector>;
584          static_assert( IsSame_v< ReduceTrait_t<MT,OP,rowwise>, RT >, "Non-matching type detected" );
585 
586          using Expr = RemoveCVRef_t< decltype( reduce<rowwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
587          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
588          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
589       }
590       {
591          using MT = StaticMatrix<int,3UL,5UL,columnMajor>;
592          using RT = StaticVector<int,3UL,columnVector>;
593          static_assert( IsSame_v< ReduceTrait_t<MT,OP,rowwise>, RT >, "Non-matching type detected" );
594 
595          using Expr = RemoveCVRef_t< decltype( reduce<rowwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
596          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
597          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
598       }
599    }
600 
601    // HybridMatrix
602    {
603       {
604          using MT = HybridMatrix<int,3UL,5UL,rowMajor>;
605          using RT = HybridVector<int,3UL,columnVector>;
606          static_assert( IsSame_v< ReduceTrait_t<MT,OP,rowwise>, RT >, "Non-matching type detected" );
607 
608          using Expr = RemoveCVRef_t< decltype( reduce<rowwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
609          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
610          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
611       }
612       {
613          using MT = HybridMatrix<int,3UL,5UL,columnMajor>;
614          using RT = HybridVector<int,3UL,columnVector>;
615          static_assert( IsSame_v< ReduceTrait_t<MT,OP,rowwise>, RT >, "Non-matching type detected" );
616 
617          using Expr = RemoveCVRef_t< decltype( reduce<rowwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
618          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
619          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
620       }
621    }
622 
623    // DynamicMatrix
624    {
625       {
626          using MT = DynamicMatrix<int,rowMajor>;
627          using RT = DynamicVector<int,columnVector>;
628          static_assert( IsSame_v< ReduceTrait_t<MT,OP,rowwise>, RT >, "Non-matching type detected" );
629 
630          using Expr = RemoveCVRef_t< decltype( reduce<rowwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
631          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
632          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
633       }
634       {
635          using MT = DynamicMatrix<int,columnMajor>;
636          using RT = DynamicVector<int,columnVector>;
637          static_assert( IsSame_v< ReduceTrait_t<MT,OP,rowwise>, RT >, "Non-matching type detected" );
638 
639          using Expr = RemoveCVRef_t< decltype( reduce<rowwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
640          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
641          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
642       }
643    }
644 
645    // CustomMatrix
646    {
647       {
648          using MT = CustomMatrix<int,unaligned,unpadded,rowMajor>;
649          using RT = DynamicVector<int,columnVector>;
650          static_assert( IsSame_v< ReduceTrait_t<MT,OP,rowwise>, RT >, "Non-matching type detected" );
651 
652          using Expr = RemoveCVRef_t< decltype( reduce<rowwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
653          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
654          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
655       }
656       {
657          using MT = CustomMatrix<int,unaligned,unpadded,columnMajor>;
658          using RT = DynamicVector<int,columnVector>;
659          static_assert( IsSame_v< ReduceTrait_t<MT,OP,rowwise>, RT >, "Non-matching type detected" );
660 
661          using Expr = RemoveCVRef_t< decltype( reduce<rowwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
662          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
663          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
664       }
665    }
666 
667    // UniformMatrix
668    {
669       {
670          using MT = UniformMatrix<int,rowMajor>;
671          using RT = UniformVector<int,columnVector>;
672          static_assert( IsSame_v< ReduceTrait_t<MT,OP,rowwise>, RT >, "Non-matching type detected" );
673 
674          using Expr = RemoveCVRef_t< decltype( reduce<rowwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
675          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
676          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
677       }
678       {
679          using MT = UniformMatrix<int,columnMajor>;
680          using RT = UniformVector<int,columnVector>;
681          static_assert( IsSame_v< ReduceTrait_t<MT,OP,rowwise>, RT >, "Non-matching type detected" );
682 
683          using Expr = RemoveCVRef_t< decltype( reduce<rowwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
684          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
685          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
686       }
687    }
688 
689    // InitializerMatrix
690    {
691       {
692          using MT = InitializerMatrix<int>;
693          using RT = DynamicVector<int,columnVector>;
694          static_assert( IsSame_v< ReduceTrait_t<MT,OP,rowwise>, RT >, "Non-matching type detected" );
695 
696          using Expr = RemoveCVRef_t< decltype( reduce<rowwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
697          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
698          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
699       }
700    }
701 
702    // CompressedMatrix
703    {
704       {
705          using MT = CompressedMatrix<int,rowMajor>;
706          using RT = DynamicVector<int,columnVector>;
707          static_assert( IsSame_v< ReduceTrait_t<MT,OP,rowwise>, RT >, "Non-matching type detected" );
708 
709          using Expr = RemoveCVRef_t< decltype( reduce<rowwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
710          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
711          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
712       }
713       {
714          using MT = CompressedMatrix<int,columnMajor>;
715          using RT = DynamicVector<int,columnVector>;
716          static_assert( IsSame_v< ReduceTrait_t<MT,OP,rowwise>, RT >, "Non-matching type detected" );
717 
718          using Expr = RemoveCVRef_t< decltype( reduce<rowwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
719          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
720          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
721       }
722    }
723 
724    // IdentityMatrix
725    {
726       {
727          using MT = IdentityMatrix<int,rowMajor>;
728          using RT = UniformVector<int,columnVector>;
729          static_assert( IsSame_v< ReduceTrait_t<MT,OP,rowwise>, RT >, "Non-matching type detected" );
730 
731          using Expr = RemoveCVRef_t< decltype( reduce<rowwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
732          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
733          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
734       }
735       {
736          using MT = IdentityMatrix<int,columnMajor>;
737          using RT = UniformVector<int,columnVector>;
738          static_assert( IsSame_v< ReduceTrait_t<MT,OP,rowwise>, RT >, "Non-matching type detected" );
739 
740          using Expr = RemoveCVRef_t< decltype( reduce<rowwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
741          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
742          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
743       }
744    }
745 
746    // ZeroMatrix
747    {
748       {
749          using MT = ZeroMatrix<int,rowMajor>;
750          using RT = UniformVector<int,columnVector>;
751          static_assert( IsSame_v< ReduceTrait_t<MT,OP,rowwise>, RT >, "Non-matching type detected" );
752 
753          using Expr = RemoveCVRef_t< decltype( reduce<rowwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
754          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
755          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
756       }
757       {
758          using MT = ZeroMatrix<int,columnMajor>;
759          using RT = UniformVector<int,columnVector>;
760          static_assert( IsSame_v< ReduceTrait_t<MT,OP,rowwise>, RT >, "Non-matching type detected" );
761 
762          using Expr = RemoveCVRef_t< decltype( reduce<rowwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
763          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
764          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
765       }
766    }
767 
768    // SymmetricMatrix<DynamicMatrix> (real)
769    {
770       {
771          using MT = SymmetricMatrix< DynamicMatrix<int,rowMajor> >;
772          using RT = DynamicVector<int,columnVector>;
773          static_assert( IsSame_v< ReduceTrait_t<MT,OP,rowwise>, RT >, "Non-matching type detected" );
774 
775          using Expr = RemoveCVRef_t< decltype( reduce<rowwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
776          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
777          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
778       }
779       {
780          using MT = SymmetricMatrix< DynamicMatrix<int,columnMajor> >;
781          using RT = DynamicVector<int,columnVector>;
782          static_assert( IsSame_v< ReduceTrait_t<MT,OP,rowwise>, RT >, "Non-matching type detected" );
783 
784          using Expr = RemoveCVRef_t< decltype( reduce<rowwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
785          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
786          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
787       }
788    }
789 
790    // SymmetricMatrix<DynamicMatrix> (complex)
791    {
792       {
793          using MT = SymmetricMatrix< DynamicMatrix<complex<int>,rowMajor> >;
794          using RT = DynamicVector<complex<int>,columnVector>;
795          static_assert( IsSame_v< ReduceTrait_t<MT,OP,rowwise>, RT >, "Non-matching type detected" );
796 
797          using Expr = RemoveCVRef_t< decltype( reduce<rowwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
798          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
799          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
800       }
801       {
802          using MT = SymmetricMatrix< DynamicMatrix<complex<int>,columnMajor> >;
803          using RT = DynamicVector<complex<int>,columnVector>;
804          static_assert( IsSame_v< ReduceTrait_t<MT,OP,rowwise>, RT >, "Non-matching type detected" );
805 
806          using Expr = RemoveCVRef_t< decltype( reduce<rowwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
807          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
808          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
809       }
810    }
811 
812    // SymmetricMatrix<UniformMatrix> (real)
813    {
814       {
815          using MT = SymmetricMatrix< UniformMatrix<int,rowMajor> >;
816          using RT = UniformVector<int,columnVector>;
817          static_assert( IsSame_v< ReduceTrait_t<MT,OP,rowwise>, RT >, "Non-matching type detected" );
818 
819          using Expr = RemoveCVRef_t< decltype( reduce<rowwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
820          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
821          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
822       }
823       {
824          using MT = SymmetricMatrix< UniformMatrix<int,columnMajor> >;
825          using RT = UniformVector<int,columnVector>;
826          static_assert( IsSame_v< ReduceTrait_t<MT,OP,rowwise>, RT >, "Non-matching type detected" );
827 
828          using Expr = RemoveCVRef_t< decltype( reduce<rowwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
829          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
830          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
831       }
832    }
833 
834    // SymmetricMatrix<ZeroMatrix> (real)
835    {
836       {
837          using MT = SymmetricMatrix< ZeroMatrix<int,rowMajor> >;
838          using RT = UniformVector<int,columnVector>;
839          static_assert( IsSame_v< ReduceTrait_t<MT,OP,rowwise>, RT >, "Non-matching type detected" );
840 
841          using Expr = RemoveCVRef_t< decltype( reduce<rowwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
842          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
843          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
844       }
845       {
846          using MT = SymmetricMatrix< ZeroMatrix<int,columnMajor> >;
847          using RT = UniformVector<int,columnVector>;
848          static_assert( IsSame_v< ReduceTrait_t<MT,OP,rowwise>, RT >, "Non-matching type detected" );
849 
850          using Expr = RemoveCVRef_t< decltype( reduce<rowwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
851          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
852          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
853       }
854    }
855 
856    // HermitianMatrix<DynamicMatrix> (symmetric)
857    {
858       {
859          using MT = HermitianMatrix< DynamicMatrix<int,rowMajor> >;
860          using RT = DynamicVector<int,columnVector>;
861          static_assert( IsSame_v< ReduceTrait_t<MT,OP,rowwise>, RT >, "Non-matching type detected" );
862 
863          using Expr = RemoveCVRef_t< decltype( reduce<rowwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
864          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
865          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
866       }
867       {
868          using MT = HermitianMatrix< DynamicMatrix<int,columnMajor> >;
869          using RT = DynamicVector<int,columnVector>;
870          static_assert( IsSame_v< ReduceTrait_t<MT,OP,rowwise>, RT >, "Non-matching type detected" );
871 
872          using Expr = RemoveCVRef_t< decltype( reduce<rowwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
873          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
874          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
875       }
876    }
877 
878    // HermitianMatrix<DynamicMatrix> (Hermitian)
879    {
880       {
881          using MT = HermitianMatrix< DynamicMatrix<complex<int>,rowMajor> >;
882          using RT = DynamicVector<complex<int>,columnVector>;
883          static_assert( IsSame_v< ReduceTrait_t<MT,OP,rowwise>, RT >, "Non-matching type detected" );
884 
885          using Expr = RemoveCVRef_t< decltype( reduce<rowwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
886          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
887          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
888       }
889       {
890          using MT = HermitianMatrix< DynamicMatrix<complex<int>,columnMajor> >;
891          using RT = DynamicVector<complex<int>,columnVector>;
892          static_assert( IsSame_v< ReduceTrait_t<MT,OP,rowwise>, RT >, "Non-matching type detected" );
893 
894          using Expr = RemoveCVRef_t< decltype( reduce<rowwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
895          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
896          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
897       }
898    }
899 
900    // LowerMatrix<DynamicMatrix>
901    {
902       {
903          using MT = LowerMatrix< DynamicMatrix<int,rowMajor> >;
904          using RT = DynamicVector<int,columnVector>;
905          static_assert( IsSame_v< ReduceTrait_t<MT,OP,rowwise>, RT >, "Non-matching type detected" );
906 
907          using Expr = RemoveCVRef_t< decltype( reduce<rowwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
908          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
909          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
910       }
911       {
912          using MT = LowerMatrix< DynamicMatrix<int,columnMajor> >;
913          using RT = DynamicVector<int,columnVector>;
914          static_assert( IsSame_v< ReduceTrait_t<MT,OP,rowwise>, RT >, "Non-matching type detected" );
915 
916          using Expr = RemoveCVRef_t< decltype( reduce<rowwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
917          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
918          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
919       }
920    }
921 
922    // UniLowerMatrix<DynamicMatrix>
923    {
924       {
925          using MT = UniLowerMatrix< DynamicMatrix<int,rowMajor> >;
926          using RT = DynamicVector<int,columnVector>;
927          static_assert( IsSame_v< ReduceTrait_t<MT,OP,rowwise>, RT >, "Non-matching type detected" );
928 
929          using Expr = RemoveCVRef_t< decltype( reduce<rowwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
930          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
931          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
932       }
933       {
934          using MT = UniLowerMatrix< DynamicMatrix<int,columnMajor> >;
935          using RT = DynamicVector<int,columnVector>;
936          static_assert( IsSame_v< ReduceTrait_t<MT,OP,rowwise>, RT >, "Non-matching type detected" );
937 
938          using Expr = RemoveCVRef_t< decltype( reduce<rowwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
939          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
940          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
941       }
942    }
943 
944    // StrictlyLowerMatrix<DynamicMatrix>
945    {
946       {
947          using MT = StrictlyLowerMatrix< DynamicMatrix<int,rowMajor> >;
948          using RT = DynamicVector<int,columnVector>;
949          static_assert( IsSame_v< ReduceTrait_t<MT,OP,rowwise>, RT >, "Non-matching type detected" );
950 
951          using Expr = RemoveCVRef_t< decltype( reduce<rowwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
952          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
953          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
954       }
955       {
956          using MT = StrictlyLowerMatrix< DynamicMatrix<int,columnMajor> >;
957          using RT = DynamicVector<int,columnVector>;
958          static_assert( IsSame_v< ReduceTrait_t<MT,OP,rowwise>, RT >, "Non-matching type detected" );
959 
960          using Expr = RemoveCVRef_t< decltype( reduce<rowwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
961          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
962          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
963       }
964    }
965 
966    // UpperMatrix<DynamicMatrix>
967    {
968       {
969          using MT = UpperMatrix< DynamicMatrix<int,rowMajor> >;
970          using RT = DynamicVector<int,columnVector>;
971          static_assert( IsSame_v< ReduceTrait_t<MT,OP,rowwise>, RT >, "Non-matching type detected" );
972 
973          using Expr = RemoveCVRef_t< decltype( reduce<rowwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
974          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
975          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
976       }
977       {
978          using MT = UpperMatrix< DynamicMatrix<int,columnMajor> >;
979          using RT = DynamicVector<int,columnVector>;
980          static_assert( IsSame_v< ReduceTrait_t<MT,OP,rowwise>, RT >, "Non-matching type detected" );
981 
982          using Expr = RemoveCVRef_t< decltype( reduce<rowwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
983          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
984          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
985       }
986    }
987 
988    // UniUpperMatrix<DynamicMatrix>
989    {
990       {
991          using MT = UniUpperMatrix< DynamicMatrix<int,rowMajor> >;
992          using RT = DynamicVector<int,columnVector>;
993          static_assert( IsSame_v< ReduceTrait_t<MT,OP,rowwise>, RT >, "Non-matching type detected" );
994 
995          using Expr = RemoveCVRef_t< decltype( reduce<rowwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
996          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
997          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
998       }
999       {
1000          using MT = UniUpperMatrix< DynamicMatrix<int,columnMajor> >;
1001          using RT = DynamicVector<int,columnVector>;
1002          static_assert( IsSame_v< ReduceTrait_t<MT,OP,rowwise>, RT >, "Non-matching type detected" );
1003 
1004          using Expr = RemoveCVRef_t< decltype( reduce<rowwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1005          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1006          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1007       }
1008    }
1009 
1010    // StrictlyUpperMatrix<DynamicMatrix>
1011    {
1012       {
1013          using MT = StrictlyUpperMatrix< DynamicMatrix<int,rowMajor> >;
1014          using RT = DynamicVector<int,columnVector>;
1015          static_assert( IsSame_v< ReduceTrait_t<MT,OP,rowwise>, RT >, "Non-matching type detected" );
1016 
1017          using Expr = RemoveCVRef_t< decltype( reduce<rowwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1018          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1019          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1020       }
1021       {
1022          using MT = StrictlyUpperMatrix< DynamicMatrix<int,columnMajor> >;
1023          using RT = DynamicVector<int,columnVector>;
1024          static_assert( IsSame_v< ReduceTrait_t<MT,OP,rowwise>, RT >, "Non-matching type detected" );
1025 
1026          using Expr = RemoveCVRef_t< decltype( reduce<rowwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1027          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1028          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1029       }
1030    }
1031 
1032    // DiagonalMatrix<DynamicMatrix>
1033    {
1034       {
1035          using MT = DiagonalMatrix< DynamicMatrix<int,rowMajor> >;
1036          using RT = DynamicVector<int,columnVector>;
1037          static_assert( IsSame_v< ReduceTrait_t<MT,OP,rowwise>, RT >, "Non-matching type detected" );
1038 
1039          using Expr = RemoveCVRef_t< decltype( reduce<rowwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1040          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1041          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1042       }
1043       {
1044          using MT = DiagonalMatrix< DynamicMatrix<int,columnMajor> >;
1045          using RT = DynamicVector<int,columnVector>;
1046          static_assert( IsSame_v< ReduceTrait_t<MT,OP,rowwise>, RT >, "Non-matching type detected" );
1047 
1048          using Expr = RemoveCVRef_t< decltype( reduce<rowwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1049          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1050          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1051       }
1052    }
1053 }
1054 //*************************************************************************************************
1055 
1056 
1057 //*************************************************************************************************
1058 /*!\brief Test of the 'ReduceTrait' class template for columnwise matrix reductions.
1059 //
1060 // \return void
1061 // \exception std::runtime_error Error detected.
1062 //
1063 // This function performs a compile time test of the 'ReduceTrait' class template for columnwise
1064 // matrix reductions. In case an error is detected, a compilation error is created.
1065 */
testColumnwiseMatrixReduction()1066 void ClassTest::testColumnwiseMatrixReduction()
1067 {
1068    using namespace blaze;
1069    using OP = Add;
1070 
1071 
1072    // StaticMatrix
1073    {
1074       {
1075          using MT = StaticMatrix<int,3UL,5UL,rowMajor>;
1076          using RT = StaticVector<int,5UL,rowVector>;
1077          static_assert( IsSame_v< ReduceTrait_t<MT,OP,columnwise>, RT >, "Non-matching type detected" );
1078 
1079          using Expr = RemoveCVRef_t< decltype( reduce<columnwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1080          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1081          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1082       }
1083       {
1084          using MT = StaticMatrix<int,3UL,5UL,columnMajor>;
1085          using RT = StaticVector<int,5UL,rowVector>;
1086          static_assert( IsSame_v< ReduceTrait_t<MT,OP,columnwise>, RT >, "Non-matching type detected" );
1087 
1088          using Expr = RemoveCVRef_t< decltype( reduce<columnwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1089          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1090          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1091       }
1092    }
1093 
1094    // HybridMatrix
1095    {
1096       {
1097          using MT = HybridMatrix<int,3UL,5UL,rowMajor>;
1098          using RT = HybridVector<int,5UL,rowVector>;
1099          static_assert( IsSame_v< ReduceTrait_t<MT,OP,columnwise>, RT >, "Non-matching type detected" );
1100 
1101          using Expr = RemoveCVRef_t< decltype( reduce<columnwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1102          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1103          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1104       }
1105       {
1106          using MT = HybridMatrix<int,3UL,5UL,columnMajor>;
1107          using RT = HybridVector<int,5UL,rowVector>;
1108          static_assert( IsSame_v< ReduceTrait_t<MT,OP,columnwise>, RT >, "Non-matching type detected" );
1109 
1110          using Expr = RemoveCVRef_t< decltype( reduce<columnwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1111          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1112          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1113       }
1114    }
1115 
1116    // DynamicMatrix
1117    {
1118       {
1119          using MT = DynamicMatrix<int,rowMajor>;
1120          using RT = DynamicVector<int,rowVector>;
1121          static_assert( IsSame_v< ReduceTrait_t<MT,OP,columnwise>, RT >, "Non-matching type detected" );
1122 
1123          using Expr = RemoveCVRef_t< decltype( reduce<columnwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1124          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1125          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1126       }
1127       {
1128          using MT = DynamicMatrix<int,columnMajor>;
1129          using RT = DynamicVector<int,rowVector>;
1130          static_assert( IsSame_v< ReduceTrait_t<MT,OP,columnwise>, RT >, "Non-matching type detected" );
1131 
1132          using Expr = RemoveCVRef_t< decltype( reduce<columnwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1133          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1134          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1135       }
1136    }
1137 
1138    // CustomMatrix
1139    {
1140       {
1141          using MT = CustomMatrix<int,unaligned,unpadded,rowMajor>;
1142          using RT = DynamicVector<int,rowVector>;
1143          static_assert( IsSame_v< ReduceTrait_t<MT,OP,columnwise>, RT >, "Non-matching type detected" );
1144 
1145          using Expr = RemoveCVRef_t< decltype( reduce<columnwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1146          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1147          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1148       }
1149       {
1150          using MT = CustomMatrix<int,unaligned,unpadded,columnMajor>;
1151          using RT = DynamicVector<int,rowVector>;
1152          static_assert( IsSame_v< ReduceTrait_t<MT,OP,columnwise>, RT >, "Non-matching type detected" );
1153 
1154          using Expr = RemoveCVRef_t< decltype( reduce<columnwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1155          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1156          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1157       }
1158    }
1159 
1160    // UniformMatrix
1161    {
1162       {
1163          using MT = UniformMatrix<int,rowMajor>;
1164          using RT = UniformVector<int,rowVector>;
1165          static_assert( IsSame_v< ReduceTrait_t<MT,OP,columnwise>, RT >, "Non-matching type detected" );
1166 
1167          using Expr = RemoveCVRef_t< decltype( reduce<columnwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1168          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1169          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1170       }
1171       {
1172          using MT = UniformMatrix<int,columnMajor>;
1173          using RT = UniformVector<int,rowVector>;
1174          static_assert( IsSame_v< ReduceTrait_t<MT,OP,columnwise>, RT >, "Non-matching type detected" );
1175 
1176          using Expr = RemoveCVRef_t< decltype( reduce<columnwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1177          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1178          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1179       }
1180    }
1181 
1182    // InitializerMatrix
1183    {
1184       {
1185          using MT = DynamicMatrix<int>;
1186          using RT = DynamicVector<int,rowVector>;
1187          static_assert( IsSame_v< ReduceTrait_t<MT,OP,columnwise>, RT >, "Non-matching type detected" );
1188 
1189          using Expr = RemoveCVRef_t< decltype( reduce<columnwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1190          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1191          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1192       }
1193    }
1194 
1195    // CompressedMatrix
1196    {
1197       {
1198          using MT = CompressedMatrix<int,rowMajor>;
1199          using RT = DynamicVector<int,rowVector>;
1200          static_assert( IsSame_v< ReduceTrait_t<MT,OP,columnwise>, RT >, "Non-matching type detected" );
1201 
1202          using Expr = RemoveCVRef_t< decltype( reduce<columnwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1203          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1204          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1205       }
1206       {
1207          using MT = CompressedMatrix<int,columnMajor>;
1208          using RT = DynamicVector<int,rowVector>;
1209          static_assert( IsSame_v< ReduceTrait_t<MT,OP,columnwise>, RT >, "Non-matching type detected" );
1210 
1211          using Expr = RemoveCVRef_t< decltype( reduce<columnwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1212          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1213          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1214       }
1215    }
1216 
1217    // IdentityMatrix
1218    {
1219       {
1220          using MT = IdentityMatrix<int,rowMajor>;
1221          using RT = UniformVector<int,rowVector>;
1222          static_assert( IsSame_v< ReduceTrait_t<MT,OP,columnwise>, RT >, "Non-matching type detected" );
1223 
1224          using Expr = RemoveCVRef_t< decltype( reduce<columnwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1225          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1226          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1227       }
1228       {
1229          using MT = IdentityMatrix<int,columnMajor>;
1230          using RT = UniformVector<int,rowVector>;
1231          static_assert( IsSame_v< ReduceTrait_t<MT,OP,columnwise>, RT >, "Non-matching type detected" );
1232 
1233          using Expr = RemoveCVRef_t< decltype( reduce<columnwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1234          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1235          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1236       }
1237    }
1238 
1239    // ZeroMatrix
1240    {
1241       {
1242          using MT = ZeroMatrix<int,rowMajor>;
1243          using RT = UniformVector<int,rowVector>;
1244          static_assert( IsSame_v< ReduceTrait_t<MT,OP,columnwise>, RT >, "Non-matching type detected" );
1245 
1246          using Expr = RemoveCVRef_t< decltype( reduce<columnwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1247          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1248          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1249       }
1250       {
1251          using MT = ZeroMatrix<int,columnMajor>;
1252          using RT = UniformVector<int,rowVector>;
1253          static_assert( IsSame_v< ReduceTrait_t<MT,OP,columnwise>, RT >, "Non-matching type detected" );
1254 
1255          using Expr = RemoveCVRef_t< decltype( reduce<columnwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1256          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1257          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1258       }
1259    }
1260 
1261    // SymmetricMatrix<DynamicMatrix> (real)
1262    {
1263       {
1264          using MT = SymmetricMatrix< DynamicMatrix<int,rowMajor> >;
1265          using RT = DynamicVector<int,rowVector>;
1266          static_assert( IsSame_v< ReduceTrait_t<MT,OP,columnwise>, RT >, "Non-matching type detected" );
1267 
1268          using Expr = RemoveCVRef_t< decltype( reduce<columnwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1269          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1270          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1271       }
1272       {
1273          using MT = SymmetricMatrix< DynamicMatrix<int,columnMajor> >;
1274          using RT = DynamicVector<int,rowVector>;
1275          static_assert( IsSame_v< ReduceTrait_t<MT,OP,columnwise>, RT >, "Non-matching type detected" );
1276 
1277          using Expr = RemoveCVRef_t< decltype( reduce<columnwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1278          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1279          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1280       }
1281    }
1282 
1283    // SymmetricMatrix<DynamicMatrix> (complex)
1284    {
1285       {
1286          using MT = SymmetricMatrix< DynamicMatrix<complex<int>,rowMajor> >;
1287          using RT = DynamicVector<complex<int>,rowVector>;
1288          static_assert( IsSame_v< ReduceTrait_t<MT,OP,columnwise>, RT >, "Non-matching type detected" );
1289 
1290          using Expr = RemoveCVRef_t< decltype( reduce<columnwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1291          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1292          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1293       }
1294       {
1295          using MT = SymmetricMatrix< DynamicMatrix<complex<int>,columnMajor> >;
1296          using RT = DynamicVector<complex<int>,rowVector>;
1297          static_assert( IsSame_v< ReduceTrait_t<MT,OP,columnwise>, RT >, "Non-matching type detected" );
1298 
1299          using Expr = RemoveCVRef_t< decltype( reduce<columnwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1300          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1301          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1302       }
1303    }
1304 
1305    // SymmetricMatrix<UniformMatrix> (real)
1306    {
1307       {
1308          using MT = SymmetricMatrix< UniformMatrix<int,rowMajor> >;
1309          using RT = UniformVector<int,rowVector>;
1310          static_assert( IsSame_v< ReduceTrait_t<MT,OP,columnwise>, RT >, "Non-matching type detected" );
1311 
1312          using Expr = RemoveCVRef_t< decltype( reduce<columnwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1313          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1314          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1315       }
1316       {
1317          using MT = SymmetricMatrix< UniformMatrix<int,columnMajor> >;
1318          using RT = UniformVector<int,rowVector>;
1319          static_assert( IsSame_v< ReduceTrait_t<MT,OP,columnwise>, RT >, "Non-matching type detected" );
1320 
1321          using Expr = RemoveCVRef_t< decltype( reduce<columnwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1322          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1323          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1324       }
1325    }
1326 
1327    // SymmetricMatrix<ZeroMatrix> (real)
1328    {
1329       {
1330          using MT = SymmetricMatrix< ZeroMatrix<int,rowMajor> >;
1331          using RT = UniformVector<int,rowVector>;
1332          static_assert( IsSame_v< ReduceTrait_t<MT,OP,columnwise>, RT >, "Non-matching type detected" );
1333 
1334          using Expr = RemoveCVRef_t< decltype( reduce<columnwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1335          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1336          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1337       }
1338       {
1339          using MT = SymmetricMatrix< ZeroMatrix<int,columnMajor> >;
1340          using RT = UniformVector<int,rowVector>;
1341          static_assert( IsSame_v< ReduceTrait_t<MT,OP,columnwise>, RT >, "Non-matching type detected" );
1342 
1343          using Expr = RemoveCVRef_t< decltype( reduce<columnwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1344          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1345          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1346       }
1347    }
1348 
1349    // HermitianMatrix<DynamicMatrix> (symmetric)
1350    {
1351       {
1352          using MT = HermitianMatrix< DynamicMatrix<int,rowMajor> >;
1353          using RT = DynamicVector<int,rowVector>;
1354          static_assert( IsSame_v< ReduceTrait_t<MT,OP,columnwise>, RT >, "Non-matching type detected" );
1355 
1356          using Expr = RemoveCVRef_t< decltype( reduce<columnwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1357          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1358          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1359       }
1360       {
1361          using MT = HermitianMatrix< DynamicMatrix<int,columnMajor> >;
1362          using RT = DynamicVector<int,rowVector>;
1363          static_assert( IsSame_v< ReduceTrait_t<MT,OP,columnwise>, RT >, "Non-matching type detected" );
1364 
1365          using Expr = RemoveCVRef_t< decltype( reduce<columnwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1366          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1367          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1368       }
1369    }
1370 
1371    // HermitianMatrix<DynamicMatrix> (Hermitian)
1372    {
1373       {
1374          using MT = HermitianMatrix< DynamicMatrix<complex<int>,rowMajor> >;
1375          using RT = DynamicVector<complex<int>,rowVector>;
1376          static_assert( IsSame_v< ReduceTrait_t<MT,OP,columnwise>, RT >, "Non-matching type detected" );
1377 
1378          using Expr = RemoveCVRef_t< decltype( reduce<columnwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1379          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1380          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1381       }
1382       {
1383          using MT = HermitianMatrix< DynamicMatrix<complex<int>,columnMajor> >;
1384          using RT = DynamicVector<complex<int>,rowVector>;
1385          static_assert( IsSame_v< ReduceTrait_t<MT,OP,columnwise>, RT >, "Non-matching type detected" );
1386 
1387          using Expr = RemoveCVRef_t< decltype( reduce<columnwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1388          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1389          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1390       }
1391    }
1392 
1393    // LowerMatrix<DynamicMatrix>
1394    {
1395       {
1396          using MT = LowerMatrix< DynamicMatrix<int,rowMajor> >;
1397          using RT = DynamicVector<int,rowVector>;
1398          static_assert( IsSame_v< ReduceTrait_t<MT,OP,columnwise>, RT >, "Non-matching type detected" );
1399 
1400          using Expr = RemoveCVRef_t< decltype( reduce<columnwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1401          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1402          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1403       }
1404       {
1405          using MT = LowerMatrix< DynamicMatrix<int,columnMajor> >;
1406          using RT = DynamicVector<int,rowVector>;
1407          static_assert( IsSame_v< ReduceTrait_t<MT,OP,columnwise>, RT >, "Non-matching type detected" );
1408 
1409          using Expr = RemoveCVRef_t< decltype( reduce<columnwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1410          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1411          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1412       }
1413    }
1414 
1415    // UniLowerMatrix<DynamicMatrix>
1416    {
1417       {
1418          using MT = UniLowerMatrix< DynamicMatrix<int,rowMajor> >;
1419          using RT = DynamicVector<int,rowVector>;
1420          static_assert( IsSame_v< ReduceTrait_t<MT,OP,columnwise>, RT >, "Non-matching type detected" );
1421 
1422          using Expr = RemoveCVRef_t< decltype( reduce<columnwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1423          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1424          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1425       }
1426       {
1427          using MT = UniLowerMatrix< DynamicMatrix<int,columnMajor> >;
1428          using RT = DynamicVector<int,rowVector>;
1429          static_assert( IsSame_v< ReduceTrait_t<MT,OP,columnwise>, RT >, "Non-matching type detected" );
1430 
1431          using Expr = RemoveCVRef_t< decltype( reduce<columnwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1432          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1433          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1434       }
1435    }
1436 
1437    // StrictlyLowerMatrix<DynamicMatrix>
1438    {
1439       {
1440          using MT = StrictlyLowerMatrix< DynamicMatrix<int,rowMajor> >;
1441          using RT = DynamicVector<int,rowVector>;
1442          static_assert( IsSame_v< ReduceTrait_t<MT,OP,columnwise>, RT >, "Non-matching type detected" );
1443 
1444          using Expr = RemoveCVRef_t< decltype( reduce<columnwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1445          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1446          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1447       }
1448       {
1449          using MT = StrictlyLowerMatrix< DynamicMatrix<int,columnMajor> >;
1450          using RT = DynamicVector<int,rowVector>;
1451          static_assert( IsSame_v< ReduceTrait_t<MT,OP,columnwise>, RT >, "Non-matching type detected" );
1452 
1453          using Expr = RemoveCVRef_t< decltype( reduce<columnwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1454          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1455          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1456       }
1457    }
1458 
1459    // UpperMatrix<DynamicMatrix>
1460    {
1461       {
1462          using MT = UpperMatrix< DynamicMatrix<int,rowMajor> >;
1463          using RT = DynamicVector<int,rowVector>;
1464          static_assert( IsSame_v< ReduceTrait_t<MT,OP,columnwise>, RT >, "Non-matching type detected" );
1465 
1466          using Expr = RemoveCVRef_t< decltype( reduce<columnwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1467          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1468          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1469       }
1470       {
1471          using MT = UpperMatrix< DynamicMatrix<int,columnMajor> >;
1472          using RT = DynamicVector<int,rowVector>;
1473          static_assert( IsSame_v< ReduceTrait_t<MT,OP,columnwise>, RT >, "Non-matching type detected" );
1474 
1475          using Expr = RemoveCVRef_t< decltype( reduce<columnwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1476          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1477          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1478       }
1479    }
1480 
1481    // UniUpperMatrix<DynamicMatrix>
1482    {
1483       {
1484          using MT = UniUpperMatrix< DynamicMatrix<int,rowMajor> >;
1485          using RT = DynamicVector<int,rowVector>;
1486          static_assert( IsSame_v< ReduceTrait_t<MT,OP,columnwise>, RT >, "Non-matching type detected" );
1487 
1488          using Expr = RemoveCVRef_t< decltype( reduce<columnwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1489          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1490          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1491       }
1492       {
1493          using MT = UniUpperMatrix< DynamicMatrix<int,columnMajor> >;
1494          using RT = DynamicVector<int,rowVector>;
1495          static_assert( IsSame_v< ReduceTrait_t<MT,OP,columnwise>, RT >, "Non-matching type detected" );
1496 
1497          using Expr = RemoveCVRef_t< decltype( reduce<columnwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1498          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1499          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1500       }
1501    }
1502 
1503    // StrictlyUpperMatrix<DynamicMatrix>
1504    {
1505       {
1506          using MT = StrictlyUpperMatrix< DynamicMatrix<int,rowMajor> >;
1507          using RT = DynamicVector<int,rowVector>;
1508          static_assert( IsSame_v< ReduceTrait_t<MT,OP,columnwise>, RT >, "Non-matching type detected" );
1509 
1510          using Expr = RemoveCVRef_t< decltype( reduce<columnwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1511          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1512          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1513       }
1514       {
1515          using MT = StrictlyUpperMatrix< DynamicMatrix<int,columnMajor> >;
1516          using RT = DynamicVector<int,rowVector>;
1517          static_assert( IsSame_v< ReduceTrait_t<MT,OP,columnwise>, RT >, "Non-matching type detected" );
1518 
1519          using Expr = RemoveCVRef_t< decltype( reduce<columnwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1520          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1521          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1522       }
1523    }
1524 
1525    // DiagonalMatrix<DynamicMatrix>
1526    {
1527       {
1528          using MT = DiagonalMatrix< DynamicMatrix<int,rowMajor> >;
1529          using RT = DynamicVector<int,rowVector>;
1530          static_assert( IsSame_v< ReduceTrait_t<MT,OP,columnwise>, RT >, "Non-matching type detected" );
1531 
1532          using Expr = RemoveCVRef_t< decltype( reduce<columnwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1533          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1534          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1535       }
1536       {
1537          using MT = DiagonalMatrix< DynamicMatrix<int,columnMajor> >;
1538          using RT = DynamicVector<int,rowVector>;
1539          static_assert( IsSame_v< ReduceTrait_t<MT,OP,columnwise>, RT >, "Non-matching type detected" );
1540 
1541          using Expr = RemoveCVRef_t< decltype( reduce<columnwise>( std::declval<MT>(), std::declval<OP>() ) ) >;
1542          static_assert( IsSame_v< ResultType_t<Expr>, RT >, "Non-matching type detected" );
1543          static_assert( TransposeFlag_v<Expr> == TransposeFlag_v<RT>, "Non-matching transpose flag detected" );
1544       }
1545    }
1546 }
1547 //*************************************************************************************************
1548 
1549 } // namespace reducetrait
1550 
1551 } // namespace traits
1552 
1553 } // namespace mathtest
1554 
1555 } // namespace blazetest
1556 
1557 
1558 
1559 
1560 //=================================================================================================
1561 //
1562 //  MAIN FUNCTION
1563 //
1564 //=================================================================================================
1565 
1566 //*************************************************************************************************
main()1567 int main()
1568 {
1569    std::cout << "   Running ReduceTrait class test..." << std::endl;
1570 
1571    try
1572    {
1573       RUN_REDUCETRAIT_CLASS_TEST;
1574    }
1575    catch( std::exception& ex ) {
1576       std::cerr << "\n\n ERROR DETECTED during ReduceTrait class test:\n"
1577                 << ex.what() << "\n";
1578       return EXIT_FAILURE;
1579    }
1580 
1581    return EXIT_SUCCESS;
1582 }
1583 //*************************************************************************************************
1584