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