1 //=================================================================================================
2 /*!
3 //  \file src/mathtest/adaptors/lowermatrix/SparseTest1.cpp
4 //  \brief Source file for the LowerMatrix sparse test (part 1)
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 <blaze/math/CompressedMatrix.h>
43 #include <blaze/math/DynamicMatrix.h>
44 #include <blaze/math/StaticMatrix.h>
45 #include <blazetest/mathtest/adaptors/lowermatrix/SparseTest.h>
46 
47 #ifdef BLAZE_USE_HPX_THREADS
48 #  include <hpx/hpx_main.hpp>
49 #endif
50 
51 
52 namespace blazetest {
53 
54 namespace mathtest {
55 
56 namespace adaptors {
57 
58 namespace lowermatrix {
59 
60 //=================================================================================================
61 //
62 //  CONSTRUCTORS
63 //
64 //=================================================================================================
65 
66 //*************************************************************************************************
67 /*!\brief Constructor for the LowerMatrix sparse test.
68 //
69 // \exception std::runtime_error Operation error detected.
70 */
SparseTest()71 SparseTest::SparseTest()
72 {
73    testConstructors();
74    testAssignment();
75    testAddAssign();
76    testSubAssign();
77    testSchurAssign();
78    testMultAssign();
79 }
80 //*************************************************************************************************
81 
82 
83 
84 
85 //=================================================================================================
86 //
87 //  TEST FUNCTIONS
88 //
89 //=================================================================================================
90 
91 //*************************************************************************************************
92 /*!\brief Test of the LowerMatrix constructors.
93 //
94 // \return void
95 // \exception std::runtime_error Error detected.
96 //
97 // This function performs a test of all constructors of the LowerMatrix specialization.
98 // In case an error is detected, a \a std::runtime_error exception is thrown.
99 */
testConstructors()100 void SparseTest::testConstructors()
101 {
102    //=====================================================================================
103    // Row-major default constructor
104    //=====================================================================================
105 
106    // Default constructor (CompressedMatrix)
107    {
108       test_ = "Row-major LowerMatrix default constructor (CompressedMatrix)";
109 
110       const LT lower;
111 
112       checkRows    ( lower, 0UL );
113       checkColumns ( lower, 0UL );
114       checkNonZeros( lower, 0UL );
115    }
116 
117 
118    //=====================================================================================
119    // Row-major size constructor
120    //=====================================================================================
121 
122    // Size constructor (CompressedMatrix)
123    {
124       test_ = "Row-major LowerMatrix size constructor (CompressedMatrix)";
125 
126       const LT lower( 2UL );
127 
128       checkRows    ( lower, 2UL );
129       checkColumns ( lower, 2UL );
130       checkNonZeros( lower, 0UL );
131    }
132 
133 
134    //=====================================================================================
135    // Row-major list initialization
136    //=====================================================================================
137 
138    // Complete initializer list
139    {
140       test_ = "Row-major LowerMatrix initializer list constructor (complete list)";
141 
142       const LT lower{ { 1, 0, 0 }, { 2, 3, 0 }, { 4, 5, 6 } };
143 
144       checkRows    ( lower, 3UL );
145       checkColumns ( lower, 3UL );
146       checkCapacity( lower, 6UL );
147       checkNonZeros( lower, 6UL );
148       checkNonZeros( lower, 0UL, 1UL );
149       checkNonZeros( lower, 1UL, 2UL );
150       checkNonZeros( lower, 2UL, 3UL );
151 
152       if( lower(0,0) != 1 || lower(0,1) != 0 || lower(0,2) != 0 ||
153           lower(1,0) != 2 || lower(1,1) != 3 || lower(1,2) != 0 ||
154           lower(2,0) != 4 || lower(2,1) != 5 || lower(2,2) != 6 ) {
155          std::ostringstream oss;
156          oss << " Test: " << test_ << "\n"
157              << " Error: Construction failed\n"
158              << " Details:\n"
159              << "   Result:\n" << lower << "\n"
160              << "   Expected result:\n( 1 0 0 )\n( 2 3 0 )\n( 4 5 6 )\n";
161          throw std::runtime_error( oss.str() );
162       }
163    }
164 
165    // Incomplete initializer list
166    {
167       test_ = "Row-major LowerMatrix initializer list constructor (incomplete list)";
168 
169       const LT lower{ { 1 }, { 2, 3 }, { 4, 5, 6 } };
170 
171       checkRows    ( lower, 3UL );
172       checkColumns ( lower, 3UL );
173       checkCapacity( lower, 6UL );
174       checkNonZeros( lower, 6UL );
175       checkNonZeros( lower, 0UL, 1UL );
176       checkNonZeros( lower, 1UL, 2UL );
177       checkNonZeros( lower, 2UL, 3UL );
178 
179       if( lower(0,0) != 1 || lower(0,1) != 0 || lower(0,2) != 0 ||
180           lower(1,0) != 2 || lower(1,1) != 3 || lower(1,2) != 0 ||
181           lower(2,0) != 4 || lower(2,1) != 5 || lower(2,2) != 6 ) {
182          std::ostringstream oss;
183          oss << " Test: " << test_ << "\n"
184              << " Error: Construction failed\n"
185              << " Details:\n"
186              << "   Result:\n" << lower << "\n"
187              << "   Expected result:\n( 1 0 0 )\n( 2 3 0 )\n( 4 5 6 )\n";
188          throw std::runtime_error( oss.str() );
189       }
190    }
191 
192 
193    //=====================================================================================
194    // Row-major copy constructor
195    //=====================================================================================
196 
197    // Copy constructor (0x0)
198    {
199       test_ = "Row-major LowerMatrix copy constructor (0x0)";
200 
201       const LT lower1;
202       const LT lower2( lower1 );
203 
204       checkRows    ( lower2, 0UL );
205       checkColumns ( lower2, 0UL );
206       checkNonZeros( lower2, 0UL );
207    }
208 
209    // Copy constructor (3x3)
210    {
211       test_ = "Row-major LowerMatrix copy constructor (3x3)";
212 
213       LT lower1( 3UL );
214       lower1(0,0) =  1;
215       lower1(1,0) = -4;
216       lower1(1,1) =  2;
217       lower1(2,0) =  7;
218       lower1(2,2) =  3;
219 
220       const LT lower2( lower1 );
221 
222       checkRows    ( lower2, 3UL );
223       checkColumns ( lower2, 3UL );
224       checkCapacity( lower2, 5UL );
225       checkNonZeros( lower2, 5UL );
226       checkNonZeros( lower2, 0UL, 1UL );
227       checkNonZeros( lower2, 1UL, 2UL );
228       checkNonZeros( lower2, 2UL, 2UL );
229 
230       if( lower2(0,0) !=  1 || lower2(0,1) != 0 || lower2(0,2) != 0 ||
231           lower2(1,0) != -4 || lower2(1,1) != 2 || lower2(1,2) != 0 ||
232           lower2(2,0) !=  7 || lower2(2,1) != 0 || lower2(2,2) != 3 ) {
233          std::ostringstream oss;
234          oss << " Test: " << test_ << "\n"
235              << " Error: Construction failed\n"
236              << " Details:\n"
237              << "   Result:\n" << lower2 << "\n"
238              << "   Expected result:\n(  1 0 0 )\n( -4 2 0 )\n(  7 0 3 )\n";
239          throw std::runtime_error( oss.str() );
240       }
241    }
242 
243 
244    //=====================================================================================
245    // Row-major move constructor
246    //=====================================================================================
247 
248    // Move constructor (0x0)
249    {
250       test_ = "Row-major LowerMatrix move constructor (0x0)";
251 
252       LT lower1;
253       LT lower2( std::move( lower1 ) );
254 
255       checkRows    ( lower2, 0UL );
256       checkColumns ( lower2, 0UL );
257       checkNonZeros( lower2, 0UL );
258    }
259 
260    // Move constructor (3x3)
261    {
262       test_ = "Row-major LowerMatrix move constructor (3x3)";
263 
264       LT lower1( 3UL );
265       lower1(0,0) =  1;
266       lower1(1,0) = -4;
267       lower1(1,1) =  2;
268       lower1(2,0) =  7;
269       lower1(2,2) =  3;
270 
271       LT lower2( std::move( lower1 ) );
272 
273       checkRows    ( lower2, 3UL );
274       checkColumns ( lower2, 3UL );
275       checkCapacity( lower2, 5UL );
276       checkNonZeros( lower2, 5UL );
277       checkNonZeros( lower2, 0UL, 1UL );
278       checkNonZeros( lower2, 1UL, 2UL );
279       checkNonZeros( lower2, 2UL, 2UL );
280 
281       if( lower2(0,0) !=  1 || lower2(0,1) != 0 || lower2(0,2) != 0 ||
282           lower2(1,0) != -4 || lower2(1,1) != 2 || lower2(1,2) != 0 ||
283           lower2(2,0) !=  7 || lower2(2,1) != 0 || lower2(2,2) != 3 ) {
284          std::ostringstream oss;
285          oss << " Test: " << test_ << "\n"
286              << " Error: Construction failed\n"
287              << " Details:\n"
288              << "   Result:\n" << lower2 << "\n"
289              << "   Expected result:\n(  1 0 0 )\n( -4 2 0 )\n(  7 0 3 )\n";
290          throw std::runtime_error( oss.str() );
291       }
292    }
293 
294 
295    //=====================================================================================
296    // Row-major conversion constructor
297    //=====================================================================================
298 
299    // Conversion constructor (0x0)
300    {
301       test_ = "Row-major LowerMatrix conversion constructor (0x0)";
302 
303       const blaze::DynamicMatrix<int,blaze::rowMajor> mat;
304       const LT lower( mat );
305 
306       checkRows    ( lower, 0UL );
307       checkColumns ( lower, 0UL );
308       checkNonZeros( lower, 0UL );
309    }
310 
311    // Conversion constructor (lower)
312    {
313       test_ = "Row-major LowerMatrix conversion constructor (lower)";
314 
315       blaze::StaticMatrix<int,3UL,3UL,blaze::rowMajor> mat;
316       mat(0,0) =  1;
317       mat(1,0) = -4;
318       mat(1,1) =  2;
319       mat(2,0) =  7;
320       mat(2,2) =  3;
321 
322       const LT lower( mat );
323 
324       checkRows    ( lower, 3UL );
325       checkColumns ( lower, 3UL );
326       checkCapacity( lower, 5UL );
327       checkNonZeros( lower, 5UL );
328       checkNonZeros( lower, 0UL, 1UL );
329       checkNonZeros( lower, 1UL, 2UL );
330       checkNonZeros( lower, 2UL, 2UL );
331 
332       if( lower(0,0) !=  1 || lower(0,1) != 0 || lower(0,2) != 0 ||
333           lower(1,0) != -4 || lower(1,1) != 2 || lower(1,2) != 0 ||
334           lower(2,0) !=  7 || lower(2,1) != 0 || lower(2,2) != 3 ) {
335          std::ostringstream oss;
336          oss << " Test: " << test_ << "\n"
337              << " Error: Construction failed\n"
338              << " Details:\n"
339              << "   Result:\n" << lower << "\n"
340              << "   Expected result:\n(  1 0 0 )\n( -4 2 0 )\n(  7 0 3 )\n";
341          throw std::runtime_error( oss.str() );
342       }
343    }
344 
345    // Conversion constructor (non-lower)
346    {
347       test_ = "Row-major LowerMatrix conversion constructor (non-lower)";
348 
349       blaze::StaticMatrix<int,3UL,3UL,blaze::rowMajor> mat;
350       mat(0,0) =  1;
351       mat(0,2) =  5;
352       mat(1,0) = -4;
353       mat(1,1) =  2;
354       mat(2,0) =  7;
355       mat(2,2) =  3;
356 
357       try {
358          const LT lower( mat );
359 
360          std::ostringstream oss;
361          oss << " Test: " << test_ << "\n"
362              << " Error: Setup of non-lower LowerMatrix succeeded\n"
363              << " Details:\n"
364              << "   Result:\n" << lower << "\n";
365          throw std::runtime_error( oss.str() );
366       }
367       catch( std::invalid_argument& ) {}
368    }
369 
370    // Conversion constructor (LowerMatrix)
371    {
372       test_ = "Row-major LowerMatrix conversion constructor (LowerMatrix)";
373 
374       blaze::LowerMatrix< blaze::StaticMatrix<int,3UL,3UL,blaze::rowMajor> > lower1;
375       lower1(0,0) =  1;
376       lower1(1,0) = -4;
377       lower1(1,1) =  2;
378       lower1(2,0) =  7;
379       lower1(2,2) =  3;
380 
381       const LT lower2( lower1 );
382 
383       checkRows    ( lower2, 3UL );
384       checkColumns ( lower2, 3UL );
385       checkCapacity( lower2, 5UL );
386       checkNonZeros( lower2, 5UL );
387       checkNonZeros( lower2, 0UL, 1UL );
388       checkNonZeros( lower2, 1UL, 2UL );
389       checkNonZeros( lower2, 2UL, 2UL );
390 
391       if( lower2(0,0) !=  1 || lower2(0,1) != 0 || lower2(0,2) != 0 ||
392           lower2(1,0) != -4 || lower2(1,1) != 2 || lower2(1,2) != 0 ||
393           lower2(2,0) !=  7 || lower2(2,1) != 0 || lower2(2,2) != 3 ) {
394          std::ostringstream oss;
395          oss << " Test: " << test_ << "\n"
396              << " Error: Construction failed\n"
397              << " Details:\n"
398              << "   Result:\n" << lower2 << "\n"
399              << "   Expected result:\n(  1 0 0 )\n( -4 2 0 )\n(  7 0 3 )\n";
400          throw std::runtime_error( oss.str() );
401       }
402    }
403 
404 
405    //=====================================================================================
406    // Column-major default constructor
407    //=====================================================================================
408 
409    // Default constructor (CompressedMatrix)
410    {
411       test_ = "Column-major LowerMatrix default constructor (CompressedMatrix)";
412 
413       const OLT lower;
414 
415       checkRows    ( lower, 0UL );
416       checkColumns ( lower, 0UL );
417       checkNonZeros( lower, 0UL );
418    }
419 
420 
421    //=====================================================================================
422    // Column-major size constructor
423    //=====================================================================================
424 
425    // Size constructor (CompressedMatrix)
426    {
427       test_ = "Column-major LowerMatrix size constructor (CompressedMatrix)";
428 
429       const OLT lower( 2UL );
430 
431       checkRows    ( lower, 2UL );
432       checkColumns ( lower, 2UL );
433       checkNonZeros( lower, 0UL );
434    }
435 
436 
437    //=====================================================================================
438    // Column-major list initialization
439    //=====================================================================================
440 
441    // Complete initializer list
442    {
443       test_ = "Column-major LowerMatrix initializer list constructor (complete list)";
444 
445       const OLT lower{ { 1, 0, 0 }, { 2, 3, 0 }, { 4, 5, 6 } };
446 
447       checkRows    ( lower, 3UL );
448       checkColumns ( lower, 3UL );
449       checkCapacity( lower, 6UL );
450       checkNonZeros( lower, 6UL );
451       checkNonZeros( lower, 0UL, 3UL );
452       checkNonZeros( lower, 1UL, 2UL );
453       checkNonZeros( lower, 2UL, 1UL );
454 
455       if( lower(0,0) != 1 || lower(0,1) != 0 || lower(0,2) != 0 ||
456           lower(1,0) != 2 || lower(1,1) != 3 || lower(1,2) != 0 ||
457           lower(2,0) != 4 || lower(2,1) != 5 || lower(2,2) != 6 ) {
458          std::ostringstream oss;
459          oss << " Test: " << test_ << "\n"
460              << " Error: Construction failed\n"
461              << " Details:\n"
462              << "   Result:\n" << lower << "\n"
463              << "   Expected result:\n( 1 0 0 )\n( 2 3 0 )\n( 4 5 6 )\n";
464          throw std::runtime_error( oss.str() );
465       }
466    }
467 
468    // Incomplete initializer list
469    {
470       test_ = "Column-major LowerMatrix initializer list constructor (incomplete list)";
471 
472       const OLT lower{ { 1 }, { 2, 3 }, { 4, 5, 6 } };
473 
474       checkRows    ( lower, 3UL );
475       checkColumns ( lower, 3UL );
476       checkCapacity( lower, 6UL );
477       checkNonZeros( lower, 6UL );
478       checkNonZeros( lower, 0UL, 3UL );
479       checkNonZeros( lower, 1UL, 2UL );
480       checkNonZeros( lower, 2UL, 1UL );
481 
482       if( lower(0,0) != 1 || lower(0,1) != 0 || lower(0,2) != 0 ||
483           lower(1,0) != 2 || lower(1,1) != 3 || lower(1,2) != 0 ||
484           lower(2,0) != 4 || lower(2,1) != 5 || lower(2,2) != 6 ) {
485          std::ostringstream oss;
486          oss << " Test: " << test_ << "\n"
487              << " Error: Construction failed\n"
488              << " Details:\n"
489              << "   Result:\n" << lower << "\n"
490              << "   Expected result:\n( 1 0 0 )\n( 2 3 0 )\n( 4 5 6 )\n";
491          throw std::runtime_error( oss.str() );
492       }
493    }
494 
495 
496    //=====================================================================================
497    // Column-major copy constructor
498    //=====================================================================================
499 
500    // Copy constructor (0x0)
501    {
502       test_ = "Column-major LowerMatrix copy constructor (0x0)";
503 
504       const OLT lower1;
505       const OLT lower2( lower1 );
506 
507       checkRows    ( lower2, 0UL );
508       checkColumns ( lower2, 0UL );
509       checkNonZeros( lower2, 0UL );
510    }
511 
512    // Copy constructor (3x3)
513    {
514       test_ = "Column-major LowerMatrix copy constructor (3x3)";
515 
516       OLT lower1( 3UL );
517       lower1(0,0) =  1;
518       lower1(1,0) = -4;
519       lower1(1,1) =  2;
520       lower1(2,0) =  7;
521       lower1(2,2) =  3;
522 
523       const OLT lower2( lower1 );
524 
525       checkRows    ( lower2, 3UL );
526       checkColumns ( lower2, 3UL );
527       checkCapacity( lower2, 5UL );
528       checkNonZeros( lower2, 5UL );
529       checkNonZeros( lower2, 0UL, 3UL );
530       checkNonZeros( lower2, 1UL, 1UL );
531       checkNonZeros( lower2, 2UL, 1UL );
532 
533       if( lower2(0,0) !=  1 || lower2(0,1) != 0 || lower2(0,2) != 0 ||
534           lower2(1,0) != -4 || lower2(1,1) != 2 || lower2(1,2) != 0 ||
535           lower2(2,0) !=  7 || lower2(2,1) != 0 || lower2(2,2) != 3 ) {
536          std::ostringstream oss;
537          oss << " Test: " << test_ << "\n"
538              << " Error: Construction failed\n"
539              << " Details:\n"
540              << "   Result:\n" << lower2 << "\n"
541              << "   Expected result:\n(  1 0 0 )\n( -4 2 0 )\n(  7 0 3 )\n";
542          throw std::runtime_error( oss.str() );
543       }
544    }
545 
546 
547    //=====================================================================================
548    // Column-major move constructor
549    //=====================================================================================
550 
551    // Move constructor (0x0)
552    {
553       test_ = "Column-major LowerMatrix move constructor (0x0)";
554 
555       OLT lower1;
556       OLT lower2( std::move( lower1 ) );
557 
558       checkRows    ( lower2, 0UL );
559       checkColumns ( lower2, 0UL );
560       checkNonZeros( lower2, 0UL );
561    }
562 
563    // Move constructor (3x3)
564    {
565       test_ = "Column-major LowerMatrix move constructor (3x3)";
566 
567       OLT lower1( 3UL );
568       lower1(0,0) =  1;
569       lower1(1,0) = -4;
570       lower1(1,1) =  2;
571       lower1(2,0) =  7;
572       lower1(2,2) =  3;
573 
574       OLT lower2( std::move( lower1 ) );
575 
576       checkRows    ( lower2, 3UL );
577       checkColumns ( lower2, 3UL );
578       checkCapacity( lower2, 5UL );
579       checkNonZeros( lower2, 5UL );
580       checkNonZeros( lower2, 0UL, 3UL );
581       checkNonZeros( lower2, 1UL, 1UL );
582       checkNonZeros( lower2, 2UL, 1UL );
583 
584       if( lower2(0,0) !=  1 || lower2(0,1) != 0 || lower2(0,2) != 0 ||
585           lower2(1,0) != -4 || lower2(1,1) != 2 || lower2(1,2) != 0 ||
586           lower2(2,0) !=  7 || lower2(2,1) != 0 || lower2(2,2) != 3 ) {
587          std::ostringstream oss;
588          oss << " Test: " << test_ << "\n"
589              << " Error: Construction failed\n"
590              << " Details:\n"
591              << "   Result:\n" << lower2 << "\n"
592              << "   Expected result:\n(  1 0 0 )\n( -4 2 0 )\n(  7 0 3 )\n";
593          throw std::runtime_error( oss.str() );
594       }
595    }
596 
597 
598    //=====================================================================================
599    // Column-major conversion constructor
600    //=====================================================================================
601 
602    // Conversion constructor (0x0)
603    {
604       test_ = "Column-major LowerMatrix conversion constructor (0x0)";
605 
606       const blaze::DynamicMatrix<int,blaze::columnMajor> mat;
607       const OLT lower( mat );
608 
609       checkRows    ( lower, 0UL );
610       checkColumns ( lower, 0UL );
611       checkNonZeros( lower, 0UL );
612    }
613 
614    // Conversion constructor (lower)
615    {
616       test_ = "Column-major LowerMatrix conversion constructor (lower)";
617 
618       blaze::StaticMatrix<int,3UL,3UL,blaze::columnMajor> mat;
619       mat(0,0) =  1;
620       mat(1,0) = -4;
621       mat(1,1) =  2;
622       mat(2,0) =  7;
623       mat(2,2) =  3;
624 
625       const OLT lower( mat );
626 
627       checkRows    ( lower, 3UL );
628       checkColumns ( lower, 3UL );
629       checkCapacity( lower, 5UL );
630       checkNonZeros( lower, 5UL );
631       checkNonZeros( lower, 0UL, 3UL );
632       checkNonZeros( lower, 1UL, 1UL );
633       checkNonZeros( lower, 2UL, 1UL );
634 
635       if( lower(0,0) !=  1 || lower(0,1) != 0 || lower(0,2) != 0 ||
636           lower(1,0) != -4 || lower(1,1) != 2 || lower(1,2) != 0 ||
637           lower(2,0) !=  7 || lower(2,1) != 0 || lower(2,2) != 3 ) {
638          std::ostringstream oss;
639          oss << " Test: " << test_ << "\n"
640              << " Error: Construction failed\n"
641              << " Details:\n"
642              << "   Result:\n" << lower << "\n"
643              << "   Expected result:\n(  1 0 0 )\n( -4 2 0 )\n(  7 0 3 )\n";
644          throw std::runtime_error( oss.str() );
645       }
646    }
647 
648    // Conversion constructor (non-lower)
649    {
650       test_ = "Column-major LowerMatrix conversion constructor (non-lower)";
651 
652       blaze::StaticMatrix<int,3UL,3UL,blaze::columnMajor> mat;
653       mat(0,0) =  1;
654       mat(0,2) =  5;
655       mat(1,0) = -4;
656       mat(1,1) =  2;
657       mat(2,0) =  7;
658       mat(2,2) =  3;
659 
660       try {
661          const OLT lower( mat );
662 
663          std::ostringstream oss;
664          oss << " Test: " << test_ << "\n"
665              << " Error: Setup of non-lower LowerMatrix succeeded\n"
666              << " Details:\n"
667              << "   Result:\n" << lower << "\n";
668          throw std::runtime_error( oss.str() );
669       }
670       catch( std::invalid_argument& ) {}
671    }
672 
673    // Conversion constructor (LowerMatrix)
674    {
675       test_ = "Column-major LowerMatrix conversion constructor (LowerMatrix)";
676 
677       blaze::LowerMatrix< blaze::StaticMatrix<int,3UL,3UL,blaze::columnMajor> > lower1;
678       lower1(0,0) =  1;
679       lower1(1,0) = -4;
680       lower1(1,1) =  2;
681       lower1(2,0) =  7;
682       lower1(2,2) =  3;
683 
684       const OLT lower2( lower1 );
685 
686       checkRows    ( lower2, 3UL );
687       checkColumns ( lower2, 3UL );
688       checkCapacity( lower2, 5UL );
689       checkNonZeros( lower2, 5UL );
690       checkNonZeros( lower2, 0UL, 3UL );
691       checkNonZeros( lower2, 1UL, 1UL );
692       checkNonZeros( lower2, 2UL, 1UL );
693 
694       if( lower2(0,0) !=  1 || lower2(0,1) != 0 || lower2(0,2) != 0 ||
695           lower2(1,0) != -4 || lower2(1,1) != 2 || lower2(1,2) != 0 ||
696           lower2(2,0) !=  7 || lower2(2,1) != 0 || lower2(2,2) != 3 ) {
697          std::ostringstream oss;
698          oss << " Test: " << test_ << "\n"
699              << " Error: Construction failed\n"
700              << " Details:\n"
701              << "   Result:\n" << lower2 << "\n"
702              << "   Expected result:\n(  1 0 0 )\n( -4 2 0 )\n(  7 0 3 )\n";
703          throw std::runtime_error( oss.str() );
704       }
705    }
706 }
707 //*************************************************************************************************
708 
709 
710 //*************************************************************************************************
711 /*!\brief Test of the LowerMatrix assignment operators.
712 //
713 // \return void
714 // \exception std::runtime_error Error detected.
715 //
716 // This function performs a test of all assignment operators of the LowerMatrix specialization.
717 // In case an error is detected, a \a std::runtime_error exception is thrown.
718 */
testAssignment()719 void SparseTest::testAssignment()
720 {
721    //=====================================================================================
722    // Row-major list assignment
723    //=====================================================================================
724 
725    // Complete initializer list
726    {
727       test_ = "Row-major LowerMatrix initializer list assignment (complete list)";
728 
729       LT lower;
730       lower = { { 1, 0, 0 }, { 2, 3, 0 }, { 4, 5, 6 } };
731 
732       checkRows    ( lower, 3UL );
733       checkColumns ( lower, 3UL );
734       checkNonZeros( lower, 6UL );
735       checkNonZeros( lower, 0UL, 1UL );
736       checkNonZeros( lower, 1UL, 2UL );
737       checkNonZeros( lower, 2UL, 3UL );
738 
739       if( lower(0,0) != 1 || lower(0,1) != 0 || lower(0,2) != 0 ||
740           lower(1,0) != 2 || lower(1,1) != 3 || lower(1,2) != 0 ||
741           lower(2,0) != 4 || lower(2,1) != 5 || lower(2,2) != 6 ) {
742          std::ostringstream oss;
743          oss << " Test: " << test_ << "\n"
744              << " Error: Assignment failed\n"
745              << " Details:\n"
746              << "   Result:\n" << lower << "\n"
747              << "   Expected result:\n( 1 0 0 )\n( 2 3 0 )\n( 4 5 6 )\n";
748          throw std::runtime_error( oss.str() );
749       }
750    }
751 
752    // Incomplete initializer list
753    {
754       test_ = "Row-major LowerMatrix initializer list assignment (incomplete list)";
755 
756       LT lower;
757       lower = { { 1 }, { 2, 3 }, { 4, 5, 6 } };
758 
759       checkRows    ( lower, 3UL );
760       checkColumns ( lower, 3UL );
761       checkNonZeros( lower, 6UL );
762       checkNonZeros( lower, 0UL, 1UL );
763       checkNonZeros( lower, 1UL, 2UL );
764       checkNonZeros( lower, 2UL, 3UL );
765 
766       if( lower(0,0) != 1 || lower(0,1) != 0 || lower(0,2) != 0 ||
767           lower(1,0) != 2 || lower(1,1) != 3 || lower(1,2) != 0 ||
768           lower(2,0) != 4 || lower(2,1) != 5 || lower(2,2) != 6 ) {
769          std::ostringstream oss;
770          oss << " Test: " << test_ << "\n"
771              << " Error: Assignment failed\n"
772              << " Details:\n"
773              << "   Result:\n" << lower << "\n"
774              << "   Expected result:\n( 1 0 0 )\n( 2 3 0 )\n( 4 5 6 )\n";
775          throw std::runtime_error( oss.str() );
776       }
777    }
778 
779 
780    //=====================================================================================
781    // Row-major copy assignment
782    //=====================================================================================
783 
784    // Copy assignment (0x0)
785    {
786       test_ = "Row-major LowerMatrix copy assignment (0x0)";
787 
788       LT lower1, lower2;
789 
790       lower2 = lower1;
791 
792       checkRows    ( lower2, 0UL );
793       checkColumns ( lower2, 0UL );
794       checkNonZeros( lower2, 0UL );
795    }
796 
797    // Copy assignment (3x3)
798    {
799       test_ = "Row-major LowerMatrix copy assignment (3x3)";
800 
801       LT lower1( 3UL );
802       lower1(0,0) =  1;
803       lower1(1,0) = -4;
804       lower1(1,1) =  2;
805       lower1(2,0) =  7;
806       lower1(2,2) =  3;
807 
808       LT lower2;
809       lower2 = lower1;
810 
811       checkRows    ( lower2, 3UL );
812       checkColumns ( lower2, 3UL );
813       checkNonZeros( lower2, 5UL );
814       checkNonZeros( lower2, 0UL, 1UL );
815       checkNonZeros( lower2, 1UL, 2UL );
816       checkNonZeros( lower2, 2UL, 2UL );
817 
818       if( lower2(0,0) !=  1 || lower2(0,1) != 0 || lower2(0,2) != 0 ||
819           lower2(1,0) != -4 || lower2(1,1) != 2 || lower2(1,2) != 0 ||
820           lower2(2,0) !=  7 || lower2(2,1) != 0 || lower2(2,2) != 3 ) {
821          std::ostringstream oss;
822          oss << " Test: " << test_ << "\n"
823              << " Error: Assignment failed\n"
824              << " Details:\n"
825              << "   Result:\n" << lower2 << "\n"
826              << "   Expected result:\n(  1 0 0 )\n( -4 2 0 )\n(  7 0 3 )\n";
827          throw std::runtime_error( oss.str() );
828       }
829    }
830 
831 
832    //=====================================================================================
833    // Row-major move assignment
834    //=====================================================================================
835 
836    // Move assignment (0x0)
837    {
838       test_ = "Row-major LowerMatrix move assignment (0x0)";
839 
840       LT lower1, lower2;
841 
842       lower2 = std::move( lower1 );
843 
844       checkRows    ( lower2, 0UL );
845       checkColumns ( lower2, 0UL );
846       checkNonZeros( lower2, 0UL );
847    }
848 
849    // Move assignment (3x3)
850    {
851       test_ = "Row-major LowerMatrix move assignment (3x3)";
852 
853       LT lower1( 3UL );
854       lower1(0,0) =  1;
855       lower1(1,0) = -4;
856       lower1(1,1) =  2;
857       lower1(2,0) =  7;
858       lower1(2,2) =  3;
859 
860       LT lower2;
861       lower2 = std::move( lower1 );
862 
863       checkRows    ( lower2, 3UL );
864       checkColumns ( lower2, 3UL );
865       checkNonZeros( lower2, 5UL );
866       checkNonZeros( lower2, 0UL, 1UL );
867       checkNonZeros( lower2, 1UL, 2UL );
868       checkNonZeros( lower2, 2UL, 2UL );
869 
870       if( lower2(0,0) !=  1 || lower2(0,1) != 0 || lower2(0,2) != 0 ||
871           lower2(1,0) != -4 || lower2(1,1) != 2 || lower2(1,2) != 0 ||
872           lower2(2,0) !=  7 || lower2(2,1) != 0 || lower2(2,2) != 3 ) {
873          std::ostringstream oss;
874          oss << " Test: " << test_ << "\n"
875              << " Error: Assignment failed\n"
876              << " Details:\n"
877              << "   Result:\n" << lower2 << "\n"
878              << "   Expected result:\n(  1 0 0 )\n( -4 2 0 )\n(  7 0 3 )\n";
879          throw std::runtime_error( oss.str() );
880       }
881    }
882 
883 
884    //=====================================================================================
885    // Row-major dense matrix assignment
886    //=====================================================================================
887 
888    // Conversion assignment (0x0)
889    {
890       test_ = "Row-major LowerMatrix dense matrix assignment (0x0)";
891 
892       const blaze::DynamicMatrix<int,blaze::rowMajor> mat;
893 
894       LT lower;
895       lower = mat;
896 
897       checkRows    ( lower, 0UL );
898       checkColumns ( lower, 0UL );
899       checkNonZeros( lower, 0UL );
900    }
901 
902    // Row-major/row-major dense matrix assignment (lower)
903    {
904       test_ = "Row-major/row-major LowerMatrix dense matrix assignment (lower)";
905 
906       blaze::StaticMatrix<int,3UL,3UL,blaze::rowMajor> mat;
907       mat(0,0) =  1;
908       mat(1,0) = -4;
909       mat(1,1) =  2;
910       mat(2,0) =  7;
911       mat(2,2) =  3;
912 
913       LT lower;
914       lower = mat;
915 
916       checkRows    ( lower, 3UL );
917       checkColumns ( lower, 3UL );
918       checkNonZeros( lower, 5UL );
919       checkNonZeros( lower, 0UL, 1UL );
920       checkNonZeros( lower, 1UL, 2UL );
921       checkNonZeros( lower, 2UL, 2UL );
922 
923       if( lower(0,0) !=  1 || lower(0,1) != 0 || lower(0,2) != 0 ||
924           lower(1,0) != -4 || lower(1,1) != 2 || lower(1,2) != 0 ||
925           lower(2,0) !=  7 || lower(2,1) != 0 || lower(2,2) != 3 ) {
926          std::ostringstream oss;
927          oss << " Test: " << test_ << "\n"
928              << " Error: Assignment failed\n"
929              << " Details:\n"
930              << "   Result:\n" << lower << "\n"
931              << "   Expected result:\n(  1 0 0 )\n( -4 2 0 )\n(  7 0 3 )\n";
932          throw std::runtime_error( oss.str() );
933       }
934    }
935 
936    // Row-major/column-major dense matrix assignment (lower)
937    {
938       test_ = "Row-major/column-major LowerMatrix dense matrix assignment (lower)";
939 
940       blaze::StaticMatrix<int,3UL,3UL,blaze::columnMajor> mat;
941       mat(0,0) =  1;
942       mat(1,0) = -4;
943       mat(1,1) =  2;
944       mat(2,0) =  7;
945       mat(2,2) =  3;
946 
947       LT lower;
948       lower = mat;
949 
950       checkRows    ( lower, 3UL );
951       checkColumns ( lower, 3UL );
952       checkNonZeros( lower, 5UL );
953       checkNonZeros( lower, 0UL, 1UL );
954       checkNonZeros( lower, 1UL, 2UL );
955       checkNonZeros( lower, 2UL, 2UL );
956 
957       if( lower(0,0) !=  1 || lower(0,1) != 0 || lower(0,2) != 0 ||
958           lower(1,0) != -4 || lower(1,1) != 2 || lower(1,2) != 0 ||
959           lower(2,0) !=  7 || lower(2,1) != 0 || lower(2,2) != 3 ) {
960          std::ostringstream oss;
961          oss << " Test: " << test_ << "\n"
962              << " Error: Assignment failed\n"
963              << " Details:\n"
964              << "   Result:\n" << lower << "\n"
965              << "   Expected result:\n(  1 0 0 )\n( -4 2 0 )\n(  7 0 3 )\n";
966          throw std::runtime_error( oss.str() );
967       }
968    }
969 
970    // Row-major/row-major dense matrix assignment (non-lower)
971    {
972       test_ = "Row-major/row-major LowerMatrix dense matrix assignment (non-lower)";
973 
974       blaze::StaticMatrix<int,3UL,3UL,blaze::rowMajor> mat;
975       mat(0,0) =  1;
976       mat(0,2) =  5;
977       mat(1,0) = -4;
978       mat(1,1) =  2;
979       mat(2,0) =  7;
980       mat(2,2) =  3;
981 
982       try {
983          LT lower;
984          lower = mat;
985 
986          std::ostringstream oss;
987          oss << " Test: " << test_ << "\n"
988              << " Error: Assignment of non-lower row-major matrix succeeded\n"
989              << " Details:\n"
990              << "   Result:\n" << lower << "\n";
991          throw std::runtime_error( oss.str() );
992       }
993       catch( std::invalid_argument& ) {}
994    }
995 
996    // Row-major/column-major dense matrix assignment (non-lower)
997    {
998       test_ = "Row-major/column-major LowerMatrix dense matrix assignment (non-lower)";
999 
1000       blaze::StaticMatrix<int,3UL,3UL,blaze::columnMajor> mat;
1001       mat(0,0) =  1;
1002       mat(0,2) =  5;
1003       mat(1,0) = -4;
1004       mat(1,1) =  2;
1005       mat(2,0) =  7;
1006       mat(2,2) =  3;
1007 
1008       try {
1009          LT lower;
1010          lower = mat;
1011 
1012          std::ostringstream oss;
1013          oss << " Test: " << test_ << "\n"
1014              << " Error: Assignment of non-lower column-major matrix succeeded\n"
1015              << " Details:\n"
1016              << "   Result:\n" << lower << "\n";
1017          throw std::runtime_error( oss.str() );
1018       }
1019       catch( std::invalid_argument& ) {}
1020    }
1021 
1022    // Row-major/row-major dense matrix assignment (LowerMatrix)
1023    {
1024       test_ = "Row-major/row-major LowerMatrix dense matrix assignment (LowerMatrix)";
1025 
1026       blaze::LowerMatrix< blaze::StaticMatrix<int,3UL,3UL,blaze::rowMajor> > lower1;
1027       lower1(0,0) =  1;
1028       lower1(1,0) = -4;
1029       lower1(1,1) =  2;
1030       lower1(2,0) =  7;
1031       lower1(2,2) =  3;
1032 
1033       LT lower2;
1034       lower2 = lower1;
1035 
1036       checkRows    ( lower2, 3UL );
1037       checkColumns ( lower2, 3UL );
1038       checkNonZeros( lower2, 5UL );
1039       checkNonZeros( lower2, 0UL, 1UL );
1040       checkNonZeros( lower2, 1UL, 2UL );
1041       checkNonZeros( lower2, 2UL, 2UL );
1042 
1043       if( lower2(0,0) !=  1 || lower2(0,1) != 0 || lower2(0,2) != 0 ||
1044           lower2(1,0) != -4 || lower2(1,1) != 2 || lower2(1,2) != 0 ||
1045           lower2(2,0) !=  7 || lower2(2,1) != 0 || lower2(2,2) != 3 ) {
1046          std::ostringstream oss;
1047          oss << " Test: " << test_ << "\n"
1048              << " Error: Assignment failed\n"
1049              << " Details:\n"
1050              << "   Result:\n" << lower2 << "\n"
1051              << "   Expected result:\n(  1 0 0 )\n( -4 2 0 )\n(  7 0 3 )\n";
1052          throw std::runtime_error( oss.str() );
1053       }
1054    }
1055 
1056    // Row-major/column-major dense matrix assignment (LowerMatrix)
1057    {
1058       test_ = "Row-major/column-major LowerMatrix dense matrix assignment (LowerMatrix)";
1059 
1060       blaze::LowerMatrix< blaze::StaticMatrix<int,3UL,3UL,blaze::columnMajor> > lower1;
1061       lower1(0,0) =  1;
1062       lower1(1,0) = -4;
1063       lower1(1,1) =  2;
1064       lower1(2,0) =  7;
1065       lower1(2,2) =  3;
1066 
1067       LT lower2;
1068       lower2 = lower1;
1069 
1070       checkRows    ( lower2, 3UL );
1071       checkColumns ( lower2, 3UL );
1072       checkNonZeros( lower2, 5UL );
1073       checkNonZeros( lower2, 0UL, 1UL );
1074       checkNonZeros( lower2, 1UL, 2UL );
1075       checkNonZeros( lower2, 2UL, 2UL );
1076 
1077       if( lower2(0,0) !=  1 || lower2(0,1) != 0 || lower2(0,2) != 0 ||
1078           lower2(1,0) != -4 || lower2(1,1) != 2 || lower2(1,2) != 0 ||
1079           lower2(2,0) !=  7 || lower2(2,1) != 0 || lower2(2,2) != 3 ) {
1080          std::ostringstream oss;
1081          oss << " Test: " << test_ << "\n"
1082              << " Error: Assignment failed\n"
1083              << " Details:\n"
1084              << "   Result:\n" << lower2 << "\n"
1085              << "   Expected result:\n(  1 0 0 )\n( -4 2 0 )\n(  7 0 3 )\n";
1086          throw std::runtime_error( oss.str() );
1087       }
1088    }
1089 
1090 
1091    //=====================================================================================
1092    // Row-major sparse matrix assignment
1093    //=====================================================================================
1094 
1095    // Conversion assignment (0x0)
1096    {
1097       test_ = "Row-major LowerMatrix sparse matrix assignment (0x0)";
1098 
1099       const blaze::CompressedMatrix<int,blaze::rowMajor> mat;
1100 
1101       LT lower;
1102       lower = mat;
1103 
1104       checkRows    ( lower, 0UL );
1105       checkColumns ( lower, 0UL );
1106       checkNonZeros( lower, 0UL );
1107    }
1108 
1109    // Row-major/row-major sparse matrix assignment (lower)
1110    {
1111       test_ = "Row-major/row-major LowerMatrix sparse matrix assignment (lower)";
1112 
1113       blaze::CompressedMatrix<int,blaze::rowMajor> mat( 3UL, 3UL, 6UL );
1114       mat(0,0) =  1;
1115       mat(1,0) = -4;
1116       mat(1,1) =  2;
1117       mat(2,0) =  7;
1118       mat(2,2) =  3;
1119       mat.insert( 1UL, 2UL, 0 );
1120 
1121       LT lower;
1122       lower = mat;
1123 
1124       checkRows    ( lower, 3UL );
1125       checkColumns ( lower, 3UL );
1126       checkNonZeros( lower, 5UL );
1127       checkNonZeros( lower, 0UL, 1UL );
1128       checkNonZeros( lower, 1UL, 2UL );
1129       checkNonZeros( lower, 2UL, 2UL );
1130 
1131       if( lower(0,0) !=  1 || lower(0,1) != 0 || lower(0,2) != 0 ||
1132           lower(1,0) != -4 || lower(1,1) != 2 || lower(1,2) != 0 ||
1133           lower(2,0) !=  7 || lower(2,1) != 0 || lower(2,2) != 3 ) {
1134          std::ostringstream oss;
1135          oss << " Test: " << test_ << "\n"
1136              << " Error: Assignment failed\n"
1137              << " Details:\n"
1138              << "   Result:\n" << lower << "\n"
1139              << "   Expected result:\n(  1 0 0 )\n( -4 2 0 )\n(  7 0 3 )\n";
1140          throw std::runtime_error( oss.str() );
1141       }
1142    }
1143 
1144    // Row-major/column-major sparse matrix assignment (lower)
1145    {
1146       test_ = "Row-major/column-major LowerMatrix sparse matrix assignment (lower)";
1147 
1148       blaze::CompressedMatrix<int,blaze::columnMajor> mat( 3UL, 3UL, 6UL );
1149       mat(0,0) =  1;
1150       mat(1,0) = -4;
1151       mat(1,1) =  2;
1152       mat(2,0) =  7;
1153       mat(2,2) =  3;
1154       mat.insert( 1UL, 2UL, 0 );
1155 
1156       LT lower;
1157       lower = mat;
1158 
1159       checkRows    ( lower, 3UL );
1160       checkColumns ( lower, 3UL );
1161       checkNonZeros( lower, 5UL );
1162       checkNonZeros( lower, 0UL, 1UL );
1163       checkNonZeros( lower, 1UL, 2UL );
1164       checkNonZeros( lower, 2UL, 2UL );
1165 
1166       if( lower(0,0) !=  1 || lower(0,1) != 0 || lower(0,2) != 0 ||
1167           lower(1,0) != -4 || lower(1,1) != 2 || lower(1,2) != 0 ||
1168           lower(2,0) !=  7 || lower(2,1) != 0 || lower(2,2) != 3 ) {
1169          std::ostringstream oss;
1170          oss << " Test: " << test_ << "\n"
1171              << " Error: Assignment failed\n"
1172              << " Details:\n"
1173              << "   Result:\n" << lower << "\n"
1174              << "   Expected result:\n(  1 0 0 )\n( -4 2 0 )\n(  7 0 3 )\n";
1175          throw std::runtime_error( oss.str() );
1176       }
1177    }
1178 
1179    // Row-major/row-major sparse matrix assignment (non-lower)
1180    {
1181       test_ = "Row-major/row-major LowerMatrix sparse matrix assignment (non-lower)";
1182 
1183       blaze::CompressedMatrix<int,blaze::rowMajor> mat( 3UL, 3UL, 6UL );
1184       mat(0,0) =  1;
1185       mat(0,2) =  5;
1186       mat(1,0) = -4;
1187       mat(1,1) =  2;
1188       mat(2,0) =  7;
1189       mat(2,2) =  3;
1190 
1191       try {
1192          LT lower;
1193          lower = mat;
1194 
1195          std::ostringstream oss;
1196          oss << " Test: " << test_ << "\n"
1197              << " Error: Assignment of non-lower row-major matrix succeeded\n"
1198              << " Details:\n"
1199              << "   Result:\n" << lower << "\n";
1200          throw std::runtime_error( oss.str() );
1201       }
1202       catch( std::invalid_argument& ) {}
1203    }
1204 
1205    // Row-major/column-major sparse matrix assignment (non-lower)
1206    {
1207       test_ = "Row-major/column-major LowerMatrix sparse matrix assignment (non-lower)";
1208 
1209       blaze::CompressedMatrix<int,blaze::columnMajor> mat( 3UL, 3UL, 6UL );
1210       mat(0,0) =  1;
1211       mat(0,2) =  5;
1212       mat(1,0) = -4;
1213       mat(1,1) =  2;
1214       mat(2,0) =  7;
1215       mat(2,2) =  3;
1216 
1217       try {
1218          LT lower;
1219          lower = mat;
1220 
1221          std::ostringstream oss;
1222          oss << " Test: " << test_ << "\n"
1223              << " Error: Assignment of non-lower column-major matrix succeeded\n"
1224              << " Details:\n"
1225              << "   Result:\n" << lower << "\n";
1226          throw std::runtime_error( oss.str() );
1227       }
1228       catch( std::invalid_argument& ) {}
1229    }
1230 
1231    // Row-major/row-major sparse matrix assignment (LowerMatrix)
1232    {
1233       test_ = "Row-major/row-major LowerMatrix sparse matrix assignment (LowerMatrix)";
1234 
1235       blaze::LowerMatrix< blaze::CompressedMatrix<unsigned int,blaze::rowMajor> > lower1( 3UL, 5UL );
1236       lower1(0,0) =  1;
1237       lower1(1,0) = -4;
1238       lower1(1,1) =  2;
1239       lower1(2,0) =  7;
1240       lower1(2,2) =  3;
1241 
1242       LT lower2;
1243       lower2 = lower1;
1244 
1245       checkRows    ( lower2, 3UL );
1246       checkColumns ( lower2, 3UL );
1247       checkNonZeros( lower2, 5UL );
1248       checkNonZeros( lower2, 0UL, 1UL );
1249       checkNonZeros( lower2, 1UL, 2UL );
1250       checkNonZeros( lower2, 2UL, 2UL );
1251 
1252       if( lower2(0,0) !=  1 || lower2(0,1) != 0 || lower2(0,2) != 0 ||
1253           lower2(1,0) != -4 || lower2(1,1) != 2 || lower2(1,2) != 0 ||
1254           lower2(2,0) !=  7 || lower2(2,1) != 0 || lower2(2,2) != 3 ) {
1255          std::ostringstream oss;
1256          oss << " Test: " << test_ << "\n"
1257              << " Error: Assignment failed\n"
1258              << " Details:\n"
1259              << "   Result:\n" << lower2 << "\n"
1260              << "   Expected result:\n(  1 0 0 )\n( -4 2 0 )\n(  7 0 3 )\n";
1261          throw std::runtime_error( oss.str() );
1262       }
1263    }
1264 
1265    // Row-major/column-major sparse matrix assignment (LowerMatrix)
1266    {
1267       test_ = "Row-major/column-major LowerMatrix sparse matrix assignment (LowerMatrix)";
1268 
1269       blaze::LowerMatrix< blaze::CompressedMatrix<int,blaze::columnMajor> > lower1( 3UL, 5UL );
1270       lower1(0,0) =  1;
1271       lower1(1,0) = -4;
1272       lower1(1,1) =  2;
1273       lower1(2,0) =  7;
1274       lower1(2,2) =  3;
1275 
1276       LT lower2;
1277       lower2 = lower1;
1278 
1279       checkRows    ( lower2, 3UL );
1280       checkColumns ( lower2, 3UL );
1281       checkNonZeros( lower2, 5UL );
1282       checkNonZeros( lower2, 0UL, 1UL );
1283       checkNonZeros( lower2, 1UL, 2UL );
1284       checkNonZeros( lower2, 2UL, 2UL );
1285 
1286       if( lower2(0,0) !=  1 || lower2(0,1) != 0 || lower2(0,2) != 0 ||
1287           lower2(1,0) != -4 || lower2(1,1) != 2 || lower2(1,2) != 0 ||
1288           lower2(2,0) !=  7 || lower2(2,1) != 0 || lower2(2,2) != 3 ) {
1289          std::ostringstream oss;
1290          oss << " Test: " << test_ << "\n"
1291              << " Error: Assignment failed\n"
1292              << " Details:\n"
1293              << "   Result:\n" << lower2 << "\n"
1294              << "   Expected result:\n(  1 0 0 )\n( -4 2 0 )\n(  7 0 3 )\n";
1295          throw std::runtime_error( oss.str() );
1296       }
1297    }
1298 
1299 
1300    //=====================================================================================
1301    // Column-major list assignment
1302    //=====================================================================================
1303 
1304    // Complete initializer list
1305    {
1306       test_ = "Column-major LowerMatrix initializer list assignment (complete list)";
1307 
1308       OLT lower;
1309       lower = { { 1, 0, 0 }, { 2, 3, 0 }, { 4, 5, 6 } };
1310 
1311       checkRows    ( lower, 3UL );
1312       checkColumns ( lower, 3UL );
1313       checkNonZeros( lower, 6UL );
1314       checkNonZeros( lower, 0UL, 3UL );
1315       checkNonZeros( lower, 1UL, 2UL );
1316       checkNonZeros( lower, 2UL, 1UL );
1317 
1318       if( lower(0,0) != 1 || lower(0,1) != 0 || lower(0,2) != 0 ||
1319           lower(1,0) != 2 || lower(1,1) != 3 || lower(1,2) != 0 ||
1320           lower(2,0) != 4 || lower(2,1) != 5 || lower(2,2) != 6 ) {
1321          std::ostringstream oss;
1322          oss << " Test: " << test_ << "\n"
1323              << " Error: Assignment failed\n"
1324              << " Details:\n"
1325              << "   Result:\n" << lower << "\n"
1326              << "   Expected result:\n( 1 0 0 )\n( 2 3 0 )\n( 4 5 6 )\n";
1327          throw std::runtime_error( oss.str() );
1328       }
1329    }
1330 
1331    // Incomplete initializer list
1332    {
1333       test_ = "Column-major LowerMatrix initializer list assignment (incomplete list)";
1334 
1335       OLT lower;
1336       lower = { { 1 }, { 2, 3 }, { 4, 5, 6 } };
1337 
1338       checkRows    ( lower, 3UL );
1339       checkColumns ( lower, 3UL );
1340       checkNonZeros( lower, 6UL );
1341       checkNonZeros( lower, 0UL, 3UL );
1342       checkNonZeros( lower, 1UL, 2UL );
1343       checkNonZeros( lower, 2UL, 1UL );
1344 
1345       if( lower(0,0) != 1 || lower(0,1) != 0 || lower(0,2) != 0 ||
1346           lower(1,0) != 2 || lower(1,1) != 3 || lower(1,2) != 0 ||
1347           lower(2,0) != 4 || lower(2,1) != 5 || lower(2,2) != 6 ) {
1348          std::ostringstream oss;
1349          oss << " Test: " << test_ << "\n"
1350              << " Error: Assignment failed\n"
1351              << " Details:\n"
1352              << "   Result:\n" << lower << "\n"
1353              << "   Expected result:\n( 1 0 0 )\n( 2 3 0 )\n( 4 5 6 )\n";
1354          throw std::runtime_error( oss.str() );
1355       }
1356    }
1357 
1358 
1359    //=====================================================================================
1360    // Column-major copy assignment
1361    //=====================================================================================
1362 
1363    // Copy assignment (0x0)
1364    {
1365       test_ = "Column-major LowerMatrix copy assignment (0x0)";
1366 
1367       OLT lower1, lower2;
1368 
1369       lower2 = lower1;
1370 
1371       checkRows    ( lower2, 0UL );
1372       checkColumns ( lower2, 0UL );
1373       checkNonZeros( lower2, 0UL );
1374    }
1375 
1376    // Copy assignment (3x3)
1377    {
1378       test_ = "Column-major LowerMatrix copy assignment (3x3)";
1379 
1380       OLT lower1( 3UL );
1381       lower1(0,0) =  1;
1382       lower1(1,0) = -4;
1383       lower1(1,1) =  2;
1384       lower1(2,0) =  7;
1385       lower1(2,2) =  3;
1386 
1387       OLT lower2;
1388       lower2 = lower1;
1389 
1390       checkRows    ( lower2, 3UL );
1391       checkColumns ( lower2, 3UL );
1392       checkNonZeros( lower2, 5UL );
1393       checkNonZeros( lower2, 0UL, 3UL );
1394       checkNonZeros( lower2, 1UL, 1UL );
1395       checkNonZeros( lower2, 2UL, 1UL );
1396 
1397       if( lower2(0,0) !=  1 || lower2(0,1) != 0 || lower2(0,2) != 0 ||
1398           lower2(1,0) != -4 || lower2(1,1) != 2 || lower2(1,2) != 0 ||
1399           lower2(2,0) !=  7 || lower2(2,1) != 0 || lower2(2,2) != 3 ) {
1400          std::ostringstream oss;
1401          oss << " Test: " << test_ << "\n"
1402              << " Error: Assignment failed\n"
1403              << " Details:\n"
1404              << "   Result:\n" << lower2 << "\n"
1405              << "   Expected result:\n(  1 0 0 )\n( -4 2 0 )\n(  7 0 3 )\n";
1406          throw std::runtime_error( oss.str() );
1407       }
1408    }
1409 
1410 
1411    //=====================================================================================
1412    // Column-major move assignment
1413    //=====================================================================================
1414 
1415    // Move assignment (0x0)
1416    {
1417       test_ = "Column-major LowerMatrix move assignment (0x0)";
1418 
1419       OLT lower1, lower2;
1420 
1421       lower2 = std::move( lower1 );
1422 
1423       checkRows    ( lower2, 0UL );
1424       checkColumns ( lower2, 0UL );
1425       checkNonZeros( lower2, 0UL );
1426    }
1427 
1428    // Move assignment (3x3)
1429    {
1430       test_ = "Column-major LowerMatrix move assignment (3x3)";
1431 
1432       OLT lower1( 3UL );
1433       lower1(0,0) =  1;
1434       lower1(1,0) = -4;
1435       lower1(1,1) =  2;
1436       lower1(2,0) =  7;
1437       lower1(2,2) =  3;
1438 
1439       OLT lower2;
1440       lower2 = std::move( lower1 );
1441 
1442       checkRows    ( lower2, 3UL );
1443       checkColumns ( lower2, 3UL );
1444       checkNonZeros( lower2, 5UL );
1445       checkNonZeros( lower2, 0UL, 3UL );
1446       checkNonZeros( lower2, 1UL, 1UL );
1447       checkNonZeros( lower2, 2UL, 1UL );
1448 
1449       if( lower2(0,0) !=  1 || lower2(0,1) != 0 || lower2(0,2) != 0 ||
1450           lower2(1,0) != -4 || lower2(1,1) != 2 || lower2(1,2) != 0 ||
1451           lower2(2,0) !=  7 || lower2(2,1) != 0 || lower2(2,2) != 3 ) {
1452          std::ostringstream oss;
1453          oss << " Test: " << test_ << "\n"
1454              << " Error: Assignment failed\n"
1455              << " Details:\n"
1456              << "   Result:\n" << lower2 << "\n"
1457              << "   Expected result:\n(  1 0 0 )\n( -4 2 0 )\n(  7 0 3 )\n";
1458          throw std::runtime_error( oss.str() );
1459       }
1460    }
1461 
1462 
1463    //=====================================================================================
1464    // Column-major dense matrix assignment
1465    //=====================================================================================
1466 
1467    // Conversion assignment (0x0)
1468    {
1469       test_ = "Column-major LowerMatrix dense matrix assignment (0x0)";
1470 
1471       const blaze::DynamicMatrix<int,blaze::columnMajor> mat;
1472 
1473       OLT lower;
1474       lower = mat;
1475 
1476       checkRows    ( lower, 0UL );
1477       checkColumns ( lower, 0UL );
1478       checkNonZeros( lower, 0UL );
1479    }
1480 
1481    // Column-major/row-major dense matrix assignment (lower)
1482    {
1483       test_ = "Column-major/row-major LowerMatrix dense matrix assignment (lower)";
1484 
1485       blaze::StaticMatrix<int,3UL,3UL,blaze::rowMajor> mat;
1486       mat(0,0) =  1;
1487       mat(1,0) = -4;
1488       mat(1,1) =  2;
1489       mat(2,0) =  7;
1490       mat(2,2) =  3;
1491 
1492       OLT lower;
1493       lower = mat;
1494 
1495       checkRows    ( lower, 3UL );
1496       checkColumns ( lower, 3UL );
1497       checkNonZeros( lower, 5UL );
1498       checkNonZeros( lower, 0UL, 3UL );
1499       checkNonZeros( lower, 1UL, 1UL );
1500       checkNonZeros( lower, 2UL, 1UL );
1501 
1502       if( lower(0,0) !=  1 || lower(0,1) != 0 || lower(0,2) != 0 ||
1503           lower(1,0) != -4 || lower(1,1) != 2 || lower(1,2) != 0 ||
1504           lower(2,0) !=  7 || lower(2,1) != 0 || lower(2,2) != 3 ) {
1505          std::ostringstream oss;
1506          oss << " Test: " << test_ << "\n"
1507              << " Error: Assignment failed\n"
1508              << " Details:\n"
1509              << "   Result:\n" << lower << "\n"
1510              << "   Expected result:\n(  1 0 0 )\n( -4 2 0 )\n(  7 0 3 )\n";
1511          throw std::runtime_error( oss.str() );
1512       }
1513    }
1514 
1515    // Column-major/column-major dense matrix assignment (lower)
1516    {
1517       test_ = "Column-major/column-major LowerMatrix dense matrix assignment (lower)";
1518 
1519       blaze::StaticMatrix<int,3UL,3UL,blaze::columnMajor> mat;
1520       mat(0,0) =  1;
1521       mat(1,0) = -4;
1522       mat(1,1) =  2;
1523       mat(2,0) =  7;
1524       mat(2,2) =  3;
1525 
1526       OLT lower;
1527       lower = mat;
1528 
1529       checkRows    ( lower, 3UL );
1530       checkColumns ( lower, 3UL );
1531       checkNonZeros( lower, 5UL );
1532       checkNonZeros( lower, 0UL, 3UL );
1533       checkNonZeros( lower, 1UL, 1UL );
1534       checkNonZeros( lower, 2UL, 1UL );
1535 
1536       if( lower(0,0) !=  1 || lower(0,1) != 0 || lower(0,2) != 0 ||
1537           lower(1,0) != -4 || lower(1,1) != 2 || lower(1,2) != 0 ||
1538           lower(2,0) !=  7 || lower(2,1) != 0 || lower(2,2) != 3 ) {
1539          std::ostringstream oss;
1540          oss << " Test: " << test_ << "\n"
1541              << " Error: Assignment failed\n"
1542              << " Details:\n"
1543              << "   Result:\n" << lower << "\n"
1544              << "   Expected result:\n(  1 0 0 )\n( -4 2 0 )\n(  7 0 3 )\n";
1545          throw std::runtime_error( oss.str() );
1546       }
1547    }
1548 
1549    // Column-major/row-major dense matrix assignment (non-lower)
1550    {
1551       test_ = "Column-major/row-major LowerMatrix dense matrix assignment (non-lower)";
1552 
1553       blaze::StaticMatrix<int,3UL,3UL,blaze::rowMajor> mat;
1554       mat(0,0) =  1;
1555       mat(0,2) =  5;
1556       mat(1,0) = -4;
1557       mat(1,1) =  2;
1558       mat(2,0) =  7;
1559       mat(2,2) =  3;
1560 
1561       try {
1562          OLT lower;
1563          lower = mat;
1564 
1565          std::ostringstream oss;
1566          oss << " Test: " << test_ << "\n"
1567              << " Error: Assignment of non-lower row-major matrix succeeded\n"
1568              << " Details:\n"
1569              << "   Result:\n" << lower << "\n";
1570          throw std::runtime_error( oss.str() );
1571       }
1572       catch( std::invalid_argument& ) {}
1573    }
1574 
1575    // Column-major/column-major dense matrix assignment (non-lower)
1576    {
1577       test_ = "Column-major/column-major LowerMatrix dense matrix assignment (non-lower)";
1578 
1579       blaze::StaticMatrix<int,3UL,3UL,blaze::columnMajor> mat;
1580       mat(0,0) =  1;
1581       mat(0,2) =  5;
1582       mat(1,0) = -4;
1583       mat(1,1) =  2;
1584       mat(2,0) =  7;
1585       mat(2,2) =  3;
1586 
1587       try {
1588          OLT lower;
1589          lower = mat;
1590 
1591          std::ostringstream oss;
1592          oss << " Test: " << test_ << "\n"
1593              << " Error: Assignment of non-lower column-major matrix succeeded\n"
1594              << " Details:\n"
1595              << "   Result:\n" << lower << "\n";
1596          throw std::runtime_error( oss.str() );
1597       }
1598       catch( std::invalid_argument& ) {}
1599    }
1600 
1601    // Column-major/row-major dense matrix assignment (LowerMatrix)
1602    {
1603       test_ = "Column-major/row-major LowerMatrix dense matrix assignment (LowerMatrix)";
1604 
1605       blaze::LowerMatrix< blaze::StaticMatrix<int,3UL,3UL,blaze::rowMajor> > lower1;
1606       lower1(0,0) =  1;
1607       lower1(1,0) = -4;
1608       lower1(1,1) =  2;
1609       lower1(2,0) =  7;
1610       lower1(2,2) =  3;
1611 
1612       OLT lower2;
1613       lower2 = lower1;
1614 
1615       checkRows    ( lower2, 3UL );
1616       checkColumns ( lower2, 3UL );
1617       checkNonZeros( lower2, 5UL );
1618       checkNonZeros( lower2, 0UL, 3UL );
1619       checkNonZeros( lower2, 1UL, 1UL );
1620       checkNonZeros( lower2, 2UL, 1UL );
1621 
1622       if( lower2(0,0) !=  1 || lower2(0,1) != 0 || lower2(0,2) != 0 ||
1623           lower2(1,0) != -4 || lower2(1,1) != 2 || lower2(1,2) != 0 ||
1624           lower2(2,0) !=  7 || lower2(2,1) != 0 || lower2(2,2) != 3 ) {
1625          std::ostringstream oss;
1626          oss << " Test: " << test_ << "\n"
1627              << " Error: Assignment failed\n"
1628              << " Details:\n"
1629              << "   Result:\n" << lower2 << "\n"
1630              << "   Expected result:\n(  1 0 0 )\n( -4 2 0 )\n(  7 0 3 )\n";
1631          throw std::runtime_error( oss.str() );
1632       }
1633    }
1634 
1635    // Column-major/column-major dense matrix assignment (LowerMatrix)
1636    {
1637       test_ = "Column-major/column-major LowerMatrix dense matrix assignment (LowerMatrix)";
1638 
1639       blaze::LowerMatrix< blaze::StaticMatrix<int,3UL,3UL,blaze::columnMajor> > lower1;
1640       lower1(0,0) =  1;
1641       lower1(1,0) = -4;
1642       lower1(1,1) =  2;
1643       lower1(2,0) =  7;
1644       lower1(2,2) =  3;
1645 
1646       OLT lower2;
1647       lower2 = lower1;
1648 
1649       checkRows    ( lower2, 3UL );
1650       checkColumns ( lower2, 3UL );
1651       checkNonZeros( lower2, 5UL );
1652       checkNonZeros( lower2, 0UL, 3UL );
1653       checkNonZeros( lower2, 1UL, 1UL );
1654       checkNonZeros( lower2, 2UL, 1UL );
1655 
1656       if( lower2(0,0) !=  1 || lower2(0,1) != 0 || lower2(0,2) != 0 ||
1657           lower2(1,0) != -4 || lower2(1,1) != 2 || lower2(1,2) != 0 ||
1658           lower2(2,0) !=  7 || lower2(2,1) != 0 || lower2(2,2) != 3 ) {
1659          std::ostringstream oss;
1660          oss << " Test: " << test_ << "\n"
1661              << " Error: Assignment failed\n"
1662              << " Details:\n"
1663              << "   Result:\n" << lower2 << "\n"
1664              << "   Expected result:\n(  1 0 0 )\n( -4 2 0 )\n(  7 0 3 )\n";
1665          throw std::runtime_error( oss.str() );
1666       }
1667    }
1668 
1669 
1670    //=====================================================================================
1671    // Column-major sparse matrix assignment
1672    //=====================================================================================
1673 
1674    // Conversion assignment (0x0)
1675    {
1676       test_ = "Column-major LowerMatrix sparse matrix assignment (0x0)";
1677 
1678       const blaze::CompressedMatrix<int,blaze::columnMajor> mat;
1679 
1680       OLT lower;
1681       lower = mat;
1682 
1683       checkRows    ( lower, 0UL );
1684       checkColumns ( lower, 0UL );
1685       checkNonZeros( lower, 0UL );
1686    }
1687 
1688    // Column-major/row-major sparse matrix assignment (lower)
1689    {
1690       test_ = "Column-major/row-major LowerMatrix sparse matrix assignment (lower)";
1691 
1692       blaze::CompressedMatrix<int,blaze::rowMajor> mat( 3UL, 3UL, 6UL );
1693       mat(0,0) =  1;
1694       mat(1,0) = -4;
1695       mat(1,1) =  2;
1696       mat(2,0) =  7;
1697       mat(2,2) =  3;
1698       mat.insert( 1UL, 2UL, 0 );
1699 
1700       OLT lower;
1701       lower = mat;
1702 
1703       checkRows    ( lower, 3UL );
1704       checkColumns ( lower, 3UL );
1705       checkNonZeros( lower, 5UL );
1706       checkNonZeros( lower, 0UL, 3UL );
1707       checkNonZeros( lower, 1UL, 1UL );
1708       checkNonZeros( lower, 2UL, 1UL );
1709 
1710       if( lower(0,0) !=  1 || lower(0,1) != 0 || lower(0,2) != 0 ||
1711           lower(1,0) != -4 || lower(1,1) != 2 || lower(1,2) != 0 ||
1712           lower(2,0) !=  7 || lower(2,1) != 0 || lower(2,2) != 3 ) {
1713          std::ostringstream oss;
1714          oss << " Test: " << test_ << "\n"
1715              << " Error: Assignment failed\n"
1716              << " Details:\n"
1717              << "   Result:\n" << lower << "\n"
1718              << "   Expected result:\n(  1 0 0 )\n( -4 2 0 )\n(  7 0 3 )\n";
1719          throw std::runtime_error( oss.str() );
1720       }
1721    }
1722 
1723    // Column-major/column-major sparse matrix assignment (lower)
1724    {
1725       test_ = "Column-major/column-major LowerMatrix sparse matrix assignment (lower)";
1726 
1727       blaze::CompressedMatrix<int,blaze::columnMajor> mat( 3UL, 3UL, 6UL );
1728       mat(0,0) =  1;
1729       mat(1,0) = -4;
1730       mat(1,1) =  2;
1731       mat(2,0) =  7;
1732       mat(2,2) =  3;
1733       mat.insert( 1UL, 2UL, 0 );
1734 
1735       OLT lower;
1736       lower = mat;
1737 
1738       checkRows    ( lower, 3UL );
1739       checkColumns ( lower, 3UL );
1740       checkNonZeros( lower, 5UL );
1741       checkNonZeros( lower, 0UL, 3UL );
1742       checkNonZeros( lower, 1UL, 1UL );
1743       checkNonZeros( lower, 2UL, 1UL );
1744 
1745       if( lower(0,0) !=  1 || lower(0,1) != 0 || lower(0,2) != 0 ||
1746           lower(1,0) != -4 || lower(1,1) != 2 || lower(1,2) != 0 ||
1747           lower(2,0) !=  7 || lower(2,1) != 0 || lower(2,2) != 3 ) {
1748          std::ostringstream oss;
1749          oss << " Test: " << test_ << "\n"
1750              << " Error: Assignment failed\n"
1751              << " Details:\n"
1752              << "   Result:\n" << lower << "\n"
1753              << "   Expected result:\n(  1 0 0 )\n( -4 2 0 )\n(  7 0 3 )\n";
1754          throw std::runtime_error( oss.str() );
1755       }
1756    }
1757 
1758    // Column-major/row-major sparse matrix assignment (non-lower)
1759    {
1760       test_ = "Column-major/row-major LowerMatrix sparse matrix assignment (non-lower)";
1761 
1762       blaze::CompressedMatrix<int,blaze::rowMajor> mat( 3UL, 3UL, 6UL );
1763       mat(0,0) =  1;
1764       mat(0,2) =  5;
1765       mat(1,0) = -4;
1766       mat(1,1) =  2;
1767       mat(2,0) =  7;
1768       mat(2,2) =  3;
1769 
1770       try {
1771          OLT lower;
1772          lower = mat;
1773 
1774          std::ostringstream oss;
1775          oss << " Test: " << test_ << "\n"
1776              << " Error: Assignment of non-lower row-major matrix succeeded\n"
1777              << " Details:\n"
1778              << "   Result:\n" << lower << "\n";
1779          throw std::runtime_error( oss.str() );
1780       }
1781       catch( std::invalid_argument& ) {}
1782    }
1783 
1784    // Column-major/column-major sparse matrix assignment (non-lower)
1785    {
1786       test_ = "Column-major/column-major LowerMatrix sparse matrix assignment (non-lower)";
1787 
1788       blaze::CompressedMatrix<int,blaze::columnMajor> mat( 3UL, 3UL, 6UL );
1789       mat(0,0) =  1;
1790       mat(0,2) =  5;
1791       mat(1,0) = -4;
1792       mat(1,1) =  2;
1793       mat(2,0) =  7;
1794       mat(2,2) =  3;
1795 
1796       try {
1797          OLT lower;
1798          lower = mat;
1799 
1800          std::ostringstream oss;
1801          oss << " Test: " << test_ << "\n"
1802              << " Error: Assignment of non-lower column-major matrix succeeded\n"
1803              << " Details:\n"
1804              << "   Result:\n" << lower << "\n";
1805          throw std::runtime_error( oss.str() );
1806       }
1807       catch( std::invalid_argument& ) {}
1808    }
1809 
1810    // Column-major/row-major sparse matrix assignment (LowerMatrix)
1811    {
1812       test_ = "Column-major/row-major LowerMatrix sparse matrix assignment (LowerMatrix)";
1813 
1814       blaze::LowerMatrix< blaze::CompressedMatrix<int,blaze::rowMajor> > lower1( 3UL, 5UL );
1815       lower1(0,0) =  1;
1816       lower1(1,0) = -4;
1817       lower1(1,1) =  2;
1818       lower1(2,0) =  7;
1819       lower1(2,2) =  3;
1820 
1821       OLT lower2;
1822       lower2 = lower1;
1823 
1824       checkRows    ( lower2, 3UL );
1825       checkColumns ( lower2, 3UL );
1826       checkNonZeros( lower2, 5UL );
1827       checkNonZeros( lower2, 0UL, 3UL );
1828       checkNonZeros( lower2, 1UL, 1UL );
1829       checkNonZeros( lower2, 2UL, 1UL );
1830 
1831       if( lower2(0,0) !=  1 || lower2(0,1) != 0 || lower2(0,2) != 0 ||
1832           lower2(1,0) != -4 || lower2(1,1) != 2 || lower2(1,2) != 0 ||
1833           lower2(2,0) !=  7 || lower2(2,1) != 0 || lower2(2,2) != 3 ) {
1834          std::ostringstream oss;
1835          oss << " Test: " << test_ << "\n"
1836              << " Error: Assignment failed\n"
1837              << " Details:\n"
1838              << "   Result:\n" << lower2 << "\n"
1839              << "   Expected result:\n(  1 0 0 )\n( -4 2 0 )\n(  7 0 3 )\n";
1840          throw std::runtime_error( oss.str() );
1841       }
1842    }
1843 
1844    // Column-major/column-major sparse matrix assignment (LowerMatrix)
1845    {
1846       test_ = "Column-major/column-major LowerMatrix sparse matrix assignment (LowerMatrix)";
1847 
1848       blaze::LowerMatrix< blaze::CompressedMatrix<unsigned int,blaze::columnMajor> > lower1( 3UL, 5UL );
1849       lower1(0,0) =  1;
1850       lower1(1,0) = -4;
1851       lower1(1,1) =  2;
1852       lower1(2,0) =  7;
1853       lower1(2,2) =  3;
1854 
1855       OLT lower2;
1856       lower2 = lower1;
1857 
1858       checkRows    ( lower2, 3UL );
1859       checkColumns ( lower2, 3UL );
1860       checkNonZeros( lower2, 5UL );
1861       checkNonZeros( lower2, 0UL, 3UL );
1862       checkNonZeros( lower2, 1UL, 1UL );
1863       checkNonZeros( lower2, 2UL, 1UL );
1864 
1865       if( lower2(0,0) !=  1 || lower2(0,1) != 0 || lower2(0,2) != 0 ||
1866           lower2(1,0) != -4 || lower2(1,1) != 2 || lower2(1,2) != 0 ||
1867           lower2(2,0) !=  7 || lower2(2,1) != 0 || lower2(2,2) != 3 ) {
1868          std::ostringstream oss;
1869          oss << " Test: " << test_ << "\n"
1870              << " Error: Assignment failed\n"
1871              << " Details:\n"
1872              << "   Result:\n" << lower2 << "\n"
1873              << "   Expected result:\n(  1 0 0 )\n( -4 2 0 )\n(  7 0 3 )\n";
1874          throw std::runtime_error( oss.str() );
1875       }
1876    }
1877 }
1878 //*************************************************************************************************
1879 
1880 
1881 //*************************************************************************************************
1882 /*!\brief Test of the LowerMatrix addition assignment operators.
1883 //
1884 // \return void
1885 // \exception std::runtime_error Error detected.
1886 //
1887 // This function performs a test of the addition assignment operators of the LowerMatrix
1888 // specialization. In case an error is detected, a \a std::runtime_error exception is thrown.
1889 */
testAddAssign()1890 void SparseTest::testAddAssign()
1891 {
1892    //=====================================================================================
1893    // Row-major dense matrix addition assignment
1894    //=====================================================================================
1895 
1896    // Row-major/row-major dense matrix addition assignment (lower)
1897    {
1898       test_ = "Row-major/row-major LowerMatrix dense matrix addition assignment (lower)";
1899 
1900       blaze::DynamicMatrix<int,blaze::rowMajor> mat( 3UL, 3UL, 0 );
1901       mat(1,0) =  2;
1902       mat(1,1) = -2;
1903       mat(2,0) =  6;
1904       mat(2,1) =  5;
1905 
1906       LT lower( 3UL );
1907       lower(0,0) =  1;
1908       lower(1,0) = -4;
1909       lower(1,1) =  2;
1910       lower(2,0) =  7;
1911       lower(2,2) =  3;
1912 
1913       lower += mat;
1914 
1915       checkRows    ( lower, 3UL );
1916       checkColumns ( lower, 3UL );
1917       checkCapacity( lower, 5UL );
1918       checkNonZeros( lower, 5UL );
1919       checkNonZeros( lower, 0UL, 1UL );
1920       checkNonZeros( lower, 1UL, 1UL );
1921       checkNonZeros( lower, 2UL, 3UL );
1922 
1923       if( lower(0,0) !=  1 || lower(0,1) != 0 || lower(0,2) != 0 ||
1924           lower(1,0) != -2 || lower(1,1) != 0 || lower(1,2) != 0 ||
1925           lower(2,0) != 13 || lower(2,1) != 5 || lower(2,2) != 3 ) {
1926          std::ostringstream oss;
1927          oss << " Test: " << test_ << "\n"
1928              << " Error: Addition assignment failed\n"
1929              << " Details:\n"
1930              << "   Result:\n" << lower << "\n"
1931              << "   Expected result:\n(  1 0 0 )\n( -2 0 0 )\n( 13 5 3 )\n";
1932          throw std::runtime_error( oss.str() );
1933       }
1934    }
1935 
1936    // Row-major/column-major dense matrix addition assignment (lower)
1937    {
1938       test_ = "Row-major/column-major LowerMatrix dense matrix addition assignment (lower)";
1939 
1940       blaze::DynamicMatrix<int,blaze::columnMajor> mat( 3UL, 3UL, 0 );
1941       mat(1,0) =  2;
1942       mat(1,1) = -2;
1943       mat(2,0) =  6;
1944       mat(2,1) =  5;
1945 
1946       LT lower( 3UL );
1947       lower(0,0) =  1;
1948       lower(1,0) = -4;
1949       lower(1,1) =  2;
1950       lower(2,0) =  7;
1951       lower(2,2) =  3;
1952 
1953       lower += mat;
1954 
1955       checkRows    ( lower, 3UL );
1956       checkColumns ( lower, 3UL );
1957       checkCapacity( lower, 5UL );
1958       checkNonZeros( lower, 5UL );
1959       checkNonZeros( lower, 0UL, 1UL );
1960       checkNonZeros( lower, 1UL, 1UL );
1961       checkNonZeros( lower, 2UL, 3UL );
1962 
1963       if( lower(0,0) !=  1 || lower(0,1) != 0 || lower(0,2) != 0 ||
1964           lower(1,0) != -2 || lower(1,1) != 0 || lower(1,2) != 0 ||
1965           lower(2,0) != 13 || lower(2,1) != 5 || lower(2,2) != 3 ) {
1966          std::ostringstream oss;
1967          oss << " Test: " << test_ << "\n"
1968              << " Error: Addition assignment failed\n"
1969              << " Details:\n"
1970              << "   Result:\n" << lower << "\n"
1971              << "   Expected result:\n(  1 0 0 )\n( -2 0 0 )\n( 13 5 3 )\n";
1972          throw std::runtime_error( oss.str() );
1973       }
1974    }
1975 
1976    // Row-major/row-major dense matrix addition assignment (non-lower)
1977    {
1978       test_ = "Row-major/row-major LowerMatrix dense matrix addition assignment (non-lower)";
1979 
1980       blaze::DynamicMatrix<int,blaze::rowMajor> mat( 3UL, 3UL, 0 );
1981       mat(0,2) = 6;
1982 
1983       LT lower( 3UL );
1984       lower(0,0) =  1;
1985       lower(1,0) = -4;
1986       lower(1,1) =  2;
1987       lower(2,0) =  7;
1988       lower(2,2) =  3;
1989 
1990       try {
1991          lower += mat;
1992 
1993          std::ostringstream oss;
1994          oss << " Test: " << test_ << "\n"
1995              << " Error: Addition assignment of non-lower row-major matrix succeeded\n"
1996              << " Details:\n"
1997              << "   Result:\n" << lower << "\n";
1998          throw std::runtime_error( oss.str() );
1999       }
2000       catch( std::invalid_argument& ) {}
2001    }
2002 
2003    // Row-major/column-major dense matrix addition assignment (non-lower)
2004    {
2005       test_ = "Row-major/column-major LowerMatrix dense matrix addition assignment (non-lower)";
2006 
2007       blaze::DynamicMatrix<int,blaze::columnMajor> mat( 3UL, 3UL, 0 );
2008       mat(0,2) = 6;
2009 
2010       LT lower( 3UL );
2011       lower(0,0) =  1;
2012       lower(1,0) = -4;
2013       lower(1,1) =  2;
2014       lower(2,0) =  7;
2015       lower(2,2) =  3;
2016 
2017       try {
2018          lower += mat;
2019 
2020          std::ostringstream oss;
2021          oss << " Test: " << test_ << "\n"
2022              << " Error: Addition assignment of non-lower column-major matrix succeeded\n"
2023              << " Details:\n"
2024              << "   Result:\n" << lower << "\n";
2025          throw std::runtime_error( oss.str() );
2026       }
2027       catch( std::invalid_argument& ) {}
2028    }
2029 
2030    // Row-major/row-major dense matrix addition assignment (LowerMatrix)
2031    {
2032       test_ = "Row-major/row-major LowerMatrix dense matrix addition assignment (LowerMatrix)";
2033 
2034       blaze::LowerMatrix< blaze::StaticMatrix<int,3UL,3UL,blaze::rowMajor> > lower1;
2035       lower1(1,0) =  2;
2036       lower1(1,1) = -2;
2037       lower1(2,0) =  6;
2038       lower1(2,1) =  5;
2039 
2040       LT lower2( 3UL );
2041       lower2(0,0) =  1;
2042       lower2(1,0) = -4;
2043       lower2(1,1) =  2;
2044       lower2(2,0) =  7;
2045       lower2(2,2) =  3;
2046 
2047       lower2 += lower1;
2048 
2049       checkRows    ( lower2, 3UL );
2050       checkColumns ( lower2, 3UL );
2051       checkCapacity( lower2, 5UL );
2052       checkNonZeros( lower2, 5UL );
2053       checkNonZeros( lower2, 0UL, 1UL );
2054       checkNonZeros( lower2, 1UL, 1UL );
2055       checkNonZeros( lower2, 2UL, 3UL );
2056 
2057       if( lower2(0,0) !=  1 || lower2(0,1) != 0 || lower2(0,2) != 0 ||
2058           lower2(1,0) != -2 || lower2(1,1) != 0 || lower2(1,2) != 0 ||
2059           lower2(2,0) != 13 || lower2(2,1) != 5 || lower2(2,2) != 3 ) {
2060          std::ostringstream oss;
2061          oss << " Test: " << test_ << "\n"
2062              << " Error: Addition assignment failed\n"
2063              << " Details:\n"
2064              << "   Result:\n" << lower2 << "\n"
2065              << "   Expected result:\n(  1 0 0 )\n( -2 0 0 )\n( 13 5 3 )\n";
2066          throw std::runtime_error( oss.str() );
2067       }
2068    }
2069 
2070    // Row-major/column-major dense matrix addition assignment (LowerMatrix)
2071    {
2072       test_ = "Row-major/column-major LowerMatrix dense matrix addition assignment (LowerMatrix)";
2073 
2074       blaze::LowerMatrix< blaze::StaticMatrix<int,3UL,3UL,blaze::columnMajor> > lower1;
2075       lower1(1,0) =  2;
2076       lower1(1,1) = -2;
2077       lower1(2,0) =  6;
2078       lower1(2,1) =  5;
2079 
2080       LT lower2( 3UL );
2081       lower2(0,0) =  1;
2082       lower2(1,0) = -4;
2083       lower2(1,1) =  2;
2084       lower2(2,0) =  7;
2085       lower2(2,2) =  3;
2086 
2087       lower2 += lower1;
2088 
2089       checkRows    ( lower2, 3UL );
2090       checkColumns ( lower2, 3UL );
2091       checkCapacity( lower2, 5UL );
2092       checkNonZeros( lower2, 5UL );
2093       checkNonZeros( lower2, 0UL, 1UL );
2094       checkNonZeros( lower2, 1UL, 1UL );
2095       checkNonZeros( lower2, 2UL, 3UL );
2096 
2097       if( lower2(0,0) !=  1 || lower2(0,1) != 0 || lower2(0,2) != 0 ||
2098           lower2(1,0) != -2 || lower2(1,1) != 0 || lower2(1,2) != 0 ||
2099           lower2(2,0) != 13 || lower2(2,1) != 5 || lower2(2,2) != 3 ) {
2100          std::ostringstream oss;
2101          oss << " Test: " << test_ << "\n"
2102              << " Error: Addition assignment failed\n"
2103              << " Details:\n"
2104              << "   Result:\n" << lower2 << "\n"
2105              << "   Expected result:\n(  1 0 0 )\n( -2 0 0 )\n( 13 5 3 )\n";
2106          throw std::runtime_error( oss.str() );
2107       }
2108    }
2109 
2110 
2111    //=====================================================================================
2112    // Row-major sparse matrix addition assignment
2113    //=====================================================================================
2114 
2115    // Row-major/row-major sparse matrix addition assignment (lower)
2116    {
2117       test_ = "Row-major/row-major LowerMatrix sparse matrix addition assignment (lower)";
2118 
2119       blaze::CompressedMatrix<int,blaze::rowMajor> mat( 3UL, 3UL, 5UL );
2120       mat(1,0) =  2;
2121       mat(1,1) = -2;
2122       mat(2,0) =  6;
2123       mat(2,1) =  5;
2124       mat.insert( 1UL, 2UL, 0 );
2125 
2126       LT lower( 3UL );
2127       lower(0,0) =  1;
2128       lower(1,0) = -4;
2129       lower(1,1) =  2;
2130       lower(2,0) =  7;
2131       lower(2,2) =  3;
2132 
2133       lower += mat;
2134 
2135       checkRows    ( lower, 3UL );
2136       checkColumns ( lower, 3UL );
2137       checkCapacity( lower, 6UL );
2138       checkNonZeros( lower, 6UL );
2139       checkNonZeros( lower, 0UL, 1UL );
2140       checkNonZeros( lower, 1UL, 2UL );
2141       checkNonZeros( lower, 2UL, 3UL );
2142 
2143       if( lower(0,0) !=  1 || lower(0,1) != 0 || lower(0,2) != 0 ||
2144           lower(1,0) != -2 || lower(1,1) != 0 || lower(1,2) != 0 ||
2145           lower(2,0) != 13 || lower(2,1) != 5 || lower(2,2) != 3 ) {
2146          std::ostringstream oss;
2147          oss << " Test: " << test_ << "\n"
2148              << " Error: Addition assignment failed\n"
2149              << " Details:\n"
2150              << "   Result:\n" << lower << "\n"
2151              << "   Expected result:\n(  1 0 0 )\n( -2 0 0 )\n( 13 5 3 )\n";
2152          throw std::runtime_error( oss.str() );
2153       }
2154    }
2155 
2156    // Row-major/column-major sparse matrix addition assignment (lower)
2157    {
2158       test_ = "Row-major/column-major LowerMatrix sparse matrix addition assignment (lower)";
2159 
2160       blaze::CompressedMatrix<int,blaze::columnMajor> mat( 3UL, 3UL, 5UL );
2161       mat(1,0) =  2;
2162       mat(1,1) = -2;
2163       mat(2,0) =  6;
2164       mat(2,1) =  5;
2165       mat.insert( 1UL, 2UL, 0 );
2166 
2167       LT lower( 3UL );
2168       lower(0,0) =  1;
2169       lower(1,0) = -4;
2170       lower(1,1) =  2;
2171       lower(2,0) =  7;
2172       lower(2,2) =  3;
2173 
2174       lower += mat;
2175 
2176       checkRows    ( lower, 3UL );
2177       checkColumns ( lower, 3UL );
2178       checkCapacity( lower, 6UL );
2179       checkNonZeros( lower, 6UL );
2180       checkNonZeros( lower, 0UL, 1UL );
2181       checkNonZeros( lower, 1UL, 2UL );
2182       checkNonZeros( lower, 2UL, 3UL );
2183 
2184       if( lower(0,0) !=  1 || lower(0,1) != 0 || lower(0,2) != 0 ||
2185           lower(1,0) != -2 || lower(1,1) != 0 || lower(1,2) != 0 ||
2186           lower(2,0) != 13 || lower(2,1) != 5 || lower(2,2) != 3 ) {
2187          std::ostringstream oss;
2188          oss << " Test: " << test_ << "\n"
2189              << " Error: Addition assignment failed\n"
2190              << " Details:\n"
2191              << "   Result:\n" << lower << "\n"
2192              << "   Expected result:\n(  1 0 0 )\n( -2 0 0 )\n( 13 5 3 )\n";
2193          throw std::runtime_error( oss.str() );
2194       }
2195    }
2196 
2197    // Row-major/row-major sparse matrix addition assignment (non-lower)
2198    {
2199       test_ = "Row-major/row-major LowerMatrix sparse matrix addition assignment (non-lower)";
2200 
2201       blaze::CompressedMatrix<int,blaze::rowMajor> mat( 3UL, 3UL, 1UL );
2202       mat(0,2) = 6;
2203 
2204       LT lower( 3UL );
2205       lower(0,0) =  1;
2206       lower(1,0) = -4;
2207       lower(1,1) =  2;
2208       lower(2,0) =  7;
2209       lower(2,2) =  3;
2210 
2211       try {
2212          lower += mat;
2213 
2214          std::ostringstream oss;
2215          oss << " Test: " << test_ << "\n"
2216              << " Error: Addition assignment of non-lower row-major matrix succeeded\n"
2217              << " Details:\n"
2218              << "   Result:\n" << lower << "\n";
2219          throw std::runtime_error( oss.str() );
2220       }
2221       catch( std::invalid_argument& ) {}
2222    }
2223 
2224    // Row-major/column-major sparse matrix addition assignment (non-lower)
2225    {
2226       test_ = "Row-major/column-major LowerMatrix sparse matrix addition assignment (non-lower)";
2227 
2228       blaze::CompressedMatrix<int,blaze::columnMajor> mat( 3UL, 3UL, 1UL );
2229       mat(0,2) = 6;
2230 
2231       LT lower( 3UL );
2232       lower(0,0) =  1;
2233       lower(1,0) = -4;
2234       lower(1,1) =  2;
2235       lower(2,0) =  7;
2236       lower(2,2) =  3;
2237 
2238       try {
2239          lower += mat;
2240 
2241          std::ostringstream oss;
2242          oss << " Test: " << test_ << "\n"
2243              << " Error: Addition assignment of non-lower column-major matrix succeeded\n"
2244              << " Details:\n"
2245              << "   Result:\n" << lower << "\n";
2246          throw std::runtime_error( oss.str() );
2247       }
2248       catch( std::invalid_argument& ) {}
2249    }
2250 
2251    // Row-major/row-major sparse matrix addition assignment (LowerMatrix)
2252    {
2253       test_ = "Row-major/row-major LowerMatrix sparse matrix addition assignment (LowerMatrix)";
2254 
2255       LT lower1( 3UL, 4UL );
2256       lower1(1,0) =  2;
2257       lower1(1,1) = -2;
2258       lower1(2,0) =  6;
2259       lower1(2,1) =  5;
2260 
2261       LT lower2( 3UL );
2262       lower2(0,0) =  1;
2263       lower2(1,0) = -4;
2264       lower2(1,1) =  2;
2265       lower2(2,0) =  7;
2266       lower2(2,2) =  3;
2267 
2268       lower2 += lower1;
2269 
2270       checkRows    ( lower2, 3UL );
2271       checkColumns ( lower2, 3UL );
2272       checkCapacity( lower2, 6UL );
2273       checkNonZeros( lower2, 6UL );
2274       checkNonZeros( lower2, 0UL, 1UL );
2275       checkNonZeros( lower2, 1UL, 2UL );
2276       checkNonZeros( lower2, 2UL, 3UL );
2277 
2278       if( lower2(0,0) !=  1 || lower2(0,1) != 0 || lower2(0,2) != 0 ||
2279           lower2(1,0) != -2 || lower2(1,1) != 0 || lower2(1,2) != 0 ||
2280           lower2(2,0) != 13 || lower2(2,1) != 5 || lower2(2,2) != 3 ) {
2281          std::ostringstream oss;
2282          oss << " Test: " << test_ << "\n"
2283              << " Error: Addition assignment failed\n"
2284              << " Details:\n"
2285              << "   Result:\n" << lower2 << "\n"
2286              << "   Expected result:\n(  1 0 0 )\n( -2 0 0 )\n( 13 5 3 )\n";
2287          throw std::runtime_error( oss.str() );
2288       }
2289    }
2290 
2291    // Row-major/column-major sparse matrix addition assignment (LowerMatrix)
2292    {
2293       test_ = "Row-major/column-major LowerMatrix sparse matrix addition assignment (LowerMatrix)";
2294 
2295       OLT lower1( 3UL, 4UL );
2296       lower1(1,0) =  2;
2297       lower1(1,1) = -2;
2298       lower1(2,0) =  6;
2299       lower1(2,1) =  5;
2300 
2301       LT lower2( 3UL );
2302       lower2(0,0) =  1;
2303       lower2(1,0) = -4;
2304       lower2(1,1) =  2;
2305       lower2(2,0) =  7;
2306       lower2(2,2) =  3;
2307 
2308       lower2 += lower1;
2309 
2310       checkRows    ( lower2, 3UL );
2311       checkColumns ( lower2, 3UL );
2312       checkCapacity( lower2, 6UL );
2313       checkNonZeros( lower2, 6UL );
2314       checkNonZeros( lower2, 0UL, 1UL );
2315       checkNonZeros( lower2, 1UL, 2UL );
2316       checkNonZeros( lower2, 2UL, 3UL );
2317 
2318       if( lower2(0,0) !=  1 || lower2(0,1) != 0 || lower2(0,2) != 0 ||
2319           lower2(1,0) != -2 || lower2(1,1) != 0 || lower2(1,2) != 0 ||
2320           lower2(2,0) != 13 || lower2(2,1) != 5 || lower2(2,2) != 3 ) {
2321          std::ostringstream oss;
2322          oss << " Test: " << test_ << "\n"
2323              << " Error: Addition assignment failed\n"
2324              << " Details:\n"
2325              << "   Result:\n" << lower2 << "\n"
2326              << "   Expected result:\n(  1 0 0 )\n( -2 0 0 )\n( 13 5 3 )\n";
2327          throw std::runtime_error( oss.str() );
2328       }
2329    }
2330 
2331 
2332    //=====================================================================================
2333    // Column-major dense matrix addition assignment
2334    //=====================================================================================
2335 
2336    // Column-major/row-major dense matrix addition assignment (lower)
2337    {
2338       test_ = "Column-major/row-major LowerMatrix dense matrix addition assignment (lower)";
2339 
2340       blaze::DynamicMatrix<int,blaze::rowMajor> mat( 3UL, 3UL, 0 );
2341       mat(1,0) =  2;
2342       mat(1,1) = -2;
2343       mat(2,0) =  6;
2344       mat(2,1) =  5;
2345 
2346       OLT lower( 3UL );
2347       lower(0,0) =  1;
2348       lower(1,0) = -4;
2349       lower(1,1) =  2;
2350       lower(2,0) =  7;
2351       lower(2,2) =  3;
2352 
2353       lower += mat;
2354 
2355       checkRows    ( lower, 3UL );
2356       checkColumns ( lower, 3UL );
2357       checkCapacity( lower, 5UL );
2358       checkNonZeros( lower, 5UL );
2359       checkNonZeros( lower, 0UL, 3UL );
2360       checkNonZeros( lower, 1UL, 1UL );
2361       checkNonZeros( lower, 2UL, 1UL );
2362 
2363       if( lower(0,0) !=  1 || lower(0,1) != 0 || lower(0,2) != 0 ||
2364           lower(1,0) != -2 || lower(1,1) != 0 || lower(1,2) != 0 ||
2365           lower(2,0) != 13 || lower(2,1) != 5 || lower(2,2) != 3 ) {
2366          std::ostringstream oss;
2367          oss << " Test: " << test_ << "\n"
2368              << " Error: Addition assignment failed\n"
2369              << " Details:\n"
2370              << "   Result:\n" << lower << "\n"
2371              << "   Expected result:\n(  1 0 0 )\n( -2 0 0 )\n( 13 5 3 )\n";
2372          throw std::runtime_error( oss.str() );
2373       }
2374    }
2375 
2376    // Column-major/column-major dense matrix addition assignment (lower)
2377    {
2378       test_ = "Column-major/column-major LowerMatrix dense matrix addition assignment (lower)";
2379 
2380       blaze::DynamicMatrix<int,blaze::columnMajor> mat( 3UL, 3UL, 0 );
2381       mat(1,0) =  2;
2382       mat(1,1) = -2;
2383       mat(2,0) =  6;
2384       mat(2,1) =  5;
2385 
2386       OLT lower( 3UL );
2387       lower(0,0) =  1;
2388       lower(1,0) = -4;
2389       lower(1,1) =  2;
2390       lower(2,0) =  7;
2391       lower(2,2) =  3;
2392 
2393       lower += mat;
2394 
2395       checkRows    ( lower, 3UL );
2396       checkColumns ( lower, 3UL );
2397       checkCapacity( lower, 5UL );
2398       checkNonZeros( lower, 5UL );
2399       checkNonZeros( lower, 0UL, 3UL );
2400       checkNonZeros( lower, 1UL, 1UL );
2401       checkNonZeros( lower, 2UL, 1UL );
2402 
2403       if( lower(0,0) !=  1 || lower(0,1) != 0 || lower(0,2) != 0 ||
2404           lower(1,0) != -2 || lower(1,1) != 0 || lower(1,2) != 0 ||
2405           lower(2,0) != 13 || lower(2,1) != 5 || lower(2,2) != 3 ) {
2406          std::ostringstream oss;
2407          oss << " Test: " << test_ << "\n"
2408              << " Error: Addition assignment failed\n"
2409              << " Details:\n"
2410              << "   Result:\n" << lower << "\n"
2411              << "   Expected result:\n(  1 0 0 )\n( -2 0 0 )\n( 13 5 3 )\n";
2412          throw std::runtime_error( oss.str() );
2413       }
2414    }
2415 
2416    // Column-major/row-major dense matrix addition assignment (non-lower)
2417    {
2418       test_ = "Column-major/row-major LowerMatrix dense matrix addition assignment (non-lower)";
2419 
2420       blaze::DynamicMatrix<int,blaze::rowMajor> mat( 3UL, 3UL, 0 );
2421       mat(0,2) = 6;
2422 
2423       OLT lower( 3UL );
2424       lower(0,0) =  1;
2425       lower(1,0) = -4;
2426       lower(1,1) =  2;
2427       lower(2,0) =  7;
2428       lower(2,2) =  3;
2429 
2430       try {
2431          lower += mat;
2432 
2433          std::ostringstream oss;
2434          oss << " Test: " << test_ << "\n"
2435              << " Error: Addition assignment of non-lower row-major matrix succeeded\n"
2436              << " Details:\n"
2437              << "   Result:\n" << lower << "\n";
2438          throw std::runtime_error( oss.str() );
2439       }
2440       catch( std::invalid_argument& ) {}
2441    }
2442 
2443    // Column-major/column-major dense matrix addition assignment (non-lower)
2444    {
2445       test_ = "Column-major/column-major LowerMatrix dense matrix addition assignment (non-lower)";
2446 
2447       blaze::DynamicMatrix<int,blaze::columnMajor> mat( 3UL, 3UL, 0 );
2448       mat(0,2) = 6;
2449 
2450       OLT lower( 3UL );
2451       lower(0,0) =  1;
2452       lower(1,0) = -4;
2453       lower(1,1) =  2;
2454       lower(2,0) =  7;
2455       lower(2,2) =  3;
2456 
2457       try {
2458          lower += mat;
2459 
2460          std::ostringstream oss;
2461          oss << " Test: " << test_ << "\n"
2462              << " Error: Addition assignment of non-lower column-major matrix succeeded\n"
2463              << " Details:\n"
2464              << "   Result:\n" << lower << "\n";
2465          throw std::runtime_error( oss.str() );
2466       }
2467       catch( std::invalid_argument& ) {}
2468    }
2469 
2470    // Column-major/row-major dense matrix addition assignment (LowerMatrix)
2471    {
2472       test_ = "Column-major/row-major LowerMatrix dense matrix addition assignment (LowerMatrix)";
2473 
2474       blaze::LowerMatrix< blaze::StaticMatrix<int,3UL,3UL,blaze::rowMajor> > lower1;
2475       lower1(1,0) =  2;
2476       lower1(1,1) = -2;
2477       lower1(2,0) =  6;
2478       lower1(2,1) =  5;
2479 
2480       OLT lower2( 3UL );
2481       lower2(0,0) =  1;
2482       lower2(1,0) = -4;
2483       lower2(1,1) =  2;
2484       lower2(2,0) =  7;
2485       lower2(2,2) =  3;
2486 
2487       lower2 += lower1;
2488 
2489       checkRows    ( lower2, 3UL );
2490       checkColumns ( lower2, 3UL );
2491       checkCapacity( lower2, 5UL );
2492       checkNonZeros( lower2, 5UL );
2493       checkNonZeros( lower2, 0UL, 3UL );
2494       checkNonZeros( lower2, 1UL, 1UL );
2495       checkNonZeros( lower2, 2UL, 1UL );
2496 
2497       if( lower2(0,0) !=  1 || lower2(0,1) != 0 || lower2(0,2) != 0 ||
2498           lower2(1,0) != -2 || lower2(1,1) != 0 || lower2(1,2) != 0 ||
2499           lower2(2,0) != 13 || lower2(2,1) != 5 || lower2(2,2) != 3 ) {
2500          std::ostringstream oss;
2501          oss << " Test: " << test_ << "\n"
2502              << " Error: Addition assignment failed\n"
2503              << " Details:\n"
2504              << "   Result:\n" << lower2 << "\n"
2505              << "   Expected result:\n(  1 0 0 )\n( -2 0 0 )\n( 13 5 3 )\n";
2506          throw std::runtime_error( oss.str() );
2507       }
2508    }
2509 
2510    // Column-major/column-major dense matrix addition assignment (LowerMatrix)
2511    {
2512       test_ = "Column-major/column-major LowerMatrix dense matrix addition assignment (LowerMatrix)";
2513 
2514       blaze::LowerMatrix< blaze::StaticMatrix<int,3UL,3UL,blaze::columnMajor> > lower1;
2515       lower1(1,0) =  2;
2516       lower1(1,1) = -2;
2517       lower1(2,0) =  6;
2518       lower1(2,1) =  5;
2519 
2520       OLT lower2( 3UL );
2521       lower2(0,0) =  1;
2522       lower2(1,0) = -4;
2523       lower2(1,1) =  2;
2524       lower2(2,0) =  7;
2525       lower2(2,2) =  3;
2526 
2527       lower2 += lower1;
2528 
2529       checkRows    ( lower2, 3UL );
2530       checkColumns ( lower2, 3UL );
2531       checkCapacity( lower2, 5UL );
2532       checkNonZeros( lower2, 5UL );
2533       checkNonZeros( lower2, 0UL, 3UL );
2534       checkNonZeros( lower2, 1UL, 1UL );
2535       checkNonZeros( lower2, 2UL, 1UL );
2536 
2537       if( lower2(0,0) !=  1 || lower2(0,1) != 0 || lower2(0,2) != 0 ||
2538           lower2(1,0) != -2 || lower2(1,1) != 0 || lower2(1,2) != 0 ||
2539           lower2(2,0) != 13 || lower2(2,1) != 5 || lower2(2,2) != 3 ) {
2540          std::ostringstream oss;
2541          oss << " Test: " << test_ << "\n"
2542              << " Error: Addition assignment failed\n"
2543              << " Details:\n"
2544              << "   Result:\n" << lower2 << "\n"
2545              << "   Expected result:\n(  1 0 0 )\n( -2 0 0 )\n( 13 5 3 )\n";
2546          throw std::runtime_error( oss.str() );
2547       }
2548    }
2549 
2550 
2551    //=====================================================================================
2552    // Column-major sparse matrix addition assignment
2553    //=====================================================================================
2554 
2555    // Column-major/row-major sparse matrix addition assignment (lower)
2556    {
2557       test_ = "Column-major/row-major LowerMatrix sparse matrix addition assignment (lower)";
2558 
2559       blaze::CompressedMatrix<int,blaze::rowMajor> mat( 3UL, 3UL, 5UL );
2560       mat(1,0) =  2;
2561       mat(1,1) = -2;
2562       mat(2,0) =  6;
2563       mat(2,1) =  5;
2564       mat.insert( 1UL, 2UL, 0 );
2565 
2566       OLT lower( 3UL );
2567       lower(0,0) =  1;
2568       lower(1,0) = -4;
2569       lower(1,1) =  2;
2570       lower(2,0) =  7;
2571       lower(2,2) =  3;
2572 
2573       lower += mat;
2574 
2575       checkRows    ( lower, 3UL );
2576       checkColumns ( lower, 3UL );
2577       checkCapacity( lower, 6UL );
2578       checkNonZeros( lower, 6UL );
2579       checkNonZeros( lower, 0UL, 3UL );
2580       checkNonZeros( lower, 1UL, 2UL );
2581       checkNonZeros( lower, 2UL, 1UL );
2582 
2583       if( lower(0,0) !=  1 || lower(0,1) != 0 || lower(0,2) != 0 ||
2584           lower(1,0) != -2 || lower(1,1) != 0 || lower(1,2) != 0 ||
2585           lower(2,0) != 13 || lower(2,1) != 5 || lower(2,2) != 3 ) {
2586          std::ostringstream oss;
2587          oss << " Test: " << test_ << "\n"
2588              << " Error: Addition assignment failed\n"
2589              << " Details:\n"
2590              << "   Result:\n" << lower << "\n"
2591              << "   Expected result:\n(  1 0 0 )\n( -2 0 0 )\n( 13 5 3 )\n";
2592          throw std::runtime_error( oss.str() );
2593       }
2594    }
2595 
2596    // Column-major/column-major sparse matrix addition assignment (lower)
2597    {
2598       test_ = "Column-major/column-major LowerMatrix sparse matrix addition assignment (lower)";
2599 
2600       blaze::CompressedMatrix<int,blaze::columnMajor> mat( 3UL, 3UL, 5UL );
2601       mat(1,0) =  2;
2602       mat(1,1) = -2;
2603       mat(2,0) =  6;
2604       mat(2,1) =  5;
2605       mat.insert( 1UL, 2UL, 0 );
2606 
2607       OLT lower( 3UL );
2608       lower(0,0) =  1;
2609       lower(1,0) = -4;
2610       lower(1,1) =  2;
2611       lower(2,0) =  7;
2612       lower(2,2) =  3;
2613 
2614       lower += mat;
2615 
2616       checkRows    ( lower, 3UL );
2617       checkColumns ( lower, 3UL );
2618       checkCapacity( lower, 6UL );
2619       checkNonZeros( lower, 6UL );
2620       checkNonZeros( lower, 0UL, 3UL );
2621       checkNonZeros( lower, 1UL, 2UL );
2622       checkNonZeros( lower, 2UL, 1UL );
2623 
2624       if( lower(0,0) !=  1 || lower(0,1) != 0 || lower(0,2) != 0 ||
2625           lower(1,0) != -2 || lower(1,1) != 0 || lower(1,2) != 0 ||
2626           lower(2,0) != 13 || lower(2,1) != 5 || lower(2,2) != 3 ) {
2627          std::ostringstream oss;
2628          oss << " Test: " << test_ << "\n"
2629              << " Error: Addition assignment failed\n"
2630              << " Details:\n"
2631              << "   Result:\n" << lower << "\n"
2632              << "   Expected result:\n(  1 0 0 )\n( -2 0 0 )\n( 13 5 3 )\n";
2633          throw std::runtime_error( oss.str() );
2634       }
2635    }
2636 
2637    // Column-major/row-major sparse matrix addition assignment (non-lower)
2638    {
2639       test_ = "Column-major/row-major LowerMatrix sparse matrix addition assignment (non-lower)";
2640 
2641       blaze::CompressedMatrix<int,blaze::rowMajor> mat( 3UL, 3UL, 1UL );
2642       mat(0,2) = 6;
2643 
2644       OLT lower( 3UL );
2645       lower(0,0) =  1;
2646       lower(1,0) = -4;
2647       lower(1,1) =  2;
2648       lower(2,0) =  7;
2649       lower(2,2) =  3;
2650 
2651       try {
2652          lower += mat;
2653 
2654          std::ostringstream oss;
2655          oss << " Test: " << test_ << "\n"
2656              << " Error: Addition assignment of non-lower row-major matrix succeeded\n"
2657              << " Details:\n"
2658              << "   Result:\n" << lower << "\n";
2659          throw std::runtime_error( oss.str() );
2660       }
2661       catch( std::invalid_argument& ) {}
2662    }
2663 
2664    // Column-major/column-major sparse matrix addition assignment (non-lower)
2665    {
2666       test_ = "Column-major/column-major LowerMatrix sparse matrix addition assignment (non-lower)";
2667 
2668       blaze::CompressedMatrix<int,blaze::columnMajor> mat( 3UL, 3UL, 1UL );
2669       mat(0,2) = 6;
2670 
2671       OLT lower( 3UL );
2672       lower(0,0) =  1;
2673       lower(1,0) = -4;
2674       lower(1,1) =  2;
2675       lower(2,0) =  7;
2676       lower(2,2) =  3;
2677 
2678       try {
2679          lower += mat;
2680 
2681          std::ostringstream oss;
2682          oss << " Test: " << test_ << "\n"
2683              << " Error: Addition assignment of non-lower column-major matrix succeeded\n"
2684              << " Details:\n"
2685              << "   Result:\n" << lower << "\n";
2686          throw std::runtime_error( oss.str() );
2687       }
2688       catch( std::invalid_argument& ) {}
2689    }
2690 
2691    // Column-major/row-major sparse matrix addition assignment (LowerMatrix)
2692    {
2693       test_ = "Column-major/row-major LowerMatrix sparse matrix addition assignment (LowerMatrix)";
2694 
2695       LT lower1( 3UL, 4UL );
2696       lower1(1,0) =  2;
2697       lower1(1,1) = -2;
2698       lower1(2,0) =  6;
2699       lower1(2,1) =  5;
2700 
2701       OLT lower2( 3UL );
2702       lower2(0,0) =  1;
2703       lower2(1,0) = -4;
2704       lower2(1,1) =  2;
2705       lower2(2,0) =  7;
2706       lower2(2,2) =  3;
2707 
2708       lower2 += lower1;
2709 
2710       checkRows    ( lower2, 3UL );
2711       checkColumns ( lower2, 3UL );
2712       checkCapacity( lower2, 6UL );
2713       checkNonZeros( lower2, 6UL );
2714       checkNonZeros( lower2, 0UL, 3UL );
2715       checkNonZeros( lower2, 1UL, 2UL );
2716       checkNonZeros( lower2, 2UL, 1UL );
2717 
2718       if( lower2(0,0) !=  1 || lower2(0,1) != 0 || lower2(0,2) != 0 ||
2719           lower2(1,0) != -2 || lower2(1,1) != 0 || lower2(1,2) != 0 ||
2720           lower2(2,0) != 13 || lower2(2,1) != 5 || lower2(2,2) != 3 ) {
2721          std::ostringstream oss;
2722          oss << " Test: " << test_ << "\n"
2723              << " Error: Addition assignment failed\n"
2724              << " Details:\n"
2725              << "   Result:\n" << lower2 << "\n"
2726              << "   Expected result:\n(  1 0 0 )\n( -2 0 0 )\n( 13 5 3 )\n";
2727          throw std::runtime_error( oss.str() );
2728       }
2729    }
2730 
2731    // Column-major/column-major sparse matrix addition assignment (LowerMatrix)
2732    {
2733       test_ = "Column-major/column-major LowerMatrix sparse matrix addition assignment (LowerMatrix)";
2734 
2735       OLT lower1( 3UL, 4UL );
2736       lower1(1,0) =  2;
2737       lower1(1,1) = -2;
2738       lower1(2,0) =  6;
2739       lower1(2,1) =  5;
2740 
2741       OLT lower2( 3UL );
2742       lower2(0,0) =  1;
2743       lower2(1,0) = -4;
2744       lower2(1,1) =  2;
2745       lower2(2,0) =  7;
2746       lower2(2,2) =  3;
2747 
2748       lower2 += lower1;
2749 
2750       checkRows    ( lower2, 3UL );
2751       checkColumns ( lower2, 3UL );
2752       checkCapacity( lower2, 6UL );
2753       checkNonZeros( lower2, 6UL );
2754       checkNonZeros( lower2, 0UL, 3UL );
2755       checkNonZeros( lower2, 1UL, 2UL );
2756       checkNonZeros( lower2, 2UL, 1UL );
2757 
2758       if( lower2(0,0) !=  1 || lower2(0,1) != 0 || lower2(0,2) != 0 ||
2759           lower2(1,0) != -2 || lower2(1,1) != 0 || lower2(1,2) != 0 ||
2760           lower2(2,0) != 13 || lower2(2,1) != 5 || lower2(2,2) != 3 ) {
2761          std::ostringstream oss;
2762          oss << " Test: " << test_ << "\n"
2763              << " Error: Addition assignment failed\n"
2764              << " Details:\n"
2765              << "   Result:\n" << lower2 << "\n"
2766              << "   Expected result:\n(  1 0 0 )\n( -2 0 0 )\n( 13 5 3 )\n";
2767          throw std::runtime_error( oss.str() );
2768       }
2769    }
2770 }
2771 //*************************************************************************************************
2772 
2773 
2774 //*************************************************************************************************
2775 /*!\brief Test of the LowerMatrix subtraction assignment operators.
2776 //
2777 // \return void
2778 // \exception std::runtime_error Error detected.
2779 //
2780 // This function performs a test of the subtraction assignment operators of the LowerMatrix
2781 // specialization. In case an error is detected, a \a std::runtime_error exception is thrown.
2782 */
testSubAssign()2783 void SparseTest::testSubAssign()
2784 {
2785    //=====================================================================================
2786    // Row-major dense matrix subtraction assignment
2787    //=====================================================================================
2788 
2789    // Row-major/row-major dense matrix subtraction assignment (lower)
2790    {
2791       test_ = "Row-major/row-major LowerMatrix dense matrix subtraction assignment (lower)";
2792 
2793       blaze::DynamicMatrix<int,blaze::rowMajor> mat( 3UL, 3UL, 0 );
2794       mat(1,0) = -2;
2795       mat(1,1) =  2;
2796       mat(2,0) =  6;
2797       mat(2,1) =  5;
2798 
2799       LT lower( 3UL );
2800       lower(0,0) =  1;
2801       lower(1,0) = -4;
2802       lower(1,1) =  2;
2803       lower(2,0) =  7;
2804       lower(2,2) =  3;
2805 
2806       lower -= mat;
2807 
2808       checkRows    ( lower, 3UL );
2809       checkColumns ( lower, 3UL );
2810       checkCapacity( lower, 5UL );
2811       checkNonZeros( lower, 5UL );
2812       checkNonZeros( lower, 0UL, 1UL );
2813       checkNonZeros( lower, 1UL, 1UL );
2814       checkNonZeros( lower, 2UL, 3UL );
2815 
2816       if( lower(0,0) !=  1 || lower(0,1) !=  0 || lower(0,2) != 0 ||
2817           lower(1,0) != -2 || lower(1,1) !=  0 || lower(1,2) != 0 ||
2818           lower(2,0) !=  1 || lower(2,1) != -5 || lower(2,2) != 3 ) {
2819          std::ostringstream oss;
2820          oss << " Test: " << test_ << "\n"
2821              << " Error: Subtraction assignment failed\n"
2822              << " Details:\n"
2823              << "   Result:\n" << lower << "\n"
2824              << "   Expected result:\n(  1  0  0 )\n( -2  0  0 )\n(  1 -5  3 )\n";
2825          throw std::runtime_error( oss.str() );
2826       }
2827    }
2828 
2829    // Row-major/column-major dense matrix subtraction assignment (lower)
2830    {
2831       test_ = "Row-major/column-major LowerMatrix dense matrix subtraction assignment (lower)";
2832 
2833       blaze::DynamicMatrix<int,blaze::columnMajor> mat( 3UL, 3UL, 0 );
2834       mat(1,0) = -2;
2835       mat(1,1) =  2;
2836       mat(2,0) =  6;
2837       mat(2,1) =  5;
2838 
2839       LT lower( 3UL );
2840       lower(0,0) =  1;
2841       lower(1,0) = -4;
2842       lower(1,1) =  2;
2843       lower(2,0) =  7;
2844       lower(2,2) =  3;
2845 
2846       lower -= mat;
2847 
2848       checkRows    ( lower, 3UL );
2849       checkColumns ( lower, 3UL );
2850       checkCapacity( lower, 5UL );
2851       checkNonZeros( lower, 5UL );
2852       checkNonZeros( lower, 0UL, 1UL );
2853       checkNonZeros( lower, 1UL, 1UL );
2854       checkNonZeros( lower, 2UL, 3UL );
2855 
2856       if( lower(0,0) !=  1 || lower(0,1) !=  0 || lower(0,2) != 0 ||
2857           lower(1,0) != -2 || lower(1,1) !=  0 || lower(1,2) != 0 ||
2858           lower(2,0) !=  1 || lower(2,1) != -5 || lower(2,2) != 3 ) {
2859          std::ostringstream oss;
2860          oss << " Test: " << test_ << "\n"
2861              << " Error: Subtraction assignment failed\n"
2862              << " Details:\n"
2863              << "   Result:\n" << lower << "\n"
2864              << "   Expected result:\n(  1  0  0 )\n( -2  0  0 )\n(  1 -5  3 )\n";
2865          throw std::runtime_error( oss.str() );
2866       }
2867    }
2868 
2869    // Row-major/row-major dense matrix subtraction assignment (non-lower)
2870    {
2871       test_ = "Row-major/row-major LowerMatrix dense matrix subtraction assignment (non-lower)";
2872 
2873       blaze::DynamicMatrix<int,blaze::rowMajor> mat( 3UL, 3UL, 0 );
2874       mat(0,2) = 6;
2875 
2876       LT lower( 3UL );
2877       lower(0,0) =  1;
2878       lower(1,0) = -4;
2879       lower(1,1) =  2;
2880       lower(2,0) =  7;
2881       lower(2,2) =  3;
2882 
2883       try {
2884          lower -= mat;
2885 
2886          std::ostringstream oss;
2887          oss << " Test: " << test_ << "\n"
2888              << " Error: Subtraction assignment of non-lower row-major matrix succeeded\n"
2889              << " Details:\n"
2890              << "   Result:\n" << lower << "\n";
2891          throw std::runtime_error( oss.str() );
2892       }
2893       catch( std::invalid_argument& ) {}
2894    }
2895 
2896    // Row-major/column-major dense matrix subtraction assignment (non-lower)
2897    {
2898       test_ = "Row-major/column-major LowerMatrix dense matrix subtraction assignment (non-lower)";
2899 
2900       blaze::DynamicMatrix<int,blaze::columnMajor> mat( 3UL, 3UL, 0 );
2901       mat(0,2) = 6;
2902 
2903       LT lower( 3UL );
2904       lower(0,0) =  1;
2905       lower(1,0) = -4;
2906       lower(1,1) =  2;
2907       lower(2,0) =  7;
2908       lower(2,2) =  3;
2909 
2910       try {
2911          lower -= mat;
2912 
2913          std::ostringstream oss;
2914          oss << " Test: " << test_ << "\n"
2915              << " Error: Subtraction assignment of non-lower column-major matrix succeeded\n"
2916              << " Details:\n"
2917              << "   Result:\n" << lower << "\n";
2918          throw std::runtime_error( oss.str() );
2919       }
2920       catch( std::invalid_argument& ) {}
2921    }
2922 
2923    // Row-major/row-major dense matrix subtraction assignment (LowerMatrix)
2924    {
2925       test_ = "Row-major/row-major LowerMatrix dense matrix subtraction assignment (LowerMatrix)";
2926 
2927       blaze::LowerMatrix< blaze::StaticMatrix<int,3UL,3UL,blaze::rowMajor> > lower1;
2928       lower1(1,0) = -2;
2929       lower1(1,1) =  2;
2930       lower1(2,0) =  6;
2931       lower1(2,1) =  5;
2932 
2933       LT lower2( 3UL );
2934       lower2(0,0) =  1;
2935       lower2(1,0) = -4;
2936       lower2(1,1) =  2;
2937       lower2(2,0) =  7;
2938       lower2(2,2) =  3;
2939 
2940       lower2 -= lower1;
2941 
2942       checkRows    ( lower2, 3UL );
2943       checkColumns ( lower2, 3UL );
2944       checkCapacity( lower2, 5UL );
2945       checkNonZeros( lower2, 5UL );
2946       checkNonZeros( lower2, 0UL, 1UL );
2947       checkNonZeros( lower2, 1UL, 1UL );
2948       checkNonZeros( lower2, 2UL, 3UL );
2949 
2950       if( lower2(0,0) !=  1 || lower2(0,1) !=  0 || lower2(0,2) != 0 ||
2951           lower2(1,0) != -2 || lower2(1,1) !=  0 || lower2(1,2) != 0 ||
2952           lower2(2,0) !=  1 || lower2(2,1) != -5 || lower2(2,2) != 3 ) {
2953          std::ostringstream oss;
2954          oss << " Test: " << test_ << "\n"
2955              << " Error: Subtraction assignment failed\n"
2956              << " Details:\n"
2957              << "   Result:\n" << lower2 << "\n"
2958              << "   Expected result:\n(  1  0  0 )\n( -2  0  0 )\n(  1 -5  3 )\n";
2959          throw std::runtime_error( oss.str() );
2960       }
2961    }
2962 
2963    // Row-major/column-major dense matrix subtraction assignment (LowerMatrix)
2964    {
2965       test_ = "Row-major/column-major LowerMatrix dense matrix subtraction assignment (LowerMatrix)";
2966 
2967       blaze::LowerMatrix< blaze::StaticMatrix<int,3UL,3UL,blaze::columnMajor> > lower1;
2968       lower1(1,0) = -2;
2969       lower1(1,1) =  2;
2970       lower1(2,0) =  6;
2971       lower1(2,1) =  5;
2972 
2973       LT lower2( 3UL );
2974       lower2(0,0) =  1;
2975       lower2(1,0) = -4;
2976       lower2(1,1) =  2;
2977       lower2(2,0) =  7;
2978       lower2(2,2) =  3;
2979 
2980       lower2 -= lower1;
2981 
2982       checkRows    ( lower2, 3UL );
2983       checkColumns ( lower2, 3UL );
2984       checkCapacity( lower2, 5UL );
2985       checkNonZeros( lower2, 5UL );
2986       checkNonZeros( lower2, 0UL, 1UL );
2987       checkNonZeros( lower2, 1UL, 1UL );
2988       checkNonZeros( lower2, 2UL, 3UL );
2989 
2990       if( lower2(0,0) !=  1 || lower2(0,1) !=  0 || lower2(0,2) != 0 ||
2991           lower2(1,0) != -2 || lower2(1,1) !=  0 || lower2(1,2) != 0 ||
2992           lower2(2,0) !=  1 || lower2(2,1) != -5 || lower2(2,2) != 3 ) {
2993          std::ostringstream oss;
2994          oss << " Test: " << test_ << "\n"
2995              << " Error: Subtraction assignment failed\n"
2996              << " Details:\n"
2997              << "   Result:\n" << lower2 << "\n"
2998              << "   Expected result:\n(  1  0  0 )\n( -2  0  0 )\n(  1 -5  3 )\n";
2999          throw std::runtime_error( oss.str() );
3000       }
3001    }
3002 
3003 
3004    //=====================================================================================
3005    // Row-major sparse matrix subtraction assignment
3006    //=====================================================================================
3007 
3008    // Row-major/row-major sparse matrix subtraction assignment (lower)
3009    {
3010       test_ = "Row-major/row-major LowerMatrix sparse matrix subtraction assignment (lower)";
3011 
3012       blaze::CompressedMatrix<int,blaze::rowMajor> mat( 3UL, 3UL, 5UL );
3013       mat(1,0) = -2;
3014       mat(1,1) =  2;
3015       mat(2,0) =  6;
3016       mat(2,1) =  5;
3017       mat.insert( 1UL, 2UL, 0 );
3018 
3019       LT lower( 3UL );
3020       lower(0,0) =  1;
3021       lower(1,0) = -4;
3022       lower(1,1) =  2;
3023       lower(2,0) =  7;
3024       lower(2,2) =  3;
3025 
3026       lower -= mat;
3027 
3028       checkRows    ( lower, 3UL );
3029       checkColumns ( lower, 3UL );
3030       checkCapacity( lower, 6UL );
3031       checkNonZeros( lower, 6UL );
3032       checkNonZeros( lower, 0UL, 1UL );
3033       checkNonZeros( lower, 1UL, 2UL );
3034       checkNonZeros( lower, 2UL, 3UL );
3035 
3036       if( lower(0,0) !=  1 || lower(0,1) !=  0 || lower(0,2) != 0 ||
3037           lower(1,0) != -2 || lower(1,1) !=  0 || lower(1,2) != 0 ||
3038           lower(2,0) !=  1 || lower(2,1) != -5 || lower(2,2) != 3 ) {
3039          std::ostringstream oss;
3040          oss << " Test: " << test_ << "\n"
3041              << " Error: Subtraction assignment failed\n"
3042              << " Details:\n"
3043              << "   Result:\n" << lower << "\n"
3044              << "   Expected result:\n(  1  0  0 )\n( -2  0  0 )\n(  1 -5  3 )\n";
3045          throw std::runtime_error( oss.str() );
3046       }
3047    }
3048 
3049    // Row-major/column-major sparse matrix subtraction assignment (lower)
3050    {
3051       test_ = "Row-major/column-major LowerMatrix sparse matrix subtraction assignment (lower)";
3052 
3053       blaze::CompressedMatrix<int,blaze::columnMajor> mat( 3UL, 3UL, 5UL );
3054       mat(1,0) = -2;
3055       mat(1,1) =  2;
3056       mat(2,0) =  6;
3057       mat(2,1) =  5;
3058       mat.insert( 1UL, 2UL, 0 );
3059 
3060       LT lower( 3UL );
3061       lower(0,0) =  1;
3062       lower(1,0) = -4;
3063       lower(1,1) =  2;
3064       lower(2,0) =  7;
3065       lower(2,2) =  3;
3066 
3067       lower -= mat;
3068 
3069       checkRows    ( lower, 3UL );
3070       checkColumns ( lower, 3UL );
3071       checkCapacity( lower, 6UL );
3072       checkNonZeros( lower, 6UL );
3073       checkNonZeros( lower, 0UL, 1UL );
3074       checkNonZeros( lower, 1UL, 2UL );
3075       checkNonZeros( lower, 2UL, 3UL );
3076 
3077       if( lower(0,0) !=  1 || lower(0,1) !=  0 || lower(0,2) != 0 ||
3078           lower(1,0) != -2 || lower(1,1) !=  0 || lower(1,2) != 0 ||
3079           lower(2,0) !=  1 || lower(2,1) != -5 || lower(2,2) != 3 ) {
3080          std::ostringstream oss;
3081          oss << " Test: " << test_ << "\n"
3082              << " Error: Subtraction assignment failed\n"
3083              << " Details:\n"
3084              << "   Result:\n" << lower << "\n"
3085              << "   Expected result:\n(  1  0  0 )\n( -2  0  0 )\n(  1 -5  3 )\n";
3086          throw std::runtime_error( oss.str() );
3087       }
3088    }
3089 
3090    // Row-major/row-major sparse matrix subtraction assignment (non-lower)
3091    {
3092       test_ = "Row-major/row-major LowerMatrix sparse matrix subtraction assignment (non-lower)";
3093 
3094       blaze::CompressedMatrix<int,blaze::rowMajor> mat( 3UL, 3UL, 1UL );
3095       mat(0,2) = 6;
3096 
3097       LT lower( 3UL );
3098       lower(0,0) =  1;
3099       lower(1,0) = -4;
3100       lower(1,1) =  2;
3101       lower(2,0) =  7;
3102       lower(2,2) =  3;
3103 
3104       try {
3105          lower -= mat;
3106 
3107          std::ostringstream oss;
3108          oss << " Test: " << test_ << "\n"
3109              << " Error: Subtraction assignment of non-lower row-major matrix succeeded\n"
3110              << " Details:\n"
3111              << "   Result:\n" << lower << "\n";
3112          throw std::runtime_error( oss.str() );
3113       }
3114       catch( std::invalid_argument& ) {}
3115    }
3116 
3117    // Row-major/column-major sparse matrix subtraction assignment (non-lower)
3118    {
3119       test_ = "Row-major/column-major LowerMatrix sparse matrix subtraction assignment (non-lower)";
3120 
3121       blaze::CompressedMatrix<int,blaze::columnMajor> mat( 3UL, 3UL, 1UL );
3122       mat(0,2) = 6;
3123 
3124       LT lower( 3UL );
3125       lower(0,0) =  1;
3126       lower(1,0) = -4;
3127       lower(1,1) =  2;
3128       lower(2,0) =  7;
3129       lower(2,2) =  3;
3130 
3131       try {
3132          lower -= mat;
3133 
3134          std::ostringstream oss;
3135          oss << " Test: " << test_ << "\n"
3136              << " Error: Subtraction assignment of non-lower column-major matrix succeeded\n"
3137              << " Details:\n"
3138              << "   Result:\n" << lower << "\n";
3139          throw std::runtime_error( oss.str() );
3140       }
3141       catch( std::invalid_argument& ) {}
3142    }
3143 
3144    // Row-major/row-major sparse matrix subtraction assignment (LowerMatrix)
3145    {
3146       test_ = "Row-major/row-major LowerMatrix sparse matrix subtraction assignment (LowerMatrix)";
3147 
3148       LT lower1( 3UL, 4UL );
3149       lower1(1,0) = -2;
3150       lower1(1,1) =  2;
3151       lower1(2,0) =  6;
3152       lower1(2,1) =  5;
3153 
3154       LT lower2( 3UL );
3155       lower2(0,0) =  1;
3156       lower2(1,0) = -4;
3157       lower2(1,1) =  2;
3158       lower2(2,0) =  7;
3159       lower2(2,2) =  3;
3160 
3161       lower2 -= lower1;
3162 
3163       checkRows    ( lower2, 3UL );
3164       checkColumns ( lower2, 3UL );
3165       checkCapacity( lower2, 6UL );
3166       checkNonZeros( lower2, 6UL );
3167       checkNonZeros( lower2, 0UL, 1UL );
3168       checkNonZeros( lower2, 1UL, 2UL );
3169       checkNonZeros( lower2, 2UL, 3UL );
3170 
3171       if( lower2(0,0) !=  1 || lower2(0,1) !=  0 || lower2(0,2) != 0 ||
3172           lower2(1,0) != -2 || lower2(1,1) !=  0 || lower2(1,2) != 0 ||
3173           lower2(2,0) !=  1 || lower2(2,1) != -5 || lower2(2,2) != 3 ) {
3174          std::ostringstream oss;
3175          oss << " Test: " << test_ << "\n"
3176              << " Error: Subtraction assignment failed\n"
3177              << " Details:\n"
3178              << "   Result:\n" << lower2 << "\n"
3179              << "   Expected result:\n(  1  0  0 )\n( -2  0  0 )\n(  1 -5  3 )\n";
3180          throw std::runtime_error( oss.str() );
3181       }
3182    }
3183 
3184    // Row-major/column-major sparse matrix subtraction assignment (LowerMatrix)
3185    {
3186       test_ = "Row-major/column-major LowerMatrix sparse matrix subtraction assignment (LowerMatrix)";
3187 
3188       OLT lower1( 3UL, 4UL );
3189       lower1(1,0) = -2;
3190       lower1(1,1) =  2;
3191       lower1(2,0) =  6;
3192       lower1(2,1) =  5;
3193 
3194       LT lower2( 3UL );
3195       lower2(0,0) =  1;
3196       lower2(1,0) = -4;
3197       lower2(1,1) =  2;
3198       lower2(2,0) =  7;
3199       lower2(2,2) =  3;
3200 
3201       lower2 -= lower1;
3202 
3203       checkRows    ( lower2, 3UL );
3204       checkColumns ( lower2, 3UL );
3205       checkCapacity( lower2, 6UL );
3206       checkNonZeros( lower2, 6UL );
3207       checkNonZeros( lower2, 0UL, 1UL );
3208       checkNonZeros( lower2, 1UL, 2UL );
3209       checkNonZeros( lower2, 2UL, 3UL );
3210 
3211       if( lower2(0,0) !=  1 || lower2(0,1) !=  0 || lower2(0,2) != 0 ||
3212           lower2(1,0) != -2 || lower2(1,1) !=  0 || lower2(1,2) != 0 ||
3213           lower2(2,0) !=  1 || lower2(2,1) != -5 || lower2(2,2) != 3 ) {
3214          std::ostringstream oss;
3215          oss << " Test: " << test_ << "\n"
3216              << " Error: Subtraction assignment failed\n"
3217              << " Details:\n"
3218              << "   Result:\n" << lower2 << "\n"
3219              << "   Expected result:\n(  1  0  0 )\n( -2  0  0 )\n(  1 -5  3 )\n";
3220          throw std::runtime_error( oss.str() );
3221       }
3222    }
3223 
3224 
3225    //=====================================================================================
3226    // Column-major dense matrix subtraction assignment
3227    //=====================================================================================
3228 
3229    // Column-major/row-major dense matrix subtraction assignment (lower)
3230    {
3231       test_ = "Column-major/row-major LowerMatrix dense matrix subtraction assignment (lower)";
3232 
3233       blaze::DynamicMatrix<int,blaze::rowMajor> mat( 3UL, 3UL, 0 );
3234       mat(1,0) = -2;
3235       mat(1,1) =  2;
3236       mat(2,0) =  6;
3237       mat(2,1) =  5;
3238 
3239       OLT lower( 3UL );
3240       lower(0,0) =  1;
3241       lower(1,0) = -4;
3242       lower(1,1) =  2;
3243       lower(2,0) =  7;
3244       lower(2,2) =  3;
3245 
3246       lower -= mat;
3247 
3248       checkRows    ( lower, 3UL );
3249       checkColumns ( lower, 3UL );
3250       checkCapacity( lower, 5UL );
3251       checkNonZeros( lower, 5UL );
3252       checkNonZeros( lower, 0UL, 3UL );
3253       checkNonZeros( lower, 1UL, 1UL );
3254       checkNonZeros( lower, 2UL, 1UL );
3255 
3256       if( lower(0,0) !=  1 || lower(0,1) !=  0 || lower(0,2) != 0 ||
3257           lower(1,0) != -2 || lower(1,1) !=  0 || lower(1,2) != 0 ||
3258           lower(2,0) !=  1 || lower(2,1) != -5 || lower(2,2) != 3 ) {
3259          std::ostringstream oss;
3260          oss << " Test: " << test_ << "\n"
3261              << " Error: Subtraction assignment failed\n"
3262              << " Details:\n"
3263              << "   Result:\n" << lower << "\n"
3264              << "   Expected result:\n(  1  0  0 )\n( -2  0  0 )\n(  1 -5  3 )\n";
3265          throw std::runtime_error( oss.str() );
3266       }
3267    }
3268 
3269    // Column-major/column-major dense matrix subtraction assignment (lower)
3270    {
3271       test_ = "Column-major/column-major LowerMatrix dense matrix subtraction assignment (lower)";
3272 
3273       blaze::DynamicMatrix<int,blaze::columnMajor> mat( 3UL, 3UL, 0 );
3274       mat(1,0) = -2;
3275       mat(1,1) =  2;
3276       mat(2,0) =  6;
3277       mat(2,1) =  5;
3278 
3279       OLT lower( 3UL );
3280       lower(0,0) =  1;
3281       lower(1,0) = -4;
3282       lower(1,1) =  2;
3283       lower(2,0) =  7;
3284       lower(2,2) =  3;
3285 
3286       lower -= mat;
3287 
3288       checkRows    ( lower, 3UL );
3289       checkColumns ( lower, 3UL );
3290       checkCapacity( lower, 5UL );
3291       checkNonZeros( lower, 5UL );
3292       checkNonZeros( lower, 0UL, 3UL );
3293       checkNonZeros( lower, 1UL, 1UL );
3294       checkNonZeros( lower, 2UL, 1UL );
3295 
3296       if( lower(0,0) !=  1 || lower(0,1) !=  0 || lower(0,2) != 0 ||
3297           lower(1,0) != -2 || lower(1,1) !=  0 || lower(1,2) != 0 ||
3298           lower(2,0) !=  1 || lower(2,1) != -5 || lower(2,2) != 3 ) {
3299          std::ostringstream oss;
3300          oss << " Test: " << test_ << "\n"
3301              << " Error: Subtraction assignment failed\n"
3302              << " Details:\n"
3303              << "   Result:\n" << lower << "\n"
3304              << "   Expected result:\n(  1  0  0 )\n( -2  0  0 )\n(  1 -5  3 )\n";
3305          throw std::runtime_error( oss.str() );
3306       }
3307    }
3308 
3309    // Column-major/row-major dense matrix subtraction assignment (non-lower)
3310    {
3311       test_ = "Column-major/row-major LowerMatrix dense matrix subtraction assignment (non-lower)";
3312 
3313       blaze::DynamicMatrix<int,blaze::rowMajor> mat( 3UL, 3UL, 0 );
3314       mat(0,2) = 6;
3315 
3316       OLT lower( 3UL );
3317       lower(0,0) =  1;
3318       lower(1,0) = -4;
3319       lower(1,1) =  2;
3320       lower(2,0) =  7;
3321       lower(2,2) =  3;
3322 
3323       try {
3324          lower -= mat;
3325 
3326          std::ostringstream oss;
3327          oss << " Test: " << test_ << "\n"
3328              << " Error: Subtraction assignment of non-lower row-major matrix succeeded\n"
3329              << " Details:\n"
3330              << "   Result:\n" << lower << "\n";
3331          throw std::runtime_error( oss.str() );
3332       }
3333       catch( std::invalid_argument& ) {}
3334    }
3335 
3336    // Column-major/column-major dense matrix subtraction assignment (non-lower)
3337    {
3338       test_ = "Column-major/column-major LowerMatrix dense matrix subtraction assignment (non-lower)";
3339 
3340       blaze::DynamicMatrix<int,blaze::columnMajor> mat( 3UL, 3UL, 0 );
3341       mat(0,2) = 6;
3342 
3343       OLT lower( 3UL );
3344       lower(0,0) =  1;
3345       lower(1,0) = -4;
3346       lower(1,1) =  2;
3347       lower(2,0) =  7;
3348       lower(2,2) =  3;
3349 
3350       try {
3351          lower -= mat;
3352 
3353          std::ostringstream oss;
3354          oss << " Test: " << test_ << "\n"
3355              << " Error: Subtraction assignment of non-lower column-major matrix succeeded\n"
3356              << " Details:\n"
3357              << "   Result:\n" << lower << "\n";
3358          throw std::runtime_error( oss.str() );
3359       }
3360       catch( std::invalid_argument& ) {}
3361    }
3362 
3363    // Column-major/row-major dense matrix subtraction assignment (LowerMatrix)
3364    {
3365       test_ = "Column-major/row-major LowerMatrix dense matrix subtraction assignment (LowerMatrix)";
3366 
3367       blaze::LowerMatrix< blaze::StaticMatrix<int,3UL,3UL,blaze::rowMajor> > lower1;
3368       lower1(1,0) = -2;
3369       lower1(1,1) =  2;
3370       lower1(2,0) =  6;
3371       lower1(2,1) =  5;
3372 
3373       OLT lower2( 3UL );
3374       lower2(0,0) =  1;
3375       lower2(1,0) = -4;
3376       lower2(1,1) =  2;
3377       lower2(2,0) =  7;
3378       lower2(2,2) =  3;
3379 
3380       lower2 -= lower1;
3381 
3382       checkRows    ( lower2, 3UL );
3383       checkColumns ( lower2, 3UL );
3384       checkCapacity( lower2, 5UL );
3385       checkNonZeros( lower2, 5UL );
3386       checkNonZeros( lower2, 0UL, 3UL );
3387       checkNonZeros( lower2, 1UL, 1UL );
3388       checkNonZeros( lower2, 2UL, 1UL );
3389 
3390       if( lower2(0,0) !=  1 || lower2(0,1) !=  0 || lower2(0,2) != 0 ||
3391           lower2(1,0) != -2 || lower2(1,1) !=  0 || lower2(1,2) != 0 ||
3392           lower2(2,0) !=  1 || lower2(2,1) != -5 || lower2(2,2) != 3 ) {
3393          std::ostringstream oss;
3394          oss << " Test: " << test_ << "\n"
3395              << " Error: Subtraction assignment failed\n"
3396              << " Details:\n"
3397              << "   Result:\n" << lower2 << "\n"
3398              << "   Expected result:\n(  1  0  0 )\n( -2  0  0 )\n(  1 -5  3 )\n";
3399          throw std::runtime_error( oss.str() );
3400       }
3401    }
3402 
3403    // Column-major/column-major dense matrix subtraction assignment (LowerMatrix)
3404    {
3405       test_ = "Column-major/column-major LowerMatrix dense matrix subtraction assignment (LowerMatrix)";
3406 
3407       blaze::LowerMatrix< blaze::StaticMatrix<int,3UL,3UL,blaze::columnMajor> > lower1;
3408       lower1(1,0) = -2;
3409       lower1(1,1) =  2;
3410       lower1(2,0) =  6;
3411       lower1(2,1) =  5;
3412 
3413       OLT lower2( 3UL );
3414       lower2(0,0) =  1;
3415       lower2(1,0) = -4;
3416       lower2(1,1) =  2;
3417       lower2(2,0) =  7;
3418       lower2(2,2) =  3;
3419 
3420       lower2 -= lower1;
3421 
3422       checkRows    ( lower2, 3UL );
3423       checkColumns ( lower2, 3UL );
3424       checkCapacity( lower2, 5UL );
3425       checkNonZeros( lower2, 5UL );
3426       checkNonZeros( lower2, 0UL, 3UL );
3427       checkNonZeros( lower2, 1UL, 1UL );
3428       checkNonZeros( lower2, 2UL, 1UL );
3429 
3430       if( lower2(0,0) !=  1 || lower2(0,1) !=  0 || lower2(0,2) != 0 ||
3431           lower2(1,0) != -2 || lower2(1,1) !=  0 || lower2(1,2) != 0 ||
3432           lower2(2,0) !=  1 || lower2(2,1) != -5 || lower2(2,2) != 3 ) {
3433          std::ostringstream oss;
3434          oss << " Test: " << test_ << "\n"
3435              << " Error: Subtraction assignment failed\n"
3436              << " Details:\n"
3437              << "   Result:\n" << lower2 << "\n"
3438              << "   Expected result:\n(  1  0  0 )\n( -2  0  0 )\n(  1 -5  3 )\n";
3439          throw std::runtime_error( oss.str() );
3440       }
3441    }
3442 
3443 
3444    //=====================================================================================
3445    // Column-major sparse matrix subtraction assignment
3446    //=====================================================================================
3447 
3448    // Column-major/row-major sparse matrix subtraction assignment (lower)
3449    {
3450       test_ = "Column-major/row-major LowerMatrix sparse matrix subtraction assignment (lower)";
3451 
3452       blaze::CompressedMatrix<int,blaze::rowMajor> mat( 3UL, 3UL, 5UL );
3453       mat(1,0) = -2;
3454       mat(1,1) =  2;
3455       mat(2,0) =  6;
3456       mat(2,1) =  5;
3457       mat.insert( 1UL, 2UL, 0 );
3458 
3459       OLT lower( 3UL );
3460       lower(0,0) =  1;
3461       lower(1,0) = -4;
3462       lower(1,1) =  2;
3463       lower(2,0) =  7;
3464       lower(2,2) =  3;
3465 
3466       lower -= mat;
3467 
3468       checkRows    ( lower, 3UL );
3469       checkColumns ( lower, 3UL );
3470       checkCapacity( lower, 6UL );
3471       checkNonZeros( lower, 6UL );
3472       checkNonZeros( lower, 0UL, 3UL );
3473       checkNonZeros( lower, 1UL, 2UL );
3474       checkNonZeros( lower, 2UL, 1UL );
3475 
3476       if( lower(0,0) !=  1 || lower(0,1) !=  0 || lower(0,2) != 0 ||
3477           lower(1,0) != -2 || lower(1,1) !=  0 || lower(1,2) != 0 ||
3478           lower(2,0) !=  1 || lower(2,1) != -5 || lower(2,2) != 3 ) {
3479          std::ostringstream oss;
3480          oss << " Test: " << test_ << "\n"
3481              << " Error: Subtraction assignment failed\n"
3482              << " Details:\n"
3483              << "   Result:\n" << lower << "\n"
3484              << "   Expected result:\n(  1  0  0 )\n( -2  0  0 )\n(  1 -5  3 )\n";
3485          throw std::runtime_error( oss.str() );
3486       }
3487    }
3488 
3489    // Column-major/column-major sparse matrix subtraction assignment (lower)
3490    {
3491       test_ = "Column-major/column-major LowerMatrix sparse matrix subtraction assignment (lower)";
3492 
3493       blaze::CompressedMatrix<int,blaze::columnMajor> mat( 3UL, 3UL, 5UL );
3494       mat(1,0) = -2;
3495       mat(1,1) =  2;
3496       mat(2,0) =  6;
3497       mat(2,1) =  5;
3498       mat.insert( 1UL, 2UL, 0 );
3499 
3500       OLT lower( 3UL );
3501       lower(0,0) =  1;
3502       lower(1,0) = -4;
3503       lower(1,1) =  2;
3504       lower(2,0) =  7;
3505       lower(2,2) =  3;
3506 
3507       lower -= mat;
3508 
3509       checkRows    ( lower, 3UL );
3510       checkColumns ( lower, 3UL );
3511       checkCapacity( lower, 6UL );
3512       checkNonZeros( lower, 6UL );
3513       checkNonZeros( lower, 0UL, 3UL );
3514       checkNonZeros( lower, 1UL, 2UL );
3515       checkNonZeros( lower, 2UL, 1UL );
3516 
3517       if( lower(0,0) !=  1 || lower(0,1) !=  0 || lower(0,2) != 0 ||
3518           lower(1,0) != -2 || lower(1,1) !=  0 || lower(1,2) != 0 ||
3519           lower(2,0) !=  1 || lower(2,1) != -5 || lower(2,2) != 3 ) {
3520          std::ostringstream oss;
3521          oss << " Test: " << test_ << "\n"
3522              << " Error: Subtraction assignment failed\n"
3523              << " Details:\n"
3524              << "   Result:\n" << lower << "\n"
3525              << "   Expected result:\n(  1  0  0 )\n( -2  0  0 )\n(  1 -5  3 )\n";
3526          throw std::runtime_error( oss.str() );
3527       }
3528    }
3529 
3530    // Column-major/row-major sparse matrix subtraction assignment (non-lower)
3531    {
3532       test_ = "Column-major/row-major LowerMatrix sparse matrix subtraction assignment (non-lower)";
3533 
3534       blaze::CompressedMatrix<int,blaze::rowMajor> mat( 3UL, 3UL, 1UL );
3535       mat(0,2) = 6;
3536 
3537       OLT lower( 3UL );
3538       lower(0,0) =  1;
3539       lower(1,0) = -4;
3540       lower(1,1) =  2;
3541       lower(2,0) =  7;
3542       lower(2,2) =  3;
3543 
3544       try {
3545          lower -= mat;
3546 
3547          std::ostringstream oss;
3548          oss << " Test: " << test_ << "\n"
3549              << " Error: Subtraction assignment of non-lower row-major matrix succeeded\n"
3550              << " Details:\n"
3551              << "   Result:\n" << lower << "\n";
3552          throw std::runtime_error( oss.str() );
3553       }
3554       catch( std::invalid_argument& ) {}
3555    }
3556 
3557    // Column-major/column-major sparse matrix subtraction assignment (non-lower)
3558    {
3559       test_ = "Column-major/column-major LowerMatrix sparse matrix subtraction assignment (non-lower)";
3560 
3561       blaze::CompressedMatrix<int,blaze::columnMajor> mat( 3UL, 3UL, 1UL );
3562       mat(0,2) = 6;
3563 
3564       OLT lower( 3UL );
3565       lower(0,0) =  1;
3566       lower(1,0) = -4;
3567       lower(1,1) =  2;
3568       lower(2,0) =  7;
3569       lower(2,2) =  3;
3570 
3571       try {
3572          lower -= mat;
3573 
3574          std::ostringstream oss;
3575          oss << " Test: " << test_ << "\n"
3576              << " Error: Subtraction assignment of non-lower column-major matrix succeeded\n"
3577              << " Details:\n"
3578              << "   Result:\n" << lower << "\n";
3579          throw std::runtime_error( oss.str() );
3580       }
3581       catch( std::invalid_argument& ) {}
3582    }
3583 
3584    // Column-major/row-major sparse matrix subtraction assignment (LowerMatrix)
3585    {
3586       test_ = "Column-major/row-major LowerMatrix sparse matrix subtraction assignment (LowerMatrix)";
3587 
3588       LT lower1( 3UL, 4UL );
3589       lower1(1,0) = -2;
3590       lower1(1,1) =  2;
3591       lower1(2,0) =  6;
3592       lower1(2,1) =  5;
3593 
3594       OLT lower2( 3UL );
3595       lower2(0,0) =  1;
3596       lower2(1,0) = -4;
3597       lower2(1,1) =  2;
3598       lower2(2,0) =  7;
3599       lower2(2,2) =  3;
3600 
3601       lower2 -= lower1;
3602 
3603       checkRows    ( lower2, 3UL );
3604       checkColumns ( lower2, 3UL );
3605       checkCapacity( lower2, 6UL );
3606       checkNonZeros( lower2, 6UL );
3607       checkNonZeros( lower2, 0UL, 3UL );
3608       checkNonZeros( lower2, 1UL, 2UL );
3609       checkNonZeros( lower2, 2UL, 1UL );
3610 
3611       if( lower2(0,0) !=  1 || lower2(0,1) !=  0 || lower2(0,2) != 0 ||
3612           lower2(1,0) != -2 || lower2(1,1) !=  0 || lower2(1,2) != 0 ||
3613           lower2(2,0) !=  1 || lower2(2,1) != -5 || lower2(2,2) != 3 ) {
3614          std::ostringstream oss;
3615          oss << " Test: " << test_ << "\n"
3616              << " Error: Subtraction assignment failed\n"
3617              << " Details:\n"
3618              << "   Result:\n" << lower2 << "\n"
3619              << "   Expected result:\n(  1  0  0 )\n( -2  0  0 )\n(  1 -5  3 )\n";
3620          throw std::runtime_error( oss.str() );
3621       }
3622    }
3623 
3624    // Column-major/column-major sparse matrix subtraction assignment (LowerMatrix)
3625    {
3626       test_ = "Column-major/column-major LowerMatrix sparse matrix subtraction assignment (LowerMatrix)";
3627 
3628       OLT lower1( 3UL, 4UL );
3629       lower1(1,0) = -2;
3630       lower1(1,1) =  2;
3631       lower1(2,0) =  6;
3632       lower1(2,1) =  5;
3633 
3634       OLT lower2( 3UL );
3635       lower2(0,0) =  1;
3636       lower2(1,0) = -4;
3637       lower2(1,1) =  2;
3638       lower2(2,0) =  7;
3639       lower2(2,2) =  3;
3640 
3641       lower2 -= lower1;
3642 
3643       checkRows    ( lower2, 3UL );
3644       checkColumns ( lower2, 3UL );
3645       checkCapacity( lower2, 6UL );
3646       checkNonZeros( lower2, 6UL );
3647       checkNonZeros( lower2, 0UL, 3UL );
3648       checkNonZeros( lower2, 1UL, 2UL );
3649       checkNonZeros( lower2, 2UL, 1UL );
3650 
3651       if( lower2(0,0) !=  1 || lower2(0,1) !=  0 || lower2(0,2) != 0 ||
3652           lower2(1,0) != -2 || lower2(1,1) !=  0 || lower2(1,2) != 0 ||
3653           lower2(2,0) !=  1 || lower2(2,1) != -5 || lower2(2,2) != 3 ) {
3654          std::ostringstream oss;
3655          oss << " Test: " << test_ << "\n"
3656              << " Error: Subtraction assignment failed\n"
3657              << " Details:\n"
3658              << "   Result:\n" << lower2 << "\n"
3659              << "   Expected result:\n(  1  0  0 )\n( -2  0  0 )\n(  1 -5  3 )\n";
3660          throw std::runtime_error( oss.str() );
3661       }
3662    }
3663 }
3664 //*************************************************************************************************
3665 
3666 
3667 //*************************************************************************************************
3668 /*!\brief Test of the LowerMatrix Schur product assignment operators.
3669 //
3670 // \return void
3671 // \exception std::runtime_error Error detected.
3672 //
3673 // This function performs a test of the Schur product assignment operators of the LowerMatrix
3674 // specialization. In case an error is detected, a \a std::runtime_error exception is thrown.
3675 */
testSchurAssign()3676 void SparseTest::testSchurAssign()
3677 {
3678    //=====================================================================================
3679    // Row-major dense matrix Schur product assignment
3680    //=====================================================================================
3681 
3682    // Row-major/row-major dense matrix Schur product assignment (general)
3683    {
3684       test_ = "Row-major/row-major LowerMatrix dense matrix Schur product assignment (general)";
3685 
3686       blaze::DynamicMatrix<int,blaze::rowMajor> mat{ { 2, 0, 9 }, { 0, -2, 0 }, { 3, 5, 0 } };
3687 
3688       LT lower( 3UL );
3689       lower(0,0) =  1;
3690       lower(1,0) = -4;
3691       lower(1,1) =  2;
3692       lower(2,0) =  7;
3693       lower(2,2) =  3;
3694 
3695       lower %= mat;
3696 
3697       checkRows    ( lower, 3UL );
3698       checkColumns ( lower, 3UL );
3699       checkCapacity( lower, 5UL );
3700       checkNonZeros( lower, 5UL );
3701       checkNonZeros( lower, 0UL, 1UL );
3702       checkNonZeros( lower, 1UL, 2UL );
3703       checkNonZeros( lower, 2UL, 2UL );
3704 
3705       if( lower(0,0) !=  2 || lower(0,1) !=  0 || lower(0,2) != 0 ||
3706           lower(1,0) !=  0 || lower(1,1) != -4 || lower(1,2) != 0 ||
3707           lower(2,0) != 21 || lower(2,1) !=  0 || lower(2,2) != 0 ) {
3708          std::ostringstream oss;
3709          oss << " Test: " << test_ << "\n"
3710              << " Error: Schur product assignment failed\n"
3711              << " Details:\n"
3712              << "   Result:\n" << lower << "\n"
3713              << "   Expected result:\n(  2  0  0 )\n(  0 -4  0 )\n( 21  0  0 )\n";
3714          throw std::runtime_error( oss.str() );
3715       }
3716    }
3717 
3718    // Row-major/column-major dense matrix Schur product assignment (general)
3719    {
3720       test_ = "Row-major/column-major LowerMatrix dense matrix Schur product assignment (general)";
3721 
3722       blaze::DynamicMatrix<int,blaze::columnMajor> mat{ { 2, 0, 9 }, { 0, -2, 0 }, { 3, 5, 0 } };
3723 
3724       LT lower( 3UL );
3725       lower(0,0) =  1;
3726       lower(1,0) = -4;
3727       lower(1,1) =  2;
3728       lower(2,0) =  7;
3729       lower(2,2) =  3;
3730 
3731       lower %= mat;
3732 
3733       checkRows    ( lower, 3UL );
3734       checkColumns ( lower, 3UL );
3735       checkCapacity( lower, 5UL );
3736       checkNonZeros( lower, 5UL );
3737       checkNonZeros( lower, 0UL, 1UL );
3738       checkNonZeros( lower, 1UL, 2UL );
3739       checkNonZeros( lower, 2UL, 2UL );
3740 
3741       if( lower(0,0) !=  2 || lower(0,1) !=  0 || lower(0,2) != 0 ||
3742           lower(1,0) !=  0 || lower(1,1) != -4 || lower(1,2) != 0 ||
3743           lower(2,0) != 21 || lower(2,1) !=  0 || lower(2,2) != 0 ) {
3744          std::ostringstream oss;
3745          oss << " Test: " << test_ << "\n"
3746              << " Error: Schur product assignment failed\n"
3747              << " Details:\n"
3748              << "   Result:\n" << lower << "\n"
3749              << "   Expected result:\n(  2  0  0 )\n(  0 -4  0 )\n( 21  0  0 )\n";
3750          throw std::runtime_error( oss.str() );
3751       }
3752    }
3753 
3754    // Row-major/row-major dense matrix Schur product assignment (LowerMatrix)
3755    {
3756       test_ = "Row-major/row-major LowerMatrix dense matrix Schur product assignment (LowerMatrix)";
3757 
3758       blaze::LowerMatrix< blaze::StaticMatrix<int,3UL,3UL,blaze::rowMajor> > lower1;
3759       lower1(0,0) =  2;
3760       lower1(1,1) = -2;
3761       lower1(2,0) =  3;
3762       lower1(2,1) =  5;
3763 
3764       LT lower2( 3UL );
3765       lower2(0,0) =  1;
3766       lower2(1,0) = -4;
3767       lower2(1,1) =  2;
3768       lower2(2,0) =  7;
3769       lower2(2,2) =  3;
3770 
3771       lower2 %= lower1;
3772 
3773       checkRows    ( lower2, 3UL );
3774       checkColumns ( lower2, 3UL );
3775       checkCapacity( lower2, 5UL );
3776       checkNonZeros( lower2, 5UL );
3777       checkNonZeros( lower2, 0UL, 1UL );
3778       checkNonZeros( lower2, 1UL, 2UL );
3779       checkNonZeros( lower2, 2UL, 2UL );
3780 
3781       if( lower2(0,0) !=  2 || lower2(0,1) !=  0 || lower2(0,2) != 0 ||
3782           lower2(1,0) !=  0 || lower2(1,1) != -4 || lower2(1,2) != 0 ||
3783           lower2(2,0) != 21 || lower2(2,1) !=  0 || lower2(2,2) != 0 ) {
3784          std::ostringstream oss;
3785          oss << " Test: " << test_ << "\n"
3786              << " Error: Schur product assignment failed\n"
3787              << " Details:\n"
3788              << "   Result:\n" << lower2 << "\n"
3789              << "   Expected result:\n(  2  0  0 )\n(  0 -4  0 )\n( 21  0  0 )\n";
3790          throw std::runtime_error( oss.str() );
3791       }
3792    }
3793 
3794    // Row-major/column-major dense matrix Schur product assignment (LowerMatrix)
3795    {
3796       test_ = "Row-major/column-major LowerMatrix dense matrix Schur product assignment (LowerMatrix)";
3797 
3798       blaze::LowerMatrix< blaze::StaticMatrix<int,3UL,3UL,blaze::columnMajor> > lower1;
3799       lower1(0,0) =  2;
3800       lower1(1,1) = -2;
3801       lower1(2,0) =  3;
3802       lower1(2,1) =  5;
3803 
3804       LT lower2( 3UL );
3805       lower2(0,0) =  1;
3806       lower2(1,0) = -4;
3807       lower2(1,1) =  2;
3808       lower2(2,0) =  7;
3809       lower2(2,2) =  3;
3810 
3811       lower2 %= lower1;
3812 
3813       checkRows    ( lower2, 3UL );
3814       checkColumns ( lower2, 3UL );
3815       checkCapacity( lower2, 5UL );
3816       checkNonZeros( lower2, 5UL );
3817       checkNonZeros( lower2, 0UL, 1UL );
3818       checkNonZeros( lower2, 1UL, 2UL );
3819       checkNonZeros( lower2, 2UL, 2UL );
3820 
3821       if( lower2(0,0) !=  2 || lower2(0,1) !=  0 || lower2(0,2) != 0 ||
3822           lower2(1,0) !=  0 || lower2(1,1) != -4 || lower2(1,2) != 0 ||
3823           lower2(2,0) != 21 || lower2(2,1) !=  0 || lower2(2,2) != 0 ) {
3824          std::ostringstream oss;
3825          oss << " Test: " << test_ << "\n"
3826              << " Error: Schur product assignment failed\n"
3827              << " Details:\n"
3828              << "   Result:\n" << lower2 << "\n"
3829              << "   Expected result:\n(  2  0  0 )\n(  0 -4  0 )\n( 21  0  0 )\n";
3830          throw std::runtime_error( oss.str() );
3831       }
3832    }
3833 
3834 
3835    //=====================================================================================
3836    // Row-major sparse matrix Schur product assignment
3837    //=====================================================================================
3838 
3839    // Row-major/row-major sparse matrix Schur product assignment (general)
3840    {
3841       test_ = "Row-major/row-major LowerMatrix sparse matrix Schur product assignment (general)";
3842 
3843       blaze::CompressedMatrix<int,blaze::rowMajor> mat( 3UL, 3UL, 5UL );
3844       mat(0,0) =  2;
3845       mat(0,2) =  9;
3846       mat(1,1) = -2;
3847       mat(2,0) =  3;
3848       mat(2,1) =  5;
3849       mat.insert( 1UL, 2UL, 0 );
3850 
3851       LT lower( 3UL );
3852       lower(0,0) =  1;
3853       lower(1,0) = -4;
3854       lower(1,1) =  2;
3855       lower(2,0) =  7;
3856       lower(2,2) =  3;
3857 
3858       lower %= mat;
3859 
3860       checkRows    ( lower, 3UL );
3861       checkColumns ( lower, 3UL );
3862       checkCapacity( lower, 5UL );
3863       checkNonZeros( lower, 3UL );
3864       checkNonZeros( lower, 0UL, 1UL );
3865       checkNonZeros( lower, 1UL, 1UL );
3866       checkNonZeros( lower, 2UL, 1UL );
3867 
3868       if( lower(0,0) !=  2 || lower(0,1) !=  0 || lower(0,2) != 0 ||
3869           lower(1,0) !=  0 || lower(1,1) != -4 || lower(1,2) != 0 ||
3870           lower(2,0) != 21 || lower(2,1) !=  0 || lower(2,2) != 0 ) {
3871          std::ostringstream oss;
3872          oss << " Test: " << test_ << "\n"
3873              << " Error: Schur product assignment failed\n"
3874              << " Details:\n"
3875              << "   Result:\n" << lower << "\n"
3876              << "   Expected result:\n(  2  0  0 )\n(  0 -4  0 )\n( 21  0  0 )\n";
3877          throw std::runtime_error( oss.str() );
3878       }
3879    }
3880 
3881    // Row-major/column-major sparse matrix Schur product assignment (general)
3882    {
3883       test_ = "Row-major/column-major LowerMatrix sparse matrix Schur product assignment (general)";
3884 
3885       blaze::CompressedMatrix<int,blaze::columnMajor> mat( 3UL, 3UL, 6UL );
3886       mat(0,0) =  2;
3887       mat(0,2) =  9;
3888       mat(1,1) = -2;
3889       mat(2,0) =  3;
3890       mat(2,1) =  5;
3891       mat.insert( 1UL, 2UL, 0 );
3892 
3893       LT lower( 3UL );
3894       lower(0,0) =  1;
3895       lower(1,0) = -4;
3896       lower(1,1) =  2;
3897       lower(2,0) =  7;
3898       lower(2,2) =  3;
3899 
3900       lower %= mat;
3901 
3902       checkRows    ( lower, 3UL );
3903       checkColumns ( lower, 3UL );
3904       checkCapacity( lower, 5UL );
3905       checkNonZeros( lower, 3UL );
3906       checkNonZeros( lower, 0UL, 1UL );
3907       checkNonZeros( lower, 1UL, 1UL );
3908       checkNonZeros( lower, 2UL, 1UL );
3909 
3910       if( lower(0,0) !=  2 || lower(0,1) !=  0 || lower(0,2) != 0 ||
3911           lower(1,0) !=  0 || lower(1,1) != -4 || lower(1,2) != 0 ||
3912           lower(2,0) != 21 || lower(2,1) !=  0 || lower(2,2) != 0 ) {
3913          std::ostringstream oss;
3914          oss << " Test: " << test_ << "\n"
3915              << " Error: Schur product assignment failed\n"
3916              << " Details:\n"
3917              << "   Result:\n" << lower << "\n"
3918              << "   Expected result:\n(  2  0  0 )\n(  0 -4  0 )\n( 21  0  0 )\n";
3919          throw std::runtime_error( oss.str() );
3920       }
3921    }
3922 
3923    // Row-major/row-major sparse matrix Schur product assignment (LowerMatrix)
3924    {
3925       test_ = "Row-major/row-major LowerMatrix sparse matrix Schur product assignment (LowerMatrix)";
3926 
3927       LT lower1( 3UL, 4UL );
3928       lower1(0,0) =  2;
3929       lower1(1,1) = -2;
3930       lower1(2,0) =  3;
3931       lower1(2,1) =  5;
3932 
3933       LT lower2( 3UL );
3934       lower2(0,0) =  1;
3935       lower2(1,0) = -4;
3936       lower2(1,1) =  2;
3937       lower2(2,0) =  7;
3938       lower2(2,2) =  3;
3939 
3940       lower2 %= lower1;
3941 
3942       checkRows    ( lower2, 3UL );
3943       checkColumns ( lower2, 3UL );
3944       checkCapacity( lower2, 4UL );
3945       checkNonZeros( lower2, 3UL );
3946       checkNonZeros( lower2, 0UL, 1UL );
3947       checkNonZeros( lower2, 1UL, 1UL );
3948       checkNonZeros( lower2, 2UL, 1UL );
3949 
3950       if( lower2(0,0) !=  2 || lower2(0,1) !=  0 || lower2(0,2) != 0 ||
3951           lower2(1,0) !=  0 || lower2(1,1) != -4 || lower2(1,2) != 0 ||
3952           lower2(2,0) != 21 || lower2(2,1) !=  0 || lower2(2,2) != 0 ) {
3953          std::ostringstream oss;
3954          oss << " Test: " << test_ << "\n"
3955              << " Error: Schur product assignment failed\n"
3956              << " Details:\n"
3957              << "   Result:\n" << lower2 << "\n"
3958              << "   Expected result:\n(  2  0  0 )\n(  0 -4  0 )\n( 21  0  0 )\n";
3959          throw std::runtime_error( oss.str() );
3960       }
3961    }
3962 
3963    // Row-major/column-major sparse matrix Schur product assignment (LowerMatrix)
3964    {
3965       test_ = "Row-major/column-major LowerMatrix sparse matrix Schur product assignment (LowerMatrix)";
3966 
3967       OLT lower1( 3UL, 4UL );
3968       lower1(0,0) =  2;
3969       lower1(1,1) = -2;
3970       lower1(2,0) =  3;
3971       lower1(2,1) =  5;
3972 
3973       LT lower2( 3UL );
3974       lower2(0,0) =  1;
3975       lower2(1,0) = -4;
3976       lower2(1,1) =  2;
3977       lower2(2,0) =  7;
3978       lower2(2,2) =  3;
3979 
3980       lower2 %= lower1;
3981 
3982       checkRows    ( lower2, 3UL );
3983       checkColumns ( lower2, 3UL );
3984       checkCapacity( lower2, 4UL );
3985       checkNonZeros( lower2, 3UL );
3986       checkNonZeros( lower2, 0UL, 1UL );
3987       checkNonZeros( lower2, 1UL, 1UL );
3988       checkNonZeros( lower2, 2UL, 1UL );
3989 
3990       if( lower2(0,0) !=  2 || lower2(0,1) !=  0 || lower2(0,2) != 0 ||
3991           lower2(1,0) !=  0 || lower2(1,1) != -4 || lower2(1,2) != 0 ||
3992           lower2(2,0) != 21 || lower2(2,1) !=  0 || lower2(2,2) != 0 ) {
3993          std::ostringstream oss;
3994          oss << " Test: " << test_ << "\n"
3995              << " Error: Schur product assignment failed\n"
3996              << " Details:\n"
3997              << "   Result:\n" << lower2 << "\n"
3998              << "   Expected result:\n(  2  0  0 )\n(  0 -4  0 )\n( 21  0  0 )\n";
3999          throw std::runtime_error( oss.str() );
4000       }
4001    }
4002 
4003 
4004    //=====================================================================================
4005    // Column-major dense matrix Schur product assignment
4006    //=====================================================================================
4007 
4008    // Column-major/row-major dense matrix Schur product assignment (general)
4009    {
4010       test_ = "Column-major/row-major LowerMatrix dense matrix Schur product assignment (general)";
4011 
4012       blaze::DynamicMatrix<int,blaze::rowMajor> mat{ { 2, 0, 9 }, { 0, -2, 0 }, { 3, 5, 0 } };
4013 
4014       OLT lower( 3UL );
4015       lower(0,0) =  1;
4016       lower(1,0) = -4;
4017       lower(1,1) =  2;
4018       lower(2,0) =  7;
4019       lower(2,2) =  3;
4020 
4021       lower %= mat;
4022 
4023       checkRows    ( lower, 3UL );
4024       checkColumns ( lower, 3UL );
4025       checkCapacity( lower, 5UL );
4026       checkNonZeros( lower, 5UL );
4027       checkNonZeros( lower, 0UL, 3UL );
4028       checkNonZeros( lower, 1UL, 1UL );
4029       checkNonZeros( lower, 2UL, 1UL );
4030 
4031       if( lower(0,0) !=  2 || lower(0,1) !=  0 || lower(0,2) != 0 ||
4032           lower(1,0) !=  0 || lower(1,1) != -4 || lower(1,2) != 0 ||
4033           lower(2,0) != 21 || lower(2,1) !=  0 || lower(2,2) != 0 ) {
4034          std::ostringstream oss;
4035          oss << " Test: " << test_ << "\n"
4036              << " Error: Schur product assignment failed\n"
4037              << " Details:\n"
4038              << "   Result:\n" << lower << "\n"
4039              << "   Expected result:\n(  2  0  0 )\n(  0 -4  0 )\n( 21  0  0 )\n";
4040          throw std::runtime_error( oss.str() );
4041       }
4042    }
4043 
4044    // Column-major/column-major dense matrix Schur product assignment (general)
4045    {
4046       test_ = "Column-major/column-major LowerMatrix dense matrix Schur product assignment (general)";
4047 
4048       blaze::DynamicMatrix<int,blaze::columnMajor> mat{ { 2, 0, 9 }, { 0, -2, 0 }, { 3, 5, 0 } };
4049 
4050       OLT lower( 3UL );
4051       lower(0,0) =  1;
4052       lower(1,0) = -4;
4053       lower(1,1) =  2;
4054       lower(2,0) =  7;
4055       lower(2,2) =  3;
4056 
4057       lower %= mat;
4058 
4059       checkRows    ( lower, 3UL );
4060       checkColumns ( lower, 3UL );
4061       checkCapacity( lower, 5UL );
4062       checkNonZeros( lower, 5UL );
4063       checkNonZeros( lower, 0UL, 3UL );
4064       checkNonZeros( lower, 1UL, 1UL );
4065       checkNonZeros( lower, 2UL, 1UL );
4066 
4067       if( lower(0,0) !=  2 || lower(0,1) !=  0 || lower(0,2) != 0 ||
4068           lower(1,0) !=  0 || lower(1,1) != -4 || lower(1,2) != 0 ||
4069           lower(2,0) != 21 || lower(2,1) !=  0 || lower(2,2) != 0 ) {
4070          std::ostringstream oss;
4071          oss << " Test: " << test_ << "\n"
4072              << " Error: Schur product assignment failed\n"
4073              << " Details:\n"
4074              << "   Result:\n" << lower << "\n"
4075              << "   Expected result:\n(  2  0  0 )\n(  0 -4  0 )\n( 21  0  0 )\n";
4076          throw std::runtime_error( oss.str() );
4077       }
4078    }
4079 
4080    // Column-major/row-major dense matrix Schur product assignment (LowerMatrix)
4081    {
4082       test_ = "Column-major/row-major LowerMatrix dense matrix Schur product assignment (LowerMatrix)";
4083 
4084       blaze::LowerMatrix< blaze::StaticMatrix<int,3UL,3UL,blaze::rowMajor> > lower1;
4085       lower1(0,0) =  2;
4086       lower1(1,1) = -2;
4087       lower1(2,0) =  3;
4088       lower1(2,1) =  5;
4089 
4090       OLT lower2( 3UL );
4091       lower2(0,0) =  1;
4092       lower2(1,0) = -4;
4093       lower2(1,1) =  2;
4094       lower2(2,0) =  7;
4095       lower2(2,2) =  3;
4096 
4097       lower2 %= lower1;
4098 
4099       checkRows    ( lower2, 3UL );
4100       checkColumns ( lower2, 3UL );
4101       checkCapacity( lower2, 5UL );
4102       checkNonZeros( lower2, 5UL );
4103       checkNonZeros( lower2, 0UL, 3UL );
4104       checkNonZeros( lower2, 1UL, 1UL );
4105       checkNonZeros( lower2, 2UL, 1UL );
4106 
4107       if( lower2(0,0) !=  2 || lower2(0,1) !=  0 || lower2(0,2) != 0 ||
4108           lower2(1,0) !=  0 || lower2(1,1) != -4 || lower2(1,2) != 0 ||
4109           lower2(2,0) != 21 || lower2(2,1) !=  0 || lower2(2,2) != 0 ) {
4110          std::ostringstream oss;
4111          oss << " Test: " << test_ << "\n"
4112              << " Error: Schur product assignment failed\n"
4113              << " Details:\n"
4114              << "   Result:\n" << lower2 << "\n"
4115              << "   Expected result:\n(  2  0  0 )\n(  0 -4  0 )\n( 21  0  0 )\n";
4116          throw std::runtime_error( oss.str() );
4117       }
4118    }
4119 
4120    // Column-major/column-major dense matrix Schur product assignment (LowerMatrix)
4121    {
4122       test_ = "Column-major/column-major LowerMatrix dense matrix Schur product assignment (LowerMatrix)";
4123 
4124       blaze::LowerMatrix< blaze::StaticMatrix<int,3UL,3UL,blaze::columnMajor> > lower1;
4125       lower1(0,0) =  2;
4126       lower1(1,1) = -2;
4127       lower1(2,0) =  3;
4128       lower1(2,1) =  5;
4129 
4130       OLT lower2( 3UL );
4131       lower2(0,0) =  1;
4132       lower2(1,0) = -4;
4133       lower2(1,1) =  2;
4134       lower2(2,0) =  7;
4135       lower2(2,2) =  3;
4136 
4137       lower2 %= lower1;
4138 
4139       checkRows    ( lower2, 3UL );
4140       checkColumns ( lower2, 3UL );
4141       checkCapacity( lower2, 5UL );
4142       checkNonZeros( lower2, 5UL );
4143       checkNonZeros( lower2, 0UL, 3UL );
4144       checkNonZeros( lower2, 1UL, 1UL );
4145       checkNonZeros( lower2, 2UL, 1UL );
4146 
4147       if( lower2(0,0) !=  2 || lower2(0,1) !=  0 || lower2(0,2) != 0 ||
4148           lower2(1,0) !=  0 || lower2(1,1) != -4 || lower2(1,2) != 0 ||
4149           lower2(2,0) != 21 || lower2(2,1) !=  0 || lower2(2,2) != 0 ) {
4150          std::ostringstream oss;
4151          oss << " Test: " << test_ << "\n"
4152              << " Error: Schur product assignment failed\n"
4153              << " Details:\n"
4154              << "   Result:\n" << lower2 << "\n"
4155              << "   Expected result:\n(  2  0  0 )\n(  0 -4  0 )\n( 21  0  0 )\n";
4156          throw std::runtime_error( oss.str() );
4157       }
4158    }
4159 
4160 
4161    //=====================================================================================
4162    // Column-major sparse matrix Schur product assignment
4163    //=====================================================================================
4164 
4165    // Column-major/row-major sparse matrix Schur product assignment (general)
4166    {
4167       test_ = "Column-major/row-major LowerMatrix sparse matrix Schur product assignment (general)";
4168 
4169       blaze::CompressedMatrix<int,blaze::rowMajor> mat( 3UL, 3UL, 6UL );
4170       mat(0,0) =  2;
4171       mat(0,2) =  9;
4172       mat(1,1) = -2;
4173       mat(2,0) =  3;
4174       mat(2,1) =  5;
4175       mat.insert( 1UL, 2UL, 0 );
4176 
4177       OLT lower( 3UL );
4178       lower(0,0) =  1;
4179       lower(1,0) = -4;
4180       lower(1,1) =  2;
4181       lower(2,0) =  7;
4182       lower(2,2) =  3;
4183 
4184       lower %= mat;
4185 
4186       checkRows    ( lower, 3UL );
4187       checkColumns ( lower, 3UL );
4188       checkCapacity( lower, 5UL );
4189       checkNonZeros( lower, 3UL );
4190       checkNonZeros( lower, 0UL, 2UL );
4191       checkNonZeros( lower, 1UL, 1UL );
4192       checkNonZeros( lower, 2UL, 0UL );
4193 
4194       if( lower(0,0) !=  2 || lower(0,1) !=  0 || lower(0,2) != 0 ||
4195           lower(1,0) !=  0 || lower(1,1) != -4 || lower(1,2) != 0 ||
4196           lower(2,0) != 21 || lower(2,1) !=  0 || lower(2,2) != 0 ) {
4197          std::ostringstream oss;
4198          oss << " Test: " << test_ << "\n"
4199              << " Error: Schur product assignment failed\n"
4200              << " Details:\n"
4201              << "   Result:\n" << lower << "\n"
4202              << "   Expected result:\n(  2  0  0 )\n(  0 -4  0 )\n( 21  0  0 )\n";
4203          throw std::runtime_error( oss.str() );
4204       }
4205    }
4206 
4207    // Column-major/column-major sparse matrix Schur product assignment (general)
4208    {
4209       test_ = "Column-major/column-major LowerMatrix sparse matrix Schur product assignment (general)";
4210 
4211       blaze::CompressedMatrix<int,blaze::columnMajor> mat( 3UL, 3UL, 6UL );
4212       mat(0,0) =  2;
4213       mat(0,2) =  9;
4214       mat(1,1) = -2;
4215       mat(2,0) =  3;
4216       mat(2,1) =  5;
4217       mat.insert( 1UL, 2UL, 0 );
4218 
4219       OLT lower( 3UL );
4220       lower(0,0) =  1;
4221       lower(1,0) = -4;
4222       lower(1,1) =  2;
4223       lower(2,0) =  7;
4224       lower(2,2) =  3;
4225 
4226       lower %= mat;
4227 
4228       checkRows    ( lower, 3UL );
4229       checkColumns ( lower, 3UL );
4230       checkCapacity( lower, 5UL );
4231       checkNonZeros( lower, 3UL );
4232       checkNonZeros( lower, 0UL, 2UL );
4233       checkNonZeros( lower, 1UL, 1UL );
4234       checkNonZeros( lower, 2UL, 0UL );
4235 
4236       if( lower(0,0) !=  2 || lower(0,1) !=  0 || lower(0,2) != 0 ||
4237           lower(1,0) !=  0 || lower(1,1) != -4 || lower(1,2) != 0 ||
4238           lower(2,0) != 21 || lower(2,1) !=  0 || lower(2,2) != 0 ) {
4239          std::ostringstream oss;
4240          oss << " Test: " << test_ << "\n"
4241              << " Error: Schur product assignment failed\n"
4242              << " Details:\n"
4243              << "   Result:\n" << lower << "\n"
4244              << "   Expected result:\n(  2  0  0 )\n(  0 -4  0 )\n( 21  0  0 )\n";
4245          throw std::runtime_error( oss.str() );
4246       }
4247    }
4248 
4249    // Column-major/row-major sparse matrix Schur product assignment (LowerMatrix)
4250    {
4251       test_ = "Column-major/row-major LowerMatrix sparse matrix Schur product assignment (LowerMatrix)";
4252 
4253       LT lower1( 3UL, 4UL );
4254       lower1(0,0) =  2;
4255       lower1(1,1) = -2;
4256       lower1(2,0) =  3;
4257       lower1(2,1) =  5;
4258 
4259       OLT lower2( 3UL );
4260       lower2(0,0) =  1;
4261       lower2(1,0) = -4;
4262       lower2(1,1) =  2;
4263       lower2(2,0) =  7;
4264       lower2(2,2) =  3;
4265 
4266       lower2 %= lower1;
4267 
4268       checkRows    ( lower2, 3UL );
4269       checkColumns ( lower2, 3UL );
4270       checkCapacity( lower2, 4UL );
4271       checkNonZeros( lower2, 3UL );
4272       checkNonZeros( lower2, 0UL, 2UL );
4273       checkNonZeros( lower2, 1UL, 1UL );
4274       checkNonZeros( lower2, 2UL, 0UL );
4275 
4276       if( lower2(0,0) !=  2 || lower2(0,1) !=  0 || lower2(0,2) != 0 ||
4277           lower2(1,0) !=  0 || lower2(1,1) != -4 || lower2(1,2) != 0 ||
4278           lower2(2,0) != 21 || lower2(2,1) !=  0 || lower2(2,2) != 0 ) {
4279          std::ostringstream oss;
4280          oss << " Test: " << test_ << "\n"
4281              << " Error: Schur product assignment failed\n"
4282              << " Details:\n"
4283              << "   Result:\n" << lower2 << "\n"
4284              << "   Expected result:\n(  2  0  0 )\n(  0 -4  0 )\n( 21  0  0 )\n";
4285          throw std::runtime_error( oss.str() );
4286       }
4287    }
4288 
4289    // Column-major/column-major sparse matrix Schur product assignment (LowerMatrix)
4290    {
4291       test_ = "Column-major/column-major LowerMatrix sparse matrix Schur product assignment (LowerMatrix)";
4292 
4293       OLT lower1( 3UL, 4UL );
4294       lower1(0,0) =  2;
4295       lower1(1,1) = -2;
4296       lower1(2,0) =  3;
4297       lower1(2,1) =  5;
4298 
4299       OLT lower2( 3UL );
4300       lower2(0,0) =  1;
4301       lower2(1,0) = -4;
4302       lower2(1,1) =  2;
4303       lower2(2,0) =  7;
4304       lower2(2,2) =  3;
4305 
4306       lower2 %= lower1;
4307 
4308       checkRows    ( lower2, 3UL );
4309       checkColumns ( lower2, 3UL );
4310       checkCapacity( lower2, 4UL );
4311       checkNonZeros( lower2, 3UL );
4312       checkNonZeros( lower2, 0UL, 2UL );
4313       checkNonZeros( lower2, 1UL, 1UL );
4314       checkNonZeros( lower2, 2UL, 0UL );
4315 
4316       if( lower2(0,0) !=  2 || lower2(0,1) !=  0 || lower2(0,2) != 0 ||
4317           lower2(1,0) !=  0 || lower2(1,1) != -4 || lower2(1,2) != 0 ||
4318           lower2(2,0) != 21 || lower2(2,1) !=  0 || lower2(2,2) != 0 ) {
4319          std::ostringstream oss;
4320          oss << " Test: " << test_ << "\n"
4321              << " Error: Schur product assignment failed\n"
4322              << " Details:\n"
4323              << "   Result:\n" << lower2 << "\n"
4324              << "   Expected result:\n(  2  0  0 )\n(  0 -4  0 )\n( 21  0  0 )\n";
4325          throw std::runtime_error( oss.str() );
4326       }
4327    }
4328 }
4329 //*************************************************************************************************
4330 
4331 
4332 //*************************************************************************************************
4333 /*!\brief Test of the LowerMatrix multiplication assignment operators.
4334 //
4335 // \return void
4336 // \exception std::runtime_error Error detected.
4337 //
4338 // This function performs a test of the multiplication assignment operators of the LowerMatrix
4339 // specialization. In case an error is detected, a \a std::runtime_error exception is thrown.
4340 */
testMultAssign()4341 void SparseTest::testMultAssign()
4342 {
4343    //=====================================================================================
4344    // Row-major dense matrix multiplication assignment
4345    //=====================================================================================
4346 
4347    // Row-major/row-major dense matrix multiplication assignment (lower)
4348    {
4349       test_ = "Row-major/row-major LowerMatrix dense matrix multiplication assignment (lower)";
4350 
4351       blaze::DynamicMatrix<int,blaze::rowMajor> mat( 3UL, 3UL, 0 );
4352       mat(0,0) = 2;
4353       mat(1,1) = 2;
4354       mat(2,2) = 2;
4355 
4356       LT lower( 3UL );
4357       lower(0,0) =  1;
4358       lower(1,0) = -4;
4359       lower(1,1) =  2;
4360       lower(2,0) =  7;
4361       lower(2,2) =  3;
4362 
4363       lower *= mat;
4364 
4365       checkRows    ( lower, 3UL );
4366       checkColumns ( lower, 3UL );
4367       checkCapacity( lower, 5UL );
4368       checkNonZeros( lower, 5UL );
4369       checkNonZeros( lower, 0UL, 1UL );
4370       checkNonZeros( lower, 1UL, 2UL );
4371       checkNonZeros( lower, 2UL, 2UL );
4372 
4373       if( lower(0,0) !=  2 || lower(0,1) != 0 || lower(0,2) != 0 ||
4374           lower(1,0) != -8 || lower(1,1) != 4 || lower(1,2) != 0 ||
4375           lower(2,0) != 14 || lower(2,1) != 0 || lower(2,2) != 6 ) {
4376          std::ostringstream oss;
4377          oss << " Test: " << test_ << "\n"
4378              << " Error: Multiplication assignment failed\n"
4379              << " Details:\n"
4380              << "   Result:\n" << lower << "\n"
4381              << "   Expected result:\n(  2 0 0 )\n( -8 4 0 )\n( 14 0 6 )\n";
4382          throw std::runtime_error( oss.str() );
4383       }
4384    }
4385 
4386    // Row-major/column-major dense matrix multiplication assignment (lower)
4387    {
4388       test_ = "Row-major/column-major LowerMatrix dense matrix multiplication assignment (lower)";
4389 
4390       blaze::DynamicMatrix<int,blaze::columnMajor> mat( 3UL, 3UL, 0 );
4391       mat(0,0) = 2;
4392       mat(1,1) = 2;
4393       mat(2,2) = 2;
4394 
4395       LT lower( 3UL );
4396       lower(0,0) =  1;
4397       lower(1,0) = -4;
4398       lower(1,1) =  2;
4399       lower(2,0) =  7;
4400       lower(2,2) =  3;
4401 
4402       lower *= mat;
4403 
4404       checkRows    ( lower, 3UL );
4405       checkColumns ( lower, 3UL );
4406       checkCapacity( lower, 5UL );
4407       checkNonZeros( lower, 5UL );
4408       checkNonZeros( lower, 0UL, 1UL );
4409       checkNonZeros( lower, 1UL, 2UL );
4410       checkNonZeros( lower, 2UL, 2UL );
4411 
4412       if( lower(0,0) !=  2 || lower(0,1) != 0 || lower(0,2) != 0 ||
4413           lower(1,0) != -8 || lower(1,1) != 4 || lower(1,2) != 0 ||
4414           lower(2,0) != 14 || lower(2,1) != 0 || lower(2,2) != 6 ) {
4415          std::ostringstream oss;
4416          oss << " Test: " << test_ << "\n"
4417              << " Error: Multiplication assignment failed\n"
4418              << " Details:\n"
4419              << "   Result:\n" << lower << "\n"
4420              << "   Expected result:\n(  2 0 0 )\n( -8 4 0 )\n( 14 0 6 )\n";
4421          throw std::runtime_error( oss.str() );
4422       }
4423    }
4424 
4425    // Row-major/row-major dense matrix multiplication assignment (non-lower)
4426    {
4427       test_ = "Row-major/row-major LowerMatrix dense matrix multiplication assignment (non-lower)";
4428 
4429       blaze::DynamicMatrix<int,blaze::rowMajor> mat( 3UL, 3UL, 0 );
4430       mat(0,1) = -2;
4431       mat(0,2) =  6;
4432       mat(1,1) =  3;
4433       mat(2,0) =  6;
4434 
4435       LT lower( 3UL );
4436       lower(0,0) =  1;
4437       lower(1,0) = -4;
4438       lower(1,1) =  2;
4439       lower(2,0) =  7;
4440       lower(2,2) =  3;
4441 
4442       try {
4443          lower *= mat;
4444 
4445          std::ostringstream oss;
4446          oss << " Test: " << test_ << "\n"
4447              << " Error: Multiplication assignment of non-lower row-major matrix succeeded\n"
4448              << " Details:\n"
4449              << "   Result:\n" << lower << "\n";
4450          throw std::runtime_error( oss.str() );
4451       }
4452       catch( std::invalid_argument& ) {}
4453    }
4454 
4455    // Row-major/column-major dense matrix multiplication assignment (non-lower)
4456    {
4457       test_ = "Row-major/column-major LowerMatrix dense matrix multiplication assignment (non-lower)";
4458 
4459       blaze::DynamicMatrix<int,blaze::columnMajor> mat( 3UL, 3UL, 0 );
4460       mat(0,1) = -2;
4461       mat(0,2) =  6;
4462       mat(1,1) =  3;
4463       mat(2,0) =  6;
4464 
4465       LT lower( 3UL );
4466       lower(0,0) =  1;
4467       lower(1,0) = -4;
4468       lower(1,1) =  2;
4469       lower(2,0) =  7;
4470       lower(2,2) =  3;
4471 
4472       try {
4473          lower *= mat;
4474 
4475          std::ostringstream oss;
4476          oss << " Test: " << test_ << "\n"
4477              << " Error: Multiplication assignment of non-lower column-major matrix succeeded\n"
4478              << " Details:\n"
4479              << "   Result:\n" << lower << "\n";
4480          throw std::runtime_error( oss.str() );
4481       }
4482       catch( std::invalid_argument& ) {}
4483    }
4484 
4485    // Row-major/row-major dense matrix multiplication assignment (LowerMatrix)
4486    {
4487       test_ = "Row-major/row-major LowerMatrix dense matrix multiplication assignment (LowerMatrix)";
4488 
4489       blaze::LowerMatrix< blaze::StaticMatrix<int,3UL,3UL,blaze::rowMajor> > lower1;
4490       lower1(0,0) = 2;
4491       lower1(1,1) = 2;
4492       lower1(2,2) = 2;
4493 
4494       LT lower2( 3UL );
4495       lower2(0,0) =  1;
4496       lower2(1,0) = -4;
4497       lower2(1,1) =  2;
4498       lower2(2,0) =  7;
4499       lower2(2,2) =  3;
4500 
4501       lower2 *= lower1;
4502 
4503       checkRows    ( lower2, 3UL );
4504       checkColumns ( lower2, 3UL );
4505       checkCapacity( lower2, 5UL );
4506       checkNonZeros( lower2, 5UL );
4507       checkNonZeros( lower2, 0UL, 1UL );
4508       checkNonZeros( lower2, 1UL, 2UL );
4509       checkNonZeros( lower2, 2UL, 2UL );
4510 
4511       if( lower2(0,0) !=  2 || lower2(0,1) != 0 || lower2(0,2) != 0 ||
4512           lower2(1,0) != -8 || lower2(1,1) != 4 || lower2(1,2) != 0 ||
4513           lower2(2,0) != 14 || lower2(2,1) != 0 || lower2(2,2) != 6 ) {
4514          std::ostringstream oss;
4515          oss << " Test: " << test_ << "\n"
4516              << " Error: Multiplication assignment failed\n"
4517              << " Details:\n"
4518              << "   Result:\n" << lower2 << "\n"
4519              << "   Expected result:\n(  2 0 0 )\n( -8 4 0 )\n( 14 0 6 )\n";
4520          throw std::runtime_error( oss.str() );
4521       }
4522    }
4523 
4524    // Row-major/column-major dense matrix multiplication assignment (LowerMatrix)
4525    {
4526       test_ = "Row-major/column-major LowerMatrix dense matrix multiplication assignment (LowerMatrix)";
4527 
4528       blaze::LowerMatrix< blaze::StaticMatrix<int,3UL,3UL,blaze::columnMajor> > lower1;
4529       lower1(0,0) = 2;
4530       lower1(1,1) = 2;
4531       lower1(2,2) = 2;
4532 
4533       LT lower2( 3UL );
4534       lower2(0,0) =  1;
4535       lower2(1,0) = -4;
4536       lower2(1,1) =  2;
4537       lower2(2,0) =  7;
4538       lower2(2,2) =  3;
4539 
4540       lower2 *= lower1;
4541 
4542       checkRows    ( lower2, 3UL );
4543       checkColumns ( lower2, 3UL );
4544       checkCapacity( lower2, 5UL );
4545       checkNonZeros( lower2, 5UL );
4546       checkNonZeros( lower2, 0UL, 1UL );
4547       checkNonZeros( lower2, 1UL, 2UL );
4548       checkNonZeros( lower2, 2UL, 2UL );
4549 
4550       if( lower2(0,0) !=  2 || lower2(0,1) != 0 || lower2(0,2) != 0 ||
4551           lower2(1,0) != -8 || lower2(1,1) != 4 || lower2(1,2) != 0 ||
4552           lower2(2,0) != 14 || lower2(2,1) != 0 || lower2(2,2) != 6 ) {
4553          std::ostringstream oss;
4554          oss << " Test: " << test_ << "\n"
4555              << " Error: Multiplication assignment failed\n"
4556              << " Details:\n"
4557              << "   Result:\n" << lower2 << "\n"
4558              << "   Expected result:\n(  2 0 0 )\n( -8 4 0 )\n( 14 0 6 )\n";
4559          throw std::runtime_error( oss.str() );
4560       }
4561    }
4562 
4563 
4564    //=====================================================================================
4565    // Row-major sparse matrix multiplication assignment
4566    //=====================================================================================
4567 
4568    // Row-major/row-major sparse matrix multiplication assignment (lower)
4569    {
4570       test_ = "Row-major/row-major LowerMatrix sparse matrix multiplication assignment (lower)";
4571 
4572       blaze::CompressedMatrix<int,blaze::rowMajor> mat( 3UL, 3UL, 4UL );
4573       mat(0,0) = 2;
4574       mat(1,1) = 2;
4575       mat(2,2) = 2;
4576       mat.insert( 1UL, 2UL, 0 );
4577 
4578       LT lower( 3UL );
4579       lower(0,0) =  1;
4580       lower(1,0) = -4;
4581       lower(1,1) =  2;
4582       lower(2,0) =  7;
4583       lower(2,2) =  3;
4584 
4585       lower *= mat;
4586 
4587       checkRows    ( lower, 3UL );
4588       checkColumns ( lower, 3UL );
4589       checkCapacity( lower, 5UL );
4590       checkNonZeros( lower, 5UL );
4591       checkNonZeros( lower, 0UL, 1UL );
4592       checkNonZeros( lower, 1UL, 2UL );
4593       checkNonZeros( lower, 2UL, 2UL );
4594 
4595       if( lower(0,0) !=  2 || lower(0,1) != 0 || lower(0,2) != 0 ||
4596           lower(1,0) != -8 || lower(1,1) != 4 || lower(1,2) != 0 ||
4597           lower(2,0) != 14 || lower(2,1) != 0 || lower(2,2) != 6 ) {
4598          std::ostringstream oss;
4599          oss << " Test: " << test_ << "\n"
4600              << " Error: Multiplication assignment failed\n"
4601              << " Details:\n"
4602              << "   Result:\n" << lower << "\n"
4603              << "   Expected result:\n(  2 0 0 )\n( -8 4 0 )\n( 14 0 6 )\n";
4604          throw std::runtime_error( oss.str() );
4605       }
4606    }
4607 
4608    // Row-major/column-major sparse matrix multiplication assignment (lower)
4609    {
4610       test_ = "Row-major/column-major LowerMatrix sparse matrix multiplication assignment (lower)";
4611 
4612       blaze::CompressedMatrix<int,blaze::columnMajor> mat( 3UL, 3UL, 4UL );
4613       mat(0,0) = 2;
4614       mat(1,1) = 2;
4615       mat(2,2) = 2;
4616       mat.insert( 1UL, 2UL, 0 );
4617 
4618       LT lower( 3UL );
4619       lower(0,0) =  1;
4620       lower(1,0) = -4;
4621       lower(1,1) =  2;
4622       lower(2,0) =  7;
4623       lower(2,2) =  3;
4624 
4625       lower *= mat;
4626 
4627       checkRows    ( lower, 3UL );
4628       checkColumns ( lower, 3UL );
4629       checkCapacity( lower, 5UL );
4630       checkNonZeros( lower, 5UL );
4631       checkNonZeros( lower, 0UL, 1UL );
4632       checkNonZeros( lower, 1UL, 2UL );
4633       checkNonZeros( lower, 2UL, 2UL );
4634 
4635       if( lower(0,0) !=  2 || lower(0,1) != 0 || lower(0,2) != 0 ||
4636           lower(1,0) != -8 || lower(1,1) != 4 || lower(1,2) != 0 ||
4637           lower(2,0) != 14 || lower(2,1) != 0 || lower(2,2) != 6 ) {
4638          std::ostringstream oss;
4639          oss << " Test: " << test_ << "\n"
4640              << " Error: Multiplication assignment failed\n"
4641              << " Details:\n"
4642              << "   Result:\n" << lower << "\n"
4643              << "   Expected result:\n(  2 0 0 )\n( -8 4 0 )\n( 14 0 6 )\n";
4644          throw std::runtime_error( oss.str() );
4645       }
4646    }
4647 
4648    // Row-major/row-major sparse matrix multiplication assignment (non-lower)
4649    {
4650       test_ = "Row-major/row-major LowerMatrix sparse matrix multiplication assignment (non-lower)";
4651 
4652       blaze::CompressedMatrix<int,blaze::rowMajor> mat( 3UL, 3UL, 4UL );
4653       mat(0,1) = -2;
4654       mat(0,2) =  6;
4655       mat(1,1) =  3;
4656       mat(2,0) =  6;
4657 
4658       LT lower( 3UL );
4659       lower(0,0) =  1;
4660       lower(1,0) = -4;
4661       lower(1,1) =  2;
4662       lower(2,0) =  7;
4663       lower(2,2) =  3;
4664 
4665       try {
4666          lower *= mat;
4667 
4668          std::ostringstream oss;
4669          oss << " Test: " << test_ << "\n"
4670              << " Error: Multiplication assignment of non-lower row-major matrix succeeded\n"
4671              << " Details:\n"
4672              << "   Result:\n" << lower << "\n";
4673          throw std::runtime_error( oss.str() );
4674       }
4675       catch( std::invalid_argument& ) {}
4676    }
4677 
4678    // Row-major/column-major sparse matrix multiplication assignment (non-lower)
4679    {
4680       test_ = "Row-major/column-major LowerMatrix sparse matrix multiplication assignment (non-lower)";
4681 
4682       blaze::CompressedMatrix<int,blaze::columnMajor> mat( 3UL, 3UL, 4UL );
4683       mat(0,1) = -2;
4684       mat(0,2) =  6;
4685       mat(1,1) =  3;
4686       mat(2,0) =  6;
4687 
4688       LT lower( 3UL );
4689       lower(0,0) =  1;
4690       lower(1,0) = -4;
4691       lower(1,1) =  2;
4692       lower(2,0) =  7;
4693       lower(2,2) =  3;
4694 
4695       try {
4696          lower *= mat;
4697 
4698          std::ostringstream oss;
4699          oss << " Test: " << test_ << "\n"
4700              << " Error: Multiplication assignment of non-lower column-major matrix succeeded\n"
4701              << " Details:\n"
4702              << "   Result:\n" << lower << "\n";
4703          throw std::runtime_error( oss.str() );
4704       }
4705       catch( std::invalid_argument& ) {}
4706    }
4707 
4708    // Row-major/row-major sparse matrix multiplication assignment (LowerMatrix)
4709    {
4710       test_ = "Row-major/row-major LowerMatrix sparse matrix multiplication assignment (LowerMatrix)";
4711 
4712       LT lower1( 3UL, 3UL );
4713       lower1(0,0) = 2;
4714       lower1(1,1) = 2;
4715       lower1(2,2) = 2;
4716 
4717       LT lower2( 3UL );
4718       lower2(0,0) =  1;
4719       lower2(1,0) = -4;
4720       lower2(1,1) =  2;
4721       lower2(2,0) =  7;
4722       lower2(2,2) =  3;
4723 
4724       lower2 *= lower1;
4725 
4726       checkRows    ( lower2, 3UL );
4727       checkColumns ( lower2, 3UL );
4728       checkCapacity( lower2, 5UL );
4729       checkNonZeros( lower2, 5UL );
4730       checkNonZeros( lower2, 0UL, 1UL );
4731       checkNonZeros( lower2, 1UL, 2UL );
4732       checkNonZeros( lower2, 2UL, 2UL );
4733 
4734       if( lower2(0,0) !=  2 || lower2(0,1) != 0 || lower2(0,2) != 0 ||
4735           lower2(1,0) != -8 || lower2(1,1) != 4 || lower2(1,2) != 0 ||
4736           lower2(2,0) != 14 || lower2(2,1) != 0 || lower2(2,2) != 6 ) {
4737          std::ostringstream oss;
4738          oss << " Test: " << test_ << "\n"
4739              << " Error: Multiplication assignment failed\n"
4740              << " Details:\n"
4741              << "   Result:\n" << lower2 << "\n"
4742              << "   Expected result:\n(  2 0 0 )\n( -8 4 0 )\n( 14 0 6 )\n";
4743          throw std::runtime_error( oss.str() );
4744       }
4745    }
4746 
4747    // Row-major/column-major sparse matrix multiplication assignment (LowerMatrix)
4748    {
4749       test_ = "Row-major/column-major LowerMatrix sparse matrix multiplication assignment (LowerMatrix)";
4750 
4751       OLT lower1( 3UL, 3UL );
4752       lower1(0,0) = 2;
4753       lower1(1,1) = 2;
4754       lower1(2,2) = 2;
4755 
4756       LT lower2( 3UL );
4757       lower2(0,0) =  1;
4758       lower2(1,0) = -4;
4759       lower2(1,1) =  2;
4760       lower2(2,0) =  7;
4761       lower2(2,2) =  3;
4762 
4763       lower2 *= lower1;
4764 
4765       checkRows    ( lower2, 3UL );
4766       checkColumns ( lower2, 3UL );
4767       checkCapacity( lower2, 5UL );
4768       checkNonZeros( lower2, 5UL );
4769       checkNonZeros( lower2, 0UL, 1UL );
4770       checkNonZeros( lower2, 1UL, 2UL );
4771       checkNonZeros( lower2, 2UL, 2UL );
4772 
4773       if( lower2(0,0) !=  2 || lower2(0,1) != 0 || lower2(0,2) != 0 ||
4774           lower2(1,0) != -8 || lower2(1,1) != 4 || lower2(1,2) != 0 ||
4775           lower2(2,0) != 14 || lower2(2,1) != 0 || lower2(2,2) != 6 ) {
4776          std::ostringstream oss;
4777          oss << " Test: " << test_ << "\n"
4778              << " Error: Multiplication assignment failed\n"
4779              << " Details:\n"
4780              << "   Result:\n" << lower2 << "\n"
4781              << "   Expected result:\n(  2 0 0 )\n( -8 4 0 )\n( 14 0 6 )\n";
4782          throw std::runtime_error( oss.str() );
4783       }
4784    }
4785 
4786 
4787    //=====================================================================================
4788    // Column-major dense matrix multiplication assignment
4789    //=====================================================================================
4790 
4791    // Column-major/row-major dense matrix multiplication assignment (lower)
4792    {
4793       test_ = "Column-major/row-major LowerMatrix dense matrix multiplication assignment (lower)";
4794 
4795       blaze::DynamicMatrix<int,blaze::rowMajor> mat( 3UL, 3UL, 0 );
4796       mat(0,0) = 2;
4797       mat(1,1) = 2;
4798       mat(2,2) = 2;
4799 
4800       OLT lower( 3UL );
4801       lower(0,0) =  1;
4802       lower(1,0) = -4;
4803       lower(1,1) =  2;
4804       lower(2,0) =  7;
4805       lower(2,2) =  3;
4806 
4807       lower *= mat;
4808 
4809       checkRows    ( lower, 3UL );
4810       checkColumns ( lower, 3UL );
4811       checkCapacity( lower, 5UL );
4812       checkNonZeros( lower, 5UL );
4813       checkNonZeros( lower, 0UL, 3UL );
4814       checkNonZeros( lower, 1UL, 1UL );
4815       checkNonZeros( lower, 2UL, 1UL );
4816 
4817       if( lower(0,0) !=  2 || lower(0,1) != 0 || lower(0,2) != 0 ||
4818           lower(1,0) != -8 || lower(1,1) != 4 || lower(1,2) != 0 ||
4819           lower(2,0) != 14 || lower(2,1) != 0 || lower(2,2) != 6 ) {
4820          std::ostringstream oss;
4821          oss << " Test: " << test_ << "\n"
4822              << " Error: Multiplication assignment failed\n"
4823              << " Details:\n"
4824              << "   Result:\n" << lower << "\n"
4825              << "   Expected result:\n(  2 0 0 )\n( -8 4 0 )\n( 14 0 6 )\n";
4826          throw std::runtime_error( oss.str() );
4827       }
4828    }
4829 
4830    // Column-major/column-major dense matrix multiplication assignment (lower)
4831    {
4832       test_ = "Column-major/column-major LowerMatrix dense matrix multiplication assignment (lower)";
4833 
4834       blaze::DynamicMatrix<int,blaze::columnMajor> mat( 3UL, 3UL, 0 );
4835       mat(0,0) = 2;
4836       mat(1,1) = 2;
4837       mat(2,2) = 2;
4838 
4839       OLT lower( 3UL );
4840       lower(0,0) =  1;
4841       lower(1,0) = -4;
4842       lower(1,1) =  2;
4843       lower(2,0) =  7;
4844       lower(2,2) =  3;
4845 
4846       lower *= mat;
4847 
4848       checkRows    ( lower, 3UL );
4849       checkColumns ( lower, 3UL );
4850       checkCapacity( lower, 5UL );
4851       checkNonZeros( lower, 5UL );
4852       checkNonZeros( lower, 0UL, 3UL );
4853       checkNonZeros( lower, 1UL, 1UL );
4854       checkNonZeros( lower, 2UL, 1UL );
4855 
4856       if( lower(0,0) !=  2 || lower(0,1) != 0 || lower(0,2) != 0 ||
4857           lower(1,0) != -8 || lower(1,1) != 4 || lower(1,2) != 0 ||
4858           lower(2,0) != 14 || lower(2,1) != 0 || lower(2,2) != 6 ) {
4859          std::ostringstream oss;
4860          oss << " Test: " << test_ << "\n"
4861              << " Error: Multiplication assignment failed\n"
4862              << " Details:\n"
4863              << "   Result:\n" << lower << "\n"
4864              << "   Expected result:\n(  2 0 0 )\n( -8 4 0 )\n( 14 0 6 )\n";
4865          throw std::runtime_error( oss.str() );
4866       }
4867    }
4868 
4869    // Column-major/row-major dense matrix multiplication assignment (non-lower)
4870    {
4871       test_ = "Column-major/row-major LowerMatrix dense matrix multiplication assignment (non-lower)";
4872 
4873       blaze::DynamicMatrix<int,blaze::rowMajor> mat( 3UL, 3UL, 0 );
4874       mat(0,1) = -2;
4875       mat(0,2) =  6;
4876       mat(1,1) =  3;
4877       mat(2,0) =  6;
4878 
4879       OLT lower( 3UL );
4880       lower(0,0) =  1;
4881       lower(1,0) = -4;
4882       lower(1,1) =  2;
4883       lower(2,0) =  7;
4884       lower(2,2) =  3;
4885 
4886       try {
4887          lower *= mat;
4888 
4889          std::ostringstream oss;
4890          oss << " Test: " << test_ << "\n"
4891              << " Error: Multiplication assignment of non-lower row-major matrix succeeded\n"
4892              << " Details:\n"
4893              << "   Result:\n" << lower << "\n";
4894          throw std::runtime_error( oss.str() );
4895       }
4896       catch( std::invalid_argument& ) {}
4897    }
4898 
4899    // Column-major/column-major dense matrix multiplication assignment (non-lower)
4900    {
4901       test_ = "Column-major/column-major LowerMatrix dense matrix multiplication assignment (non-lower)";
4902 
4903       blaze::DynamicMatrix<int,blaze::columnMajor> mat( 3UL, 3UL, 0 );
4904       mat(0,1) = -2;
4905       mat(0,2) =  6;
4906       mat(1,1) =  3;
4907       mat(2,0) =  6;
4908 
4909       OLT lower( 3UL );
4910       lower(0,0) =  1;
4911       lower(1,0) = -4;
4912       lower(1,1) =  2;
4913       lower(2,0) =  7;
4914       lower(2,2) =  3;
4915 
4916       try {
4917          lower *= mat;
4918 
4919          std::ostringstream oss;
4920          oss << " Test: " << test_ << "\n"
4921              << " Error: Multiplication assignment of non-lower column-major matrix succeeded\n"
4922              << " Details:\n"
4923              << "   Result:\n" << lower << "\n";
4924          throw std::runtime_error( oss.str() );
4925       }
4926       catch( std::invalid_argument& ) {}
4927    }
4928 
4929    // Column-major/row-major dense matrix multiplication assignment (LowerMatrix)
4930    {
4931       test_ = "Column-major/row-major LowerMatrix dense matrix multiplication assignment (LowerMatrix)";
4932 
4933       blaze::LowerMatrix< blaze::StaticMatrix<int,3UL,3UL,blaze::rowMajor> > lower1;
4934       lower1(0,0) = 2;
4935       lower1(1,1) = 2;
4936       lower1(2,2) = 2;
4937 
4938       OLT lower2( 3UL );
4939       lower2(0,0) =  1;
4940       lower2(1,0) = -4;
4941       lower2(1,1) =  2;
4942       lower2(2,0) =  7;
4943       lower2(2,2) =  3;
4944 
4945       lower2 *= lower1;
4946 
4947       checkRows    ( lower2, 3UL );
4948       checkColumns ( lower2, 3UL );
4949       checkCapacity( lower2, 5UL );
4950       checkNonZeros( lower2, 5UL );
4951       checkNonZeros( lower2, 0UL, 3UL );
4952       checkNonZeros( lower2, 1UL, 1UL );
4953       checkNonZeros( lower2, 2UL, 1UL );
4954 
4955       if( lower2(0,0) !=  2 || lower2(0,1) != 0 || lower2(0,2) != 0 ||
4956           lower2(1,0) != -8 || lower2(1,1) != 4 || lower2(1,2) != 0 ||
4957           lower2(2,0) != 14 || lower2(2,1) != 0 || lower2(2,2) != 6 ) {
4958          std::ostringstream oss;
4959          oss << " Test: " << test_ << "\n"
4960              << " Error: Multiplication assignment failed\n"
4961              << " Details:\n"
4962              << "   Result:\n" << lower2 << "\n"
4963              << "   Expected result:\n(  2 0 0 )\n( -8 4 0 )\n( 14 0 6 )\n";
4964          throw std::runtime_error( oss.str() );
4965       }
4966    }
4967 
4968    // Column-major/column-major dense matrix multiplication assignment (LowerMatrix)
4969    {
4970       test_ = "Column-major/column-major LowerMatrix dense matrix multiplication assignment (LowerMatrix)";
4971 
4972       blaze::LowerMatrix< blaze::StaticMatrix<int,3UL,3UL,blaze::columnMajor> > lower1;
4973       lower1(0,0) = 2;
4974       lower1(1,1) = 2;
4975       lower1(2,2) = 2;
4976 
4977       OLT lower2( 3UL );
4978       lower2(0,0) =  1;
4979       lower2(1,0) = -4;
4980       lower2(1,1) =  2;
4981       lower2(2,0) =  7;
4982       lower2(2,2) =  3;
4983 
4984       lower2 *= lower1;
4985 
4986       checkRows    ( lower2, 3UL );
4987       checkColumns ( lower2, 3UL );
4988       checkCapacity( lower2, 5UL );
4989       checkNonZeros( lower2, 5UL );
4990       checkNonZeros( lower2, 0UL, 3UL );
4991       checkNonZeros( lower2, 1UL, 1UL );
4992       checkNonZeros( lower2, 2UL, 1UL );
4993 
4994       if( lower2(0,0) !=  2 || lower2(0,1) != 0 || lower2(0,2) != 0 ||
4995           lower2(1,0) != -8 || lower2(1,1) != 4 || lower2(1,2) != 0 ||
4996           lower2(2,0) != 14 || lower2(2,1) != 0 || lower2(2,2) != 6 ) {
4997          std::ostringstream oss;
4998          oss << " Test: " << test_ << "\n"
4999              << " Error: Multiplication assignment failed\n"
5000              << " Details:\n"
5001              << "   Result:\n" << lower2 << "\n"
5002              << "   Expected result:\n(  2 0 0 )\n( -8 4 0 )\n( 14 0 6 )\n";
5003          throw std::runtime_error( oss.str() );
5004       }
5005    }
5006 
5007 
5008    //=====================================================================================
5009    // Column-major sparse matrix multiplication assignment
5010    //=====================================================================================
5011 
5012    // Column-major/row-major sparse matrix multiplication assignment (lower)
5013    {
5014       test_ = "Column-major/row-major LowerMatrix sparse matrix multiplication assignment (lower)";
5015 
5016       blaze::CompressedMatrix<int,blaze::rowMajor> mat( 3UL, 3UL, 4UL );
5017       mat(0,0) = 2;
5018       mat(1,1) = 2;
5019       mat(2,2) = 2;
5020       mat.insert( 1UL, 2UL, 0 );
5021 
5022       OLT lower( 3UL );
5023       lower(0,0) =  1;
5024       lower(1,0) = -4;
5025       lower(1,1) =  2;
5026       lower(2,0) =  7;
5027       lower(2,2) =  3;
5028 
5029       lower *= mat;
5030 
5031       checkRows    ( lower, 3UL );
5032       checkColumns ( lower, 3UL );
5033       checkCapacity( lower, 5UL );
5034       checkNonZeros( lower, 5UL );
5035       checkNonZeros( lower, 0UL, 3UL );
5036       checkNonZeros( lower, 1UL, 1UL );
5037       checkNonZeros( lower, 2UL, 1UL );
5038 
5039       if( lower(0,0) !=  2 || lower(0,1) != 0 || lower(0,2) != 0 ||
5040           lower(1,0) != -8 || lower(1,1) != 4 || lower(1,2) != 0 ||
5041           lower(2,0) != 14 || lower(2,1) != 0 || lower(2,2) != 6 ) {
5042          std::ostringstream oss;
5043          oss << " Test: " << test_ << "\n"
5044              << " Error: Multiplication assignment failed\n"
5045              << " Details:\n"
5046              << "   Result:\n" << lower << "\n"
5047              << "   Expected result:\n(  2 0 0 )\n( -8 4 0 )\n( 14 0 6 )\n";
5048          throw std::runtime_error( oss.str() );
5049       }
5050    }
5051 
5052    // Column-major/column-major sparse matrix multiplication assignment (lower)
5053    {
5054       test_ = "Column-major/column-major LowerMatrix sparse matrix multiplication assignment (lower)";
5055 
5056       blaze::CompressedMatrix<int,blaze::columnMajor> mat( 3UL, 3UL, 4UL );
5057       mat(0,0) = 2;
5058       mat(1,1) = 2;
5059       mat(2,2) = 2;
5060       mat.insert( 1UL, 2UL, 0 );
5061 
5062       OLT lower( 3UL );
5063       lower(0,0) =  1;
5064       lower(1,0) = -4;
5065       lower(1,1) =  2;
5066       lower(2,0) =  7;
5067       lower(2,2) =  3;
5068 
5069       lower *= mat;
5070 
5071       checkRows    ( lower, 3UL );
5072       checkColumns ( lower, 3UL );
5073       checkCapacity( lower, 5UL );
5074       checkNonZeros( lower, 5UL );
5075       checkNonZeros( lower, 0UL, 3UL );
5076       checkNonZeros( lower, 1UL, 1UL );
5077       checkNonZeros( lower, 2UL, 1UL );
5078 
5079       if( lower(0,0) !=  2 || lower(0,1) != 0 || lower(0,2) != 0 ||
5080           lower(1,0) != -8 || lower(1,1) != 4 || lower(1,2) != 0 ||
5081           lower(2,0) != 14 || lower(2,1) != 0 || lower(2,2) != 6 ) {
5082          std::ostringstream oss;
5083          oss << " Test: " << test_ << "\n"
5084              << " Error: Multiplication assignment failed\n"
5085              << " Details:\n"
5086              << "   Result:\n" << lower << "\n"
5087              << "   Expected result:\n(  2 0 0 )\n( -8 4 0 )\n( 14 0 6 )\n";
5088          throw std::runtime_error( oss.str() );
5089       }
5090    }
5091 
5092    // Column-major/row-major sparse matrix multiplication assignment (non-lower)
5093    {
5094       test_ = "Column-major/row-major LowerMatrix sparse matrix multiplication assignment (non-lower)";
5095 
5096       blaze::CompressedMatrix<int,blaze::rowMajor> mat( 3UL, 3UL, 4UL );
5097       mat(0,1) = -2;
5098       mat(0,2) =  6;
5099       mat(1,1) =  3;
5100       mat(2,0) =  6;
5101 
5102       OLT lower( 3UL );
5103       lower(0,0) =  1;
5104       lower(1,0) = -4;
5105       lower(1,1) =  2;
5106       lower(2,0) =  7;
5107       lower(2,2) =  3;
5108 
5109       try {
5110          lower *= mat;
5111 
5112          std::ostringstream oss;
5113          oss << " Test: " << test_ << "\n"
5114              << " Error: Multiplication assignment of non-lower row-major matrix succeeded\n"
5115              << " Details:\n"
5116              << "   Result:\n" << lower << "\n";
5117          throw std::runtime_error( oss.str() );
5118       }
5119       catch( std::invalid_argument& ) {}
5120    }
5121 
5122    // Column-major/column-major sparse matrix multiplication assignment (non-lower)
5123    {
5124       test_ = "Column-major/column-major LowerMatrix sparse matrix multiplication assignment (non-lower)";
5125 
5126       blaze::CompressedMatrix<int,blaze::columnMajor> mat( 3UL, 3UL, 4UL );
5127       mat(0,1) = -2;
5128       mat(0,2) =  6;
5129       mat(1,1) =  3;
5130       mat(2,0) =  6;
5131 
5132       OLT lower( 3UL );
5133       lower(0,0) =  1;
5134       lower(1,0) = -4;
5135       lower(1,1) =  2;
5136       lower(2,0) =  7;
5137       lower(2,2) =  3;
5138 
5139       try {
5140          lower *= mat;
5141 
5142          std::ostringstream oss;
5143          oss << " Test: " << test_ << "\n"
5144              << " Error: Multiplication assignment of non-lower column-major matrix succeeded\n"
5145              << " Details:\n"
5146              << "   Result:\n" << lower << "\n";
5147          throw std::runtime_error( oss.str() );
5148       }
5149       catch( std::invalid_argument& ) {}
5150    }
5151 
5152    // Column-major/row-major sparse matrix multiplication assignment (LowerMatrix)
5153    {
5154       test_ = "Column-major/row-major LowerMatrix sparse matrix multiplication assignment (LowerMatrix)";
5155 
5156       LT lower1( 3UL, 3UL );
5157       lower1(0,0) = 2;
5158       lower1(1,1) = 2;
5159       lower1(2,2) = 2;
5160 
5161       OLT lower2( 3UL );
5162       lower2(0,0) =  1;
5163       lower2(1,0) = -4;
5164       lower2(1,1) =  2;
5165       lower2(2,0) =  7;
5166       lower2(2,2) =  3;
5167 
5168       lower2 *= lower1;
5169 
5170       checkRows    ( lower2, 3UL );
5171       checkColumns ( lower2, 3UL );
5172       checkCapacity( lower2, 5UL );
5173       checkNonZeros( lower2, 5UL );
5174       checkNonZeros( lower2, 0UL, 3UL );
5175       checkNonZeros( lower2, 1UL, 1UL );
5176       checkNonZeros( lower2, 2UL, 1UL );
5177 
5178       if( lower2(0,0) !=  2 || lower2(0,1) != 0 || lower2(0,2) != 0 ||
5179           lower2(1,0) != -8 || lower2(1,1) != 4 || lower2(1,2) != 0 ||
5180           lower2(2,0) != 14 || lower2(2,1) != 0 || lower2(2,2) != 6 ) {
5181          std::ostringstream oss;
5182          oss << " Test: " << test_ << "\n"
5183              << " Error: Multiplication assignment failed\n"
5184              << " Details:\n"
5185              << "   Result:\n" << lower2 << "\n"
5186              << "   Expected result:\n(  2 0 0 )\n( -8 4 0 )\n( 14 0 6 )\n";
5187          throw std::runtime_error( oss.str() );
5188       }
5189    }
5190 
5191    // Column-major/column-major sparse matrix multiplication assignment (LowerMatrix)
5192    {
5193       test_ = "Column-major/column-major LowerMatrix sparse matrix multiplication assignment (LowerMatrix)";
5194 
5195       OLT lower1( 3UL, 3UL );
5196       lower1(0,0) = 2;
5197       lower1(1,1) = 2;
5198       lower1(2,2) = 2;
5199 
5200       OLT lower2( 3UL );
5201       lower2(0,0) =  1;
5202       lower2(1,0) = -4;
5203       lower2(1,1) =  2;
5204       lower2(2,0) =  7;
5205       lower2(2,2) =  3;
5206 
5207       lower2 *= lower1;
5208 
5209       checkRows    ( lower2, 3UL );
5210       checkColumns ( lower2, 3UL );
5211       checkCapacity( lower2, 5UL );
5212       checkNonZeros( lower2, 5UL );
5213       checkNonZeros( lower2, 0UL, 3UL );
5214       checkNonZeros( lower2, 1UL, 1UL );
5215       checkNonZeros( lower2, 2UL, 1UL );
5216 
5217       if( lower2(0,0) !=  2 || lower2(0,1) != 0 || lower2(0,2) != 0 ||
5218           lower2(1,0) != -8 || lower2(1,1) != 4 || lower2(1,2) != 0 ||
5219           lower2(2,0) != 14 || lower2(2,1) != 0 || lower2(2,2) != 6 ) {
5220          std::ostringstream oss;
5221          oss << " Test: " << test_ << "\n"
5222              << " Error: Multiplication assignment failed\n"
5223              << " Details:\n"
5224              << "   Result:\n" << lower2 << "\n"
5225              << "   Expected result:\n(  2 0 0 )\n( -8 4 0 )\n( 14 0 6 )\n";
5226          throw std::runtime_error( oss.str() );
5227       }
5228    }
5229 }
5230 //*************************************************************************************************
5231 
5232 } // namespace lowermatrix
5233 
5234 } // namespace adaptors
5235 
5236 } // namespace mathtest
5237 
5238 } // namespace blazetest
5239 
5240 
5241 
5242 
5243 //=================================================================================================
5244 //
5245 //  MAIN FUNCTION
5246 //
5247 //=================================================================================================
5248 
5249 //*************************************************************************************************
main()5250 int main()
5251 {
5252    std::cout << "   Running LowerMatrix sparse test (part 1)..." << std::endl;
5253 
5254    try
5255    {
5256       RUN_LOWERMATRIX_SPARSE_TEST;
5257    }
5258    catch( std::exception& ex ) {
5259       std::cerr << "\n\n ERROR DETECTED during LowerMatrix sparse test (part 1):\n"
5260                 << ex.what() << "\n";
5261       return EXIT_FAILURE;
5262    }
5263 
5264    return EXIT_SUCCESS;
5265 }
5266 //*************************************************************************************************
5267