1 //=================================================================================================
2 /*!
3 //  \file blazetest/mathtest/adaptors/lowermatrix/SubmatrixTest.h
4 //  \brief Header file for the LowerMatrix submatrix test
5 //
6 //  Copyright (C) 2012-2020 Klaus Iglberger - All Rights Reserved
7 //
8 //  This file is part of the Blaze library. You can redistribute it and/or modify it under
9 //  the terms of the New (Revised) BSD License. Redistribution and use in source and binary
10 //  forms, with or without modification, are permitted provided that the following conditions
11 //  are met:
12 //
13 //  1. Redistributions of source code must retain the above copyright notice, this list of
14 //     conditions and the following disclaimer.
15 //  2. Redistributions in binary form must reproduce the above copyright notice, this list
16 //     of conditions and the following disclaimer in the documentation and/or other materials
17 //     provided with the distribution.
18 //  3. Neither the names of the Blaze development group nor the names of its contributors
19 //     may be used to endorse or promote products derived from this software without specific
20 //     prior written permission.
21 //
22 //  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
23 //  EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24 //  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
25 //  SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26 //  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
27 //  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
28 //  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 //  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
30 //  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
31 //  DAMAGE.
32 */
33 //=================================================================================================
34 
35 #ifndef _BLAZETEST_MATHTEST_ADAPTORS_LOWERMATRIX_SUBMATRIXTEST_H_
36 #define _BLAZETEST_MATHTEST_ADAPTORS_LOWERMATRIX_SUBMATRIXTEST_H_
37 
38 
39 //*************************************************************************************************
40 // Includes
41 //*************************************************************************************************
42 
43 #include <sstream>
44 #include <stdexcept>
45 #include <string>
46 #include <blaze/math/CompressedMatrix.h>
47 #include <blaze/math/DynamicMatrix.h>
48 #include <blaze/math/LowerMatrix.h>
49 #include <blaze/math/Submatrix.h>
50 #include <blaze/math/typetraits/IsRowMajorMatrix.h>
51 #include <blazetest/system/Types.h>
52 
53 
54 namespace blazetest {
55 
56 namespace mathtest {
57 
58 namespace adaptors {
59 
60 namespace lowermatrix {
61 
62 //=================================================================================================
63 //
64 //  CLASS DEFINITION
65 //
66 //=================================================================================================
67 
68 //*************************************************************************************************
69 /*!\brief Auxiliary class for assignment tests to a submatrix of a LowerMatrix.
70 //
71 // This class performs assignment tests to a submatrix of a LowerMatrix. It performs a series
72 // of both compile time as well as runtime tests.
73 */
74 class SubmatrixTest
75 {
76  private:
77    //**Type definitions****************************************************************************
78    //! Type of the dense lower triangular matrix.
79    using DLT = blaze::LowerMatrix< blaze::DynamicMatrix<int,blaze::rowMajor> >;
80 
81    //! Opposite dense lower triangular matrix type.
82    using DOLT = DLT::OppositeType;
83 
84    //! Type of the sparse lower triangular matrix.
85    using SLT = blaze::LowerMatrix< blaze::CompressedMatrix<int,blaze::rowMajor> >;
86 
87    //! Opposite sparse lower triangular matrix type.
88    using SOLT = SLT::OppositeType;
89    //**********************************************************************************************
90 
91  public:
92    //**Constructors********************************************************************************
93    /*!\name Constructors */
94    //@{
95    explicit SubmatrixTest();
96    // No explicitly declared copy constructor.
97    //@}
98    //**********************************************************************************************
99 
100    //**Destructor**********************************************************************************
101    // No explicitly declared destructor.
102    //**********************************************************************************************
103 
104  private:
105    //**Test functions******************************************************************************
106    /*!\name Test functions */
107    //@{
108    template< typename LT > void testAssignment ();
109    template< typename LT > void testAddAssign  ();
110    template< typename LT > void testSubAssign  ();
111    template< typename LT > void testSchurAssign();
112 
113    template< typename Type >
114    void checkRows( const Type& matrix, size_t expectedRows ) const;
115 
116    template< typename Type >
117    void checkColumns( const Type& matrix, size_t expectedColumns ) const;
118 
119    template< typename Type >
120    void checkNonZeros( const Type& matrix, size_t expectedNonZeros ) const;
121    //@}
122    //**********************************************************************************************
123 
124    //**Utility functions***************************************************************************
125    /*!\name Utility functions */
126    //@{
127    template< typename LT > void init( LT& lower );
128    //@}
129    //**********************************************************************************************
130 
131    //**Member variables****************************************************************************
132    /*!\name Member variables */
133    //@{
134    std::string test_;  //!< Label of the currently performed test.
135    //@}
136    //**********************************************************************************************
137 };
138 //*************************************************************************************************
139 
140 
141 
142 
143 //=================================================================================================
144 //
145 //  TEST FUNCTIONS
146 //
147 //=================================================================================================
148 
149 //*************************************************************************************************
150 /*!\brief Test of the assignment to a submatrix of a LowerMatrix.
151 //
152 // \return void
153 // \exception std::runtime_error Error detected.
154 //
155 // This function performs a test of the assignment to a submatrix of a LowerMatrix. In case an
156 // error is detected, a \a std::runtime_error exception is thrown.
157 */
158 template< typename LT >  // Type of the lower matrix
testAssignment()159 void SubmatrixTest::testAssignment()
160 {
161    //=====================================================================================
162    // Dense matrix assignment
163    //=====================================================================================
164 
165    // (  1  0  0  0 )      (  1  0  0  0 )
166    // ( -4  2  0  0 )  =>  ( -4 18  0  0 )
167    // (  7  0  3  0 )      (  7 14 11  0 )
168    // ( -2  0  1  5 )      ( -2 15 19  5 )
169    {
170       test_ = "Row-major dense matrix assignment test 1";
171 
172       blaze::DynamicMatrix<int,blaze::rowMajor> mat( 4UL, 2UL, 0 );
173       mat(1,0) = 18;
174       mat(2,0) = 14;
175       mat(2,1) = 11;
176       mat(3,0) = 15;
177       mat(3,1) = 19;
178 
179       LT lower;
180       init( lower );
181 
182       auto sm = submatrix( lower, 0UL, 1UL, 4UL, 2UL );
183       sm = mat;
184 
185       checkRows    ( lower,  4UL );
186       checkColumns ( lower,  4UL );
187       checkNonZeros( lower, 10UL );
188 
189       if( sm(0,0) !=  0 || sm(0,1) !=  0 ||
190           sm(1,0) != 18 || sm(1,1) !=  0 ||
191           sm(2,0) != 14 || sm(2,1) != 11 ||
192           sm(3,0) != 15 || sm(3,1) != 19 ) {
193          std::ostringstream oss;
194          oss << " Test: " << test_ << "\n"
195              << " Error: Assignment to submatrix failed\n"
196              << " Details:\n"
197              << "   Result:\n" << sm << "\n"
198              << "   Expected result:\n(  0  0 )\n( 18  0 )\n( 14 11 )\n( 15 19 )\n";
199          throw std::runtime_error( oss.str() );
200       }
201 
202       if( lower(0,0) !=  1 || lower(0,1) !=  0 || lower(0,2) !=  0 || lower(0,3) != 0 ||
203           lower(1,0) != -4 || lower(1,1) != 18 || lower(1,2) !=  0 || lower(1,3) != 0 ||
204           lower(2,0) !=  7 || lower(2,1) != 14 || lower(2,2) != 11 || lower(2,3) != 0 ||
205           lower(3,0) != -2 || lower(3,1) != 15 || lower(3,2) != 19 || lower(3,3) != 5 ) {
206          std::ostringstream oss;
207          oss << " Test: " << test_ << "\n"
208              << " Error: Assignment to submatrix failed\n"
209              << " Details:\n"
210              << "   Result:\n" << lower << "\n"
211              << "   Expected result:\n(  1  0  0  0 )\n"
212                                      "( -4 18  0  0 )\n"
213                                      "(  7 14 11  0 )\n"
214                                      "( -2 15 19  5 )\n";
215          throw std::runtime_error( oss.str() );
216       }
217    }
218 
219    // (  1  0  0  0 )      (  1  0  0  0 )
220    // ( -4  2  0  0 )  =>  ( 12 18  0  0 )
221    // (  7  0  3  0 )      ( 15 17 11  0 )
222    // ( -2  0  1  5 )      ( -2  0  1  5 )
223    {
224       test_ = "Row-major dense matrix assignment test 2";
225 
226       blaze::DynamicMatrix<int,blaze::rowMajor> mat( 2UL, 4UL, 0 );
227       mat(0,0) = 12;
228       mat(0,1) = 18;
229       mat(1,0) = 15;
230       mat(1,1) = 17;
231       mat(1,2) = 11;
232 
233       LT lower;
234       init( lower );
235 
236       auto sm = submatrix( lower, 1UL, 0UL, 2UL, 4UL );
237       sm = mat;
238 
239       checkRows    ( lower, 4UL );
240       checkColumns ( lower, 4UL );
241       checkNonZeros( lower, 9UL );
242 
243       if( sm(0,0) != 12 || sm(0,1) != 18 || sm(0,2) !=  0 || sm(0,3) != 0 ||
244           sm(1,0) != 15 || sm(1,1) != 17 || sm(1,2) != 11 || sm(1,3) != 0 ) {
245          std::ostringstream oss;
246          oss << " Test: " << test_ << "\n"
247              << " Error: Assignment to submatrix failed\n"
248              << " Details:\n"
249              << "   Result:\n" << sm << "\n"
250              << "   Expected result:\n( 12 18  0  0 )\n( 15 17 11  0 )\n";
251          throw std::runtime_error( oss.str() );
252       }
253 
254       if( lower(0,0) !=  1 || lower(0,1) !=  0 || lower(0,2) !=  0 || lower(0,3) != 0 ||
255           lower(1,0) != 12 || lower(1,1) != 18 || lower(1,2) !=  0 || lower(1,3) != 0 ||
256           lower(2,0) != 15 || lower(2,1) != 17 || lower(2,2) != 11 || lower(2,3) != 0 ||
257           lower(3,0) != -2 || lower(3,1) !=  0 || lower(3,2) !=  1 || lower(3,3) != 5 ) {
258          std::ostringstream oss;
259          oss << " Test: " << test_ << "\n"
260              << " Error: Assignment to submatrix failed\n"
261              << " Details:\n"
262              << "   Result:\n" << lower << "\n"
263              << "   Expected result:\n(  1  0  0  0 )\n"
264                                      "( 12 18  0  0 )\n"
265                                      "( 15 17 11  0 )\n"
266                                      "( -2  0  1  5 )\n";
267          throw std::runtime_error( oss.str() );
268       }
269    }
270 
271    // (  1  0  0  0 )      (  1  0  0  0 )
272    // ( -4  2  0  0 )  =>  ( -4 11 12  0 )
273    // (  7  0  3  0 )      (  7 13 14  0 )
274    // ( -2  0  1  5 )      ( -2  0  1  5 )
275    {
276       test_ = "Row-major dense matrix assignment test 3";
277 
278       blaze::DynamicMatrix<int,blaze::rowMajor> mat( 2UL, 2UL );
279       mat(0,0) = 11;
280       mat(0,1) = 12;
281       mat(1,0) = 13;
282       mat(1,1) = 14;
283 
284       LT lower;
285       init( lower );
286 
287       auto sm = submatrix( lower, 1UL, 1UL, 2UL, 2UL );
288 
289       try {
290          sm = mat;
291 
292          std::ostringstream oss;
293          oss << " Test: " << test_ << "\n"
294              << " Error: Assignment of invalid matrix succeeded\n"
295              << " Details:\n"
296              << "   Result:\n" << lower << "\n";
297          throw std::runtime_error( oss.str() );
298       }
299       catch( std::invalid_argument& ) {}
300    }
301 
302    // (  1  0  0  0 )      (  1  0  0  0 )
303    // ( -4  2  0  0 )  =>  ( -4 18  0  0 )
304    // (  7  0  3  0 )      (  7 14 11  0 )
305    // ( -2  0  1  5 )      ( -2 15 19  5 )
306    {
307       test_ = "Column-major dense matrix assignment test 1";
308 
309       blaze::DynamicMatrix<int,blaze::columnMajor> mat( 4UL, 2UL, 0 );
310       mat(1,0) = 18;
311       mat(2,0) = 14;
312       mat(2,1) = 11;
313       mat(3,0) = 15;
314       mat(3,1) = 19;
315 
316       LT lower;
317       init( lower );
318 
319       auto sm = submatrix( lower, 0UL, 1UL, 4UL, 2UL );
320       sm = mat;
321 
322       checkRows    ( lower,  4UL );
323       checkColumns ( lower,  4UL );
324       checkNonZeros( lower, 10UL );
325 
326       if( sm(0,0) !=  0 || sm(0,1) !=  0 ||
327           sm(1,0) != 18 || sm(1,1) !=  0 ||
328           sm(2,0) != 14 || sm(2,1) != 11 ||
329           sm(3,0) != 15 || sm(3,1) != 19 ) {
330          std::ostringstream oss;
331          oss << " Test: " << test_ << "\n"
332              << " Error: Assignment to submatrix failed\n"
333              << " Details:\n"
334              << "   Result:\n" << sm << "\n"
335              << "   Expected result:\n(  0  0 )\n( 18  0 )\n( 14 11 )\n( 15 19 )\n";
336          throw std::runtime_error( oss.str() );
337       }
338 
339       if( lower(0,0) !=  1 || lower(0,1) !=  0 || lower(0,2) !=  0 || lower(0,3) != 0 ||
340           lower(1,0) != -4 || lower(1,1) != 18 || lower(1,2) !=  0 || lower(1,3) != 0 ||
341           lower(2,0) !=  7 || lower(2,1) != 14 || lower(2,2) != 11 || lower(2,3) != 0 ||
342           lower(3,0) != -2 || lower(3,1) != 15 || lower(3,2) != 19 || lower(3,3) != 5 ) {
343          std::ostringstream oss;
344          oss << " Test: " << test_ << "\n"
345              << " Error: Assignment to submatrix failed\n"
346              << " Details:\n"
347              << "   Result:\n" << lower << "\n"
348              << "   Expected result:\n(  1  0  0  0 )\n"
349                                      "( -4 18  0  0 )\n"
350                                      "(  7 14 11  0 )\n"
351                                      "( -2 15 19  5 )\n";
352          throw std::runtime_error( oss.str() );
353       }
354    }
355 
356    // (  1  0  0  0 )      (  1  0  0  0 )
357    // ( -4  2  0  0 )  =>  ( 12 18  0  0 )
358    // (  7  0  3  0 )      ( 15 17 11  0 )
359    // ( -2  0  1  5 )      ( -2  0  1  5 )
360    {
361       test_ = "Column-major dense matrix assignment test 2";
362 
363       blaze::DynamicMatrix<int,blaze::columnMajor> mat( 2UL, 4UL, 0 );
364       mat(0,0) = 12;
365       mat(0,1) = 18;
366       mat(1,0) = 15;
367       mat(1,1) = 17;
368       mat(1,2) = 11;
369 
370       LT lower;
371       init( lower );
372 
373       auto sm = submatrix( lower, 1UL, 0UL, 2UL, 4UL );
374       sm = mat;
375 
376       checkRows    ( lower, 4UL );
377       checkColumns ( lower, 4UL );
378       checkNonZeros( lower, 9UL );
379 
380       if( sm(0,0) != 12 || sm(0,1) != 18 || sm(0,2) !=  0 || sm(0,3) != 0 ||
381           sm(1,0) != 15 || sm(1,1) != 17 || sm(1,2) != 11 || sm(1,3) != 0 ) {
382          std::ostringstream oss;
383          oss << " Test: " << test_ << "\n"
384              << " Error: Assignment to submatrix failed\n"
385              << " Details:\n"
386              << "   Result:\n" << sm << "\n"
387              << "   Expected result:\n( 12 18  0  0 )\n( 15 17 11  0 )\n";
388          throw std::runtime_error( oss.str() );
389       }
390 
391       if( lower(0,0) !=  1 || lower(0,1) !=  0 || lower(0,2) !=  0 || lower(0,3) != 0 ||
392           lower(1,0) != 12 || lower(1,1) != 18 || lower(1,2) !=  0 || lower(1,3) != 0 ||
393           lower(2,0) != 15 || lower(2,1) != 17 || lower(2,2) != 11 || lower(2,3) != 0 ||
394           lower(3,0) != -2 || lower(3,1) !=  0 || lower(3,2) !=  1 || lower(3,3) != 5 ) {
395          std::ostringstream oss;
396          oss << " Test: " << test_ << "\n"
397              << " Error: Assignment to submatrix failed\n"
398              << " Details:\n"
399              << "   Result:\n" << lower << "\n"
400              << "   Expected result:\n(  1  0  0  0 )\n"
401                                      "( 12 18  0  0 )\n"
402                                      "( 15 17 11  0 )\n"
403                                      "( -2  0  1  5 )\n";
404          throw std::runtime_error( oss.str() );
405       }
406    }
407 
408    // (  1  0  0  0 )      (  1  0  0  0 )
409    // ( -4  2  0  0 )  =>  ( -4 11 12  0 )
410    // (  7  0  3  0 )      (  7 13 14  0 )
411    // ( -2  0  1  5 )      ( -2  0  1  5 )
412    {
413       test_ = "Column-major dense matrix assignment test 3";
414 
415       blaze::DynamicMatrix<int,blaze::columnMajor> mat( 2UL, 2UL );
416       mat(0,0) = 11;
417       mat(0,1) = 12;
418       mat(1,0) = 13;
419       mat(1,1) = 14;
420 
421       LT lower;
422       init( lower );
423 
424       auto sm = submatrix( lower, 1UL, 1UL, 2UL, 2UL );
425 
426       try {
427          sm = mat;
428 
429          std::ostringstream oss;
430          oss << " Test: " << test_ << "\n"
431              << " Error: Assignment of invalid matrix succeeded\n"
432              << " Details:\n"
433              << "   Result:\n" << lower << "\n";
434          throw std::runtime_error( oss.str() );
435       }
436       catch( std::invalid_argument& ) {}
437    }
438 
439 
440    //=====================================================================================
441    // Sparse matrix assignment
442    //=====================================================================================
443 
444    // (  1  0  0  0 )      (  1  0  0  0 )
445    // ( -4  2  0  0 )  =>  ( -4 18  0  0 )
446    // (  7  0  3  0 )      (  7 14 11  0 )
447    // ( -2  0  1  5 )      ( -2 15 19  5 )
448    {
449       test_ = "Row-major sparse matrix assignment test 1";
450 
451       blaze::CompressedMatrix<int,blaze::rowMajor> mat( 4UL, 2UL, 6UL );
452       mat(1,0) = 18;
453       mat(2,0) = 14;
454       mat(2,1) = 11;
455       mat(3,0) = 15;
456       mat(3,1) = 19;
457       mat.insert( 0UL, 1UL, 0 );
458 
459       LT lower;
460       init( lower );
461 
462       auto sm = submatrix( lower, 0UL, 1UL, 4UL, 2UL );
463       sm = mat;
464 
465       checkRows    ( lower,  4UL );
466       checkColumns ( lower,  4UL );
467       checkNonZeros( lower, 10UL );
468 
469       if( sm(0,0) !=  0 || sm(0,1) !=  0 ||
470           sm(1,0) != 18 || sm(1,1) !=  0 ||
471           sm(2,0) != 14 || sm(2,1) != 11 ||
472           sm(3,0) != 15 || sm(3,1) != 19 ) {
473          std::ostringstream oss;
474          oss << " Test: " << test_ << "\n"
475              << " Error: Assignment to submatrix failed\n"
476              << " Details:\n"
477              << "   Result:\n" << sm << "\n"
478              << "   Expected result:\n(  0  0 )\n( 18  0 )\n( 14 11 )\n( 15 19 )\n";
479          throw std::runtime_error( oss.str() );
480       }
481 
482       if( lower(0,0) !=  1 || lower(0,1) !=  0 || lower(0,2) !=  0 || lower(0,3) != 0 ||
483           lower(1,0) != -4 || lower(1,1) != 18 || lower(1,2) !=  0 || lower(1,3) != 0 ||
484           lower(2,0) !=  7 || lower(2,1) != 14 || lower(2,2) != 11 || lower(2,3) != 0 ||
485           lower(3,0) != -2 || lower(3,1) != 15 || lower(3,2) != 19 || lower(3,3) != 5 ) {
486          std::ostringstream oss;
487          oss << " Test: " << test_ << "\n"
488              << " Error: Assignment to submatrix failed\n"
489              << " Details:\n"
490              << "   Result:\n" << lower << "\n"
491              << "   Expected result:\n(  1  0  0  0 )\n"
492                                      "( -4 18  0  0 )\n"
493                                      "(  7 14 11  0 )\n"
494                                      "( -2 15 19  5 )\n";
495          throw std::runtime_error( oss.str() );
496       }
497    }
498 
499    // (  1  0  0  0 )      (  1  0  0  0 )
500    // ( -4  2  0  0 )  =>  ( 12 18  0  0 )
501    // (  7  0  3  0 )      ( 15 17 11  0 )
502    // ( -2  0  1  5 )      ( -2  0  1  5 )
503    {
504       test_ = "Row-major sparse matrix assignment test 2";
505 
506       blaze::CompressedMatrix<int,blaze::rowMajor> mat( 2UL, 4UL, 6UL );
507       mat(0,0) = 12;
508       mat(0,1) = 18;
509       mat(1,0) = 15;
510       mat(1,1) = 17;
511       mat(1,2) = 11;
512       mat.insert( 0UL, 3UL, 0 );
513 
514       LT lower;
515       init( lower );
516 
517       auto sm = submatrix( lower, 1UL, 0UL, 2UL, 4UL );
518       sm = mat;
519 
520       checkRows    ( lower, 4UL );
521       checkColumns ( lower, 4UL );
522       checkNonZeros( lower, 9UL );
523 
524       if( sm(0,0) != 12 || sm(0,1) != 18 || sm(0,2) !=  0 || sm(0,3) != 0 ||
525           sm(1,0) != 15 || sm(1,1) != 17 || sm(1,2) != 11 || sm(1,3) != 0 ) {
526          std::ostringstream oss;
527          oss << " Test: " << test_ << "\n"
528              << " Error: Assignment to submatrix failed\n"
529              << " Details:\n"
530              << "   Result:\n" << sm << "\n"
531              << "   Expected result:\n( 12 18  0  0 )\n( 15 17 11  0 )\n";
532          throw std::runtime_error( oss.str() );
533       }
534 
535       if( lower(0,0) !=  1 || lower(0,1) !=  0 || lower(0,2) !=  0 || lower(0,3) != 0 ||
536           lower(1,0) != 12 || lower(1,1) != 18 || lower(1,2) !=  0 || lower(1,3) != 0 ||
537           lower(2,0) != 15 || lower(2,1) != 17 || lower(2,2) != 11 || lower(2,3) != 0 ||
538           lower(3,0) != -2 || lower(3,1) !=  0 || lower(3,2) !=  1 || lower(3,3) != 5 ) {
539          std::ostringstream oss;
540          oss << " Test: " << test_ << "\n"
541              << " Error: Assignment to submatrix failed\n"
542              << " Details:\n"
543              << "   Result:\n" << lower << "\n"
544              << "   Expected result:\n(  1  0  0  0 )\n"
545                                      "( 12 18  0  0 )\n"
546                                      "( 15 17 11  0 )\n"
547                                      "( -2  0  1  5 )\n";
548          throw std::runtime_error( oss.str() );
549       }
550    }
551 
552    // (  1  0  0  0 )      (  1  0  0  0 )
553    // ( -4  2  0  0 )  =>  ( -4 11 12  0 )
554    // (  7  0  3  0 )      (  7 13 14  0 )
555    // ( -2  0  1  5 )      ( -2  0  1  5 )
556    {
557       test_ = "Row-major sparse matrix assignment test 3";
558 
559       blaze::CompressedMatrix<int,blaze::rowMajor> mat( 2UL, 2UL, 4UL );
560       mat(0,0) = 11;
561       mat(0,1) = 12;
562       mat(1,0) = 13;
563       mat(1,1) = 14;
564 
565       LT lower;
566       init( lower );
567 
568       auto sm = submatrix( lower, 1UL, 1UL, 2UL, 2UL );
569 
570       try {
571          sm = mat;
572 
573          std::ostringstream oss;
574          oss << " Test: " << test_ << "\n"
575              << " Error: Assignment of invalid matrix succeeded\n"
576              << " Details:\n"
577              << "   Result:\n" << lower << "\n";
578          throw std::runtime_error( oss.str() );
579       }
580       catch( std::invalid_argument& ) {}
581    }
582 
583    // (  1  0  0  0 )      (  1  0  0  0 )
584    // ( -4  2  0  0 )  =>  ( -4 18  0  0 )
585    // (  7  0  3  0 )      (  7 14 11  0 )
586    // ( -2  0  1  5 )      ( -2 15 19  5 )
587    {
588       test_ = "Column-major sparse matrix assignment test 1";
589 
590       blaze::CompressedMatrix<int,blaze::columnMajor> mat( 4UL, 2UL, 6UL );
591       mat(1,0) = 18;
592       mat(2,0) = 14;
593       mat(2,1) = 11;
594       mat(3,0) = 15;
595       mat(3,1) = 19;
596       mat.insert( 0UL, 1UL, 0 );
597 
598       LT lower;
599       init( lower );
600 
601       auto sm = submatrix( lower, 0UL, 1UL, 4UL, 2UL );
602       sm = mat;
603 
604       checkRows    ( lower,  4UL );
605       checkColumns ( lower,  4UL );
606       checkNonZeros( lower, 10UL );
607 
608       if( sm(0,0) !=  0 || sm(0,1) !=  0 ||
609           sm(1,0) != 18 || sm(1,1) !=  0 ||
610           sm(2,0) != 14 || sm(2,1) != 11 ||
611           sm(3,0) != 15 || sm(3,1) != 19 ) {
612          std::ostringstream oss;
613          oss << " Test: " << test_ << "\n"
614              << " Error: Assignment to submatrix failed\n"
615              << " Details:\n"
616              << "   Result:\n" << sm << "\n"
617              << "   Expected result:\n(  0  0 )\n( 18  0 )\n( 14 11 )\n( 15 19 )\n";
618          throw std::runtime_error( oss.str() );
619       }
620 
621       if( lower(0,0) !=  1 || lower(0,1) !=  0 || lower(0,2) !=  0 || lower(0,3) != 0 ||
622           lower(1,0) != -4 || lower(1,1) != 18 || lower(1,2) !=  0 || lower(1,3) != 0 ||
623           lower(2,0) !=  7 || lower(2,1) != 14 || lower(2,2) != 11 || lower(2,3) != 0 ||
624           lower(3,0) != -2 || lower(3,1) != 15 || lower(3,2) != 19 || lower(3,3) != 5 ) {
625          std::ostringstream oss;
626          oss << " Test: " << test_ << "\n"
627              << " Error: Assignment to submatrix failed\n"
628              << " Details:\n"
629              << "   Result:\n" << lower << "\n"
630              << "   Expected result:\n(  1  0  0  0 )\n"
631                                      "( -4 18  0  0 )\n"
632                                      "(  7 14 11  0 )\n"
633                                      "( -2 15 19  5 )\n";
634          throw std::runtime_error( oss.str() );
635       }
636    }
637 
638    // (  1  0  0  0 )      (  1  0  0  0 )
639    // ( -4  2  0  0 )  =>  ( 12 18  0  0 )
640    // (  7  0  3  0 )      ( 15 17 11  0 )
641    // ( -2  0  1  5 )      ( -2  0  1  5 )
642    {
643       test_ = "Column-major sparse matrix assignment test 2";
644 
645       blaze::CompressedMatrix<int,blaze::columnMajor> mat( 2UL, 4UL, 6UL );
646       mat(0,0) = 12;
647       mat(0,1) = 18;
648       mat(1,0) = 15;
649       mat(1,1) = 17;
650       mat(1,2) = 11;
651       mat.insert( 0UL, 3UL, 0 );
652 
653       LT lower;
654       init( lower );
655 
656       auto sm = submatrix( lower, 1UL, 0UL, 2UL, 4UL );
657       sm = mat;
658 
659       checkRows    ( lower, 4UL );
660       checkColumns ( lower, 4UL );
661       checkNonZeros( lower, 9UL );
662 
663       if( sm(0,0) != 12 || sm(0,1) != 18 || sm(0,2) !=  0 || sm(0,3) != 0 ||
664           sm(1,0) != 15 || sm(1,1) != 17 || sm(1,2) != 11 || sm(1,3) != 0 ) {
665          std::ostringstream oss;
666          oss << " Test: " << test_ << "\n"
667              << " Error: Assignment to submatrix failed\n"
668              << " Details:\n"
669              << "   Result:\n" << sm << "\n"
670              << "   Expected result:\n( 12 18  0  0 )\n( 15 17 11  0 )\n";
671          throw std::runtime_error( oss.str() );
672       }
673 
674       if( lower(0,0) !=  1 || lower(0,1) !=  0 || lower(0,2) !=  0 || lower(0,3) != 0 ||
675           lower(1,0) != 12 || lower(1,1) != 18 || lower(1,2) !=  0 || lower(1,3) != 0 ||
676           lower(2,0) != 15 || lower(2,1) != 17 || lower(2,2) != 11 || lower(2,3) != 0 ||
677           lower(3,0) != -2 || lower(3,1) !=  0 || lower(3,2) !=  1 || lower(3,3) != 5 ) {
678          std::ostringstream oss;
679          oss << " Test: " << test_ << "\n"
680              << " Error: Assignment to submatrix failed\n"
681              << " Details:\n"
682              << "   Result:\n" << lower << "\n"
683              << "   Expected result:\n(  1  0  0  0 )\n"
684                                      "( 12 18  0  0 )\n"
685                                      "( 15 17 11  0 )\n"
686                                      "( -2  0  1  5 )\n";
687          throw std::runtime_error( oss.str() );
688       }
689    }
690 
691    // (  1  0  0  0 )      (  1  0  0  0 )
692    // ( -4  2  0  0 )  =>  ( -4 11 12  0 )
693    // (  7  0  3  0 )      (  7 13 14  0 )
694    // ( -2  0  1  5 )      ( -2  0  1  5 )
695    {
696       test_ = "Column-major sparse matrix assignment test 3";
697 
698       blaze::CompressedMatrix<int,blaze::columnMajor> mat( 2UL, 2UL, 4UL );
699       mat(0,0) = 11;
700       mat(0,1) = 12;
701       mat(1,0) = 13;
702       mat(1,1) = 14;
703 
704       LT lower;
705       init( lower );
706 
707       auto sm = submatrix( lower, 1UL, 1UL, 2UL, 2UL );
708 
709       try {
710          sm = mat;
711 
712          std::ostringstream oss;
713          oss << " Test: " << test_ << "\n"
714              << " Error: Assignment of invalid matrix succeeded\n"
715              << " Details:\n"
716              << "   Result:\n" << lower << "\n";
717          throw std::runtime_error( oss.str() );
718       }
719       catch( std::invalid_argument& ) {}
720    }
721 }
722 //*************************************************************************************************
723 
724 
725 //*************************************************************************************************
726 /*!\brief Test of the addition assignment to a submatrix of a LowerMatrix.
727 //
728 // \return void
729 // \exception std::runtime_error Error detected.
730 //
731 // This function performs a test of the addition assignment to a submatrix of a LowerMatrix. In
732 // case an error is detected, a \a std::runtime_error exception is thrown.
733 */
734 template< typename LT >  // Type of the lower matrix
testAddAssign()735 void SubmatrixTest::testAddAssign()
736 {
737    //=====================================================================================
738    // Dense matrix addition assignment
739    //=====================================================================================
740 
741    // (  1  0  0  0 )      (  1  0  0  0 )
742    // ( -4  2  0  0 )  =>  ( -4 20  0  0 )
743    // (  7  0  3  0 )      (  7 14 14  0 )
744    // ( -2  0  1  5 )      ( -2 15 20  5 )
745    {
746       test_ = "Row-major dense matrix addition assignment test 1";
747 
748       blaze::DynamicMatrix<int,blaze::rowMajor> mat( 4UL, 2UL, 0 );
749       mat(1,0) = 18;
750       mat(2,0) = 14;
751       mat(2,1) = 11;
752       mat(3,0) = 15;
753       mat(3,1) = 19;
754 
755       LT lower;
756       init( lower );
757 
758       auto sm = submatrix( lower, 0UL, 1UL, 4UL, 2UL );
759       sm += mat;
760 
761       checkRows    ( lower,  4UL );
762       checkColumns ( lower,  4UL );
763       checkNonZeros( lower, 10UL );
764 
765       if( sm(0,0) !=  0 || sm(0,1) !=  0 ||
766           sm(1,0) != 20 || sm(1,1) !=  0 ||
767           sm(2,0) != 14 || sm(2,1) != 14 ||
768           sm(3,0) != 15 || sm(3,1) != 20 ) {
769          std::ostringstream oss;
770          oss << " Test: " << test_ << "\n"
771              << " Error: Assignment to submatrix failed\n"
772              << " Details:\n"
773              << "   Result:\n" << sm << "\n"
774              << "   Expected result:\n(  0  0 )\n( 20  0 )\n( 14 14 )\n( 15 20 )\n";
775          throw std::runtime_error( oss.str() );
776       }
777 
778       if( lower(0,0) !=  1 || lower(0,1) !=  0 || lower(0,2) !=  0 || lower(0,3) != 0 ||
779           lower(1,0) != -4 || lower(1,1) != 20 || lower(1,2) !=  0 || lower(1,3) != 0 ||
780           lower(2,0) !=  7 || lower(2,1) != 14 || lower(2,2) != 14 || lower(2,3) != 0 ||
781           lower(3,0) != -2 || lower(3,1) != 15 || lower(3,2) != 20 || lower(3,3) != 5 ) {
782          std::ostringstream oss;
783          oss << " Test: " << test_ << "\n"
784              << " Error: Assignment to submatrix failed\n"
785              << " Details:\n"
786              << "   Result:\n" << lower << "\n"
787              << "   Expected result:\n(  1  0  0  0 )\n"
788                                      "( -4 20  0  0 )\n"
789                                      "(  7 14 14  0 )\n"
790                                      "( -2 15 20  5 )\n";
791          throw std::runtime_error( oss.str() );
792       }
793    }
794 
795    // (  1  0  0  0 )      (  1  0  0  0 )
796    // ( -4  2  0  0 )  =>  (  8 20  0  0 )
797    // (  7  0  3  0 )      ( 22 17 14  0 )
798    // ( -2  0  1  5 )      ( -2  0  1  5 )
799    {
800       test_ = "Row-major dense matrix addition assignment test 2";
801 
802       blaze::DynamicMatrix<int,blaze::rowMajor> mat( 2UL, 4UL, 0 );
803       mat(0,0) = 12;
804       mat(0,1) = 18;
805       mat(1,0) = 15;
806       mat(1,1) = 17;
807       mat(1,2) = 11;
808 
809       LT lower;
810       init( lower );
811 
812       auto sm = submatrix( lower, 1UL, 0UL, 2UL, 4UL );
813       sm += mat;
814 
815       checkRows    ( lower, 4UL );
816       checkColumns ( lower, 4UL );
817       checkNonZeros( lower, 9UL );
818 
819       if( sm(0,0) !=  8 || sm(0,1) != 20 || sm(0,2) !=  0 || sm(0,3) != 0 ||
820           sm(1,0) != 22 || sm(1,1) != 17 || sm(1,2) != 14 || sm(1,3) != 0 ) {
821          std::ostringstream oss;
822          oss << " Test: " << test_ << "\n"
823              << " Error: Assignment to submatrix failed\n"
824              << " Details:\n"
825              << "   Result:\n" << sm << "\n"
826              << "   Expected result:\n(  8 20  0  0 )\n( 22 17 14  0 )\n";
827          throw std::runtime_error( oss.str() );
828       }
829 
830       if( lower(0,0) !=  1 || lower(0,1) !=  0 || lower(0,2) !=  0 || lower(0,3) != 0 ||
831           lower(1,0) !=  8 || lower(1,1) != 20 || lower(1,2) !=  0 || lower(1,3) != 0 ||
832           lower(2,0) != 22 || lower(2,1) != 17 || lower(2,2) != 14 || lower(2,3) != 0 ||
833           lower(3,0) != -2 || lower(3,1) !=  0 || lower(3,2) !=  1 || lower(3,3) != 5 ) {
834          std::ostringstream oss;
835          oss << " Test: " << test_ << "\n"
836              << " Error: Assignment to submatrix failed\n"
837              << " Details:\n"
838              << "   Result:\n" << lower << "\n"
839              << "   Expected result:\n(  1  0  0  0 )\n"
840                                      "(  8 20  0  0 )\n"
841                                      "( 22 17 14  0 )\n"
842                                      "( -2  0  1  5 )\n";
843          throw std::runtime_error( oss.str() );
844       }
845    }
846 
847    // (  1  0  0  0 )      (  1  0  0  0 )
848    // ( -4  2  0  0 )  =>  ( -4 13 12  0 )
849    // (  7  0  3  0 )      (  7 13 17  0 )
850    // ( -2  0  1  5 )      ( -2  0  1  5 )
851    {
852       test_ = "Row-major dense matrix addition assignment test 3";
853 
854       blaze::DynamicMatrix<int,blaze::rowMajor> mat( 2UL, 2UL );
855       mat(0,0) = 11;
856       mat(0,1) = 12;
857       mat(1,0) = 13;
858       mat(1,1) = 14;
859 
860       LT lower;
861       init( lower );
862 
863       auto sm = submatrix( lower, 1UL, 1UL, 2UL, 2UL );
864 
865       try {
866          sm += mat;
867 
868          std::ostringstream oss;
869          oss << " Test: " << test_ << "\n"
870              << " Error: Assignment of invalid matrix succeeded\n"
871              << " Details:\n"
872              << "   Result:\n" << lower << "\n";
873          throw std::runtime_error( oss.str() );
874       }
875       catch( std::invalid_argument& ) {}
876    }
877 
878    // (  1  0  0  0 )      (  1  0  0  0 )
879    // ( -4  2  0  0 )  =>  ( -4 20  0  0 )
880    // (  7  0  3  0 )      (  7 14 14  0 )
881    // ( -2  0  1  5 )      ( -2 15 20  5 )
882    {
883       test_ = "Column-major dense matrix addition assignment test 1";
884 
885       blaze::DynamicMatrix<int,blaze::columnMajor> mat( 4UL, 2UL, 0 );
886       mat(1,0) = 18;
887       mat(2,0) = 14;
888       mat(2,1) = 11;
889       mat(3,0) = 15;
890       mat(3,1) = 19;
891 
892       LT lower;
893       init( lower );
894 
895       auto sm = submatrix( lower, 0UL, 1UL, 4UL, 2UL );
896       sm += mat;
897 
898       checkRows    ( lower,  4UL );
899       checkColumns ( lower,  4UL );
900       checkNonZeros( lower, 10UL );
901 
902       if( sm(0,0) !=  0 || sm(0,1) !=  0 ||
903           sm(1,0) != 20 || sm(1,1) !=  0 ||
904           sm(2,0) != 14 || sm(2,1) != 14 ||
905           sm(3,0) != 15 || sm(3,1) != 20 ) {
906          std::ostringstream oss;
907          oss << " Test: " << test_ << "\n"
908              << " Error: Assignment to submatrix failed\n"
909              << " Details:\n"
910              << "   Result:\n" << sm << "\n"
911              << "   Expected result:\n(  0  0 )\n( 20  0 )\n( 14 14 )\n( 15 20 )\n";
912          throw std::runtime_error( oss.str() );
913       }
914 
915       if( lower(0,0) !=  1 || lower(0,1) !=  0 || lower(0,2) !=  0 || lower(0,3) != 0 ||
916           lower(1,0) != -4 || lower(1,1) != 20 || lower(1,2) !=  0 || lower(1,3) != 0 ||
917           lower(2,0) !=  7 || lower(2,1) != 14 || lower(2,2) != 14 || lower(2,3) != 0 ||
918           lower(3,0) != -2 || lower(3,1) != 15 || lower(3,2) != 20 || lower(3,3) != 5 ) {
919          std::ostringstream oss;
920          oss << " Test: " << test_ << "\n"
921              << " Error: Assignment to submatrix failed\n"
922              << " Details:\n"
923              << "   Result:\n" << lower << "\n"
924              << "   Expected result:\n(  1  0  0  0 )\n"
925                                      "( -4 20  0  0 )\n"
926                                      "(  7 14 14  0 )\n"
927                                      "( -2 15 20  5 )\n";
928          throw std::runtime_error( oss.str() );
929       }
930    }
931 
932    // (  1  0  0  0 )      (  1  0  0  0 )
933    // ( -4  2  0  0 )  =>  (  8 20  0  0 )
934    // (  7  0  3  0 )      ( 22 17 14  0 )
935    // ( -2  0  1  5 )      ( -2  0  1  5 )
936    {
937       test_ = "Column-major dense matrix addition assignment test 2";
938 
939       blaze::DynamicMatrix<int,blaze::columnMajor> mat( 2UL, 4UL, 0 );
940       mat(0,0) = 12;
941       mat(0,1) = 18;
942       mat(1,0) = 15;
943       mat(1,1) = 17;
944       mat(1,2) = 11;
945 
946       LT lower;
947       init( lower );
948 
949       auto sm = submatrix( lower, 1UL, 0UL, 2UL, 4UL );
950       sm += mat;
951 
952       checkRows    ( lower, 4UL );
953       checkColumns ( lower, 4UL );
954       checkNonZeros( lower, 9UL );
955 
956       if( sm(0,0) !=  8 || sm(0,1) != 20 || sm(0,2) !=  0 || sm(0,3) != 0 ||
957           sm(1,0) != 22 || sm(1,1) != 17 || sm(1,2) != 14 || sm(1,3) != 0 ) {
958          std::ostringstream oss;
959          oss << " Test: " << test_ << "\n"
960              << " Error: Assignment to submatrix failed\n"
961              << " Details:\n"
962              << "   Result:\n" << sm << "\n"
963              << "   Expected result:\n( 12 18  0  0 )\n( 15 17 11  0 )\n";
964          throw std::runtime_error( oss.str() );
965       }
966 
967       if( lower(0,0) !=  1 || lower(0,1) !=  0 || lower(0,2) !=  0 || lower(0,3) != 0 ||
968           lower(1,0) !=  8 || lower(1,1) != 20 || lower(1,2) !=  0 || lower(1,3) != 0 ||
969           lower(2,0) != 22 || lower(2,1) != 17 || lower(2,2) != 14 || lower(2,3) != 0 ||
970           lower(3,0) != -2 || lower(3,1) !=  0 || lower(3,2) !=  1 || lower(3,3) != 5 ) {
971          std::ostringstream oss;
972          oss << " Test: " << test_ << "\n"
973              << " Error: Assignment to submatrix failed\n"
974              << " Details:\n"
975              << "   Result:\n" << lower << "\n"
976              << "   Expected result:\n(  1  0  0  0 )\n"
977                                      "(  8 20  0  0 )\n"
978                                      "( 22 17 14  0 )\n"
979                                      "( -2  0  1  5 )\n";
980          throw std::runtime_error( oss.str() );
981       }
982    }
983 
984    // (  1  0  0  0 )      (  1  0  0  0 )
985    // ( -4  2  0  0 )  =>  ( -4 13 12  0 )
986    // (  7  0  3  0 )      (  7 13 17  0 )
987    // ( -2  0  1  5 )      ( -2  0  1  5 )
988    {
989       test_ = "Column-major dense matrix addition assignment test 3";
990 
991       blaze::DynamicMatrix<int,blaze::columnMajor> mat( 2UL, 2UL );
992       mat(0,0) = 11;
993       mat(0,1) = 12;
994       mat(1,0) = 13;
995       mat(1,1) = 14;
996 
997       LT lower;
998       init( lower );
999 
1000       auto sm = submatrix( lower, 1UL, 1UL, 2UL, 2UL );
1001 
1002       try {
1003          sm += mat;
1004 
1005          std::ostringstream oss;
1006          oss << " Test: " << test_ << "\n"
1007              << " Error: Assignment of invalid matrix succeeded\n"
1008              << " Details:\n"
1009              << "   Result:\n" << lower << "\n";
1010          throw std::runtime_error( oss.str() );
1011       }
1012       catch( std::invalid_argument& ) {}
1013    }
1014 
1015 
1016    //=====================================================================================
1017    // Row-major sparse matrix addition assignment
1018    //=====================================================================================
1019 
1020    // (  1  0  0  0 )      (  1  0  0  0 )
1021    // ( -4  2  0  0 )  =>  ( -4 20  0  0 )
1022    // (  7  0  3  0 )      (  7 14 14  0 )
1023    // ( -2  0  1  5 )      ( -2 15 20  5 )
1024    {
1025       test_ = "Row-major sparse matrix addition assignment test 1";
1026 
1027       blaze::CompressedMatrix<int,blaze::rowMajor> mat( 4UL, 2UL, 5UL );
1028       mat(1,0) = 18;
1029       mat(2,0) = 14;
1030       mat(2,1) = 11;
1031       mat(3,0) = 15;
1032       mat(3,1) = 19;
1033 
1034       LT lower;
1035       init( lower );
1036 
1037       auto sm = submatrix( lower, 0UL, 1UL, 4UL, 2UL );
1038       sm += mat;
1039 
1040       checkRows    ( lower,  4UL );
1041       checkColumns ( lower,  4UL );
1042       checkNonZeros( lower, 10UL );
1043 
1044       if( sm(0,0) !=  0 || sm(0,1) !=  0 ||
1045           sm(1,0) != 20 || sm(1,1) !=  0 ||
1046           sm(2,0) != 14 || sm(2,1) != 14 ||
1047           sm(3,0) != 15 || sm(3,1) != 20 ) {
1048          std::ostringstream oss;
1049          oss << " Test: " << test_ << "\n"
1050              << " Error: Assignment to submatrix failed\n"
1051              << " Details:\n"
1052              << "   Result:\n" << sm << "\n"
1053              << "   Expected result:\n(  0  0 )\n( 20  0 )\n( 14 14 )\n( 15 20 )\n";
1054          throw std::runtime_error( oss.str() );
1055       }
1056 
1057       if( lower(0,0) !=  1 || lower(0,1) !=  0 || lower(0,2) !=  0 || lower(0,3) != 0 ||
1058           lower(1,0) != -4 || lower(1,1) != 20 || lower(1,2) !=  0 || lower(1,3) != 0 ||
1059           lower(2,0) !=  7 || lower(2,1) != 14 || lower(2,2) != 14 || lower(2,3) != 0 ||
1060           lower(3,0) != -2 || lower(3,1) != 15 || lower(3,2) != 20 || lower(3,3) != 5 ) {
1061          std::ostringstream oss;
1062          oss << " Test: " << test_ << "\n"
1063              << " Error: Assignment to submatrix failed\n"
1064              << " Details:\n"
1065              << "   Result:\n" << lower << "\n"
1066              << "   Expected result:\n(  1  0  0  0 )\n"
1067                                      "( -4 20  0  0 )\n"
1068                                      "(  7 14 14  0 )\n"
1069                                      "( -2 15 20  5 )\n";
1070          throw std::runtime_error( oss.str() );
1071       }
1072    }
1073 
1074    // (  1  0  0  0 )      (  1  0  0  0 )
1075    // ( -4  2  0  0 )  =>  (  8 20  0  0 )
1076    // (  7  0  3  0 )      ( 22 17 14  0 )
1077    // ( -2  0  1  5 )      ( -2  0  1  5 )
1078    {
1079       test_ = "Row-major sparse matrix addition assignment test 2";
1080 
1081       blaze::CompressedMatrix<int,blaze::rowMajor> mat( 2UL, 4UL, 5UL );
1082       mat(0,0) = 12;
1083       mat(0,1) = 18;
1084       mat(1,0) = 15;
1085       mat(1,1) = 17;
1086       mat(1,2) = 11;
1087 
1088       LT lower;
1089       init( lower );
1090 
1091       auto sm = submatrix( lower, 1UL, 0UL, 2UL, 4UL );
1092       sm += mat;
1093 
1094       checkRows    ( lower, 4UL );
1095       checkColumns ( lower, 4UL );
1096       checkNonZeros( lower, 9UL );
1097 
1098       if( sm(0,0) !=  8 || sm(0,1) != 20 || sm(0,2) !=  0 || sm(0,3) != 0 ||
1099           sm(1,0) != 22 || sm(1,1) != 17 || sm(1,2) != 14 || sm(1,3) != 0 ) {
1100          std::ostringstream oss;
1101          oss << " Test: " << test_ << "\n"
1102              << " Error: Assignment to submatrix failed\n"
1103              << " Details:\n"
1104              << "   Result:\n" << sm << "\n"
1105              << "   Expected result:\n(  8 20  0  0 )\n( 22 17 14  0 )\n";
1106          throw std::runtime_error( oss.str() );
1107       }
1108 
1109       if( lower(0,0) !=  1 || lower(0,1) !=  0 || lower(0,2) !=  0 || lower(0,3) != 0 ||
1110           lower(1,0) !=  8 || lower(1,1) != 20 || lower(1,2) !=  0 || lower(1,3) != 0 ||
1111           lower(2,0) != 22 || lower(2,1) != 17 || lower(2,2) != 14 || lower(2,3) != 0 ||
1112           lower(3,0) != -2 || lower(3,1) !=  0 || lower(3,2) !=  1 || lower(3,3) != 5 ) {
1113          std::ostringstream oss;
1114          oss << " Test: " << test_ << "\n"
1115              << " Error: Assignment to submatrix failed\n"
1116              << " Details:\n"
1117              << "   Result:\n" << lower << "\n"
1118              << "   Expected result:\n(  1  0  0  0 )\n"
1119                                      "(  8 20  0  0 )\n"
1120                                      "( 22 17 14  0 )\n"
1121                                      "( -2  0  1  5 )\n";
1122          throw std::runtime_error( oss.str() );
1123       }
1124    }
1125 
1126    // (  1  0  0  0 )      (  1  0  0  0 )
1127    // ( -4  2  0  0 )  =>  ( -4 13 12  0 )
1128    // (  7  0  3  0 )      (  7 13 17  0 )
1129    // ( -2  0  1  5 )      ( -2  0  1  5 )
1130    {
1131       test_ = "Row-major sparse matrix addition assignment test 3";
1132 
1133       blaze::CompressedMatrix<int,blaze::rowMajor> mat( 2UL, 2UL, 4UL );
1134       mat(0,0) = 11;
1135       mat(0,1) = 12;
1136       mat(1,0) = 13;
1137       mat(1,1) = 14;
1138 
1139       LT lower;
1140       init( lower );
1141 
1142       auto sm = submatrix( lower, 1UL, 1UL, 2UL, 2UL );
1143 
1144       try {
1145          sm += mat;
1146 
1147          std::ostringstream oss;
1148          oss << " Test: " << test_ << "\n"
1149              << " Error: Assignment of invalid matrix succeeded\n"
1150              << " Details:\n"
1151              << "   Result:\n" << lower << "\n";
1152          throw std::runtime_error( oss.str() );
1153       }
1154       catch( std::invalid_argument& ) {}
1155    }
1156 
1157    // (  1  0  0  0 )      (  1  0  0  0 )
1158    // ( -4  2  0  0 )  =>  ( -4 20  0  0 )
1159    // (  7  0  3  0 )      (  7 14 14  0 )
1160    // ( -2  0  1  5 )      ( -2 15 20  5 )
1161    {
1162       test_ = "Column-major sparse matrix addition assignment test 1";
1163 
1164       blaze::CompressedMatrix<int,blaze::columnMajor> mat( 4UL, 2UL, 5UL );
1165       mat(1,0) = 18;
1166       mat(2,0) = 14;
1167       mat(2,1) = 11;
1168       mat(3,0) = 15;
1169       mat(3,1) = 19;
1170 
1171       LT lower;
1172       init( lower );
1173 
1174       auto sm = submatrix( lower, 0UL, 1UL, 4UL, 2UL );
1175       sm += mat;
1176 
1177       checkRows    ( lower,  4UL );
1178       checkColumns ( lower,  4UL );
1179       checkNonZeros( lower, 10UL );
1180 
1181       if( sm(0,0) !=  0 || sm(0,1) !=  0 ||
1182           sm(1,0) != 20 || sm(1,1) !=  0 ||
1183           sm(2,0) != 14 || sm(2,1) != 14 ||
1184           sm(3,0) != 15 || sm(3,1) != 20 ) {
1185          std::ostringstream oss;
1186          oss << " Test: " << test_ << "\n"
1187              << " Error: Assignment to submatrix failed\n"
1188              << " Details:\n"
1189              << "   Result:\n" << sm << "\n"
1190              << "   Expected result:\n(  0  0 )\n( 20  0 )\n( 14 14 )\n( 15 20 )\n";
1191          throw std::runtime_error( oss.str() );
1192       }
1193 
1194       if( lower(0,0) !=  1 || lower(0,1) !=  0 || lower(0,2) !=  0 || lower(0,3) != 0 ||
1195           lower(1,0) != -4 || lower(1,1) != 20 || lower(1,2) !=  0 || lower(1,3) != 0 ||
1196           lower(2,0) !=  7 || lower(2,1) != 14 || lower(2,2) != 14 || lower(2,3) != 0 ||
1197           lower(3,0) != -2 || lower(3,1) != 15 || lower(3,2) != 20 || lower(3,3) != 5 ) {
1198          std::ostringstream oss;
1199          oss << " Test: " << test_ << "\n"
1200              << " Error: Assignment to submatrix failed\n"
1201              << " Details:\n"
1202              << "   Result:\n" << lower << "\n"
1203              << "   Expected result:\n(  1  0  0  0 )\n"
1204                                      "( -4 20  0  0 )\n"
1205                                      "(  7 14 14  0 )\n"
1206                                      "( -2 15 20  5 )\n";
1207          throw std::runtime_error( oss.str() );
1208       }
1209    }
1210 
1211    // (  1  0  0  0 )      (  1  0  0  0 )
1212    // ( -4  2  0  0 )  =>  (  8 20  0  0 )
1213    // (  7  0  3  0 )      ( 22 17 14  0 )
1214    // ( -2  0  1  5 )      ( -2  0  1  5 )
1215    {
1216       test_ = "Column-major sparse matrix addition assignment test 2";
1217 
1218       blaze::CompressedMatrix<int,blaze::columnMajor> mat( 2UL, 4UL, 5UL );
1219       mat(0,0) = 12;
1220       mat(0,1) = 18;
1221       mat(1,0) = 15;
1222       mat(1,1) = 17;
1223       mat(1,2) = 11;
1224 
1225       LT lower;
1226       init( lower );
1227 
1228       auto sm = submatrix( lower, 1UL, 0UL, 2UL, 4UL );
1229       sm += mat;
1230 
1231       checkRows    ( lower, 4UL );
1232       checkColumns ( lower, 4UL );
1233       checkNonZeros( lower, 9UL );
1234 
1235       if( sm(0,0) !=  8 || sm(0,1) != 20 || sm(0,2) !=  0 || sm(0,3) != 0 ||
1236           sm(1,0) != 22 || sm(1,1) != 17 || sm(1,2) != 14 || sm(1,3) != 0 ) {
1237          std::ostringstream oss;
1238          oss << " Test: " << test_ << "\n"
1239              << " Error: Assignment to submatrix failed\n"
1240              << " Details:\n"
1241              << "   Result:\n" << sm << "\n"
1242              << "   Expected result:\n( 12 18  0  0 )\n( 15 17 11  0 )\n";
1243          throw std::runtime_error( oss.str() );
1244       }
1245 
1246       if( lower(0,0) !=  1 || lower(0,1) !=  0 || lower(0,2) !=  0 || lower(0,3) != 0 ||
1247           lower(1,0) !=  8 || lower(1,1) != 20 || lower(1,2) !=  0 || lower(1,3) != 0 ||
1248           lower(2,0) != 22 || lower(2,1) != 17 || lower(2,2) != 14 || lower(2,3) != 0 ||
1249           lower(3,0) != -2 || lower(3,1) !=  0 || lower(3,2) !=  1 || lower(3,3) != 5 ) {
1250          std::ostringstream oss;
1251          oss << " Test: " << test_ << "\n"
1252              << " Error: Assignment to submatrix failed\n"
1253              << " Details:\n"
1254              << "   Result:\n" << lower << "\n"
1255              << "   Expected result:\n(  1  0  0  0 )\n"
1256                                      "(  8 20  0  0 )\n"
1257                                      "( 22 17 14  0 )\n"
1258                                      "( -2  0  1  5 )\n";
1259          throw std::runtime_error( oss.str() );
1260       }
1261    }
1262 
1263    // (  1  0  0  0 )      (  1  0  0  0 )
1264    // ( -4  2  0  0 )  =>  ( -4 13 12  0 )
1265    // (  7  0  3  0 )      (  7 13 17  0 )
1266    // ( -2  0  1  5 )      ( -2  0  1  5 )
1267    {
1268       test_ = "Column-major sparse matrix addition assignment test 3";
1269 
1270       blaze::CompressedMatrix<int,blaze::columnMajor> mat( 2UL, 2UL, 4UL );
1271       mat(0,0) = 11;
1272       mat(0,1) = 12;
1273       mat(1,0) = 13;
1274       mat(1,1) = 14;
1275 
1276       LT lower;
1277       init( lower );
1278 
1279       auto sm = submatrix( lower, 1UL, 1UL, 2UL, 2UL );
1280 
1281       try {
1282          sm += mat;
1283 
1284          std::ostringstream oss;
1285          oss << " Test: " << test_ << "\n"
1286              << " Error: Assignment of invalid matrix succeeded\n"
1287              << " Details:\n"
1288              << "   Result:\n" << lower << "\n";
1289          throw std::runtime_error( oss.str() );
1290       }
1291       catch( std::invalid_argument& ) {}
1292    }
1293 }
1294 //*************************************************************************************************
1295 
1296 
1297 //*************************************************************************************************
1298 /*!\brief Test of the subtraction assignment to a submatrix of a LowerMatrix.
1299 //
1300 // \return void
1301 // \exception std::runtime_error Error detected.
1302 //
1303 // This function performs a test of the subtraction assignment to a submatrix of a LowerMatrix.
1304 // In case an error is detected, a \a std::runtime_error exception is thrown.
1305 */
1306 template< typename LT >  // Type of the lower matrix
testSubAssign()1307 void SubmatrixTest::testSubAssign()
1308 {
1309    //=====================================================================================
1310    // Dense matrix subtraction assignment
1311    //=====================================================================================
1312 
1313    // (  1  0  0  0 )      (  1   0   0   0 )
1314    // ( -4  2  0  0 )  =>  ( -4 -16   0   0 )
1315    // (  7  0  3  0 )      (  7 -14  -8   0 )
1316    // ( -2  0  1  5 )      ( -2 -15 -18   5 )
1317    {
1318       test_ = "Row-major dense matrix subtraction assignment test 1";
1319 
1320       blaze::DynamicMatrix<int,blaze::rowMajor> mat( 4UL, 2UL, 0 );
1321       mat(1,0) = 18;
1322       mat(2,0) = 14;
1323       mat(2,1) = 11;
1324       mat(3,0) = 15;
1325       mat(3,1) = 19;
1326 
1327       LT lower;
1328       init( lower );
1329 
1330       auto sm = submatrix( lower, 0UL, 1UL, 4UL, 2UL );
1331       sm -= mat;
1332 
1333       checkRows    ( lower,  4UL );
1334       checkColumns ( lower,  4UL );
1335       checkNonZeros( lower, 10UL );
1336 
1337       if( sm(0,0) !=   0 || sm(0,1) !=   0 ||
1338           sm(1,0) != -16 || sm(1,1) !=   0 ||
1339           sm(2,0) != -14 || sm(2,1) !=  -8 ||
1340           sm(3,0) != -15 || sm(3,1) != -18 ) {
1341          std::ostringstream oss;
1342          oss << " Test: " << test_ << "\n"
1343              << " Error: Assignment to submatrix failed\n"
1344              << " Details:\n"
1345              << "   Result:\n" << sm << "\n"
1346              << "   Expected result:\n(   0   0 )\n( -16   0 )\n( -14  -8 )\n( -15 -18 )\n";
1347          throw std::runtime_error( oss.str() );
1348       }
1349 
1350       if( lower(0,0) !=  1 || lower(0,1) !=   0 || lower(0,2) !=   0 || lower(0,3) != 0 ||
1351           lower(1,0) != -4 || lower(1,1) != -16 || lower(1,2) !=   0 || lower(1,3) != 0 ||
1352           lower(2,0) !=  7 || lower(2,1) != -14 || lower(2,2) !=  -8 || lower(2,3) != 0 ||
1353           lower(3,0) != -2 || lower(3,1) != -15 || lower(3,2) != -18 || lower(3,3) != 5 ) {
1354          std::ostringstream oss;
1355          oss << " Test: " << test_ << "\n"
1356              << " Error: Assignment to submatrix failed\n"
1357              << " Details:\n"
1358              << "   Result:\n" << lower << "\n"
1359              << "   Expected result:\n(  1   0   0   0 )\n"
1360                                      "( -4 -16   0   0 )\n"
1361                                      "(  7 -14  -8   0 )\n"
1362                                      "( -2 -15 -18   5 )\n";
1363          throw std::runtime_error( oss.str() );
1364       }
1365    }
1366 
1367    // (  1  0  0  0 )      (   1   0   0   0 )
1368    // ( -4  2  0  0 )  =>  ( -16 -16   0   0 )
1369    // (  7  0  3  0 )      (  -8 -17  -8   0 )
1370    // ( -2  0  1  5 )      (  -2   0   1   5 )
1371    {
1372       test_ = "Row-major dense matrix subtraction assignment test 2";
1373 
1374       blaze::DynamicMatrix<int,blaze::rowMajor> mat( 2UL, 4UL, 0 );
1375       mat(0,0) = 12;
1376       mat(0,1) = 18;
1377       mat(1,0) = 15;
1378       mat(1,1) = 17;
1379       mat(1,2) = 11;
1380 
1381       LT lower;
1382       init( lower );
1383 
1384       auto sm = submatrix( lower, 1UL, 0UL, 2UL, 4UL );
1385       sm -= mat;
1386 
1387       checkRows    ( lower, 4UL );
1388       checkColumns ( lower, 4UL );
1389       checkNonZeros( lower, 9UL );
1390 
1391       if( sm(0,0) != -16 || sm(0,1) != -16 || sm(0,2) !=  0 || sm(0,3) != 0 ||
1392           sm(1,0) !=  -8 || sm(1,1) != -17 || sm(1,2) != -8 || sm(1,3) != 0 ) {
1393          std::ostringstream oss;
1394          oss << " Test: " << test_ << "\n"
1395              << " Error: Assignment to submatrix failed\n"
1396              << " Details:\n"
1397              << "   Result:\n" << sm << "\n"
1398              << "   Expected result:\n( -16 -16  0  0 )\n(  -8 -17 -8  0 )\n";
1399          throw std::runtime_error( oss.str() );
1400       }
1401 
1402       if( lower(0,0) !=   1 || lower(0,1) !=   0 || lower(0,2) !=  0 || lower(0,3) != 0 ||
1403           lower(1,0) != -16 || lower(1,1) != -16 || lower(1,2) !=  0 || lower(1,3) != 0 ||
1404           lower(2,0) !=  -8 || lower(2,1) != -17 || lower(2,2) != -8 || lower(2,3) != 0 ||
1405           lower(3,0) !=  -2 || lower(3,1) !=   0 || lower(3,2) !=  1 || lower(3,3) != 5 ) {
1406          std::ostringstream oss;
1407          oss << " Test: " << test_ << "\n"
1408              << " Error: Assignment to submatrix failed\n"
1409              << " Details:\n"
1410              << "   Result:\n" << lower << "\n"
1411              << "   Expected result:\n(   1   0  0  0 )\n"
1412                                      "( -16 -16  0  0 )\n"
1413                                      "(  -8 -17 -8  0 )\n"
1414                                      "(  -2  0   1  5 )\n";
1415          throw std::runtime_error( oss.str() );
1416       }
1417    }
1418 
1419    // (  1  0  0  0 )      (  1   0   0  0 )
1420    // ( -4  2  0  0 )  =>  ( -4  -9 -12  0 )
1421    // (  7  0  3  0 )      (  7 -13 -11  0 )
1422    // ( -2  0  1  5 )      ( -2   0   1  5 )
1423    {
1424       test_ = "Row-major dense matrix subtraction assignment test 3";
1425 
1426       blaze::DynamicMatrix<int,blaze::rowMajor> mat( 2UL, 2UL );
1427       mat(0,0) = 11;
1428       mat(0,1) = 12;
1429       mat(1,0) = 13;
1430       mat(1,1) = 14;
1431 
1432       LT lower;
1433       init( lower );
1434 
1435       auto sm = submatrix( lower, 1UL, 1UL, 2UL, 2UL );
1436 
1437       try {
1438          sm -= mat;
1439 
1440          std::ostringstream oss;
1441          oss << " Test: " << test_ << "\n"
1442              << " Error: Assignment of invalid matrix succeeded\n"
1443              << " Details:\n"
1444              << "   Result:\n" << lower << "\n";
1445          throw std::runtime_error( oss.str() );
1446       }
1447       catch( std::invalid_argument& ) {}
1448    }
1449 
1450    // (  1  0  0  0 )      (  1   0   0   0 )
1451    // ( -4  2  0  0 )  =>  ( -4 -16   0   0 )
1452    // (  7  0  3  0 )      (  7 -14  -8   0 )
1453    // ( -2  0  1  5 )      ( -2 -15 -18   5 )
1454    {
1455       test_ = "Column-major dense matrix subtraction assignment test 1";
1456 
1457       blaze::DynamicMatrix<int,blaze::columnMajor> mat( 4UL, 2UL, 0 );
1458       mat(1,0) = 18;
1459       mat(2,0) = 14;
1460       mat(2,1) = 11;
1461       mat(3,0) = 15;
1462       mat(3,1) = 19;
1463 
1464       LT lower;
1465       init( lower );
1466 
1467       auto sm = submatrix( lower, 0UL, 1UL, 4UL, 2UL );
1468       sm -= mat;
1469 
1470       checkRows    ( lower,  4UL );
1471       checkColumns ( lower,  4UL );
1472       checkNonZeros( lower, 10UL );
1473 
1474       if( sm(0,0) !=   0 || sm(0,1) !=   0 ||
1475           sm(1,0) != -16 || sm(1,1) !=   0 ||
1476           sm(2,0) != -14 || sm(2,1) !=  -8 ||
1477           sm(3,0) != -15 || sm(3,1) != -18 ) {
1478          std::ostringstream oss;
1479          oss << " Test: " << test_ << "\n"
1480              << " Error: Assignment to submatrix failed\n"
1481              << " Details:\n"
1482              << "   Result:\n" << sm << "\n"
1483              << "   Expected result:\n(   0   0 )\n( -16   0 )\n( -14  -8 )\n( -15 -18 )\n";
1484          throw std::runtime_error( oss.str() );
1485       }
1486 
1487       if( lower(0,0) !=  1 || lower(0,1) !=   0 || lower(0,2) !=   0 || lower(0,3) != 0 ||
1488           lower(1,0) != -4 || lower(1,1) != -16 || lower(1,2) !=   0 || lower(1,3) != 0 ||
1489           lower(2,0) !=  7 || lower(2,1) != -14 || lower(2,2) !=  -8 || lower(2,3) != 0 ||
1490           lower(3,0) != -2 || lower(3,1) != -15 || lower(3,2) != -18 || lower(3,3) != 5 ) {
1491          std::ostringstream oss;
1492          oss << " Test: " << test_ << "\n"
1493              << " Error: Assignment to submatrix failed\n"
1494              << " Details:\n"
1495              << "   Result:\n" << lower << "\n"
1496              << "   Expected result:\n(  1   0   0   0 )\n"
1497                                      "( -4 -16   0   0 )\n"
1498                                      "(  7 -14  -8   0 )\n"
1499                                      "( -2 -15 -18   5 )\n";
1500          throw std::runtime_error( oss.str() );
1501       }
1502    }
1503 
1504    // (  1  0  0  0 )      (   1   0   0   0 )
1505    // ( -4  2  0  0 )  =>  ( -16 -16   0   0 )
1506    // (  7  0  3  0 )      (  -8 -17  -8   0 )
1507    // ( -2  0  1  5 )      (  -2   0   1   5 )
1508    {
1509       test_ = "Column-major dense matrix subtraction assignment test 2";
1510 
1511       blaze::DynamicMatrix<int,blaze::columnMajor> mat( 2UL, 4UL, 0 );
1512       mat(0,0) = 12;
1513       mat(0,1) = 18;
1514       mat(1,0) = 15;
1515       mat(1,1) = 17;
1516       mat(1,2) = 11;
1517 
1518       LT lower;
1519       init( lower );
1520 
1521       auto sm = submatrix( lower, 1UL, 0UL, 2UL, 4UL );
1522       sm -= mat;
1523 
1524       checkRows    ( lower, 4UL );
1525       checkColumns ( lower, 4UL );
1526       checkNonZeros( lower, 9UL );
1527 
1528       if( sm(0,0) != -16 || sm(0,1) != -16 || sm(0,2) !=  0 || sm(0,3) != 0 ||
1529           sm(1,0) !=  -8 || sm(1,1) != -17 || sm(1,2) != -8 || sm(1,3) != 0 ) {
1530          std::ostringstream oss;
1531          oss << " Test: " << test_ << "\n"
1532              << " Error: Assignment to submatrix failed\n"
1533              << " Details:\n"
1534              << "   Result:\n" << sm << "\n"
1535              << "   Expected result:\n( -16 -16  0  0 )\n(  -8 -17 -8  0 )\n";
1536          throw std::runtime_error( oss.str() );
1537       }
1538 
1539       if( lower(0,0) !=   1 || lower(0,1) !=   0 || lower(0,2) !=  0 || lower(0,3) != 0 ||
1540           lower(1,0) != -16 || lower(1,1) != -16 || lower(1,2) !=  0 || lower(1,3) != 0 ||
1541           lower(2,0) !=  -8 || lower(2,1) != -17 || lower(2,2) != -8 || lower(2,3) != 0 ||
1542           lower(3,0) !=  -2 || lower(3,1) !=   0 || lower(3,2) !=  1 || lower(3,3) != 5 ) {
1543          std::ostringstream oss;
1544          oss << " Test: " << test_ << "\n"
1545              << " Error: Assignment to submatrix failed\n"
1546              << " Details:\n"
1547              << "   Result:\n" << lower << "\n"
1548              << "   Expected result:\n(   1   0  0  0 )\n"
1549                                      "( -16 -16  0  0 )\n"
1550                                      "(  -8 -17 -8  0 )\n"
1551                                      "(  -2  0   1  5 )\n";
1552          throw std::runtime_error( oss.str() );
1553       }
1554    }
1555 
1556    // (  1  0  0  0 )      (  1   0   0  0 )
1557    // ( -4  2  0  0 )  =>  ( -4  -9 -12  0 )
1558    // (  7  0  3  0 )      (  7 -13 -11  0 )
1559    // ( -2  0  1  5 )      ( -2   0   1  5 )
1560    {
1561       test_ = "Column-major dense matrix subtraction assignment test 3";
1562 
1563       blaze::DynamicMatrix<int,blaze::columnMajor> mat( 2UL, 2UL );
1564       mat(0,0) = 11;
1565       mat(0,1) = 12;
1566       mat(1,0) = 13;
1567       mat(1,1) = 14;
1568 
1569       LT lower;
1570       init( lower );
1571 
1572       auto sm = submatrix( lower, 1UL, 1UL, 2UL, 2UL );
1573 
1574       try {
1575          sm -= mat;
1576 
1577          std::ostringstream oss;
1578          oss << " Test: " << test_ << "\n"
1579              << " Error: Assignment of invalid matrix succeeded\n"
1580              << " Details:\n"
1581              << "   Result:\n" << lower << "\n";
1582          throw std::runtime_error( oss.str() );
1583       }
1584       catch( std::invalid_argument& ) {}
1585    }
1586 
1587 
1588    //=====================================================================================
1589    // Sparse matrix subtraction assignment
1590    //=====================================================================================
1591 
1592    // (  1  0  0  0 )      (  1   0   0   0 )
1593    // ( -4  2  0  0 )  =>  ( -4 -16   0   0 )
1594    // (  7  0  3  0 )      (  7 -14  -8   0 )
1595    // ( -2  0  1  5 )      ( -2 -15 -18   5 )
1596    {
1597       test_ = "Row-major sparse matrix subtraction assignment test 1";
1598 
1599       blaze::CompressedMatrix<int,blaze::rowMajor> mat( 4UL, 2UL, 5UL );
1600       mat(1,0) = 18;
1601       mat(2,0) = 14;
1602       mat(2,1) = 11;
1603       mat(3,0) = 15;
1604       mat(3,1) = 19;
1605 
1606       LT lower;
1607       init( lower );
1608 
1609       auto sm = submatrix( lower, 0UL, 1UL, 4UL, 2UL );
1610       sm -= mat;
1611 
1612       checkRows    ( lower,  4UL );
1613       checkColumns ( lower,  4UL );
1614       checkNonZeros( lower, 10UL );
1615 
1616       if( sm(0,0) !=   0 || sm(0,1) !=   0 ||
1617           sm(1,0) != -16 || sm(1,1) !=   0 ||
1618           sm(2,0) != -14 || sm(2,1) !=  -8 ||
1619           sm(3,0) != -15 || sm(3,1) != -18 ) {
1620          std::ostringstream oss;
1621          oss << " Test: " << test_ << "\n"
1622              << " Error: Assignment to submatrix failed\n"
1623              << " Details:\n"
1624              << "   Result:\n" << sm << "\n"
1625              << "   Expected result:\n(   0   0 )\n( -16   0 )\n( -14  -8 )\n( -15 -18 )\n";
1626          throw std::runtime_error( oss.str() );
1627       }
1628 
1629       if( lower(0,0) !=  1 || lower(0,1) !=   0 || lower(0,2) !=   0 || lower(0,3) != 0 ||
1630           lower(1,0) != -4 || lower(1,1) != -16 || lower(1,2) !=   0 || lower(1,3) != 0 ||
1631           lower(2,0) !=  7 || lower(2,1) != -14 || lower(2,2) !=  -8 || lower(2,3) != 0 ||
1632           lower(3,0) != -2 || lower(3,1) != -15 || lower(3,2) != -18 || lower(3,3) != 5 ) {
1633          std::ostringstream oss;
1634          oss << " Test: " << test_ << "\n"
1635              << " Error: Assignment to submatrix failed\n"
1636              << " Details:\n"
1637              << "   Result:\n" << lower << "\n"
1638              << "   Expected result:\n(  1   0   0   0 )\n"
1639                                      "( -4 -16   0   0 )\n"
1640                                      "(  7 -14  -8   0 )\n"
1641                                      "( -2 -15 -18   5 )\n";
1642          throw std::runtime_error( oss.str() );
1643       }
1644    }
1645 
1646    // (  1  0  0  0 )      (   1   0   0   0 )
1647    // ( -4  2  0  0 )  =>  ( -16 -16   0   0 )
1648    // (  7  0  3  0 )      (  -8 -17  -8   0 )
1649    // ( -2  0  1  5 )      (  -2   0   1   5 )
1650    {
1651       test_ = "Row-major sparse matrix subtraction assignment test 2";
1652 
1653       blaze::CompressedMatrix<int,blaze::rowMajor> mat( 2UL, 4UL, 5UL );
1654       mat(0,0) = 12;
1655       mat(0,1) = 18;
1656       mat(1,0) = 15;
1657       mat(1,1) = 17;
1658       mat(1,2) = 11;
1659 
1660       LT lower;
1661       init( lower );
1662 
1663       auto sm = submatrix( lower, 1UL, 0UL, 2UL, 4UL );
1664       sm -= mat;
1665 
1666       checkRows    ( lower, 4UL );
1667       checkColumns ( lower, 4UL );
1668       checkNonZeros( lower, 9UL );
1669 
1670       if( sm(0,0) != -16 || sm(0,1) != -16 || sm(0,2) !=  0 || sm(0,3) != 0 ||
1671           sm(1,0) !=  -8 || sm(1,1) != -17 || sm(1,2) != -8 || sm(1,3) != 0 ) {
1672          std::ostringstream oss;
1673          oss << " Test: " << test_ << "\n"
1674              << " Error: Assignment to submatrix failed\n"
1675              << " Details:\n"
1676              << "   Result:\n" << sm << "\n"
1677              << "   Expected result:\n( -16 -16  0  0 )\n(  -8 -17 -8  0 )\n";
1678          throw std::runtime_error( oss.str() );
1679       }
1680 
1681       if( lower(0,0) !=   1 || lower(0,1) !=   0 || lower(0,2) !=  0 || lower(0,3) != 0 ||
1682           lower(1,0) != -16 || lower(1,1) != -16 || lower(1,2) !=  0 || lower(1,3) != 0 ||
1683           lower(2,0) !=  -8 || lower(2,1) != -17 || lower(2,2) != -8 || lower(2,3) != 0 ||
1684           lower(3,0) !=  -2 || lower(3,1) !=   0 || lower(3,2) !=  1 || lower(3,3) != 5 ) {
1685          std::ostringstream oss;
1686          oss << " Test: " << test_ << "\n"
1687              << " Error: Assignment to submatrix failed\n"
1688              << " Details:\n"
1689              << "   Result:\n" << lower << "\n"
1690              << "   Expected result:\n(   1   0  0  0 )\n"
1691                                      "( -16 -16  0  0 )\n"
1692                                      "(  -8 -17 -8  0 )\n"
1693                                      "(  -2  0   1  5 )\n";
1694          throw std::runtime_error( oss.str() );
1695       }
1696    }
1697 
1698    // (  1  0  0  0 )      (  1   0   0  0 )
1699    // ( -4  2  0  0 )  =>  ( -4  -9 -12  0 )
1700    // (  7  0  3  0 )      (  7 -13 -11  0 )
1701    // ( -2  0  1  5 )      ( -2   0   1  5 )
1702    {
1703       test_ = "Row-major sparse matrix subtraction assignment test 3";
1704 
1705       blaze::CompressedMatrix<int,blaze::rowMajor> mat( 2UL, 2UL, 4UL );
1706       mat(0,0) = 11;
1707       mat(0,1) = 12;
1708       mat(1,0) = 13;
1709       mat(1,1) = 14;
1710 
1711       LT lower;
1712       init( lower );
1713 
1714       auto sm = submatrix( lower, 1UL, 1UL, 2UL, 2UL );
1715 
1716       try {
1717          sm -= mat;
1718 
1719          std::ostringstream oss;
1720          oss << " Test: " << test_ << "\n"
1721              << " Error: Assignment of invalid matrix succeeded\n"
1722              << " Details:\n"
1723              << "   Result:\n" << lower << "\n";
1724          throw std::runtime_error( oss.str() );
1725       }
1726       catch( std::invalid_argument& ) {}
1727    }
1728 
1729    // (  1  0  0  0 )      (  1   0   0   0 )
1730    // ( -4  2  0  0 )  =>  ( -4 -16   0   0 )
1731    // (  7  0  3  0 )      (  7 -14  -8   0 )
1732    // ( -2  0  1  5 )      ( -2 -15 -18   5 )
1733    {
1734       test_ = "Column-major sparse matrix subtraction assignment test 1";
1735 
1736       blaze::CompressedMatrix<int,blaze::columnMajor> mat( 4UL, 2UL, 5UL );
1737       mat(1,0) = 18;
1738       mat(2,0) = 14;
1739       mat(2,1) = 11;
1740       mat(3,0) = 15;
1741       mat(3,1) = 19;
1742 
1743       LT lower;
1744       init( lower );
1745 
1746       auto sm = submatrix( lower, 0UL, 1UL, 4UL, 2UL );
1747       sm -= mat;
1748 
1749       checkRows    ( lower,  4UL );
1750       checkColumns ( lower,  4UL );
1751       checkNonZeros( lower, 10UL );
1752 
1753       if( sm(0,0) !=   0 || sm(0,1) !=   0 ||
1754           sm(1,0) != -16 || sm(1,1) !=   0 ||
1755           sm(2,0) != -14 || sm(2,1) !=  -8 ||
1756           sm(3,0) != -15 || sm(3,1) != -18 ) {
1757          std::ostringstream oss;
1758          oss << " Test: " << test_ << "\n"
1759              << " Error: Assignment to submatrix failed\n"
1760              << " Details:\n"
1761              << "   Result:\n" << sm << "\n"
1762              << "   Expected result:\n(   0   0 )\n( -16   0 )\n( -14  -8 )\n( -15 -18 )\n";
1763          throw std::runtime_error( oss.str() );
1764       }
1765 
1766       if( lower(0,0) !=  1 || lower(0,1) !=   0 || lower(0,2) !=   0 || lower(0,3) != 0 ||
1767           lower(1,0) != -4 || lower(1,1) != -16 || lower(1,2) !=   0 || lower(1,3) != 0 ||
1768           lower(2,0) !=  7 || lower(2,1) != -14 || lower(2,2) !=  -8 || lower(2,3) != 0 ||
1769           lower(3,0) != -2 || lower(3,1) != -15 || lower(3,2) != -18 || lower(3,3) != 5 ) {
1770          std::ostringstream oss;
1771          oss << " Test: " << test_ << "\n"
1772              << " Error: Assignment to submatrix failed\n"
1773              << " Details:\n"
1774              << "   Result:\n" << lower << "\n"
1775              << "   Expected result:\n(  1   0   0   0 )\n"
1776                                      "( -4 -16   0   0 )\n"
1777                                      "(  7 -14  -8   0 )\n"
1778                                      "( -2 -15 -18   5 )\n";
1779          throw std::runtime_error( oss.str() );
1780       }
1781    }
1782 
1783    // (  1  0  0  0 )      (   1   0   0   0 )
1784    // ( -4  2  0  0 )  =>  ( -16 -16   0   0 )
1785    // (  7  0  3  0 )      (  -8 -17  -8   0 )
1786    // ( -2  0  1  5 )      (  -2   0   1   5 )
1787    {
1788       test_ = "Column-major sparse matrix subtraction assignment test 2";
1789 
1790       blaze::CompressedMatrix<int,blaze::columnMajor> mat( 2UL, 4UL, 5UL );
1791       mat(0,0) = 12;
1792       mat(0,1) = 18;
1793       mat(1,0) = 15;
1794       mat(1,1) = 17;
1795       mat(1,2) = 11;
1796 
1797       LT lower;
1798       init( lower );
1799 
1800       auto sm = submatrix( lower, 1UL, 0UL, 2UL, 4UL );
1801       sm -= mat;
1802 
1803       checkRows    ( lower, 4UL );
1804       checkColumns ( lower, 4UL );
1805       checkNonZeros( lower, 9UL );
1806 
1807       if( sm(0,0) != -16 || sm(0,1) != -16 || sm(0,2) !=  0 || sm(0,3) != 0 ||
1808           sm(1,0) !=  -8 || sm(1,1) != -17 || sm(1,2) != -8 || sm(1,3) != 0 ) {
1809          std::ostringstream oss;
1810          oss << " Test: " << test_ << "\n"
1811              << " Error: Assignment to submatrix failed\n"
1812              << " Details:\n"
1813              << "   Result:\n" << sm << "\n"
1814              << "   Expected result:\n( -16 -16  0  0 )\n(  -8 -17 -8  0 )\n";
1815          throw std::runtime_error( oss.str() );
1816       }
1817 
1818       if( lower(0,0) !=   1 || lower(0,1) !=   0 || lower(0,2) !=  0 || lower(0,3) != 0 ||
1819           lower(1,0) != -16 || lower(1,1) != -16 || lower(1,2) !=  0 || lower(1,3) != 0 ||
1820           lower(2,0) !=  -8 || lower(2,1) != -17 || lower(2,2) != -8 || lower(2,3) != 0 ||
1821           lower(3,0) !=  -2 || lower(3,1) !=   0 || lower(3,2) !=  1 || lower(3,3) != 5 ) {
1822          std::ostringstream oss;
1823          oss << " Test: " << test_ << "\n"
1824              << " Error: Assignment to submatrix failed\n"
1825              << " Details:\n"
1826              << "   Result:\n" << lower << "\n"
1827              << "   Expected result:\n(   1   0  0  0 )\n"
1828                                      "( -16 -16  0  0 )\n"
1829                                      "(  -8 -17 -8  0 )\n"
1830                                      "(  -2  0   1  5 )\n";
1831          throw std::runtime_error( oss.str() );
1832       }
1833    }
1834 
1835    // (  1  0  0  0 )      (  1   0   0  0 )
1836    // ( -4  2  0  0 )  =>  ( -4  -9 -12  0 )
1837    // (  7  0  3  0 )      (  7 -13 -11  0 )
1838    // ( -2  0  1  5 )      ( -2   0   1  5 )
1839    {
1840       test_ = "Column-major sparse matrix subtraction assignment test 3";
1841 
1842       blaze::CompressedMatrix<int,blaze::columnMajor> mat( 2UL, 2UL, 4UL );
1843       mat(0,0) = 11;
1844       mat(0,1) = 12;
1845       mat(1,0) = 13;
1846       mat(1,1) = 14;
1847 
1848       LT lower;
1849       init( lower );
1850 
1851       auto sm = submatrix( lower, 1UL, 1UL, 2UL, 2UL );
1852 
1853       try {
1854          sm -= mat;
1855 
1856          std::ostringstream oss;
1857          oss << " Test: " << test_ << "\n"
1858              << " Error: Assignment of invalid matrix succeeded\n"
1859              << " Details:\n"
1860              << "   Result:\n" << lower << "\n";
1861          throw std::runtime_error( oss.str() );
1862       }
1863       catch( std::invalid_argument& ) {}
1864    }
1865 }
1866 //*************************************************************************************************
1867 
1868 
1869 //*************************************************************************************************
1870 /*!\brief Test of the Schur product assignment to a submatrix of a LowerMatrix.
1871 //
1872 // \return void
1873 // \exception std::runtime_error Error detected.
1874 //
1875 // This function performs a test of the Schur product assignment to a submatrix of a LowerMatrix.
1876 // In case an error is detected, a \a std::runtime_error exception is thrown.
1877 */
1878 template< typename LT >  // Type of the lower matrix
testSchurAssign()1879 void SubmatrixTest::testSchurAssign()
1880 {
1881    //=====================================================================================
1882    // Dense matrix Schur product assignment
1883    //=====================================================================================
1884 
1885    // (  1  0  0  0 )      (  1  0  0  0 )
1886    // ( -4  2  0  0 )  =>  ( -4 12  0  0 )
1887    // (  7  0  3  0 )      (  7  0 12  0 )
1888    // ( -2  0  1  5 )      ( -2  0  0  5 )
1889    {
1890       test_ = "Row-major dense matrix Schur product assignment test 1";
1891 
1892       blaze::DynamicMatrix<int,blaze::rowMajor> mat( 4UL, 2UL, 0 );
1893       mat(0,1) = 9;
1894       mat(1,0) = 6;
1895       mat(2,1) = 4;
1896       mat(3,0) = 9;
1897 
1898       LT lower;
1899       init( lower );
1900 
1901       auto sm = submatrix( lower, 0UL, 1UL, 4UL, 2UL );
1902       sm %= mat;
1903 
1904       checkRows    ( lower, 4UL );
1905       checkColumns ( lower, 4UL );
1906       checkNonZeros( lower, 7UL );
1907 
1908       if( sm(0,0) !=  0 || sm(0,1) !=  0 ||
1909           sm(1,0) != 12 || sm(1,1) !=  0 ||
1910           sm(2,0) !=  0 || sm(2,1) != 12 ||
1911           sm(3,0) !=  0 || sm(3,1) !=  0 ) {
1912          std::ostringstream oss;
1913          oss << " Test: " << test_ << "\n"
1914              << " Error: Assignment to submatrix failed\n"
1915              << " Details:\n"
1916              << "   Result:\n" << sm << "\n"
1917              << "   Expected result:\n(  0  0 )\n( 12  0 )\n(  0 12 )\n(  0  0 )\n";
1918          throw std::runtime_error( oss.str() );
1919       }
1920 
1921       if( lower(0,0) !=  1 || lower(0,1) !=  0 || lower(0,2) !=  0 || lower(0,3) != 0 ||
1922           lower(1,0) != -4 || lower(1,1) != 12 || lower(1,2) !=  0 || lower(1,3) != 0 ||
1923           lower(2,0) !=  7 || lower(2,1) !=  0 || lower(2,2) != 12 || lower(2,3) != 0 ||
1924           lower(3,0) != -2 || lower(3,1) !=  0 || lower(3,2) !=  0 || lower(3,3) != 5 ) {
1925          std::ostringstream oss;
1926          oss << " Test: " << test_ << "\n"
1927              << " Error: Assignment to submatrix failed\n"
1928              << " Details:\n"
1929              << "   Result:\n" << lower << "\n"
1930              << "   Expected result:\n(  1  0  0  0 )\n"
1931                                      "( -4 12  0  0 )\n"
1932                                      "(  7  0 12  0 )\n"
1933                                      "( -2  0  0  5 )\n";
1934          throw std::runtime_error( oss.str() );
1935       }
1936    }
1937 
1938    // (  1  0  0  0 )      (  1  0  0  0 )
1939    // ( -4  2  0  0 )  =>  (  0 12  0  0 )
1940    // (  7  0  3  0 )      ( 21  0 12  0 )
1941    // ( -2  0  1  5 )      ( -2  0  1  5 )
1942    {
1943       test_ = "Row-major dense matrix Schur product assignment test 2";
1944 
1945       blaze::DynamicMatrix<int,blaze::rowMajor> mat( 2UL, 4UL, 0 );
1946       mat(0,1) = 6;
1947       mat(0,3) = 9;
1948       mat(1,0) = 3;
1949       mat(1,2) = 4;
1950 
1951       LT lower;
1952       init( lower );
1953 
1954       auto sm = submatrix( lower, 1UL, 0UL, 2UL, 4UL );
1955       sm %= mat;
1956 
1957       checkRows    ( lower, 4UL );
1958       checkColumns ( lower, 4UL );
1959       checkNonZeros( lower, 7UL );
1960 
1961       if( sm(0,0) !=  0 || sm(0,1) != 12 || sm(0,2) !=  0 || sm(0,3) != 0 ||
1962           sm(1,0) != 21 || sm(1,1) !=  0 || sm(1,2) != 12 || sm(1,3) != 0 ) {
1963          std::ostringstream oss;
1964          oss << " Test: " << test_ << "\n"
1965              << " Error: Assignment to submatrix failed\n"
1966              << " Details:\n"
1967              << "   Result:\n" << sm << "\n"
1968              << "   Expected result:\n(  0 12  0  0 )\n( 21  0 12  0 )\n";
1969          throw std::runtime_error( oss.str() );
1970       }
1971 
1972       if( lower(0,0) !=  1 || lower(0,1) !=  0 || lower(0,2) !=  0 || lower(0,3) != 0 ||
1973           lower(1,0) !=  0 || lower(1,1) != 12 || lower(1,2) !=  0 || lower(1,3) != 0 ||
1974           lower(2,0) != 21 || lower(2,1) !=  0 || lower(2,2) != 12 || lower(2,3) != 0 ||
1975           lower(3,0) != -2 || lower(3,1) !=  0 || lower(3,2) !=  1 || lower(3,3) != 5 ) {
1976          std::ostringstream oss;
1977          oss << " Test: " << test_ << "\n"
1978              << " Error: Assignment to submatrix failed\n"
1979              << " Details:\n"
1980              << "   Result:\n" << lower << "\n"
1981              << "   Expected result:\n(  1  0  0  0 )\n"
1982                                      "(  0 12  0  0 )\n"
1983                                      "( 21  0 12  0 )\n"
1984                                      "( -2  0  1  5 )\n";
1985          throw std::runtime_error( oss.str() );
1986       }
1987    }
1988 
1989    // (  1  0  0  0 )      (  1  0  0  0 )
1990    // ( -4  2  0  0 )  =>  ( -4 12  0  0 )
1991    // (  7  0  3  0 )      (  7  0 12  0 )
1992    // ( -2  0  1  5 )      ( -2  0  0  5 )
1993    {
1994       test_ = "Column-major dense matrix Schur product assignment test 1";
1995 
1996       blaze::DynamicMatrix<int,blaze::columnMajor> mat( 4UL, 2UL, 0 );
1997       mat(0,1) = 9;
1998       mat(1,0) = 6;
1999       mat(2,1) = 4;
2000       mat(3,0) = 9;
2001 
2002       LT lower;
2003       init( lower );
2004 
2005       auto sm = submatrix( lower, 0UL, 1UL, 4UL, 2UL );
2006       sm %= mat;
2007 
2008       checkRows    ( lower, 4UL );
2009       checkColumns ( lower, 4UL );
2010       checkNonZeros( lower, 7UL );
2011 
2012       if( sm(0,0) !=  0 || sm(0,1) !=  0 ||
2013           sm(1,0) != 12 || sm(1,1) !=  0 ||
2014           sm(2,0) !=  0 || sm(2,1) != 12 ||
2015           sm(3,0) !=  0 || sm(3,1) !=  0 ) {
2016          std::ostringstream oss;
2017          oss << " Test: " << test_ << "\n"
2018              << " Error: Assignment to submatrix failed\n"
2019              << " Details:\n"
2020              << "   Result:\n" << sm << "\n"
2021              << "   Expected result:\n(  0  0 )\n( 12  0 )\n(  0 12 )\n(  0  0 )\n";
2022          throw std::runtime_error( oss.str() );
2023       }
2024 
2025       if( lower(0,0) !=  1 || lower(0,1) !=  0 || lower(0,2) !=  0 || lower(0,3) != 0 ||
2026           lower(1,0) != -4 || lower(1,1) != 12 || lower(1,2) !=  0 || lower(1,3) != 0 ||
2027           lower(2,0) !=  7 || lower(2,1) !=  0 || lower(2,2) != 12 || lower(2,3) != 0 ||
2028           lower(3,0) != -2 || lower(3,1) !=  0 || lower(3,2) !=  0 || lower(3,3) != 5 ) {
2029          std::ostringstream oss;
2030          oss << " Test: " << test_ << "\n"
2031              << " Error: Assignment to submatrix failed\n"
2032              << " Details:\n"
2033              << "   Result:\n" << lower << "\n"
2034              << "   Expected result:\n(  1  0  0  0 )\n"
2035                                      "( -4 12  0  0 )\n"
2036                                      "(  7  0 12  0 )\n"
2037                                      "( -2  0  0  5 )\n";
2038          throw std::runtime_error( oss.str() );
2039       }
2040    }
2041 
2042    // (  1  0  0  0 )      (  1  0  0  0 )
2043    // ( -4  2  0  0 )  =>  (  0 12  0  0 )
2044    // (  7  0  3  0 )      ( 21  0 12  0 )
2045    // ( -2  0  1  5 )      ( -2  0  1  5 )
2046    {
2047       test_ = "Column-major dense matrix Schur product assignment test 2";
2048 
2049       blaze::DynamicMatrix<int,blaze::columnMajor> mat( 2UL, 4UL, 0 );
2050       mat(0,1) = 6;
2051       mat(0,3) = 9;
2052       mat(1,0) = 3;
2053       mat(1,2) = 4;
2054 
2055       LT lower;
2056       init( lower );
2057 
2058       auto sm = submatrix( lower, 1UL, 0UL, 2UL, 4UL );
2059       sm %= mat;
2060 
2061       checkRows    ( lower, 4UL );
2062       checkColumns ( lower, 4UL );
2063       checkNonZeros( lower, 7UL );
2064 
2065       if( sm(0,0) !=  0 || sm(0,1) != 12 || sm(0,2) !=  0 || sm(0,3) != 0 ||
2066           sm(1,0) != 21 || sm(1,1) !=  0 || sm(1,2) != 12 || sm(1,3) != 0 ) {
2067          std::ostringstream oss;
2068          oss << " Test: " << test_ << "\n"
2069              << " Error: Assignment to submatrix failed\n"
2070              << " Details:\n"
2071              << "   Result:\n" << sm << "\n"
2072              << "   Expected result:\n(  0 12  0  0 )\n( 21  0 12  0 )\n";
2073          throw std::runtime_error( oss.str() );
2074       }
2075 
2076       if( lower(0,0) !=  1 || lower(0,1) !=  0 || lower(0,2) !=  0 || lower(0,3) != 0 ||
2077           lower(1,0) !=  0 || lower(1,1) != 12 || lower(1,2) !=  0 || lower(1,3) != 0 ||
2078           lower(2,0) != 21 || lower(2,1) !=  0 || lower(2,2) != 12 || lower(2,3) != 0 ||
2079           lower(3,0) != -2 || lower(3,1) !=  0 || lower(3,2) !=  1 || lower(3,3) != 5 ) {
2080          std::ostringstream oss;
2081          oss << " Test: " << test_ << "\n"
2082              << " Error: Assignment to submatrix failed\n"
2083              << " Details:\n"
2084              << "   Result:\n" << lower << "\n"
2085              << "   Expected result:\n(  1  0  0  0 )\n"
2086                                      "(  0 12  0  0 )\n"
2087                                      "( 21  0 12  0 )\n"
2088                                      "( -2  0  1  5 )\n";
2089          throw std::runtime_error( oss.str() );
2090       }
2091    }
2092 
2093 
2094    //=====================================================================================
2095    // Row-major sparse matrix Schur product assignment
2096    //=====================================================================================
2097 
2098    // (  1  0  0  0 )      (  1  0  0  0 )
2099    // ( -4  2  0  0 )  =>  ( -4 12  0  0 )
2100    // (  7  0  3  0 )      (  7  0 12  0 )
2101    // ( -2  0  1  5 )      ( -2  0  0  5 )
2102    {
2103       test_ = "Row-major sparse matrix Schur product assignment test 1";
2104 
2105       blaze::CompressedMatrix<int,blaze::rowMajor> mat( 4UL, 2UL, 4UL );
2106       mat(0,1) = 9;
2107       mat(1,0) = 6;
2108       mat(2,1) = 4;
2109       mat(3,0) = 9;
2110 
2111       LT lower;
2112       init( lower );
2113 
2114       auto sm = submatrix( lower, 0UL, 1UL, 4UL, 2UL );
2115       sm %= mat;
2116 
2117       checkRows    ( lower, 4UL );
2118       checkColumns ( lower, 4UL );
2119       checkNonZeros( lower, 7UL );
2120 
2121       if( sm(0,0) !=  0 || sm(0,1) !=  0 ||
2122           sm(1,0) != 12 || sm(1,1) !=  0 ||
2123           sm(2,0) !=  0 || sm(2,1) != 12 ||
2124           sm(3,0) !=  0 || sm(3,1) !=  0 ) {
2125          std::ostringstream oss;
2126          oss << " Test: " << test_ << "\n"
2127              << " Error: Assignment to submatrix failed\n"
2128              << " Details:\n"
2129              << "   Result:\n" << sm << "\n"
2130              << "   Expected result:\n(  0  0 )\n( 12  0 )\n(  0 12 )\n(  0  0 )\n";
2131          throw std::runtime_error( oss.str() );
2132       }
2133 
2134       if( lower(0,0) !=  1 || lower(0,1) !=  0 || lower(0,2) !=  0 || lower(0,3) != 0 ||
2135           lower(1,0) != -4 || lower(1,1) != 12 || lower(1,2) !=  0 || lower(1,3) != 0 ||
2136           lower(2,0) !=  7 || lower(2,1) !=  0 || lower(2,2) != 12 || lower(2,3) != 0 ||
2137           lower(3,0) != -2 || lower(3,1) !=  0 || lower(3,2) !=  0 || lower(3,3) != 5 ) {
2138          std::ostringstream oss;
2139          oss << " Test: " << test_ << "\n"
2140              << " Error: Assignment to submatrix failed\n"
2141              << " Details:\n"
2142              << "   Result:\n" << lower << "\n"
2143              << "   Expected result:\n(  1  0  0  0 )\n"
2144                                      "( -4 12  0  0 )\n"
2145                                      "(  7  0 12  0 )\n"
2146                                      "( -2  0  0  5 )\n";
2147          throw std::runtime_error( oss.str() );
2148       }
2149    }
2150 
2151    // (  1  0  0  0 )      (  1  0  0  0 )
2152    // ( -4  2  0  0 )  =>  (  0 12  0  0 )
2153    // (  7  0  3  0 )      ( 21  0 12  0 )
2154    // ( -2  0  1  5 )      ( -2  0  1  5 )
2155    {
2156       test_ = "Row-major sparse matrix Schur product assignment test 2";
2157 
2158       blaze::CompressedMatrix<int,blaze::rowMajor> mat( 2UL, 4UL, 4UL );
2159       mat(0,1) = 6;
2160       mat(0,3) = 9;
2161       mat(1,0) = 3;
2162       mat(1,2) = 4;
2163 
2164       LT lower;
2165       init( lower );
2166 
2167       auto sm = submatrix( lower, 1UL, 0UL, 2UL, 4UL );
2168       sm %= mat;
2169 
2170       checkRows    ( lower, 4UL );
2171       checkColumns ( lower, 4UL );
2172       checkNonZeros( lower, 7UL );
2173 
2174       if( sm(0,0) !=  0 || sm(0,1) != 12 || sm(0,2) !=  0 || sm(0,3) != 0 ||
2175           sm(1,0) != 21 || sm(1,1) !=  0 || sm(1,2) != 12 || sm(1,3) != 0 ) {
2176          std::ostringstream oss;
2177          oss << " Test: " << test_ << "\n"
2178              << " Error: Assignment to submatrix failed\n"
2179              << " Details:\n"
2180              << "   Result:\n" << sm << "\n"
2181              << "   Expected result:\n(  0 12  0  0 )\n( 21  0 12  0 )\n";
2182          throw std::runtime_error( oss.str() );
2183       }
2184 
2185       if( lower(0,0) !=  1 || lower(0,1) !=  0 || lower(0,2) !=  0 || lower(0,3) != 0 ||
2186           lower(1,0) !=  0 || lower(1,1) != 12 || lower(1,2) !=  0 || lower(1,3) != 0 ||
2187           lower(2,0) != 21 || lower(2,1) !=  0 || lower(2,2) != 12 || lower(2,3) != 0 ||
2188           lower(3,0) != -2 || lower(3,1) !=  0 || lower(3,2) !=  1 || lower(3,3) != 5 ) {
2189          std::ostringstream oss;
2190          oss << " Test: " << test_ << "\n"
2191              << " Error: Assignment to submatrix failed\n"
2192              << " Details:\n"
2193              << "   Result:\n" << lower << "\n"
2194              << "   Expected result:\n(  1  0  0  0 )\n"
2195                                      "(  0 12  0  0 )\n"
2196                                      "( 21  0 12  0 )\n"
2197                                      "( -2  0  1  5 )\n";
2198          throw std::runtime_error( oss.str() );
2199       }
2200    }
2201 
2202    // (  1  0  0  0 )      (  1  0  0  0 )
2203    // ( -4  2  0  0 )  =>  ( -4 12  0  0 )
2204    // (  7  0  3  0 )      (  7  0 12  0 )
2205    // ( -2  0  1  5 )      ( -2  0  0  5 )
2206    {
2207       test_ = "Column-major sparse matrix Schur product assignment test 1";
2208 
2209       blaze::CompressedMatrix<int,blaze::columnMajor> mat( 4UL, 2UL, 4UL );
2210       mat(0,1) = 9;
2211       mat(1,0) = 6;
2212       mat(2,1) = 4;
2213       mat(3,0) = 9;
2214 
2215       LT lower;
2216       init( lower );
2217 
2218       auto sm = submatrix( lower, 0UL, 1UL, 4UL, 2UL );
2219       sm %= mat;
2220 
2221       checkRows    ( lower, 4UL );
2222       checkColumns ( lower, 4UL );
2223       checkNonZeros( lower, 7UL );
2224 
2225       if( sm(0,0) !=  0 || sm(0,1) !=  0 ||
2226           sm(1,0) != 12 || sm(1,1) !=  0 ||
2227           sm(2,0) !=  0 || sm(2,1) != 12 ||
2228           sm(3,0) !=  0 || sm(3,1) !=  0 ) {
2229          std::ostringstream oss;
2230          oss << " Test: " << test_ << "\n"
2231              << " Error: Assignment to submatrix failed\n"
2232              << " Details:\n"
2233              << "   Result:\n" << sm << "\n"
2234              << "   Expected result:\n(  0  0 )\n( 12  0 )\n(  0 12 )\n(  0  0 )\n";
2235          throw std::runtime_error( oss.str() );
2236       }
2237 
2238       if( lower(0,0) !=  1 || lower(0,1) !=  0 || lower(0,2) !=  0 || lower(0,3) != 0 ||
2239           lower(1,0) != -4 || lower(1,1) != 12 || lower(1,2) !=  0 || lower(1,3) != 0 ||
2240           lower(2,0) !=  7 || lower(2,1) !=  0 || lower(2,2) != 12 || lower(2,3) != 0 ||
2241           lower(3,0) != -2 || lower(3,1) !=  0 || lower(3,2) !=  0 || lower(3,3) != 5 ) {
2242          std::ostringstream oss;
2243          oss << " Test: " << test_ << "\n"
2244              << " Error: Assignment to submatrix failed\n"
2245              << " Details:\n"
2246              << "   Result:\n" << lower << "\n"
2247              << "   Expected result:\n(  1  0  0  0 )\n"
2248                                      "( -4 12  0  0 )\n"
2249                                      "(  7  0 12  0 )\n"
2250                                      "( -2  0  0  5 )\n";
2251          throw std::runtime_error( oss.str() );
2252       }
2253    }
2254 
2255    // (  1  0  0  0 )      (  1  0  0  0 )
2256    // ( -4  2  0  0 )  =>  (  0 12  0  0 )
2257    // (  7  0  3  0 )      ( 21  0 12  0 )
2258    // ( -2  0  1  5 )      ( -2  0  1  5 )
2259    {
2260       test_ = "Column-major sparse matrix Schur product assignment test 2";
2261 
2262       blaze::CompressedMatrix<int,blaze::columnMajor> mat( 2UL, 4UL, 4UL );
2263       mat(0,1) = 6;
2264       mat(0,3) = 9;
2265       mat(1,0) = 3;
2266       mat(1,2) = 4;
2267 
2268       LT lower;
2269       init( lower );
2270 
2271       auto sm = submatrix( lower, 1UL, 0UL, 2UL, 4UL );
2272       sm %= mat;
2273 
2274       checkRows    ( lower, 4UL );
2275       checkColumns ( lower, 4UL );
2276       checkNonZeros( lower, 7UL );
2277 
2278       if( sm(0,0) !=  0 || sm(0,1) != 12 || sm(0,2) !=  0 || sm(0,3) != 0 ||
2279           sm(1,0) != 21 || sm(1,1) !=  0 || sm(1,2) != 12 || sm(1,3) != 0 ) {
2280          std::ostringstream oss;
2281          oss << " Test: " << test_ << "\n"
2282              << " Error: Assignment to submatrix failed\n"
2283              << " Details:\n"
2284              << "   Result:\n" << sm << "\n"
2285              << "   Expected result:\n(  0 12  0  0 )\n( 21  0 12  0 )\n";
2286          throw std::runtime_error( oss.str() );
2287       }
2288 
2289       if( lower(0,0) !=  1 || lower(0,1) !=  0 || lower(0,2) !=  0 || lower(0,3) != 0 ||
2290           lower(1,0) !=  0 || lower(1,1) != 12 || lower(1,2) !=  0 || lower(1,3) != 0 ||
2291           lower(2,0) != 21 || lower(2,1) !=  0 || lower(2,2) != 12 || lower(2,3) != 0 ||
2292           lower(3,0) != -2 || lower(3,1) !=  0 || lower(3,2) !=  1 || lower(3,3) != 5 ) {
2293          std::ostringstream oss;
2294          oss << " Test: " << test_ << "\n"
2295              << " Error: Assignment to submatrix failed\n"
2296              << " Details:\n"
2297              << "   Result:\n" << lower << "\n"
2298              << "   Expected result:\n(  1  0  0  0 )\n"
2299                                      "(  0 12  0  0 )\n"
2300                                      "( 21  0 12  0 )\n"
2301                                      "( -2  0  1  5 )\n";
2302          throw std::runtime_error( oss.str() );
2303       }
2304    }
2305 }
2306 //*************************************************************************************************
2307 
2308 
2309 //*************************************************************************************************
2310 /*!\brief Checking the number of rows of the given matrix.
2311 //
2312 // \param matrix The matrix to be checked.
2313 // \param expectedRows The expected number of rows of the matrix.
2314 // \return void
2315 // \exception std::runtime_error Error detected.
2316 //
2317 // This function checks the number of rows of the given matrix. In case the actual number of
2318 // rows does not correspond to the given expected number of rows, a \a std::runtime_error
2319 // exception is thrown.
2320 */
2321 template< typename Type >  // Type of the matrix
checkRows(const Type & matrix,size_t expectedRows)2322 void SubmatrixTest::checkRows( const Type& matrix, size_t expectedRows ) const
2323 {
2324    if( matrix.rows() != expectedRows ) {
2325       std::ostringstream oss;
2326       oss << " Test: " << test_ << "\n"
2327           << " Error: Invalid number of rows detected\n"
2328           << " Details:\n"
2329           << "   Number of rows         : " << matrix.rows() << "\n"
2330           << "   Expected number of rows: " << expectedRows << "\n";
2331       throw std::runtime_error( oss.str() );
2332    }
2333 }
2334 //*************************************************************************************************
2335 
2336 
2337 //*************************************************************************************************
2338 /*!\brief Checking the number of columns of the given matrix.
2339 //
2340 // \param matrix The matrix to be checked.
2341 // \param expectedColumns The expected number of columns of the matrix.
2342 // \return void
2343 // \exception std::runtime_error Error detected.
2344 //
2345 // This function checks the number of columns of the given matrix. In case the actual number of
2346 // columns does not correspond to the given expected number of columns, a \a std::runtime_error
2347 // exception is thrown.
2348 */
2349 template< typename Type >  // Type of the matrix
checkColumns(const Type & matrix,size_t expectedColumns)2350 void SubmatrixTest::checkColumns( const Type& matrix, size_t expectedColumns ) const
2351 {
2352    if( matrix.columns() != expectedColumns ) {
2353       std::ostringstream oss;
2354       oss << " Test: " << test_ << "\n"
2355           << " Error: Invalid number of columns detected\n"
2356           << " Details:\n"
2357           << "   Number of columns         : " << matrix.columns() << "\n"
2358           << "   Expected number of columns: " << expectedColumns << "\n";
2359       throw std::runtime_error( oss.str() );
2360    }
2361 }
2362 //*************************************************************************************************
2363 
2364 
2365 //*************************************************************************************************
2366 /*!\brief Checking the number of non-zero elements of the given matrix.
2367 //
2368 // \param matrix The matrix to be checked.
2369 // \param expectedNonZeros The expected number of non-zero elements of the matrix.
2370 // \return void
2371 // \exception std::runtime_error Error detected.
2372 //
2373 // This function checks the number of non-zero elements of the given matrix. In case the
2374 // actual number of non-zero elements does not correspond to the given expected number,
2375 // a \a std::runtime_error exception is thrown.
2376 */
2377 template< typename Type >  // Type of the matrix
checkNonZeros(const Type & matrix,size_t expectedNonZeros)2378 void SubmatrixTest::checkNonZeros( const Type& matrix, size_t expectedNonZeros ) const
2379 {
2380    if( nonZeros( matrix ) != expectedNonZeros ) {
2381       std::ostringstream oss;
2382       oss << " Test: " << test_ << "\n"
2383           << " Error: Invalid number of non-zero elements\n"
2384           << " Details:\n"
2385           << "   Number of non-zeros         : " << nonZeros( matrix ) << "\n"
2386           << "   Expected number of non-zeros: " << expectedNonZeros << "\n";
2387       throw std::runtime_error( oss.str() );
2388    }
2389 
2390    if( capacity( matrix ) < nonZeros( matrix ) ) {
2391       std::ostringstream oss;
2392       oss << " Test: " << test_ << "\n"
2393           << " Error: Invalid capacity detected\n"
2394           << " Details:\n"
2395           << "   Number of non-zeros: " << nonZeros( matrix ) << "\n"
2396           << "   Capacity           : " << capacity( matrix ) << "\n";
2397       throw std::runtime_error( oss.str() );
2398    }
2399 }
2400 //*************************************************************************************************
2401 
2402 
2403 
2404 
2405 //=================================================================================================
2406 //
2407 //  UTILITY FUNCTIONS
2408 //
2409 //=================================================================================================
2410 
2411 //*************************************************************************************************
2412 /*!\brief Initializing the given lower triangular matrix.
2413 //
2414 // \return void
2415 //
2416 // This function is called before each test case to initialize the given lower triangular matrix.
2417 */
2418 template< typename LT >
init(LT & lower)2419 void SubmatrixTest::init( LT& lower )
2420 {
2421    lower.resize( 4UL );
2422    lower(0,0) =  1;
2423    lower(1,0) = -4;
2424    lower(1,1) =  2;
2425    lower(2,0) =  7;
2426    lower(2,1) =  0;
2427    lower(2,2) =  3;
2428    lower(3,0) = -2;
2429    lower(3,1) =  0;
2430    lower(3,2) =  1;
2431    lower(3,3) =  5;
2432 }
2433 //*************************************************************************************************
2434 
2435 
2436 
2437 
2438 //=================================================================================================
2439 //
2440 //  GLOBAL TEST FUNCTIONS
2441 //
2442 //=================================================================================================
2443 
2444 //*************************************************************************************************
2445 /*!\brief Testing the assignment to a submatrix of a LowerMatrix.
2446 //
2447 // \return void
2448 */
runTest()2449 void runTest()
2450 {
2451    SubmatrixTest();
2452 }
2453 //*************************************************************************************************
2454 
2455 
2456 
2457 
2458 //=================================================================================================
2459 //
2460 //  MACRO DEFINITIONS
2461 //
2462 //=================================================================================================
2463 
2464 //*************************************************************************************************
2465 /*! \cond BLAZE_INTERNAL */
2466 /*!\brief Macro for the execution of the LowerMatrix submatrix test.
2467 */
2468 #define RUN_LOWERMATRIX_SUBMATRIX_TEST \
2469    blazetest::mathtest::adaptors::lowermatrix::runTest()
2470 /*! \endcond */
2471 //*************************************************************************************************
2472 
2473 } // namespace lowermatrix
2474 
2475 } // namespace adaptors
2476 
2477 } // namespace mathtest
2478 
2479 } // namespace blazetest
2480 
2481 #endif
2482