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