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