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