1 //=================================================================================================
2 /*!
3 //  \file blazetest/mathtest/adaptors/diagonalmatrix/SubmatrixTest.h
4 //  \brief Header file for the DiagonalMatrix 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_DIAGONALMATRIX_SUBMATRIXTEST_H_
36 #define _BLAZETEST_MATHTEST_ADAPTORS_DIAGONALMATRIX_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/DiagonalMatrix.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 diagonalmatrix {
61 
62 //=================================================================================================
63 //
64 //  CLASS DEFINITION
65 //
66 //=================================================================================================
67 
68 //*************************************************************************************************
69 /*!\brief Auxiliary class for assignment tests to a submatrix of a DiagonalMatrix.
70 //
71 // This class performs assignment tests to a submatrix of a DiagonalMatrix. 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 diagonal matrix.
79    using DDT = blaze::DiagonalMatrix< blaze::DynamicMatrix<int,blaze::rowMajor> >;
80 
81    //! Opposite dense diagonal matrix type.
82    using DODT = DDT::OppositeType;
83 
84    //! Type of the sparse diagonal matrix.
85    using SDT = blaze::DiagonalMatrix< blaze::CompressedMatrix<int,blaze::rowMajor> >;
86 
87    //! Opposite sparse diagonal matrix type.
88    using SODT = SDT::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 DT > void testAssignment ();
109    template< typename DT > void testAddAssign  ();
110    template< typename DT > void testSubAssign  ();
111    template< typename DT > 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 DT > void init( DT& diag );
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 DiagonalMatrix.
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 DiagonalMatrix. In case an
156 // error is detected, a \a std::runtime_error exception is thrown.
157 */
158 template< typename DT >  // Type of the diagonal matrix
testAssignment()159 void SubmatrixTest::testAssignment()
160 {
161    //=====================================================================================
162    // Dense matrix assignment
163    //=====================================================================================
164 
165    // ( 1  0  0  0 )      ( 1  0  0  0 )
166    // ( 0  2  0  0 )  =>  ( 0 18  0  0 )
167    // ( 0  0  3  0 )      ( 0  0 11  0 )
168    // ( 0  0  0  4 )      ( 0  0  0  4 )
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,1) = 11;
175 
176       DT diag;
177       init( diag );
178 
179       auto sm = submatrix( diag, 0UL, 1UL, 4UL, 2UL );
180       sm = mat;
181 
182       checkRows    ( diag, 4UL );
183       checkColumns ( diag, 4UL );
184       checkNonZeros( diag, 4UL );
185 
186       if( sm(0,0) !=  0 || sm(0,1) !=  0 ||
187           sm(1,0) != 18 || sm(1,1) !=  0 ||
188           sm(2,0) !=  0 || sm(2,1) != 11 ||
189           sm(3,0) !=  0 || sm(3,1) !=  0 ) {
190          std::ostringstream oss;
191          oss << " Test: " << test_ << "\n"
192              << " Error: Assignment to submatrix failed\n"
193              << " Details:\n"
194              << "   Result:\n" << sm << "\n"
195              << "   Expected result:\n(  0  0 )\n( 18  0 )\n(  0 11 )\n(  0  0 )\n";
196          throw std::runtime_error( oss.str() );
197       }
198 
199       if( diag(0,0) != 1 || diag(0,1) !=  0 || diag(0,2) !=  0 || diag(0,3) != 0 ||
200           diag(1,0) != 0 || diag(1,1) != 18 || diag(1,2) !=  0 || diag(1,3) != 0 ||
201           diag(2,0) != 0 || diag(2,1) !=  0 || diag(2,2) != 11 || diag(2,3) != 0 ||
202           diag(3,0) != 0 || diag(3,1) !=  0 || diag(3,2) !=  0 || diag(3,3) != 4 ) {
203          std::ostringstream oss;
204          oss << " Test: " << test_ << "\n"
205              << " Error: Assignment to submatrix failed\n"
206              << " Details:\n"
207              << "   Result:\n" << diag << "\n"
208              << "   Expected result:\n( 1  0  0  0 )\n"
209                                      "( 0 18  0  0 )\n"
210                                      "( 0  0 11  0 )\n"
211                                      "( 0  0  0  4 )\n";
212          throw std::runtime_error( oss.str() );
213       }
214    }
215 
216    // ( 1  0  0  0 )      ( 1  0  0  0 )
217    // ( 0  2  0  0 )  =>  ( 0 18  0  0 )
218    // ( 0  0  3  0 )      ( 0  0 11  0 )
219    // ( 0  0  0  4 )      ( 0  0  0  4 )
220    {
221       test_ = "Row-major dense matrix assignment test 2";
222 
223       blaze::DynamicMatrix<int,blaze::rowMajor> mat( 2UL, 4UL, 0 );
224       mat(0,1) = 18;
225       mat(1,2) = 11;
226 
227       DT diag;
228       init( diag );
229 
230       auto sm = submatrix( diag, 1UL, 0UL, 2UL, 4UL );
231       sm = mat;
232 
233       checkRows    ( diag, 4UL );
234       checkColumns ( diag, 4UL );
235       checkNonZeros( diag, 4UL );
236 
237       if( sm(0,0) != 0 || sm(0,1) != 18 || sm(0,2) !=  0 || sm(0,3) != 0 ||
238           sm(1,0) != 0 || sm(1,1) !=  0 || sm(1,2) != 11 || sm(1,3) != 0 ) {
239          std::ostringstream oss;
240          oss << " Test: " << test_ << "\n"
241              << " Error: Assignment to submatrix failed\n"
242              << " Details:\n"
243              << "   Result:\n" << sm << "\n"
244              << "   Expected result:\n( 0 18  0  0 )\n( 0  0 11  0 )\n";
245          throw std::runtime_error( oss.str() );
246       }
247 
248       if( diag(0,0) != 1 || diag(0,1) !=  0 || diag(0,2) !=  0 || diag(0,3) != 0 ||
249           diag(1,0) != 0 || diag(1,1) != 18 || diag(1,2) !=  0 || diag(1,3) != 0 ||
250           diag(2,0) != 0 || diag(2,1) !=  0 || diag(2,2) != 11 || diag(2,3) != 0 ||
251           diag(3,0) != 0 || diag(3,1) !=  0 || diag(3,2) !=  0 || diag(3,3) != 4 ) {
252          std::ostringstream oss;
253          oss << " Test: " << test_ << "\n"
254              << " Error: Assignment to submatrix failed\n"
255              << " Details:\n"
256              << "   Result:\n" << diag << "\n"
257              << "   Expected result:\n( 1  0  0  0 )\n"
258                                      "( 0 18  0  0 )\n"
259                                      "( 0  0 11  0 )\n"
260                                      "( 0  0  0  4 )\n";
261          throw std::runtime_error( oss.str() );
262       }
263    }
264 
265    // ( 1  0  0  0 )      ( 1  0  0  0 )
266    // ( 0  2  0  0 )  =>  ( 0 11 12  0 )
267    // ( 0  0  3  0 )      ( 0  0 14  0 )
268    // ( 0  0  1  5 )      ( 0  0  0  5 )
269    {
270       test_ = "Row-major dense matrix assignment test 3";
271 
272       blaze::DynamicMatrix<int,blaze::rowMajor> mat( 2UL, 2UL, 0 );
273       mat(0,0) = 11;
274       mat(0,1) = 12;
275       mat(1,1) = 14;
276 
277       DT diag;
278       init( diag );
279 
280       auto sm = submatrix( diag, 1UL, 1UL, 2UL, 2UL );
281 
282       try {
283          sm = mat;
284 
285          std::ostringstream oss;
286          oss << " Test: " << test_ << "\n"
287              << " Error: Assignment of invalid matrix succeeded\n"
288              << " Details:\n"
289              << "   Result:\n" << diag << "\n";
290          throw std::runtime_error( oss.str() );
291       }
292       catch( std::invalid_argument& ) {}
293    }
294 
295    // ( 1  0  0  0 )      ( 1  0  0  0 )
296    // ( 0  2  0  0 )  =>  ( 0 11  0  0 )
297    // ( 0  0  3  0 )      ( 0 13 14  0 )
298    // ( 0  0  1  5 )      ( 0  0  0  5 )
299    {
300       test_ = "Row-major dense matrix assignment test 4";
301 
302       blaze::DynamicMatrix<int,blaze::rowMajor> mat( 2UL, 2UL, 0 );
303       mat(0,0) = 11;
304       mat(1,0) = 13;
305       mat(1,1) = 14;
306 
307       DT diag;
308       init( diag );
309 
310       auto sm = submatrix( diag, 1UL, 1UL, 2UL, 2UL );
311 
312       try {
313          sm = mat;
314 
315          std::ostringstream oss;
316          oss << " Test: " << test_ << "\n"
317              << " Error: Assignment of invalid matrix succeeded\n"
318              << " Details:\n"
319              << "   Result:\n" << diag << "\n";
320          throw std::runtime_error( oss.str() );
321       }
322       catch( std::invalid_argument& ) {}
323    }
324 
325    // ( 1  0  0  0 )      ( 1  0  0  0 )
326    // ( 0  2  0  0 )  =>  ( 0 18  0  0 )
327    // ( 0  0  3  0 )      ( 0  0 11  0 )
328    // ( 0  0  0  4 )      ( 0  0  0  4 )
329    {
330       test_ = "Column-major dense matrix assignment test 1";
331 
332       blaze::DynamicMatrix<int,blaze::columnMajor> mat( 4UL, 2UL, 0 );
333       mat(1,0) = 18;
334       mat(2,1) = 11;
335 
336       DT diag;
337       init( diag );
338 
339       auto sm = submatrix( diag, 0UL, 1UL, 4UL, 2UL );
340       sm = mat;
341 
342       checkRows    ( diag, 4UL );
343       checkColumns ( diag, 4UL );
344       checkNonZeros( diag, 4UL );
345 
346       if( sm(0,0) !=  0 || sm(0,1) !=  0 ||
347           sm(1,0) != 18 || sm(1,1) !=  0 ||
348           sm(2,0) !=  0 || sm(2,1) != 11 ||
349           sm(3,0) !=  0 || sm(3,1) !=  0 ) {
350          std::ostringstream oss;
351          oss << " Test: " << test_ << "\n"
352              << " Error: Assignment to submatrix failed\n"
353              << " Details:\n"
354              << "   Result:\n" << sm << "\n"
355              << "   Expected result:\n(  0  0 )\n( 18  0 )\n(  0 11 )\n(  0  0 )\n";
356          throw std::runtime_error( oss.str() );
357       }
358 
359       if( diag(0,0) != 1 || diag(0,1) !=  0 || diag(0,2) !=  0 || diag(0,3) != 0 ||
360           diag(1,0) != 0 || diag(1,1) != 18 || diag(1,2) !=  0 || diag(1,3) != 0 ||
361           diag(2,0) != 0 || diag(2,1) !=  0 || diag(2,2) != 11 || diag(2,3) != 0 ||
362           diag(3,0) != 0 || diag(3,1) !=  0 || diag(3,2) !=  0 || diag(3,3) != 4 ) {
363          std::ostringstream oss;
364          oss << " Test: " << test_ << "\n"
365              << " Error: Assignment to submatrix failed\n"
366              << " Details:\n"
367              << "   Result:\n" << diag << "\n"
368              << "   Expected result:\n( 1  0  0  0 )\n"
369                                      "( 0 18  0  0 )\n"
370                                      "( 0  0 11  0 )\n"
371                                      "( 0  0  0  5 )\n";
372          throw std::runtime_error( oss.str() );
373       }
374    }
375 
376    // ( 1  0  0  0 )      ( 1  0  0  0 )
377    // ( 0  2  0  0 )  =>  ( 0 18  0  0 )
378    // ( 0  0  3  0 )      ( 0  0 11  0 )
379    // ( 0  0  0  4 )      ( 0  0  0  4 )
380    {
381       test_ = "Column-major dense matrix assignment test 2";
382 
383       blaze::DynamicMatrix<int,blaze::columnMajor> mat( 2UL, 4UL, 0 );
384       mat(0,1) = 18;
385       mat(1,2) = 11;
386 
387       DT diag;
388       init( diag );
389 
390       auto sm = submatrix( diag, 1UL, 0UL, 2UL, 4UL );
391       sm = mat;
392 
393       checkRows    ( diag, 4UL );
394       checkColumns ( diag, 4UL );
395       checkNonZeros( diag, 4UL );
396 
397       if( sm(0,0) != 0 || sm(0,1) != 18 || sm(0,2) !=  0 || sm(0,3) != 0 ||
398           sm(1,0) != 0 || sm(1,1) !=  0 || sm(1,2) != 11 || sm(1,3) != 0 ) {
399          std::ostringstream oss;
400          oss << " Test: " << test_ << "\n"
401              << " Error: Assignment to submatrix failed\n"
402              << " Details:\n"
403              << "   Result:\n" << sm << "\n"
404              << "   Expected result:\n( 0 18  0  0 )\n( 0  0 11  0 )\n";
405          throw std::runtime_error( oss.str() );
406       }
407 
408       if( diag(0,0) != 1 || diag(0,1) !=  0 || diag(0,2) !=  0 || diag(0,3) != 0 ||
409           diag(1,0) != 0 || diag(1,1) != 18 || diag(1,2) !=  0 || diag(1,3) != 0 ||
410           diag(2,0) != 0 || diag(2,1) !=  0 || diag(2,2) != 11 || diag(2,3) != 0 ||
411           diag(3,0) != 0 || diag(3,1) !=  0 || diag(3,2) !=  0 || diag(3,3) != 4 ) {
412          std::ostringstream oss;
413          oss << " Test: " << test_ << "\n"
414              << " Error: Assignment to submatrix failed\n"
415              << " Details:\n"
416              << "   Result:\n" << diag << "\n"
417              << "   Expected result:\n( 1  0  0  0 )\n"
418                                      "( 0 18  0  0 )\n"
419                                      "( 0  0 11  0 )\n"
420                                      "( 0  0  0  4 )\n";
421          throw std::runtime_error( oss.str() );
422       }
423    }
424 
425    // ( 1  0  0  0 )      ( 1  0  0  0 )
426    // ( 0  2  0  0 )  =>  ( 0 11 12  0 )
427    // ( 0  0  3  0 )      ( 0  0 14  0 )
428    // ( 0  0  0  4 )      ( 0  0  0  4 )
429    {
430       test_ = "Column-major dense matrix assignment test 3";
431 
432       blaze::DynamicMatrix<int,blaze::columnMajor> mat( 2UL, 2UL, 0 );
433       mat(0,0) = 11;
434       mat(0,1) = 12;
435       mat(1,1) = 14;
436 
437       DT diag;
438       init( diag );
439 
440       auto sm = submatrix( diag, 1UL, 1UL, 2UL, 2UL );
441 
442       try {
443          sm = mat;
444 
445          std::ostringstream oss;
446          oss << " Test: " << test_ << "\n"
447              << " Error: Assignment of invalid matrix succeeded\n"
448              << " Details:\n"
449              << "   Result:\n" << diag << "\n";
450          throw std::runtime_error( oss.str() );
451       }
452       catch( std::invalid_argument& ) {}
453    }
454 
455    // ( 1  0  0  0 )      ( 1  0  0  0 )
456    // ( 0  2  0  0 )  =>  ( 0 11  0  0 )
457    // ( 0  0  3  0 )      ( 0 13 14  0 )
458    // ( 0  0  0  4 )      ( 0  0  0  4 )
459    {
460       test_ = "Column-major dense matrix assignment test 4";
461 
462       blaze::DynamicMatrix<int,blaze::columnMajor> mat( 2UL, 2UL, 0 );
463       mat(0,0) = 11;
464       mat(1,0) = 13;
465       mat(1,1) = 14;
466 
467       DT diag;
468       init( diag );
469 
470       auto sm = submatrix( diag, 1UL, 1UL, 2UL, 2UL );
471 
472       try {
473          sm = mat;
474 
475          std::ostringstream oss;
476          oss << " Test: " << test_ << "\n"
477              << " Error: Assignment of invalid matrix succeeded\n"
478              << " Details:\n"
479              << "   Result:\n" << diag << "\n";
480          throw std::runtime_error( oss.str() );
481       }
482       catch( std::invalid_argument& ) {}
483    }
484 
485 
486    //=====================================================================================
487    // Sparse matrix assignment
488    //=====================================================================================
489 
490    // ( 1  0  0  0 )      ( 1  0  0  0 )
491    // ( 0  2  0  0 )  =>  ( 0 18  0  0 )
492    // ( 0  0  3  0 )      ( 0  0 11  0 )
493    // ( 0  0  0  4 )      ( 0  0  0  4 )
494    {
495       test_ = "Row-major sparse matrix assignment test 1";
496 
497       blaze::CompressedMatrix<int,blaze::rowMajor> mat( 4UL, 2UL, 4UL );
498       mat(1,0) = 18;
499       mat(2,1) = 11;
500       mat.insert( 1UL, 1UL, 0 );
501       mat.insert( 2UL, 0UL, 0 );
502 
503       DT diag;
504       init( diag );
505 
506       auto sm = submatrix( diag, 0UL, 1UL, 4UL, 2UL );
507       sm = mat;
508 
509       checkRows    ( diag, 4UL );
510       checkColumns ( diag, 4UL );
511       checkNonZeros( diag, 4UL );
512 
513       if( sm(0,0) !=  0 || sm(0,1) !=  0 ||
514           sm(1,0) != 18 || sm(1,1) !=  0 ||
515           sm(2,0) !=  0 || sm(2,1) != 11 ||
516           sm(3,0) !=  0 || sm(3,1) !=  0 ) {
517          std::ostringstream oss;
518          oss << " Test: " << test_ << "\n"
519              << " Error: Assignment to submatrix failed\n"
520              << " Details:\n"
521              << "   Result:\n" << sm << "\n"
522              << "   Expected result:\n(  0  0 )\n( 18  0 )\n(  0 11 )\n(  0  0 )\n";
523          throw std::runtime_error( oss.str() );
524       }
525 
526       if( diag(0,0) != 1 || diag(0,1) !=  0 || diag(0,2) !=  0 || diag(0,3) != 0 ||
527           diag(1,0) != 0 || diag(1,1) != 18 || diag(1,2) !=  0 || diag(1,3) != 0 ||
528           diag(2,0) != 0 || diag(2,1) !=  0 || diag(2,2) != 11 || diag(2,3) != 0 ||
529           diag(3,0) != 0 || diag(3,1) !=  0 || diag(3,2) !=  0 || diag(3,3) != 4 ) {
530          std::ostringstream oss;
531          oss << " Test: " << test_ << "\n"
532              << " Error: Assignment to submatrix failed\n"
533              << " Details:\n"
534              << "   Result:\n" << diag << "\n"
535              << "   Expected result:\n( 1  0  0  0 )\n"
536                                      "( 0 18  0  0 )\n"
537                                      "( 0  0 11  0 )\n"
538                                      "( 0  0  0  4 )\n";
539          throw std::runtime_error( oss.str() );
540       }
541    }
542 
543    // ( 1  0  0  0 )      ( 1  0  0  0 )
544    // ( 0  2  0  0 )  =>  ( 0 18  0  0 )
545    // ( 0  0  3  0 )      ( 0  0 11  0 )
546    // ( 0  0  0  4 )      ( 0  0  0  4 )
547    {
548       test_ = "Row-major sparse matrix assignment test 2";
549 
550       blaze::CompressedMatrix<int,blaze::rowMajor> mat( 2UL, 4UL, 4UL );
551       mat(0,1) = 18;
552       mat(1,2) = 11;
553       mat.insert( 0UL, 2UL, 0 );
554       mat.insert( 1UL, 1UL, 0 );
555 
556       DT diag;
557       init( diag );
558 
559       auto sm = submatrix( diag, 1UL, 0UL, 2UL, 4UL );
560       sm = mat;
561 
562       checkRows    ( diag, 4UL );
563       checkColumns ( diag, 4UL );
564       checkNonZeros( diag, 4UL );
565 
566       if( sm(0,0) != 0 || sm(0,1) != 18 || sm(0,2) !=  0 || sm(0,3) != 0 ||
567           sm(1,0) != 0 || sm(1,1) !=  0 || sm(1,2) != 11 || sm(1,3) != 0 ) {
568          std::ostringstream oss;
569          oss << " Test: " << test_ << "\n"
570              << " Error: Assignment to submatrix failed\n"
571              << " Details:\n"
572              << "   Result:\n" << sm << "\n"
573              << "   Expected result:\n( 0 18  0  0 )\n( 0  0 11  0 )\n";
574          throw std::runtime_error( oss.str() );
575       }
576 
577       if( diag(0,0) != 1 || diag(0,1) !=  0 || diag(0,2) !=  0 || diag(0,3) != 0 ||
578           diag(1,0) != 0 || diag(1,1) != 18 || diag(1,2) !=  0 || diag(1,3) != 0 ||
579           diag(2,0) != 0 || diag(2,1) !=  0 || diag(2,2) != 11 || diag(2,3) != 0 ||
580           diag(3,0) != 0 || diag(3,1) !=  0 || diag(3,2) !=  0 || diag(3,3) != 4 ) {
581          std::ostringstream oss;
582          oss << " Test: " << test_ << "\n"
583              << " Error: Assignment to submatrix failed\n"
584              << " Details:\n"
585              << "   Result:\n" << diag << "\n"
586              << "   Expected result:\n( 1  0  0  0 )\n"
587                                      "( 0 18  0  0 )\n"
588                                      "( 0  0 11  0 )\n"
589                                      "( 0  0  0  4 )\n";
590          throw std::runtime_error( oss.str() );
591       }
592    }
593 
594    // ( 1  0  0  0 )      ( 1  0  0  0 )
595    // ( 0  2  0  0 )  =>  ( 0 11 12  0 )
596    // ( 0  0  3  0 )      ( 0  0 14  0 )
597    // ( 0  0  0  4 )      ( 0  0  0  4 )
598    {
599       test_ = "Row-major sparse matrix assignment test 3";
600 
601       blaze::CompressedMatrix<int,blaze::rowMajor> mat( 2UL, 2UL, 4UL );
602       mat(0,0) = 11;
603       mat(0,1) = 12;
604       mat(1,1) = 14;
605       mat.insert( 1UL, 0UL, 0 );
606 
607       DT diag;
608       init( diag );
609 
610       auto sm = submatrix( diag, 1UL, 1UL, 2UL, 2UL );
611 
612       try {
613          sm = mat;
614 
615          std::ostringstream oss;
616          oss << " Test: " << test_ << "\n"
617              << " Error: Assignment of invalid matrix succeeded\n"
618              << " Details:\n"
619              << "   Result:\n" << diag << "\n";
620          throw std::runtime_error( oss.str() );
621       }
622       catch( std::invalid_argument& ) {}
623    }
624 
625    // ( 1  0  0  0 )      ( 1  0  0  0 )
626    // ( 0  2  0  0 )  =>  ( 0 11  0  0 )
627    // ( 0  0  3  0 )      ( 0 13 14  0 )
628    // ( 0  0  0  4 )      ( 0  0  0  4 )
629    {
630       test_ = "Row-major sparse matrix assignment test 4";
631 
632       blaze::CompressedMatrix<int,blaze::rowMajor> mat( 2UL, 2UL, 4UL );
633       mat(0,0) = 11;
634       mat(1,0) = 13;
635       mat(1,1) = 14;
636       mat.insert( 0UL, 1UL, 0 );
637 
638       DT diag;
639       init( diag );
640 
641       auto sm = submatrix( diag, 1UL, 1UL, 2UL, 2UL );
642 
643       try {
644          sm = mat;
645 
646          std::ostringstream oss;
647          oss << " Test: " << test_ << "\n"
648              << " Error: Assignment of invalid matrix succeeded\n"
649              << " Details:\n"
650              << "   Result:\n" << diag << "\n";
651          throw std::runtime_error( oss.str() );
652       }
653       catch( std::invalid_argument& ) {}
654    }
655 
656    // ( 1  0  0  0 )      ( 1  0  0  0 )
657    // ( 0  2  0  0 )  =>  ( 0 18  0  0 )
658    // ( 0  0  3  0 )      ( 0  0 11  0 )
659    // ( 0  0  0  4 )      ( 0  0  0  4 )
660    {
661       test_ = "Column-major sparse matrix assignment test 1";
662 
663       blaze::CompressedMatrix<int,blaze::columnMajor> mat( 4UL, 2UL, 4UL );
664       mat(1,0) = 18;
665       mat(2,1) = 11;
666       mat.insert( 1UL, 1UL, 0 );
667       mat.insert( 2UL, 0UL, 0 );
668 
669       DT diag;
670       init( diag );
671 
672       auto sm = submatrix( diag, 0UL, 1UL, 4UL, 2UL );
673       sm = mat;
674 
675       checkRows    ( diag, 4UL );
676       checkColumns ( diag, 4UL );
677       checkNonZeros( diag, 4UL );
678 
679       if( sm(0,0) !=  0 || sm(0,1) !=  0 ||
680           sm(1,0) != 18 || sm(1,1) !=  0 ||
681           sm(2,0) !=  0 || sm(2,1) != 11 ||
682           sm(3,0) !=  0 || sm(3,1) !=  0 ) {
683          std::ostringstream oss;
684          oss << " Test: " << test_ << "\n"
685              << " Error: Assignment to submatrix failed\n"
686              << " Details:\n"
687              << "   Result:\n" << sm << "\n"
688              << "   Expected result:\n(  0  0 )\n( 18  0 )\n(  0 11 )\n(  0  0 )\n";
689          throw std::runtime_error( oss.str() );
690       }
691 
692       if( diag(0,0) != 1 || diag(0,1) !=  0 || diag(0,2) !=  0 || diag(0,3) != 0 ||
693           diag(1,0) != 0 || diag(1,1) != 18 || diag(1,2) !=  0 || diag(1,3) != 0 ||
694           diag(2,0) != 0 || diag(2,1) !=  0 || diag(2,2) != 11 || diag(2,3) != 0 ||
695           diag(3,0) != 0 || diag(3,1) !=  0 || diag(3,2) !=  0 || diag(3,3) != 4 ) {
696          std::ostringstream oss;
697          oss << " Test: " << test_ << "\n"
698              << " Error: Assignment to submatrix failed\n"
699              << " Details:\n"
700              << "   Result:\n" << diag << "\n"
701              << "   Expected result:\n( 1  0  0  0 )\n"
702                                      "( 0 18  0  0 )\n"
703                                      "( 0  0 11  0 )\n"
704                                      "( 0  0  0  4 )\n";
705          throw std::runtime_error( oss.str() );
706       }
707    }
708 
709    // ( 1  0  0  0 )      ( 1  0  0  0 )
710    // ( 0  2  0  0 )  =>  ( 0 18  0  0 )
711    // ( 0  0  3  0 )      ( 0  0 11  0 )
712    // ( 0  0  0  4 )      ( 0  0  0  4 )
713    {
714       test_ = "Column-major sparse matrix assignment test 2";
715 
716       blaze::CompressedMatrix<int,blaze::columnMajor> mat( 2UL, 4UL, 4UL );
717       mat(0,1) = 18;
718       mat(1,2) = 11;
719       mat.insert( 0UL, 2UL, 0 );
720       mat.insert( 1UL, 1UL, 0 );
721 
722       DT diag;
723       init( diag );
724 
725       auto sm = submatrix( diag, 1UL, 0UL, 2UL, 4UL );
726       sm = mat;
727 
728       checkRows    ( diag, 4UL );
729       checkColumns ( diag, 4UL );
730       checkNonZeros( diag, 4UL );
731 
732       if( sm(0,0) != 0 || sm(0,1) != 18 || sm(0,2) !=  0 || sm(0,3) != 0 ||
733           sm(1,0) != 0 || sm(1,1) !=  0 || sm(1,2) != 11 || sm(1,3) != 0 ) {
734          std::ostringstream oss;
735          oss << " Test: " << test_ << "\n"
736              << " Error: Assignment to submatrix failed\n"
737              << " Details:\n"
738              << "   Result:\n" << sm << "\n"
739              << "   Expected result:\n( 0 18  0  0 )\n( 0  0 11  0 )\n";
740          throw std::runtime_error( oss.str() );
741       }
742 
743       if( diag(0,0) != 1 || diag(0,1) !=  0 || diag(0,2) !=  0 || diag(0,3) != 0 ||
744           diag(1,0) != 0 || diag(1,1) != 18 || diag(1,2) !=  0 || diag(1,3) != 0 ||
745           diag(2,0) != 0 || diag(2,1) !=  0 || diag(2,2) != 11 || diag(2,3) != 0 ||
746           diag(3,0) != 0 || diag(3,1) !=  0 || diag(3,2) !=  0 || diag(3,3) != 4 ) {
747          std::ostringstream oss;
748          oss << " Test: " << test_ << "\n"
749              << " Error: Assignment to submatrix failed\n"
750              << " Details:\n"
751              << "   Result:\n" << diag << "\n"
752              << "   Expected result:\n( 1  0  0  0 )\n"
753                                      "( 0 18  0  0 )\n"
754                                      "( 0  0 11  0 )\n"
755                                      "( 0  0  0  4 )\n";
756          throw std::runtime_error( oss.str() );
757       }
758    }
759 
760    // ( 1  0  0  0 )      ( 1  0  0  0 )
761    // ( 0  2  0  0 )  =>  ( 0 11 12  0 )
762    // ( 0  0  3  0 )      ( 0  0 14  0 )
763    // ( 0  0  0  4 )      ( 0  0  0  4 )
764    {
765       test_ = "Column-major sparse matrix assignment test 3";
766 
767       blaze::CompressedMatrix<int,blaze::columnMajor> mat( 2UL, 2UL, 4UL );
768       mat(0,0) = 11;
769       mat(0,1) = 12;
770       mat(1,1) = 14;
771       mat.insert( 1UL, 0UL, 0 );
772 
773       DT diag;
774       init( diag );
775 
776       auto sm = submatrix( diag, 1UL, 1UL, 2UL, 2UL );
777 
778       try {
779          sm = mat;
780 
781          std::ostringstream oss;
782          oss << " Test: " << test_ << "\n"
783              << " Error: Assignment of invalid matrix succeeded\n"
784              << " Details:\n"
785              << "   Result:\n" << diag << "\n";
786          throw std::runtime_error( oss.str() );
787       }
788       catch( std::invalid_argument& ) {}
789    }
790 
791    // ( 1  0  0  0 )      ( 1  0  0  0 )
792    // ( 0  2  0  0 )  =>  ( 0 11  0  0 )
793    // ( 0  0  3  0 )      ( 0 13 14  0 )
794    // ( 0  0  0  4 )      ( 0  0  0  4 )
795    {
796       test_ = "Column-major sparse matrix assignment test 4";
797 
798       blaze::CompressedMatrix<int,blaze::columnMajor> mat( 2UL, 2UL, 4UL );
799       mat(0,0) = 11;
800       mat(1,0) = 13;
801       mat(1,1) = 14;
802       mat.insert( 0UL, 1UL, 0 );
803 
804       DT diag;
805       init( diag );
806 
807       auto sm = submatrix( diag, 1UL, 1UL, 2UL, 2UL );
808 
809       try {
810          sm = mat;
811 
812          std::ostringstream oss;
813          oss << " Test: " << test_ << "\n"
814              << " Error: Assignment of invalid matrix succeeded\n"
815              << " Details:\n"
816              << "   Result:\n" << diag << "\n";
817          throw std::runtime_error( oss.str() );
818       }
819       catch( std::invalid_argument& ) {}
820    }
821 }
822 //*************************************************************************************************
823 
824 
825 //*************************************************************************************************
826 /*!\brief Test of the addition assignment to a submatrix of a DiagonalMatrix.
827 //
828 // \return void
829 // \exception std::runtime_error Error detected.
830 //
831 // This function performs a test of the addition assignment to a submatrix of a DiagonalMatrix. In
832 // case an error is detected, a \a std::runtime_error exception is thrown.
833 */
834 template< typename DT >  // Type of the diagonal matrix
testAddAssign()835 void SubmatrixTest::testAddAssign()
836 {
837    //=====================================================================================
838    // Dense matrix addition assignment
839    //=====================================================================================
840 
841    // ( 1  0  0  0 )      ( 1  0  0  0 )
842    // ( 0  2  0  0 )  =>  ( 0 18  0  0 )
843    // ( 0  0  3  0 )      ( 0  0 11  0 )
844    // ( 0  0  0  4 )      ( 0  0  0  4 )
845    {
846       test_ = "Row-major dense matrix addition assignment test 1";
847 
848       blaze::DynamicMatrix<int,blaze::rowMajor> mat( 4UL, 2UL, 0 );
849       mat(1,0) = 16;
850       mat(2,1) =  8;
851 
852       DT diag;
853       init( diag );
854 
855       auto sm = submatrix( diag, 0UL, 1UL, 4UL, 2UL );
856       sm += mat;
857 
858       checkRows    ( diag, 4UL );
859       checkColumns ( diag, 4UL );
860       checkNonZeros( diag, 4UL );
861 
862       if( sm(0,0) !=  0 || sm(0,1) !=  0 ||
863           sm(1,0) != 18 || sm(1,1) !=  0 ||
864           sm(2,0) !=  0 || sm(2,1) != 11 ||
865           sm(3,0) !=  0 || sm(3,1) !=  0 ) {
866          std::ostringstream oss;
867          oss << " Test: " << test_ << "\n"
868              << " Error: Assignment to submatrix failed\n"
869              << " Details:\n"
870              << "   Result:\n" << sm << "\n"
871              << "   Expected result:\n(  0  0 )\n( 18  0 )\n(  0 11 )\n(  0  0 )\n";
872          throw std::runtime_error( oss.str() );
873       }
874 
875       if( diag(0,0) != 1 || diag(0,1) !=  0 || diag(0,2) !=  0 || diag(0,3) != 0 ||
876           diag(1,0) != 0 || diag(1,1) != 18 || diag(1,2) !=  0 || diag(1,3) != 0 ||
877           diag(2,0) != 0 || diag(2,1) !=  0 || diag(2,2) != 11 || diag(2,3) != 0 ||
878           diag(3,0) != 0 || diag(3,1) !=  0 || diag(3,2) !=  0 || diag(3,3) != 4 ) {
879          std::ostringstream oss;
880          oss << " Test: " << test_ << "\n"
881              << " Error: Assignment to submatrix failed\n"
882              << " Details:\n"
883              << "   Result:\n" << diag << "\n"
884              << "   Expected result:\n( 1  0  0  0 )\n"
885                                      "( 0 18  0  0 )\n"
886                                      "( 0  0 11  0 )\n"
887                                      "( 0  0  0  4 )\n";
888          throw std::runtime_error( oss.str() );
889       }
890    }
891 
892    // ( 1  0  0  0 )      ( 1  0  0  0 )
893    // ( 0  2  0  0 )  =>  ( 0 18  0  0 )
894    // ( 0  0  3  0 )      ( 0  0 11  0 )
895    // ( 0  0  0  4 )      ( 0  0  0  4 )
896    {
897       test_ = "Row-major dense matrix addition assignment test 2";
898 
899       blaze::DynamicMatrix<int,blaze::rowMajor> mat( 2UL, 4UL, 0 );
900       mat(0,1) = 16;
901       mat(1,2) =  8;
902 
903       DT diag;
904       init( diag );
905 
906       auto sm = submatrix( diag, 1UL, 0UL, 2UL, 4UL );
907       sm += mat;
908 
909       checkRows    ( diag, 4UL );
910       checkColumns ( diag, 4UL );
911       checkNonZeros( diag, 4UL );
912 
913       if( sm(0,0) != 0 || sm(0,1) != 18 || sm(0,2) !=  0 || sm(0,3) != 0 ||
914           sm(1,0) != 0 || sm(1,1) !=  0 || sm(1,2) != 11 || sm(1,3) != 0 ) {
915          std::ostringstream oss;
916          oss << " Test: " << test_ << "\n"
917              << " Error: Assignment to submatrix failed\n"
918              << " Details:\n"
919              << "   Result:\n" << sm << "\n"
920              << "   Expected result:\n( 0 18  0  0 )\n( 0  0 11  0 )\n";
921          throw std::runtime_error( oss.str() );
922       }
923 
924       if( diag(0,0) != 1 || diag(0,1) !=  0 || diag(0,2) !=  0 || diag(0,3) != 0 ||
925           diag(1,0) != 0 || diag(1,1) != 18 || diag(1,2) !=  0 || diag(1,3) != 0 ||
926           diag(2,0) != 0 || diag(2,1) !=  0 || diag(2,2) != 11 || diag(2,3) != 0 ||
927           diag(3,0) != 0 || diag(3,1) !=  0 || diag(3,2) !=  0 || diag(3,3) != 4 ) {
928          std::ostringstream oss;
929          oss << " Test: " << test_ << "\n"
930              << " Error: Assignment to submatrix failed\n"
931              << " Details:\n"
932              << "   Result:\n" << diag << "\n"
933              << "   Expected result:\n( 1  0  0  0 )\n"
934                                      "( 0 18  0  0 )\n"
935                                      "( 0  0 11  0 )\n"
936                                      "( 0  0  0  4 )\n";
937          throw std::runtime_error( oss.str() );
938       }
939    }
940 
941    // ( 1  0  0  0 )      ( 1  0  0  0 )
942    // ( 0  2  0  0 )  =>  ( 0 11 12  0 )
943    // ( 0  0  3  0 )      ( 0  0 14  0 )
944    // ( 0  0  1  5 )      ( 0  0  0  5 )
945    {
946       test_ = "Row-major dense matrix addition assignment test 3";
947 
948       blaze::DynamicMatrix<int,blaze::rowMajor> mat( 2UL, 2UL, 0 );
949       mat(0,0) =  9;
950       mat(0,1) = 12;
951       mat(1,1) = 11;
952 
953       DT diag;
954       init( diag );
955 
956       auto sm = submatrix( diag, 1UL, 1UL, 2UL, 2UL );
957 
958       try {
959          sm += mat;
960 
961          std::ostringstream oss;
962          oss << " Test: " << test_ << "\n"
963              << " Error: Assignment of invalid matrix succeeded\n"
964              << " Details:\n"
965              << "   Result:\n" << diag << "\n";
966          throw std::runtime_error( oss.str() );
967       }
968       catch( std::invalid_argument& ) {}
969    }
970 
971    // ( 1  0  0  0 )      ( 1  0  0  0 )
972    // ( 0  2  0  0 )  =>  ( 0 11  0  0 )
973    // ( 0  0  3  0 )      ( 0 13 14  0 )
974    // ( 0  0  1  5 )      ( 0  0  0  5 )
975    {
976       test_ = "Row-major dense matrix addition assignment test 4";
977 
978       blaze::DynamicMatrix<int,blaze::rowMajor> mat( 2UL, 2UL, 0 );
979       mat(0,0) =  9;
980       mat(1,0) = 13;
981       mat(1,1) = 11;
982 
983       DT diag;
984       init( diag );
985 
986       auto sm = submatrix( diag, 1UL, 1UL, 2UL, 2UL );
987 
988       try {
989          sm += mat;
990 
991          std::ostringstream oss;
992          oss << " Test: " << test_ << "\n"
993              << " Error: Assignment of invalid matrix succeeded\n"
994              << " Details:\n"
995              << "   Result:\n" << diag << "\n";
996          throw std::runtime_error( oss.str() );
997       }
998       catch( std::invalid_argument& ) {}
999    }
1000 
1001    // ( 1  0  0  0 )      ( 1  0  0  0 )
1002    // ( 0  2  0  0 )  =>  ( 0 18  0  0 )
1003    // ( 0  0  3  0 )      ( 0  0 11  0 )
1004    // ( 0  0  0  4 )      ( 0  0  0  4 )
1005    {
1006       test_ = "Column-major dense matrix addition assignment test 1";
1007 
1008       blaze::DynamicMatrix<int,blaze::columnMajor> mat( 4UL, 2UL, 0 );
1009       mat(1,0) = 16;
1010       mat(2,1) =  8;
1011 
1012       DT diag;
1013       init( diag );
1014 
1015       auto sm = submatrix( diag, 0UL, 1UL, 4UL, 2UL );
1016       sm += mat;
1017 
1018       checkRows    ( diag, 4UL );
1019       checkColumns ( diag, 4UL );
1020       checkNonZeros( diag, 4UL );
1021 
1022       if( sm(0,0) !=  0 || sm(0,1) !=  0 ||
1023           sm(1,0) != 18 || sm(1,1) !=  0 ||
1024           sm(2,0) !=  0 || sm(2,1) != 11 ||
1025           sm(3,0) !=  0 || sm(3,1) !=  0 ) {
1026          std::ostringstream oss;
1027          oss << " Test: " << test_ << "\n"
1028              << " Error: Assignment to submatrix failed\n"
1029              << " Details:\n"
1030              << "   Result:\n" << sm << "\n"
1031              << "   Expected result:\n(  0  0 )\n( 18  0 )\n(  0 11 )\n(  0  0 )\n";
1032          throw std::runtime_error( oss.str() );
1033       }
1034 
1035       if( diag(0,0) != 1 || diag(0,1) !=  0 || diag(0,2) !=  0 || diag(0,3) != 0 ||
1036           diag(1,0) != 0 || diag(1,1) != 18 || diag(1,2) !=  0 || diag(1,3) != 0 ||
1037           diag(2,0) != 0 || diag(2,1) !=  0 || diag(2,2) != 11 || diag(2,3) != 0 ||
1038           diag(3,0) != 0 || diag(3,1) !=  0 || diag(3,2) !=  0 || diag(3,3) != 4 ) {
1039          std::ostringstream oss;
1040          oss << " Test: " << test_ << "\n"
1041              << " Error: Assignment to submatrix failed\n"
1042              << " Details:\n"
1043              << "   Result:\n" << diag << "\n"
1044              << "   Expected result:\n( 1  0  0  0 )\n"
1045                                      "( 0 18  0  0 )\n"
1046                                      "( 0  0 11  0 )\n"
1047                                      "( 0  0  0  5 )\n";
1048          throw std::runtime_error( oss.str() );
1049       }
1050    }
1051 
1052    // ( 1  0  0  0 )      ( 1  0  0  0 )
1053    // ( 0  2  0  0 )  =>  ( 0 18  0  0 )
1054    // ( 0  0  3  0 )      ( 0  0 11  0 )
1055    // ( 0  0  0  4 )      ( 0  0  0  4 )
1056    {
1057       test_ = "Column-major dense matrix addition assignment test 2";
1058 
1059       blaze::DynamicMatrix<int,blaze::columnMajor> mat( 2UL, 4UL, 0 );
1060       mat(0,1) = 16;
1061       mat(1,2) =  8;
1062 
1063       DT diag;
1064       init( diag );
1065 
1066       auto sm = submatrix( diag, 1UL, 0UL, 2UL, 4UL );
1067       sm += mat;
1068 
1069       checkRows    ( diag, 4UL );
1070       checkColumns ( diag, 4UL );
1071       checkNonZeros( diag, 4UL );
1072 
1073       if( sm(0,0) != 0 || sm(0,1) != 18 || sm(0,2) !=  0 || sm(0,3) != 0 ||
1074           sm(1,0) != 0 || sm(1,1) !=  0 || sm(1,2) != 11 || sm(1,3) != 0 ) {
1075          std::ostringstream oss;
1076          oss << " Test: " << test_ << "\n"
1077              << " Error: Assignment to submatrix failed\n"
1078              << " Details:\n"
1079              << "   Result:\n" << sm << "\n"
1080              << "   Expected result:\n( 0 18  0  0 )\n( 0  0 11  0 )\n";
1081          throw std::runtime_error( oss.str() );
1082       }
1083 
1084       if( diag(0,0) != 1 || diag(0,1) !=  0 || diag(0,2) !=  0 || diag(0,3) != 0 ||
1085           diag(1,0) != 0 || diag(1,1) != 18 || diag(1,2) !=  0 || diag(1,3) != 0 ||
1086           diag(2,0) != 0 || diag(2,1) !=  0 || diag(2,2) != 11 || diag(2,3) != 0 ||
1087           diag(3,0) != 0 || diag(3,1) !=  0 || diag(3,2) !=  0 || diag(3,3) != 4 ) {
1088          std::ostringstream oss;
1089          oss << " Test: " << test_ << "\n"
1090              << " Error: Assignment to submatrix failed\n"
1091              << " Details:\n"
1092              << "   Result:\n" << diag << "\n"
1093              << "   Expected result:\n( 1  0  0  0 )\n"
1094                                      "( 0 18  0  0 )\n"
1095                                      "( 0  0 11  0 )\n"
1096                                      "( 0  0  0  4 )\n";
1097          throw std::runtime_error( oss.str() );
1098       }
1099    }
1100 
1101    // ( 1  0  0  0 )      ( 1  0  0  0 )
1102    // ( 0  2  0  0 )  =>  ( 0 11 12  0 )
1103    // ( 0  0  3  0 )      ( 0  0 14  0 )
1104    // ( 0  0  0  4 )      ( 0  0  0  4 )
1105    {
1106       test_ = "Column-major dense matrix addition assignment test 3";
1107 
1108       blaze::DynamicMatrix<int,blaze::columnMajor> mat( 2UL, 2UL, 0 );
1109       mat(0,0) =  9;
1110       mat(0,1) = 12;
1111       mat(1,1) = 11;
1112 
1113       DT diag;
1114       init( diag );
1115 
1116       auto sm = submatrix( diag, 1UL, 1UL, 2UL, 2UL );
1117 
1118       try {
1119          sm += mat;
1120 
1121          std::ostringstream oss;
1122          oss << " Test: " << test_ << "\n"
1123              << " Error: Assignment of invalid matrix succeeded\n"
1124              << " Details:\n"
1125              << "   Result:\n" << diag << "\n";
1126          throw std::runtime_error( oss.str() );
1127       }
1128       catch( std::invalid_argument& ) {}
1129    }
1130 
1131    // ( 1  0  0  0 )      ( 1  0  0  0 )
1132    // ( 0  2  0  0 )  =>  ( 0 11  0  0 )
1133    // ( 0  0  3  0 )      ( 0 13 14  0 )
1134    // ( 0  0  0  4 )      ( 0  0  0  4 )
1135    {
1136       test_ = "Column-major dense matrix addition assignment test 4";
1137 
1138       blaze::DynamicMatrix<int,blaze::columnMajor> mat( 2UL, 2UL, 0 );
1139       mat(0,0) =  9;
1140       mat(1,0) = 13;
1141       mat(1,1) = 11;
1142 
1143       DT diag;
1144       init( diag );
1145 
1146       auto sm = submatrix( diag, 1UL, 1UL, 2UL, 2UL );
1147 
1148       try {
1149          sm += mat;
1150 
1151          std::ostringstream oss;
1152          oss << " Test: " << test_ << "\n"
1153              << " Error: Assignment of invalid matrix succeeded\n"
1154              << " Details:\n"
1155              << "   Result:\n" << diag << "\n";
1156          throw std::runtime_error( oss.str() );
1157       }
1158       catch( std::invalid_argument& ) {}
1159    }
1160 
1161 
1162    //=====================================================================================
1163    // Sparse matrix addition assignment
1164    //=====================================================================================
1165 
1166    // ( 1  0  0  0 )      ( 1  0  0  0 )
1167    // ( 0  2  0  0 )  =>  ( 0 18  0  0 )
1168    // ( 0  0  3  0 )      ( 0  0 11  0 )
1169    // ( 0  0  0  4 )      ( 0  0  0  4 )
1170    {
1171       test_ = "Row-major sparse matrix addition assignment test 1";
1172 
1173       blaze::CompressedMatrix<int,blaze::rowMajor> mat( 4UL, 2UL, 4UL );
1174       mat(1,0) = 16;
1175       mat(2,1) =  8;
1176       mat.insert( 1UL, 1UL, 0 );
1177       mat.insert( 2UL, 0UL, 0 );
1178 
1179       DT diag;
1180       init( diag );
1181 
1182       auto sm = submatrix( diag, 0UL, 1UL, 4UL, 2UL );
1183       sm += mat;
1184 
1185       checkRows    ( diag, 4UL );
1186       checkColumns ( diag, 4UL );
1187       checkNonZeros( diag, 4UL );
1188 
1189       if( sm(0,0) !=  0 || sm(0,1) !=  0 ||
1190           sm(1,0) != 18 || sm(1,1) !=  0 ||
1191           sm(2,0) !=  0 || sm(2,1) != 11 ||
1192           sm(3,0) !=  0 || sm(3,1) !=  0 ) {
1193          std::ostringstream oss;
1194          oss << " Test: " << test_ << "\n"
1195              << " Error: Assignment to submatrix failed\n"
1196              << " Details:\n"
1197              << "   Result:\n" << sm << "\n"
1198              << "   Expected result:\n(  0  0 )\n( 18  0 )\n(  0 11 )\n(  0  0 )\n";
1199          throw std::runtime_error( oss.str() );
1200       }
1201 
1202       if( diag(0,0) != 1 || diag(0,1) !=  0 || diag(0,2) !=  0 || diag(0,3) != 0 ||
1203           diag(1,0) != 0 || diag(1,1) != 18 || diag(1,2) !=  0 || diag(1,3) != 0 ||
1204           diag(2,0) != 0 || diag(2,1) !=  0 || diag(2,2) != 11 || diag(2,3) != 0 ||
1205           diag(3,0) != 0 || diag(3,1) !=  0 || diag(3,2) !=  0 || diag(3,3) != 4 ) {
1206          std::ostringstream oss;
1207          oss << " Test: " << test_ << "\n"
1208              << " Error: Assignment to submatrix failed\n"
1209              << " Details:\n"
1210              << "   Result:\n" << diag << "\n"
1211              << "   Expected result:\n( 1  0  0  0 )\n"
1212                                      "( 0 18  0  0 )\n"
1213                                      "( 0  0 11  0 )\n"
1214                                      "( 0  0  0  4 )\n";
1215          throw std::runtime_error( oss.str() );
1216       }
1217    }
1218 
1219    // ( 1  0  0  0 )      ( 1  0  0  0 )
1220    // ( 0  2  0  0 )  =>  ( 0 18  0  0 )
1221    // ( 0  0  3  0 )      ( 0  0 11  0 )
1222    // ( 0  0  0  4 )      ( 0  0  0  4 )
1223    {
1224       test_ = "Row-major sparse matrix addition assignment test 2";
1225 
1226       blaze::CompressedMatrix<int,blaze::rowMajor> mat( 2UL, 4UL, 4UL );
1227       mat(0,1) = 16;
1228       mat(1,2) =  8;
1229       mat.insert( 0UL, 2UL, 0 );
1230       mat.insert( 1UL, 1UL, 0 );
1231 
1232       DT diag;
1233       init( diag );
1234 
1235       auto sm = submatrix( diag, 1UL, 0UL, 2UL, 4UL );
1236       sm += mat;
1237 
1238       checkRows    ( diag, 4UL );
1239       checkColumns ( diag, 4UL );
1240       checkNonZeros( diag, 4UL );
1241 
1242       if( sm(0,0) != 0 || sm(0,1) != 18 || sm(0,2) !=  0 || sm(0,3) != 0 ||
1243           sm(1,0) != 0 || sm(1,1) !=  0 || sm(1,2) != 11 || sm(1,3) != 0 ) {
1244          std::ostringstream oss;
1245          oss << " Test: " << test_ << "\n"
1246              << " Error: Assignment to submatrix failed\n"
1247              << " Details:\n"
1248              << "   Result:\n" << sm << "\n"
1249              << "   Expected result:\n( 0 18  0  0 )\n( 0  0 11  0 )\n";
1250          throw std::runtime_error( oss.str() );
1251       }
1252 
1253       if( diag(0,0) != 1 || diag(0,1) !=  0 || diag(0,2) !=  0 || diag(0,3) != 0 ||
1254           diag(1,0) != 0 || diag(1,1) != 18 || diag(1,2) !=  0 || diag(1,3) != 0 ||
1255           diag(2,0) != 0 || diag(2,1) !=  0 || diag(2,2) != 11 || diag(2,3) != 0 ||
1256           diag(3,0) != 0 || diag(3,1) !=  0 || diag(3,2) !=  0 || diag(3,3) != 4 ) {
1257          std::ostringstream oss;
1258          oss << " Test: " << test_ << "\n"
1259              << " Error: Assignment to submatrix failed\n"
1260              << " Details:\n"
1261              << "   Result:\n" << diag << "\n"
1262              << "   Expected result:\n( 1  0  0  0 )\n"
1263                                      "( 0 18  0  0 )\n"
1264                                      "( 0  0 11  0 )\n"
1265                                      "( 0  0  0  4 )\n";
1266          throw std::runtime_error( oss.str() );
1267       }
1268    }
1269 
1270    // ( 1  0  0  0 )      ( 1  0  0  0 )
1271    // ( 0  2  0  0 )  =>  ( 0 11 12  0 )
1272    // ( 0  0  3  0 )      ( 0  0 14  0 )
1273    // ( 0  0  0  4 )      ( 0  0  0  4 )
1274    {
1275       test_ = "Row-major sparse matrix addition assignment test 3";
1276 
1277       blaze::CompressedMatrix<int,blaze::rowMajor> mat( 2UL, 2UL, 4UL );
1278       mat(0,0) =  9;
1279       mat(0,1) = 12;
1280       mat(1,1) = 11;
1281       mat.insert( 1UL, 0UL, 0 );
1282 
1283       DT diag;
1284       init( diag );
1285 
1286       auto sm = submatrix( diag, 1UL, 1UL, 2UL, 2UL );
1287 
1288       try {
1289          sm += mat;
1290 
1291          std::ostringstream oss;
1292          oss << " Test: " << test_ << "\n"
1293              << " Error: Assignment of invalid matrix succeeded\n"
1294              << " Details:\n"
1295              << "   Result:\n" << diag << "\n";
1296          throw std::runtime_error( oss.str() );
1297       }
1298       catch( std::invalid_argument& ) {}
1299    }
1300 
1301    // ( 1  0  0  0 )      ( 1  0  0  0 )
1302    // ( 0  2  0  0 )  =>  ( 0 11  0  0 )
1303    // ( 0  0  3  0 )      ( 0 13 14  0 )
1304    // ( 0  0  0  4 )      ( 0  0  0  4 )
1305    {
1306       test_ = "Row-major sparse matrix addition assignment test 4";
1307 
1308       blaze::CompressedMatrix<int,blaze::rowMajor> mat( 2UL, 2UL, 4UL );
1309       mat(0,0) =  9;
1310       mat(1,0) = 13;
1311       mat(1,1) = 11;
1312       mat.insert( 0UL, 1UL, 0 );
1313 
1314       DT diag;
1315       init( diag );
1316 
1317       auto sm = submatrix( diag, 1UL, 1UL, 2UL, 2UL );
1318 
1319       try {
1320          sm += mat;
1321 
1322          std::ostringstream oss;
1323          oss << " Test: " << test_ << "\n"
1324              << " Error: Assignment of invalid matrix succeeded\n"
1325              << " Details:\n"
1326              << "   Result:\n" << diag << "\n";
1327          throw std::runtime_error( oss.str() );
1328       }
1329       catch( std::invalid_argument& ) {}
1330    }
1331 
1332    // ( 1  0  0  0 )      ( 1  0  0  0 )
1333    // ( 0  2  0  0 )  =>  ( 0 18  0  0 )
1334    // ( 0  0  3  0 )      ( 0  0 11  0 )
1335    // ( 0  0  0  4 )      ( 0  0  0  4 )
1336    {
1337       test_ = "Column-major sparse matrix addition assignment test 1";
1338 
1339       blaze::CompressedMatrix<int,blaze::columnMajor> mat( 4UL, 2UL, 4UL );
1340       mat(1,0) = 16;
1341       mat(2,1) =  8;
1342       mat.insert( 1UL, 1UL, 0 );
1343       mat.insert( 2UL, 0UL, 0 );
1344 
1345       DT diag;
1346       init( diag );
1347 
1348       auto sm = submatrix( diag, 0UL, 1UL, 4UL, 2UL );
1349       sm += mat;
1350 
1351       checkRows    ( diag, 4UL );
1352       checkColumns ( diag, 4UL );
1353       checkNonZeros( diag, 4UL );
1354 
1355       if( sm(0,0) !=  0 || sm(0,1) !=  0 ||
1356           sm(1,0) != 18 || sm(1,1) !=  0 ||
1357           sm(2,0) !=  0 || sm(2,1) != 11 ||
1358           sm(3,0) !=  0 || sm(3,1) !=  0 ) {
1359          std::ostringstream oss;
1360          oss << " Test: " << test_ << "\n"
1361              << " Error: Assignment to submatrix failed\n"
1362              << " Details:\n"
1363              << "   Result:\n" << sm << "\n"
1364              << "   Expected result:\n(  0  0 )\n( 18  0 )\n(  0 11 )\n(  0  0 )\n";
1365          throw std::runtime_error( oss.str() );
1366       }
1367 
1368       if( diag(0,0) != 1 || diag(0,1) !=  0 || diag(0,2) !=  0 || diag(0,3) != 0 ||
1369           diag(1,0) != 0 || diag(1,1) != 18 || diag(1,2) !=  0 || diag(1,3) != 0 ||
1370           diag(2,0) != 0 || diag(2,1) !=  0 || diag(2,2) != 11 || diag(2,3) != 0 ||
1371           diag(3,0) != 0 || diag(3,1) !=  0 || diag(3,2) !=  0 || diag(3,3) != 4 ) {
1372          std::ostringstream oss;
1373          oss << " Test: " << test_ << "\n"
1374              << " Error: Assignment to submatrix failed\n"
1375              << " Details:\n"
1376              << "   Result:\n" << diag << "\n"
1377              << "   Expected result:\n( 1  0  0  0 )\n"
1378                                      "( 0 18  0  0 )\n"
1379                                      "( 0  0 11  0 )\n"
1380                                      "( 0  0  0  4 )\n";
1381          throw std::runtime_error( oss.str() );
1382       }
1383    }
1384 
1385    // ( 1  0  0  0 )      ( 1  0  0  0 )
1386    // ( 0  2  0  0 )  =>  ( 0 18  0  0 )
1387    // ( 0  0  3  0 )      ( 0  0 11  0 )
1388    // ( 0  0  0  4 )      ( 0  0  0  4 )
1389    {
1390       test_ = "Column-major sparse matrix addition assignment test 2";
1391 
1392       blaze::CompressedMatrix<int,blaze::columnMajor> mat( 2UL, 4UL, 4UL );
1393       mat(0,1) = 16;
1394       mat(1,2) =  8;
1395       mat.insert( 0UL, 2UL, 0 );
1396       mat.insert( 1UL, 1UL, 0 );
1397 
1398       DT diag;
1399       init( diag );
1400 
1401       auto sm = submatrix( diag, 1UL, 0UL, 2UL, 4UL );
1402       sm += mat;
1403 
1404       checkRows    ( diag, 4UL );
1405       checkColumns ( diag, 4UL );
1406       checkNonZeros( diag, 4UL );
1407 
1408       if( sm(0,0) != 0 || sm(0,1) != 18 || sm(0,2) !=  0 || sm(0,3) != 0 ||
1409           sm(1,0) != 0 || sm(1,1) !=  0 || sm(1,2) != 11 || sm(1,3) != 0 ) {
1410          std::ostringstream oss;
1411          oss << " Test: " << test_ << "\n"
1412              << " Error: Assignment to submatrix failed\n"
1413              << " Details:\n"
1414              << "   Result:\n" << sm << "\n"
1415              << "   Expected result:\n( 0 18  0  0 )\n( 0  0 11  0 )\n";
1416          throw std::runtime_error( oss.str() );
1417       }
1418 
1419       if( diag(0,0) != 1 || diag(0,1) !=  0 || diag(0,2) !=  0 || diag(0,3) != 0 ||
1420           diag(1,0) != 0 || diag(1,1) != 18 || diag(1,2) !=  0 || diag(1,3) != 0 ||
1421           diag(2,0) != 0 || diag(2,1) !=  0 || diag(2,2) != 11 || diag(2,3) != 0 ||
1422           diag(3,0) != 0 || diag(3,1) !=  0 || diag(3,2) !=  0 || diag(3,3) != 4 ) {
1423          std::ostringstream oss;
1424          oss << " Test: " << test_ << "\n"
1425              << " Error: Assignment to submatrix failed\n"
1426              << " Details:\n"
1427              << "   Result:\n" << diag << "\n"
1428              << "   Expected result:\n( 1  0  0  0 )\n"
1429                                      "( 0 18  0  0 )\n"
1430                                      "( 0  0 11  0 )\n"
1431                                      "( 0  0  0  4 )\n";
1432          throw std::runtime_error( oss.str() );
1433       }
1434    }
1435 
1436    // ( 1  0  0  0 )      ( 1  0  0  0 )
1437    // ( 0  2  0  0 )  =>  ( 0 11 12  0 )
1438    // ( 0  0  3  0 )      ( 0  0 14  0 )
1439    // ( 0  0  0  4 )      ( 0  0  0  4 )
1440    {
1441       test_ = "Column-major sparse matrix addition assignment test 3";
1442 
1443       blaze::CompressedMatrix<int,blaze::columnMajor> mat( 2UL, 2UL, 4UL );
1444       mat(0,0) =  9;
1445       mat(0,1) = 12;
1446       mat(1,1) = 11;
1447       mat.insert( 1UL, 0UL, 0 );
1448 
1449       DT diag;
1450       init( diag );
1451 
1452       auto sm = submatrix( diag, 1UL, 1UL, 2UL, 2UL );
1453 
1454       try {
1455          sm += mat;
1456 
1457          std::ostringstream oss;
1458          oss << " Test: " << test_ << "\n"
1459              << " Error: Assignment of invalid matrix succeeded\n"
1460              << " Details:\n"
1461              << "   Result:\n" << diag << "\n";
1462          throw std::runtime_error( oss.str() );
1463       }
1464       catch( std::invalid_argument& ) {}
1465    }
1466 
1467    // ( 1  0  0  0 )      ( 1  0  0  0 )
1468    // ( 0  2  0  0 )  =>  ( 0 11  0  0 )
1469    // ( 0  0  3  0 )      ( 0 13 14  0 )
1470    // ( 0  0  0  4 )      ( 0  0  0  4 )
1471    {
1472       test_ = "Column-major sparse matrix addition assignment test 4";
1473 
1474       blaze::CompressedMatrix<int,blaze::columnMajor> mat( 2UL, 2UL, 4UL );
1475       mat(0,0) =  9;
1476       mat(1,0) = 13;
1477       mat(1,1) = 11;
1478       mat.insert( 0UL, 1UL, 0 );
1479 
1480       DT diag;
1481       init( diag );
1482 
1483       auto sm = submatrix( diag, 1UL, 1UL, 2UL, 2UL );
1484 
1485       try {
1486          sm += mat;
1487 
1488          std::ostringstream oss;
1489          oss << " Test: " << test_ << "\n"
1490              << " Error: Assignment of invalid matrix succeeded\n"
1491              << " Details:\n"
1492              << "   Result:\n" << diag << "\n";
1493          throw std::runtime_error( oss.str() );
1494       }
1495       catch( std::invalid_argument& ) {}
1496    }
1497 }
1498 //*************************************************************************************************
1499 
1500 
1501 //*************************************************************************************************
1502 /*!\brief Test of the subtraction assignment to a submatrix of a DiagonalMatrix.
1503 //
1504 // \return void
1505 // \exception std::runtime_error Error detected.
1506 //
1507 // This function performs a test of the subtraction assignment to a submatrix of a DiagonalMatrix.
1508 // In case an error is detected, a \a std::runtime_error exception is thrown.
1509 */
1510 template< typename DT >  // Type of the diagonal matrix
testSubAssign()1511 void SubmatrixTest::testSubAssign()
1512 {
1513    //=====================================================================================
1514    // Dense matrix subtraction assignment
1515    //=====================================================================================
1516 
1517    // ( 1  0  0  0 )      ( 1  0  0  0 )
1518    // ( 0  2  0  0 )  =>  ( 0 18  0  0 )
1519    // ( 0  0  3  0 )      ( 0  0 11  0 )
1520    // ( 0  0  0  4 )      ( 0  0  0  4 )
1521    {
1522       test_ = "Row-major dense matrix subtraction assignment test 1";
1523 
1524       blaze::DynamicMatrix<int,blaze::rowMajor> mat( 4UL, 2UL, 0 );
1525       mat(1,0) = -16;
1526       mat(2,1) =  -8;
1527 
1528       DT diag;
1529       init( diag );
1530 
1531       auto sm = submatrix( diag, 0UL, 1UL, 4UL, 2UL );
1532       sm -= mat;
1533 
1534       checkRows    ( diag, 4UL );
1535       checkColumns ( diag, 4UL );
1536       checkNonZeros( diag, 4UL );
1537 
1538       if( sm(0,0) !=  0 || sm(0,1) !=  0 ||
1539           sm(1,0) != 18 || sm(1,1) !=  0 ||
1540           sm(2,0) !=  0 || sm(2,1) != 11 ||
1541           sm(3,0) !=  0 || sm(3,1) !=  0 ) {
1542          std::ostringstream oss;
1543          oss << " Test: " << test_ << "\n"
1544              << " Error: Assignment to submatrix failed\n"
1545              << " Details:\n"
1546              << "   Result:\n" << sm << "\n"
1547              << "   Expected result:\n(  0  0 )\n( 18  0 )\n(  0 11 )\n(  0  0 )\n";
1548          throw std::runtime_error( oss.str() );
1549       }
1550 
1551       if( diag(0,0) != 1 || diag(0,1) !=  0 || diag(0,2) !=  0 || diag(0,3) != 0 ||
1552           diag(1,0) != 0 || diag(1,1) != 18 || diag(1,2) !=  0 || diag(1,3) != 0 ||
1553           diag(2,0) != 0 || diag(2,1) !=  0 || diag(2,2) != 11 || diag(2,3) != 0 ||
1554           diag(3,0) != 0 || diag(3,1) !=  0 || diag(3,2) !=  0 || diag(3,3) != 4 ) {
1555          std::ostringstream oss;
1556          oss << " Test: " << test_ << "\n"
1557              << " Error: Assignment to submatrix failed\n"
1558              << " Details:\n"
1559              << "   Result:\n" << diag << "\n"
1560              << "   Expected result:\n( 1  0  0  0 )\n"
1561                                      "( 0 18  0  0 )\n"
1562                                      "( 0  0 11  0 )\n"
1563                                      "( 0  0  0  4 )\n";
1564          throw std::runtime_error( oss.str() );
1565       }
1566    }
1567 
1568    // ( 1  0  0  0 )      ( 1  0  0  0 )
1569    // ( 0  2  0  0 )  =>  ( 0 18  0  0 )
1570    // ( 0  0  3  0 )      ( 0  0 11  0 )
1571    // ( 0  0  0  4 )      ( 0  0  0  4 )
1572    {
1573       test_ = "Row-major dense matrix subtraction assignment test 2";
1574 
1575       blaze::DynamicMatrix<int,blaze::rowMajor> mat( 2UL, 4UL, 0 );
1576       mat(0,1) = -16;
1577       mat(1,2) =  -8;
1578 
1579       DT diag;
1580       init( diag );
1581 
1582       auto sm = submatrix( diag, 1UL, 0UL, 2UL, 4UL );
1583       sm -= mat;
1584 
1585       checkRows    ( diag, 4UL );
1586       checkColumns ( diag, 4UL );
1587       checkNonZeros( diag, 4UL );
1588 
1589       if( sm(0,0) != 0 || sm(0,1) != 18 || sm(0,2) !=  0 || sm(0,3) != 0 ||
1590           sm(1,0) != 0 || sm(1,1) !=  0 || sm(1,2) != 11 || sm(1,3) != 0 ) {
1591          std::ostringstream oss;
1592          oss << " Test: " << test_ << "\n"
1593              << " Error: Assignment to submatrix failed\n"
1594              << " Details:\n"
1595              << "   Result:\n" << sm << "\n"
1596              << "   Expected result:\n( 0 18  0  0 )\n( 0  0 11  0 )\n";
1597          throw std::runtime_error( oss.str() );
1598       }
1599 
1600       if( diag(0,0) != 1 || diag(0,1) !=  0 || diag(0,2) !=  0 || diag(0,3) != 0 ||
1601           diag(1,0) != 0 || diag(1,1) != 18 || diag(1,2) !=  0 || diag(1,3) != 0 ||
1602           diag(2,0) != 0 || diag(2,1) !=  0 || diag(2,2) != 11 || diag(2,3) != 0 ||
1603           diag(3,0) != 0 || diag(3,1) !=  0 || diag(3,2) !=  0 || diag(3,3) != 4 ) {
1604          std::ostringstream oss;
1605          oss << " Test: " << test_ << "\n"
1606              << " Error: Assignment to submatrix failed\n"
1607              << " Details:\n"
1608              << "   Result:\n" << diag << "\n"
1609              << "   Expected result:\n( 1  0  0  0 )\n"
1610                                      "( 0 18  0  0 )\n"
1611                                      "( 0  0 11  0 )\n"
1612                                      "( 0  0  0  4 )\n";
1613          throw std::runtime_error( oss.str() );
1614       }
1615    }
1616 
1617    // ( 1  0  0  0 )      ( 1  0  0  0 )
1618    // ( 0  2  0  0 )  =>  ( 0 11 12  0 )
1619    // ( 0  0  3  0 )      ( 0  0 14  0 )
1620    // ( 0  0  1  5 )      ( 0  0  0  5 )
1621    {
1622       test_ = "Row-major dense matrix subtraction assignment test 3";
1623 
1624       blaze::DynamicMatrix<int,blaze::rowMajor> mat( 2UL, 2UL, 0 );
1625       mat(0,0) =  -9;
1626       mat(0,1) = -12;
1627       mat(1,1) = -11;
1628 
1629       DT diag;
1630       init( diag );
1631 
1632       auto sm = submatrix( diag, 1UL, 1UL, 2UL, 2UL );
1633 
1634       try {
1635          sm -= mat;
1636 
1637          std::ostringstream oss;
1638          oss << " Test: " << test_ << "\n"
1639              << " Error: Assignment of invalid matrix succeeded\n"
1640              << " Details:\n"
1641              << "   Result:\n" << diag << "\n";
1642          throw std::runtime_error( oss.str() );
1643       }
1644       catch( std::invalid_argument& ) {}
1645    }
1646 
1647    // ( 1  0  0  0 )      ( 1  0  0  0 )
1648    // ( 0  2  0  0 )  =>  ( 0 11  0  0 )
1649    // ( 0  0  3  0 )      ( 0 13 14  0 )
1650    // ( 0  0  1  5 )      ( 0  0  0  5 )
1651    {
1652       test_ = "Row-major dense matrix subtraction assignment test 4";
1653 
1654       blaze::DynamicMatrix<int,blaze::rowMajor> mat( 2UL, 2UL, 0 );
1655       mat(0,0) =  -9;
1656       mat(1,0) = -13;
1657       mat(1,1) = -11;
1658 
1659       DT diag;
1660       init( diag );
1661 
1662       auto sm = submatrix( diag, 1UL, 1UL, 2UL, 2UL );
1663 
1664       try {
1665          sm -= mat;
1666 
1667          std::ostringstream oss;
1668          oss << " Test: " << test_ << "\n"
1669              << " Error: Assignment of invalid matrix succeeded\n"
1670              << " Details:\n"
1671              << "   Result:\n" << diag << "\n";
1672          throw std::runtime_error( oss.str() );
1673       }
1674       catch( std::invalid_argument& ) {}
1675    }
1676 
1677    // ( 1  0  0  0 )      ( 1  0  0  0 )
1678    // ( 0  2  0  0 )  =>  ( 0 18  0  0 )
1679    // ( 0  0  3  0 )      ( 0  0 11  0 )
1680    // ( 0  0  0  4 )      ( 0  0  0  4 )
1681    {
1682       test_ = "Column-major dense matrix subtraction assignment test 1";
1683 
1684       blaze::DynamicMatrix<int,blaze::columnMajor> mat( 4UL, 2UL, 0 );
1685       mat(1,0) = -16;
1686       mat(2,1) =  -8;
1687 
1688       DT diag;
1689       init( diag );
1690 
1691       auto sm = submatrix( diag, 0UL, 1UL, 4UL, 2UL );
1692       sm -= mat;
1693 
1694       checkRows    ( diag, 4UL );
1695       checkColumns ( diag, 4UL );
1696       checkNonZeros( diag, 4UL );
1697 
1698       if( sm(0,0) !=  0 || sm(0,1) !=  0 ||
1699           sm(1,0) != 18 || sm(1,1) !=  0 ||
1700           sm(2,0) !=  0 || sm(2,1) != 11 ||
1701           sm(3,0) !=  0 || sm(3,1) !=  0 ) {
1702          std::ostringstream oss;
1703          oss << " Test: " << test_ << "\n"
1704              << " Error: Assignment to submatrix failed\n"
1705              << " Details:\n"
1706              << "   Result:\n" << sm << "\n"
1707              << "   Expected result:\n(  0  0 )\n( 18  0 )\n(  0 11 )\n(  0  0 )\n";
1708          throw std::runtime_error( oss.str() );
1709       }
1710 
1711       if( diag(0,0) != 1 || diag(0,1) !=  0 || diag(0,2) !=  0 || diag(0,3) != 0 ||
1712           diag(1,0) != 0 || diag(1,1) != 18 || diag(1,2) !=  0 || diag(1,3) != 0 ||
1713           diag(2,0) != 0 || diag(2,1) !=  0 || diag(2,2) != 11 || diag(2,3) != 0 ||
1714           diag(3,0) != 0 || diag(3,1) !=  0 || diag(3,2) !=  0 || diag(3,3) != 4 ) {
1715          std::ostringstream oss;
1716          oss << " Test: " << test_ << "\n"
1717              << " Error: Assignment to submatrix failed\n"
1718              << " Details:\n"
1719              << "   Result:\n" << diag << "\n"
1720              << "   Expected result:\n( 1  0  0  0 )\n"
1721                                      "( 0 18  0  0 )\n"
1722                                      "( 0  0 11  0 )\n"
1723                                      "( 0  0  0  5 )\n";
1724          throw std::runtime_error( oss.str() );
1725       }
1726    }
1727 
1728    // ( 1  0  0  0 )      ( 1  0  0  0 )
1729    // ( 0  2  0  0 )  =>  ( 0 18  0  0 )
1730    // ( 0  0  3  0 )      ( 0  0 11  0 )
1731    // ( 0  0  0  4 )      ( 0  0  0  4 )
1732    {
1733       test_ = "Column-major dense matrix subtraction assignment test 2";
1734 
1735       blaze::DynamicMatrix<int,blaze::columnMajor> mat( 2UL, 4UL, 0 );
1736       mat(0,1) = -16;
1737       mat(1,2) =  -8;
1738 
1739       DT diag;
1740       init( diag );
1741 
1742       auto sm = submatrix( diag, 1UL, 0UL, 2UL, 4UL );
1743       sm -= mat;
1744 
1745       checkRows    ( diag, 4UL );
1746       checkColumns ( diag, 4UL );
1747       checkNonZeros( diag, 4UL );
1748 
1749       if( sm(0,0) != 0 || sm(0,1) != 18 || sm(0,2) !=  0 || sm(0,3) != 0 ||
1750           sm(1,0) != 0 || sm(1,1) !=  0 || sm(1,2) != 11 || sm(1,3) != 0 ) {
1751          std::ostringstream oss;
1752          oss << " Test: " << test_ << "\n"
1753              << " Error: Assignment to submatrix failed\n"
1754              << " Details:\n"
1755              << "   Result:\n" << sm << "\n"
1756              << "   Expected result:\n( 0 18  0  0 )\n( 0  0 11  0 )\n";
1757          throw std::runtime_error( oss.str() );
1758       }
1759 
1760       if( diag(0,0) != 1 || diag(0,1) !=  0 || diag(0,2) !=  0 || diag(0,3) != 0 ||
1761           diag(1,0) != 0 || diag(1,1) != 18 || diag(1,2) !=  0 || diag(1,3) != 0 ||
1762           diag(2,0) != 0 || diag(2,1) !=  0 || diag(2,2) != 11 || diag(2,3) != 0 ||
1763           diag(3,0) != 0 || diag(3,1) !=  0 || diag(3,2) !=  0 || diag(3,3) != 4 ) {
1764          std::ostringstream oss;
1765          oss << " Test: " << test_ << "\n"
1766              << " Error: Assignment to submatrix failed\n"
1767              << " Details:\n"
1768              << "   Result:\n" << diag << "\n"
1769              << "   Expected result:\n( 1  0  0  0 )\n"
1770                                      "( 0 18  0  0 )\n"
1771                                      "( 0  0 11  0 )\n"
1772                                      "( 0  0  0  4 )\n";
1773          throw std::runtime_error( oss.str() );
1774       }
1775    }
1776 
1777    // ( 1  0  0  0 )      ( 1  0  0  0 )
1778    // ( 0  2  0  0 )  =>  ( 0 11 12  0 )
1779    // ( 0  0  3  0 )      ( 0  0 14  0 )
1780    // ( 0  0  0  4 )      ( 0  0  0  4 )
1781    {
1782       test_ = "Column-major dense matrix subtraction assignment test 3";
1783 
1784       blaze::DynamicMatrix<int,blaze::columnMajor> mat( 2UL, 2UL, 0 );
1785       mat(0,0) =  -9;
1786       mat(0,1) = -12;
1787       mat(1,1) = -11;
1788 
1789       DT diag;
1790       init( diag );
1791 
1792       auto sm = submatrix( diag, 1UL, 1UL, 2UL, 2UL );
1793 
1794       try {
1795          sm -= mat;
1796 
1797          std::ostringstream oss;
1798          oss << " Test: " << test_ << "\n"
1799              << " Error: Assignment of invalid matrix succeeded\n"
1800              << " Details:\n"
1801              << "   Result:\n" << diag << "\n";
1802          throw std::runtime_error( oss.str() );
1803       }
1804       catch( std::invalid_argument& ) {}
1805    }
1806 
1807    // ( 1  0  0  0 )      ( 1  0  0  0 )
1808    // ( 0  2  0  0 )  =>  ( 0 11  0  0 )
1809    // ( 0  0  3  0 )      ( 0 13 14  0 )
1810    // ( 0  0  0  4 )      ( 0  0  0  4 )
1811    {
1812       test_ = "Column-major dense matrix subtraction assignment test 4";
1813 
1814       blaze::DynamicMatrix<int,blaze::columnMajor> mat( 2UL, 2UL, 0 );
1815       mat(0,0) =  -9;
1816       mat(1,0) = -13;
1817       mat(1,1) = -11;
1818 
1819       DT diag;
1820       init( diag );
1821 
1822       auto sm = submatrix( diag, 1UL, 1UL, 2UL, 2UL );
1823 
1824       try {
1825          sm -= mat;
1826 
1827          std::ostringstream oss;
1828          oss << " Test: " << test_ << "\n"
1829              << " Error: Assignment of invalid matrix succeeded\n"
1830              << " Details:\n"
1831              << "   Result:\n" << diag << "\n";
1832          throw std::runtime_error( oss.str() );
1833       }
1834       catch( std::invalid_argument& ) {}
1835    }
1836 
1837 
1838    //=====================================================================================
1839    // Sparse matrix subtraction assignment
1840    //=====================================================================================
1841 
1842    // ( 1  0  0  0 )      ( 1  0  0  0 )
1843    // ( 0  2  0  0 )  =>  ( 0 18  0  0 )
1844    // ( 0  0  3  0 )      ( 0  0 11  0 )
1845    // ( 0  0  0  4 )      ( 0  0  0  4 )
1846    {
1847       test_ = "Row-major sparse matrix subtraction assignment test 1";
1848 
1849       blaze::CompressedMatrix<int,blaze::rowMajor> mat( 4UL, 2UL, 4UL );
1850       mat(1,0) = -16;
1851       mat(2,1) =  -8;
1852       mat.insert( 1UL, 1UL, 0 );
1853       mat.insert( 2UL, 0UL, 0 );
1854 
1855       DT diag;
1856       init( diag );
1857 
1858       auto sm = submatrix( diag, 0UL, 1UL, 4UL, 2UL );
1859       sm -= mat;
1860 
1861       checkRows    ( diag, 4UL );
1862       checkColumns ( diag, 4UL );
1863       checkNonZeros( diag, 4UL );
1864 
1865       if( sm(0,0) !=  0 || sm(0,1) !=  0 ||
1866           sm(1,0) != 18 || sm(1,1) !=  0 ||
1867           sm(2,0) !=  0 || sm(2,1) != 11 ||
1868           sm(3,0) !=  0 || sm(3,1) !=  0 ) {
1869          std::ostringstream oss;
1870          oss << " Test: " << test_ << "\n"
1871              << " Error: Assignment to submatrix failed\n"
1872              << " Details:\n"
1873              << "   Result:\n" << sm << "\n"
1874              << "   Expected result:\n(  0  0 )\n( 18  0 )\n(  0 11 )\n(  0  0 )\n";
1875          throw std::runtime_error( oss.str() );
1876       }
1877 
1878       if( diag(0,0) != 1 || diag(0,1) !=  0 || diag(0,2) !=  0 || diag(0,3) != 0 ||
1879           diag(1,0) != 0 || diag(1,1) != 18 || diag(1,2) !=  0 || diag(1,3) != 0 ||
1880           diag(2,0) != 0 || diag(2,1) !=  0 || diag(2,2) != 11 || diag(2,3) != 0 ||
1881           diag(3,0) != 0 || diag(3,1) !=  0 || diag(3,2) !=  0 || diag(3,3) != 4 ) {
1882          std::ostringstream oss;
1883          oss << " Test: " << test_ << "\n"
1884              << " Error: Assignment to submatrix failed\n"
1885              << " Details:\n"
1886              << "   Result:\n" << diag << "\n"
1887              << "   Expected result:\n( 1  0  0  0 )\n"
1888                                      "( 0 18  0  0 )\n"
1889                                      "( 0  0 11  0 )\n"
1890                                      "( 0  0  0  4 )\n";
1891          throw std::runtime_error( oss.str() );
1892       }
1893    }
1894 
1895    // ( 1  0  0  0 )      ( 1  0  0  0 )
1896    // ( 0  2  0  0 )  =>  ( 0 18  0  0 )
1897    // ( 0  0  3  0 )      ( 0  0 11  0 )
1898    // ( 0  0  0  4 )      ( 0  0  0  4 )
1899    {
1900       test_ = "Row-major sparse matrix subtraction assignment test 2";
1901 
1902       blaze::CompressedMatrix<int,blaze::rowMajor> mat( 2UL, 4UL, 4UL );
1903       mat(0,1) = -16;
1904       mat(1,2) =  -8;
1905       mat.insert( 0UL, 2UL, 0 );
1906       mat.insert( 1UL, 1UL, 0 );
1907 
1908       DT diag;
1909       init( diag );
1910 
1911       auto sm = submatrix( diag, 1UL, 0UL, 2UL, 4UL );
1912       sm -= mat;
1913 
1914       checkRows    ( diag, 4UL );
1915       checkColumns ( diag, 4UL );
1916       checkNonZeros( diag, 4UL );
1917 
1918       if( sm(0,0) != 0 || sm(0,1) != 18 || sm(0,2) !=  0 || sm(0,3) != 0 ||
1919           sm(1,0) != 0 || sm(1,1) !=  0 || sm(1,2) != 11 || sm(1,3) != 0 ) {
1920          std::ostringstream oss;
1921          oss << " Test: " << test_ << "\n"
1922              << " Error: Assignment to submatrix failed\n"
1923              << " Details:\n"
1924              << "   Result:\n" << sm << "\n"
1925              << "   Expected result:\n( 0 18  0  0 )\n( 0  0 11  0 )\n";
1926          throw std::runtime_error( oss.str() );
1927       }
1928 
1929       if( diag(0,0) != 1 || diag(0,1) !=  0 || diag(0,2) !=  0 || diag(0,3) != 0 ||
1930           diag(1,0) != 0 || diag(1,1) != 18 || diag(1,2) !=  0 || diag(1,3) != 0 ||
1931           diag(2,0) != 0 || diag(2,1) !=  0 || diag(2,2) != 11 || diag(2,3) != 0 ||
1932           diag(3,0) != 0 || diag(3,1) !=  0 || diag(3,2) !=  0 || diag(3,3) != 4 ) {
1933          std::ostringstream oss;
1934          oss << " Test: " << test_ << "\n"
1935              << " Error: Assignment to submatrix failed\n"
1936              << " Details:\n"
1937              << "   Result:\n" << diag << "\n"
1938              << "   Expected result:\n( 1  0  0  0 )\n"
1939                                      "( 0 18  0  0 )\n"
1940                                      "( 0  0 11  0 )\n"
1941                                      "( 0  0  0  4 )\n";
1942          throw std::runtime_error( oss.str() );
1943       }
1944    }
1945 
1946    // ( 1  0  0  0 )      ( 1  0  0  0 )
1947    // ( 0  2  0  0 )  =>  ( 0 11 12  0 )
1948    // ( 0  0  3  0 )      ( 0  0 14  0 )
1949    // ( 0  0  0  4 )      ( 0  0  0  4 )
1950    {
1951       test_ = "Row-major sparse matrix subtraction assignment test 3";
1952 
1953       blaze::CompressedMatrix<int,blaze::rowMajor> mat( 2UL, 2UL, 4UL );
1954       mat(0,0) =  -9;
1955       mat(0,1) = -12;
1956       mat(1,1) = -11;
1957       mat.insert( 1UL, 0UL, 0 );
1958 
1959       DT diag;
1960       init( diag );
1961 
1962       auto sm = submatrix( diag, 1UL, 1UL, 2UL, 2UL );
1963 
1964       try {
1965          sm -= mat;
1966 
1967          std::ostringstream oss;
1968          oss << " Test: " << test_ << "\n"
1969              << " Error: Assignment of invalid matrix succeeded\n"
1970              << " Details:\n"
1971              << "   Result:\n" << diag << "\n";
1972          throw std::runtime_error( oss.str() );
1973       }
1974       catch( std::invalid_argument& ) {}
1975    }
1976 
1977    // ( 1  0  0  0 )      ( 1  0  0  0 )
1978    // ( 0  2  0  0 )  =>  ( 0 11  0  0 )
1979    // ( 0  0  3  0 )      ( 0 13 14  0 )
1980    // ( 0  0  0  4 )      ( 0  0  0  4 )
1981    {
1982       test_ = "Row-major sparse matrix subtraction assignment test 4";
1983 
1984       blaze::CompressedMatrix<int,blaze::rowMajor> mat( 2UL, 2UL, 4UL );
1985       mat(0,0) =  -9;
1986       mat(1,0) = -13;
1987       mat(1,1) = -11;
1988       mat.insert( 0UL, 1UL, 0 );
1989 
1990       DT diag;
1991       init( diag );
1992 
1993       auto sm = submatrix( diag, 1UL, 1UL, 2UL, 2UL );
1994 
1995       try {
1996          sm -= mat;
1997 
1998          std::ostringstream oss;
1999          oss << " Test: " << test_ << "\n"
2000              << " Error: Assignment of invalid matrix succeeded\n"
2001              << " Details:\n"
2002              << "   Result:\n" << diag << "\n";
2003          throw std::runtime_error( oss.str() );
2004       }
2005       catch( std::invalid_argument& ) {}
2006    }
2007 
2008    // ( 1  0  0  0 )      ( 1  0  0  0 )
2009    // ( 0  2  0  0 )  =>  ( 0 18  0  0 )
2010    // ( 0  0  3  0 )      ( 0  0 11  0 )
2011    // ( 0  0  0  4 )      ( 0  0  0  4 )
2012    {
2013       test_ = "Column-major sparse matrix subtraction assignment test 1";
2014 
2015       blaze::CompressedMatrix<int,blaze::columnMajor> mat( 4UL, 2UL, 4UL );
2016       mat(1,0) = -16;
2017       mat(2,1) =  -8;
2018       mat.insert( 1UL, 1UL, 0 );
2019       mat.insert( 2UL, 0UL, 0 );
2020 
2021       DT diag;
2022       init( diag );
2023 
2024       auto sm = submatrix( diag, 0UL, 1UL, 4UL, 2UL );
2025       sm -= mat;
2026 
2027       checkRows    ( diag, 4UL );
2028       checkColumns ( diag, 4UL );
2029       checkNonZeros( diag, 4UL );
2030 
2031       if( sm(0,0) !=  0 || sm(0,1) !=  0 ||
2032           sm(1,0) != 18 || sm(1,1) !=  0 ||
2033           sm(2,0) !=  0 || sm(2,1) != 11 ||
2034           sm(3,0) !=  0 || sm(3,1) !=  0 ) {
2035          std::ostringstream oss;
2036          oss << " Test: " << test_ << "\n"
2037              << " Error: Assignment to submatrix failed\n"
2038              << " Details:\n"
2039              << "   Result:\n" << sm << "\n"
2040              << "   Expected result:\n(  0  0 )\n( 18  0 )\n(  0 11 )\n(  0  0 )\n";
2041          throw std::runtime_error( oss.str() );
2042       }
2043 
2044       if( diag(0,0) != 1 || diag(0,1) !=  0 || diag(0,2) !=  0 || diag(0,3) != 0 ||
2045           diag(1,0) != 0 || diag(1,1) != 18 || diag(1,2) !=  0 || diag(1,3) != 0 ||
2046           diag(2,0) != 0 || diag(2,1) !=  0 || diag(2,2) != 11 || diag(2,3) != 0 ||
2047           diag(3,0) != 0 || diag(3,1) !=  0 || diag(3,2) !=  0 || diag(3,3) != 4 ) {
2048          std::ostringstream oss;
2049          oss << " Test: " << test_ << "\n"
2050              << " Error: Assignment to submatrix failed\n"
2051              << " Details:\n"
2052              << "   Result:\n" << diag << "\n"
2053              << "   Expected result:\n( 1  0  0  0 )\n"
2054                                      "( 0 18  0  0 )\n"
2055                                      "( 0  0 11  0 )\n"
2056                                      "( 0  0  0  4 )\n";
2057          throw std::runtime_error( oss.str() );
2058       }
2059    }
2060 
2061    // ( 1  0  0  0 )      ( 1  0  0  0 )
2062    // ( 0  2  0  0 )  =>  ( 0 18  0  0 )
2063    // ( 0  0  3  0 )      ( 0  0 11  0 )
2064    // ( 0  0  0  4 )      ( 0  0  0  4 )
2065    {
2066       test_ = "Column-major sparse matrix subtraction assignment test 2";
2067 
2068       blaze::CompressedMatrix<int,blaze::columnMajor> mat( 2UL, 4UL, 4UL );
2069       mat(0,1) = -16;
2070       mat(1,2) =  -8;
2071       mat.insert( 0UL, 2UL, 0 );
2072       mat.insert( 1UL, 1UL, 0 );
2073 
2074       DT diag;
2075       init( diag );
2076 
2077       auto sm = submatrix( diag, 1UL, 0UL, 2UL, 4UL );
2078       sm -= mat;
2079 
2080       checkRows    ( diag, 4UL );
2081       checkColumns ( diag, 4UL );
2082       checkNonZeros( diag, 4UL );
2083 
2084       if( sm(0,0) != 0 || sm(0,1) != 18 || sm(0,2) !=  0 || sm(0,3) != 0 ||
2085           sm(1,0) != 0 || sm(1,1) !=  0 || sm(1,2) != 11 || sm(1,3) != 0 ) {
2086          std::ostringstream oss;
2087          oss << " Test: " << test_ << "\n"
2088              << " Error: Assignment to submatrix failed\n"
2089              << " Details:\n"
2090              << "   Result:\n" << sm << "\n"
2091              << "   Expected result:\n( 0 18  0  0 )\n( 0  0 11  0 )\n";
2092          throw std::runtime_error( oss.str() );
2093       }
2094 
2095       if( diag(0,0) != 1 || diag(0,1) !=  0 || diag(0,2) !=  0 || diag(0,3) != 0 ||
2096           diag(1,0) != 0 || diag(1,1) != 18 || diag(1,2) !=  0 || diag(1,3) != 0 ||
2097           diag(2,0) != 0 || diag(2,1) !=  0 || diag(2,2) != 11 || diag(2,3) != 0 ||
2098           diag(3,0) != 0 || diag(3,1) !=  0 || diag(3,2) !=  0 || diag(3,3) != 4 ) {
2099          std::ostringstream oss;
2100          oss << " Test: " << test_ << "\n"
2101              << " Error: Assignment to submatrix failed\n"
2102              << " Details:\n"
2103              << "   Result:\n" << diag << "\n"
2104              << "   Expected result:\n( 1  0  0  0 )\n"
2105                                      "( 0 18  0  0 )\n"
2106                                      "( 0  0 11  0 )\n"
2107                                      "( 0  0  0  4 )\n";
2108          throw std::runtime_error( oss.str() );
2109       }
2110    }
2111 
2112    // ( 1  0  0  0 )      ( 1  0  0  0 )
2113    // ( 0  2  0  0 )  =>  ( 0 11 12  0 )
2114    // ( 0  0  3  0 )      ( 0  0 14  0 )
2115    // ( 0  0  0  4 )      ( 0  0  0  4 )
2116    {
2117       test_ = "Column-major sparse matrix subtraction assignment test 3";
2118 
2119       blaze::CompressedMatrix<int,blaze::columnMajor> mat( 2UL, 2UL, 4UL );
2120       mat(0,0) =  -9;
2121       mat(0,1) = -12;
2122       mat(1,1) = -11;
2123       mat.insert( 1UL, 0UL, 0 );
2124 
2125       DT diag;
2126       init( diag );
2127 
2128       auto sm = submatrix( diag, 1UL, 1UL, 2UL, 2UL );
2129 
2130       try {
2131          sm -= mat;
2132 
2133          std::ostringstream oss;
2134          oss << " Test: " << test_ << "\n"
2135              << " Error: Assignment of invalid matrix succeeded\n"
2136              << " Details:\n"
2137              << "   Result:\n" << diag << "\n";
2138          throw std::runtime_error( oss.str() );
2139       }
2140       catch( std::invalid_argument& ) {}
2141    }
2142 
2143    // ( 1  0  0  0 )      ( 1  0  0  0 )
2144    // ( 0  2  0  0 )  =>  ( 0 11  0  0 )
2145    // ( 0  0  3  0 )      ( 0 13 14  0 )
2146    // ( 0  0  0  4 )      ( 0  0  0  4 )
2147    {
2148       test_ = "Column-major sparse matrix subtraction assignment test 4";
2149 
2150       blaze::CompressedMatrix<int,blaze::columnMajor> mat( 2UL, 2UL, 4UL );
2151       mat(0,0) =  -9;
2152       mat(1,0) = -13;
2153       mat(1,1) = -11;
2154       mat.insert( 0UL, 1UL, 0 );
2155 
2156       DT diag;
2157       init( diag );
2158 
2159       auto sm = submatrix( diag, 1UL, 1UL, 2UL, 2UL );
2160 
2161       try {
2162          sm -= mat;
2163 
2164          std::ostringstream oss;
2165          oss << " Test: " << test_ << "\n"
2166              << " Error: Assignment of invalid matrix succeeded\n"
2167              << " Details:\n"
2168              << "   Result:\n" << diag << "\n";
2169          throw std::runtime_error( oss.str() );
2170       }
2171       catch( std::invalid_argument& ) {}
2172    }
2173 }
2174 //*************************************************************************************************
2175 
2176 
2177 //*************************************************************************************************
2178 /*!\brief Test of the Schur product assignment to a submatrix of a DiagonalMatrix.
2179 //
2180 // \return void
2181 // \exception std::runtime_error Error detected.
2182 //
2183 // This function performs a test of the Schur product assignment to a submatrix of a
2184 // DiagonalMatrix. In case an error is detected, a \a std::runtime_error exception is thrown.
2185 */
2186 template< typename DT >  // Type of the diagonal matrix
testSchurAssign()2187 void SubmatrixTest::testSchurAssign()
2188 {
2189    //=====================================================================================
2190    // Dense matrix Schur product assignment
2191    //=====================================================================================
2192 
2193    // ( 1  0  0  0 )      ( 1  0  0  0 )
2194    // ( 0  2  0  0 )  =>  ( 0 12  0  0 )
2195    // ( 0  0  3  0 )      ( 0  0 12  0 )
2196    // ( 0  0  0  4 )      ( 0  0  0  4 )
2197    {
2198       test_ = "Row-major dense matrix Schur product assignment test 1";
2199 
2200       blaze::DynamicMatrix<int,blaze::rowMajor> mat( 4UL, 2UL, 0 );
2201       mat(0,1) = 9;
2202       mat(1,0) = 6;
2203       mat(2,1) = 4;
2204       mat(3,0) = 9;
2205 
2206       DT diag;
2207       init( diag );
2208 
2209       auto sm = submatrix( diag, 0UL, 1UL, 4UL, 2UL );
2210       sm %= mat;
2211 
2212       checkRows    ( diag, 4UL );
2213       checkColumns ( diag, 4UL );
2214       checkNonZeros( diag, 4UL );
2215 
2216       if( sm(0,0) !=  0 || sm(0,1) !=  0 ||
2217           sm(1,0) != 12 || sm(1,1) !=  0 ||
2218           sm(2,0) !=  0 || sm(2,1) != 12 ||
2219           sm(3,0) !=  0 || sm(3,1) !=  0 ) {
2220          std::ostringstream oss;
2221          oss << " Test: " << test_ << "\n"
2222              << " Error: Assignment to submatrix failed\n"
2223              << " Details:\n"
2224              << "   Result:\n" << sm << "\n"
2225              << "   Expected result:\n(  0  0 )\n( 12  0 )\n(  0 12 )\n(  0  0 )\n";
2226          throw std::runtime_error( oss.str() );
2227       }
2228 
2229       if( diag(0,0) != 1 || diag(0,1) !=  0 || diag(0,2) !=  0 || diag(0,3) != 0 ||
2230           diag(1,0) != 0 || diag(1,1) != 12 || diag(1,2) !=  0 || diag(1,3) != 0 ||
2231           diag(2,0) != 0 || diag(2,1) !=  0 || diag(2,2) != 12 || diag(2,3) != 0 ||
2232           diag(3,0) != 0 || diag(3,1) !=  0 || diag(3,2) !=  0 || diag(3,3) != 4 ) {
2233          std::ostringstream oss;
2234          oss << " Test: " << test_ << "\n"
2235              << " Error: Assignment to submatrix failed\n"
2236              << " Details:\n"
2237              << "   Result:\n" << diag << "\n"
2238              << "   Expected result:\n( 1  0  0  0 )\n"
2239                                      "( 0 12  0  0 )\n"
2240                                      "( 0  0 12  0 )\n"
2241                                      "( 0  0  0  4 )\n";
2242          throw std::runtime_error( oss.str() );
2243       }
2244    }
2245 
2246    // ( 1  0  0  0 )      ( 1  0  0  0 )
2247    // ( 0  2  0  0 )  =>  ( 0 12  0  0 )
2248    // ( 0  0  3  0 )      ( 0  0 12  0 )
2249    // ( 0  0  0  4 )      ( 0  0  0  4 )
2250    {
2251       test_ = "Row-major dense matrix Schur product assignment test 2";
2252 
2253       blaze::DynamicMatrix<int,blaze::rowMajor> mat( 2UL, 4UL, 0 );
2254       mat(0,1) = 6;
2255       mat(0,3) = 9;
2256       mat(1,0) = 9;
2257       mat(1,2) = 4;
2258 
2259       DT diag;
2260       init( diag );
2261 
2262       auto sm = submatrix( diag, 1UL, 0UL, 2UL, 4UL );
2263       sm %= mat;
2264 
2265       checkRows    ( diag, 4UL );
2266       checkColumns ( diag, 4UL );
2267       checkNonZeros( diag, 4UL );
2268 
2269       if( sm(0,0) != 0 || sm(0,1) != 12 || sm(0,2) !=  0 || sm(0,3) != 0 ||
2270           sm(1,0) != 0 || sm(1,1) !=  0 || sm(1,2) != 12 || sm(1,3) != 0 ) {
2271          std::ostringstream oss;
2272          oss << " Test: " << test_ << "\n"
2273              << " Error: Assignment to submatrix failed\n"
2274              << " Details:\n"
2275              << "   Result:\n" << sm << "\n"
2276              << "   Expected result:\n( 0 12  0  0 )\n( 0  0 12  0 )\n";
2277          throw std::runtime_error( oss.str() );
2278       }
2279 
2280       if( diag(0,0) != 1 || diag(0,1) !=  0 || diag(0,2) !=  0 || diag(0,3) != 0 ||
2281           diag(1,0) != 0 || diag(1,1) != 12 || diag(1,2) !=  0 || diag(1,3) != 0 ||
2282           diag(2,0) != 0 || diag(2,1) !=  0 || diag(2,2) != 12 || diag(2,3) != 0 ||
2283           diag(3,0) != 0 || diag(3,1) !=  0 || diag(3,2) !=  0 || diag(3,3) != 4 ) {
2284          std::ostringstream oss;
2285          oss << " Test: " << test_ << "\n"
2286              << " Error: Assignment to submatrix failed\n"
2287              << " Details:\n"
2288              << "   Result:\n" << diag << "\n"
2289              << "   Expected result:\n( 1  0  0  0 )\n"
2290                                      "( 0 12  0  0 )\n"
2291                                      "( 0  0 12  0 )\n"
2292                                      "( 0  0  0  4 )\n";
2293          throw std::runtime_error( oss.str() );
2294       }
2295    }
2296 
2297    // ( 1  0  0  0 )      ( 1  0  0  0 )
2298    // ( 0  2  0  0 )  =>  ( 0 12  0  0 )
2299    // ( 0  0  3  0 )      ( 0  0 12  0 )
2300    // ( 0  0  0  4 )      ( 0  0  0  4 )
2301    {
2302       test_ = "Column-major dense matrix Schur product assignment test 1";
2303 
2304       blaze::DynamicMatrix<int,blaze::columnMajor> mat( 4UL, 2UL, 0 );
2305       mat(0,1) = 9;
2306       mat(1,0) = 6;
2307       mat(2,1) = 4;
2308       mat(3,0) = 9;
2309 
2310       DT diag;
2311       init( diag );
2312 
2313       auto sm = submatrix( diag, 0UL, 1UL, 4UL, 2UL );
2314       sm %= mat;
2315 
2316       checkRows    ( diag, 4UL );
2317       checkColumns ( diag, 4UL );
2318       checkNonZeros( diag, 4UL );
2319 
2320       if( sm(0,0) !=  0 || sm(0,1) !=  0 ||
2321           sm(1,0) != 12 || sm(1,1) !=  0 ||
2322           sm(2,0) !=  0 || sm(2,1) != 12 ||
2323           sm(3,0) !=  0 || sm(3,1) !=  0 ) {
2324          std::ostringstream oss;
2325          oss << " Test: " << test_ << "\n"
2326              << " Error: Assignment to submatrix failed\n"
2327              << " Details:\n"
2328              << "   Result:\n" << sm << "\n"
2329              << "   Expected result:\n(  0  0 )\n( 12  0 )\n(  0 12 )\n(  0  0 )\n";
2330          throw std::runtime_error( oss.str() );
2331       }
2332 
2333       if( diag(0,0) != 1 || diag(0,1) !=  0 || diag(0,2) !=  0 || diag(0,3) != 0 ||
2334           diag(1,0) != 0 || diag(1,1) != 12 || diag(1,2) !=  0 || diag(1,3) != 0 ||
2335           diag(2,0) != 0 || diag(2,1) !=  0 || diag(2,2) != 12 || diag(2,3) != 0 ||
2336           diag(3,0) != 0 || diag(3,1) !=  0 || diag(3,2) !=  0 || diag(3,3) != 4 ) {
2337          std::ostringstream oss;
2338          oss << " Test: " << test_ << "\n"
2339              << " Error: Assignment to submatrix failed\n"
2340              << " Details:\n"
2341              << "   Result:\n" << diag << "\n"
2342              << "   Expected result:\n( 1  0  0  0 )\n"
2343                                      "( 0 12  0  0 )\n"
2344                                      "( 0  0 12  0 )\n"
2345                                      "( 0  0  0  5 )\n";
2346          throw std::runtime_error( oss.str() );
2347       }
2348    }
2349 
2350    // ( 1  0  0  0 )      ( 1  0  0  0 )
2351    // ( 0  2  0  0 )  =>  ( 0 12  0  0 )
2352    // ( 0  0  3  0 )      ( 0  0 12  0 )
2353    // ( 0  0  0  4 )      ( 0  0  0  4 )
2354    {
2355       test_ = "Column-major dense matrix Schur product assignment test 2";
2356 
2357       blaze::DynamicMatrix<int,blaze::columnMajor> mat( 2UL, 4UL, 0 );
2358       mat(0,1) = 6;
2359       mat(0,3) = 9;
2360       mat(1,0) = 9;
2361       mat(1,2) = 4;
2362 
2363       DT diag;
2364       init( diag );
2365 
2366       auto sm = submatrix( diag, 1UL, 0UL, 2UL, 4UL );
2367       sm %= mat;
2368 
2369       checkRows    ( diag, 4UL );
2370       checkColumns ( diag, 4UL );
2371       checkNonZeros( diag, 4UL );
2372 
2373       if( sm(0,0) != 0 || sm(0,1) != 12 || sm(0,2) !=  0 || sm(0,3) != 0 ||
2374           sm(1,0) != 0 || sm(1,1) !=  0 || sm(1,2) != 12 || sm(1,3) != 0 ) {
2375          std::ostringstream oss;
2376          oss << " Test: " << test_ << "\n"
2377              << " Error: Assignment to submatrix failed\n"
2378              << " Details:\n"
2379              << "   Result:\n" << sm << "\n"
2380              << "   Expected result:\n( 0 12  0  0 )\n( 0  0 12  0 )\n";
2381          throw std::runtime_error( oss.str() );
2382       }
2383 
2384       if( diag(0,0) != 1 || diag(0,1) !=  0 || diag(0,2) !=  0 || diag(0,3) != 0 ||
2385           diag(1,0) != 0 || diag(1,1) != 12 || diag(1,2) !=  0 || diag(1,3) != 0 ||
2386           diag(2,0) != 0 || diag(2,1) !=  0 || diag(2,2) != 12 || diag(2,3) != 0 ||
2387           diag(3,0) != 0 || diag(3,1) !=  0 || diag(3,2) !=  0 || diag(3,3) != 4 ) {
2388          std::ostringstream oss;
2389          oss << " Test: " << test_ << "\n"
2390              << " Error: Assignment to submatrix failed\n"
2391              << " Details:\n"
2392              << "   Result:\n" << diag << "\n"
2393              << "   Expected result:\n( 1  0  0  0 )\n"
2394                                      "( 0 12  0  0 )\n"
2395                                      "( 0  0 12  0 )\n"
2396                                      "( 0  0  0  4 )\n";
2397          throw std::runtime_error( oss.str() );
2398       }
2399    }
2400 
2401 
2402    //=====================================================================================
2403    // Sparse matrix Schur product assignment
2404    //=====================================================================================
2405 
2406    // ( 1  0  0  0 )      ( 1  0  0  0 )
2407    // ( 0  2  0  0 )  =>  ( 0 12  0  0 )
2408    // ( 0  0  3  0 )      ( 0  0 12  0 )
2409    // ( 0  0  0  4 )      ( 0  0  0  4 )
2410    {
2411       test_ = "Row-major sparse matrix Schur product assignment test 1";
2412 
2413       blaze::CompressedMatrix<int,blaze::rowMajor> mat( 4UL, 2UL, 4UL );
2414       mat(0,1) = 9;
2415       mat(1,0) = 6;
2416       mat(2,1) = 4;
2417       mat(3,0) = 9;
2418 
2419       DT diag;
2420       init( diag );
2421 
2422       auto sm = submatrix( diag, 0UL, 1UL, 4UL, 2UL );
2423       sm %= mat;
2424 
2425       checkRows    ( diag, 4UL );
2426       checkColumns ( diag, 4UL );
2427       checkNonZeros( diag, 4UL );
2428 
2429       if( sm(0,0) !=  0 || sm(0,1) !=  0 ||
2430           sm(1,0) != 12 || sm(1,1) !=  0 ||
2431           sm(2,0) !=  0 || sm(2,1) != 12 ||
2432           sm(3,0) !=  0 || sm(3,1) !=  0 ) {
2433          std::ostringstream oss;
2434          oss << " Test: " << test_ << "\n"
2435              << " Error: Assignment to submatrix failed\n"
2436              << " Details:\n"
2437              << "   Result:\n" << sm << "\n"
2438              << "   Expected result:\n(  0  0 )\n( 12  0 )\n(  0 12 )\n(  0  0 )\n";
2439          throw std::runtime_error( oss.str() );
2440       }
2441 
2442       if( diag(0,0) != 1 || diag(0,1) !=  0 || diag(0,2) !=  0 || diag(0,3) != 0 ||
2443           diag(1,0) != 0 || diag(1,1) != 12 || diag(1,2) !=  0 || diag(1,3) != 0 ||
2444           diag(2,0) != 0 || diag(2,1) !=  0 || diag(2,2) != 12 || diag(2,3) != 0 ||
2445           diag(3,0) != 0 || diag(3,1) !=  0 || diag(3,2) !=  0 || diag(3,3) != 4 ) {
2446          std::ostringstream oss;
2447          oss << " Test: " << test_ << "\n"
2448              << " Error: Assignment to submatrix failed\n"
2449              << " Details:\n"
2450              << "   Result:\n" << diag << "\n"
2451              << "   Expected result:\n( 1  0  0  0 )\n"
2452                                      "( 0 12  0  0 )\n"
2453                                      "( 0  0 12  0 )\n"
2454                                      "( 0  0  0  4 )\n";
2455          throw std::runtime_error( oss.str() );
2456       }
2457    }
2458 
2459    // ( 1  0  0  0 )      ( 1  0  0  0 )
2460    // ( 0  2  0  0 )  =>  ( 0 12  0  0 )
2461    // ( 0  0  3  0 )      ( 0  0 12  0 )
2462    // ( 0  0  0  4 )      ( 0  0  0  4 )
2463    {
2464       test_ = "Row-major sparse matrix Schur product assignment test 2";
2465 
2466       blaze::CompressedMatrix<int,blaze::rowMajor> mat( 2UL, 4UL, 4UL );
2467       mat(0,1) = 6;
2468       mat(0,3) = 9;
2469       mat(1,0) = 9;
2470       mat(1,2) = 4;
2471 
2472       DT diag;
2473       init( diag );
2474 
2475       auto sm = submatrix( diag, 1UL, 0UL, 2UL, 4UL );
2476       sm %= mat;
2477 
2478       checkRows    ( diag, 4UL );
2479       checkColumns ( diag, 4UL );
2480       checkNonZeros( diag, 4UL );
2481 
2482       if( sm(0,0) != 0 || sm(0,1) != 12 || sm(0,2) !=  0 || sm(0,3) != 0 ||
2483           sm(1,0) != 0 || sm(1,1) !=  0 || sm(1,2) != 12 || sm(1,3) != 0 ) {
2484          std::ostringstream oss;
2485          oss << " Test: " << test_ << "\n"
2486              << " Error: Assignment to submatrix failed\n"
2487              << " Details:\n"
2488              << "   Result:\n" << sm << "\n"
2489              << "   Expected result:\n( 0 12  0  0 )\n( 0  0 12  0 )\n";
2490          throw std::runtime_error( oss.str() );
2491       }
2492 
2493       if( diag(0,0) != 1 || diag(0,1) !=  0 || diag(0,2) !=  0 || diag(0,3) != 0 ||
2494           diag(1,0) != 0 || diag(1,1) != 12 || diag(1,2) !=  0 || diag(1,3) != 0 ||
2495           diag(2,0) != 0 || diag(2,1) !=  0 || diag(2,2) != 12 || diag(2,3) != 0 ||
2496           diag(3,0) != 0 || diag(3,1) !=  0 || diag(3,2) !=  0 || diag(3,3) != 4 ) {
2497          std::ostringstream oss;
2498          oss << " Test: " << test_ << "\n"
2499              << " Error: Assignment to submatrix failed\n"
2500              << " Details:\n"
2501              << "   Result:\n" << diag << "\n"
2502              << "   Expected result:\n( 1  0  0  0 )\n"
2503                                      "( 0 12  0  0 )\n"
2504                                      "( 0  0 12  0 )\n"
2505                                      "( 0  0  0  4 )\n";
2506          throw std::runtime_error( oss.str() );
2507       }
2508    }
2509 
2510    // ( 1  0  0  0 )      ( 1  0  0  0 )
2511    // ( 0  2  0  0 )  =>  ( 0 12  0  0 )
2512    // ( 0  0  3  0 )      ( 0  0 12  0 )
2513    // ( 0  0  0  4 )      ( 0  0  0  4 )
2514    {
2515       test_ = "Column-major sparse matrix Schur product assignment test 1";
2516 
2517       blaze::CompressedMatrix<int,blaze::columnMajor> mat( 4UL, 2UL, 4UL );
2518       mat(0,1) = 9;
2519       mat(1,0) = 6;
2520       mat(2,1) = 4;
2521       mat(3,0) = 9;
2522 
2523       DT diag;
2524       init( diag );
2525 
2526       auto sm = submatrix( diag, 0UL, 1UL, 4UL, 2UL );
2527       sm %= mat;
2528 
2529       checkRows    ( diag, 4UL );
2530       checkColumns ( diag, 4UL );
2531       checkNonZeros( diag, 4UL );
2532 
2533       if( sm(0,0) !=  0 || sm(0,1) !=  0 ||
2534           sm(1,0) != 12 || sm(1,1) !=  0 ||
2535           sm(2,0) !=  0 || sm(2,1) != 12 ||
2536           sm(3,0) !=  0 || sm(3,1) !=  0 ) {
2537          std::ostringstream oss;
2538          oss << " Test: " << test_ << "\n"
2539              << " Error: Assignment to submatrix failed\n"
2540              << " Details:\n"
2541              << "   Result:\n" << sm << "\n"
2542              << "   Expected result:\n(  0  0 )\n( 12  0 )\n(  0 12 )\n(  0  0 )\n";
2543          throw std::runtime_error( oss.str() );
2544       }
2545 
2546       if( diag(0,0) != 1 || diag(0,1) !=  0 || diag(0,2) !=  0 || diag(0,3) != 0 ||
2547           diag(1,0) != 0 || diag(1,1) != 12 || diag(1,2) !=  0 || diag(1,3) != 0 ||
2548           diag(2,0) != 0 || diag(2,1) !=  0 || diag(2,2) != 12 || diag(2,3) != 0 ||
2549           diag(3,0) != 0 || diag(3,1) !=  0 || diag(3,2) !=  0 || diag(3,3) != 4 ) {
2550          std::ostringstream oss;
2551          oss << " Test: " << test_ << "\n"
2552              << " Error: Assignment to submatrix failed\n"
2553              << " Details:\n"
2554              << "   Result:\n" << diag << "\n"
2555              << "   Expected result:\n( 1  0  0  0 )\n"
2556                                      "( 0 12  0  0 )\n"
2557                                      "( 0  0 12  0 )\n"
2558                                      "( 0  0  0  4 )\n";
2559          throw std::runtime_error( oss.str() );
2560       }
2561    }
2562 
2563    // ( 1  0  0  0 )      ( 1  0  0  0 )
2564    // ( 0  2  0  0 )  =>  ( 0 12  0  0 )
2565    // ( 0  0  3  0 )      ( 0  0 12  0 )
2566    // ( 0  0  0  4 )      ( 0  0  0  4 )
2567    {
2568       test_ = "Column-major sparse matrix Schur product assignment test 2";
2569 
2570       blaze::CompressedMatrix<int,blaze::columnMajor> mat( 2UL, 4UL, 4UL );
2571       mat(0,1) = 6;
2572       mat(0,3) = 9;
2573       mat(1,0) = 9;
2574       mat(1,2) = 4;
2575 
2576       DT diag;
2577       init( diag );
2578 
2579       auto sm = submatrix( diag, 1UL, 0UL, 2UL, 4UL );
2580       sm %= mat;
2581 
2582       checkRows    ( diag, 4UL );
2583       checkColumns ( diag, 4UL );
2584       checkNonZeros( diag, 4UL );
2585 
2586       if( sm(0,0) != 0 || sm(0,1) != 12 || sm(0,2) !=  0 || sm(0,3) != 0 ||
2587           sm(1,0) != 0 || sm(1,1) !=  0 || sm(1,2) != 12 || sm(1,3) != 0 ) {
2588          std::ostringstream oss;
2589          oss << " Test: " << test_ << "\n"
2590              << " Error: Assignment to submatrix failed\n"
2591              << " Details:\n"
2592              << "   Result:\n" << sm << "\n"
2593              << "   Expected result:\n( 0 12  0  0 )\n( 0  0 12  0 )\n";
2594          throw std::runtime_error( oss.str() );
2595       }
2596 
2597       if( diag(0,0) != 1 || diag(0,1) !=  0 || diag(0,2) !=  0 || diag(0,3) != 0 ||
2598           diag(1,0) != 0 || diag(1,1) != 12 || diag(1,2) !=  0 || diag(1,3) != 0 ||
2599           diag(2,0) != 0 || diag(2,1) !=  0 || diag(2,2) != 12 || diag(2,3) != 0 ||
2600           diag(3,0) != 0 || diag(3,1) !=  0 || diag(3,2) !=  0 || diag(3,3) != 4 ) {
2601          std::ostringstream oss;
2602          oss << " Test: " << test_ << "\n"
2603              << " Error: Assignment to submatrix failed\n"
2604              << " Details:\n"
2605              << "   Result:\n" << diag << "\n"
2606              << "   Expected result:\n( 1  0  0  0 )\n"
2607                                      "( 0 12  0  0 )\n"
2608                                      "( 0  0 12  0 )\n"
2609                                      "( 0  0  0  4 )\n";
2610          throw std::runtime_error( oss.str() );
2611       }
2612    }
2613 }
2614 //*************************************************************************************************
2615 
2616 
2617 //*************************************************************************************************
2618 /*!\brief Checking the number of rows of the given matrix.
2619 //
2620 // \param matrix The matrix to be checked.
2621 // \param expectedRows The expected number of rows of the matrix.
2622 // \return void
2623 // \exception std::runtime_error Error detected.
2624 //
2625 // This function checks the number of rows of the given matrix. In case the actual number of
2626 // rows does not correspond to the given expected number of rows, a \a std::runtime_error
2627 // exception is thrown.
2628 */
2629 template< typename Type >  // Type of the matrix
checkRows(const Type & matrix,size_t expectedRows)2630 void SubmatrixTest::checkRows( const Type& matrix, size_t expectedRows ) const
2631 {
2632    if( matrix.rows() != expectedRows ) {
2633       std::ostringstream oss;
2634       oss << " Test: " << test_ << "\n"
2635           << " Error: Invalid number of rows detected\n"
2636           << " Details:\n"
2637           << "   Number of rows         : " << matrix.rows() << "\n"
2638           << "   Expected number of rows: " << expectedRows << "\n";
2639       throw std::runtime_error( oss.str() );
2640    }
2641 }
2642 //*************************************************************************************************
2643 
2644 
2645 //*************************************************************************************************
2646 /*!\brief Checking the number of columns of the given matrix.
2647 //
2648 // \param matrix The matrix to be checked.
2649 // \param expectedColumns The expected number of columns of the matrix.
2650 // \return void
2651 // \exception std::runtime_error Error detected.
2652 //
2653 // This function checks the number of columns of the given matrix. In case the actual number of
2654 // columns does not correspond to the given expected number of columns, a \a std::runtime_error
2655 // exception is thrown.
2656 */
2657 template< typename Type >  // Type of the matrix
checkColumns(const Type & matrix,size_t expectedColumns)2658 void SubmatrixTest::checkColumns( const Type& matrix, size_t expectedColumns ) const
2659 {
2660    if( matrix.columns() != expectedColumns ) {
2661       std::ostringstream oss;
2662       oss << " Test: " << test_ << "\n"
2663           << " Error: Invalid number of columns detected\n"
2664           << " Details:\n"
2665           << "   Number of columns         : " << matrix.columns() << "\n"
2666           << "   Expected number of columns: " << expectedColumns << "\n";
2667       throw std::runtime_error( oss.str() );
2668    }
2669 }
2670 //*************************************************************************************************
2671 
2672 
2673 //*************************************************************************************************
2674 /*!\brief Checking the number of non-zero elements of the given matrix.
2675 //
2676 // \param matrix The matrix to be checked.
2677 // \param expectedNonZeros The expected number of non-zero elements of the matrix.
2678 // \return void
2679 // \exception std::runtime_error Error detected.
2680 //
2681 // This function checks the number of non-zero elements of the given matrix. In case the
2682 // actual number of non-zero elements does not correspond to the given expected number,
2683 // a \a std::runtime_error exception is thrown.
2684 */
2685 template< typename Type >  // Type of the matrix
checkNonZeros(const Type & matrix,size_t expectedNonZeros)2686 void SubmatrixTest::checkNonZeros( const Type& matrix, size_t expectedNonZeros ) const
2687 {
2688    if( nonZeros( matrix ) != expectedNonZeros ) {
2689       std::ostringstream oss;
2690       oss << " Test: " << test_ << "\n"
2691           << " Error: Invalid number of non-zero elements\n"
2692           << " Details:\n"
2693           << "   Number of non-zeros         : " << nonZeros( matrix ) << "\n"
2694           << "   Expected number of non-zeros: " << expectedNonZeros << "\n";
2695       throw std::runtime_error( oss.str() );
2696    }
2697 
2698    if( capacity( matrix ) < nonZeros( matrix ) ) {
2699       std::ostringstream oss;
2700       oss << " Test: " << test_ << "\n"
2701           << " Error: Invalid capacity detected\n"
2702           << " Details:\n"
2703           << "   Number of non-zeros: " << nonZeros( matrix ) << "\n"
2704           << "   Capacity           : " << capacity( matrix ) << "\n";
2705       throw std::runtime_error( oss.str() );
2706    }
2707 }
2708 //*************************************************************************************************
2709 
2710 
2711 
2712 
2713 //=================================================================================================
2714 //
2715 //  UTILITY FUNCTIONS
2716 //
2717 //=================================================================================================
2718 
2719 //*************************************************************************************************
2720 /*!\brief Initializing the given diagonal matrix.
2721 //
2722 // \return void
2723 //
2724 // This function is called before each test case to initialize the given diagonal matrix.
2725 */
2726 template< typename DT >
init(DT & diag)2727 void SubmatrixTest::init( DT& diag )
2728 {
2729    diag.resize( 4UL );
2730    diag(0,0) = 1;
2731    diag(1,1) = 2;
2732    diag(2,2) = 3;
2733    diag(3,3) = 4;
2734 }
2735 //*************************************************************************************************
2736 
2737 
2738 
2739 
2740 //=================================================================================================
2741 //
2742 //  GLOBAL TEST FUNCTIONS
2743 //
2744 //=================================================================================================
2745 
2746 //*************************************************************************************************
2747 /*!\brief Testing the assignment to a submatrix of a DiagonalMatrix.
2748 //
2749 // \return void
2750 */
runTest()2751 void runTest()
2752 {
2753    SubmatrixTest();
2754 }
2755 //*************************************************************************************************
2756 
2757 
2758 
2759 
2760 //=================================================================================================
2761 //
2762 //  MACRO DEFINITIONS
2763 //
2764 //=================================================================================================
2765 
2766 //*************************************************************************************************
2767 /*! \cond BLAZE_INTERNAL */
2768 /*!\brief Macro for the execution of the DiagonalMatrix submatrix test.
2769 */
2770 #define RUN_DIAGONALMATRIX_SUBMATRIX_TEST \
2771    blazetest::mathtest::adaptors::diagonalmatrix::runTest()
2772 /*! \endcond */
2773 //*************************************************************************************************
2774 
2775 } // namespace diagonalmatrix
2776 
2777 } // namespace adaptors
2778 
2779 } // namespace mathtest
2780 
2781 } // namespace blazetest
2782 
2783 #endif
2784