1 | // Copyright 2008 Gunter Winkler <guwi17@gmx.de> |
2 | // Thanks to Tiago Requeijo for providing this test |
3 | // Distributed under the Boost Software License, Version 1.0. (See |
4 | // accompanying file LICENSE_1_0.txt or copy at |
5 | // http://www.boost.org/LICENSE_1_0.txt) |
6 | |
7 | #include <iostream> |
8 | #include <boost/numeric/ublas/symmetric.hpp> |
9 | #include <boost/numeric/ublas/triangular.hpp> |
10 | #include <boost/cstdlib.hpp> |
11 | |
12 | using namespace std; |
13 | namespace ublas = boost::numeric::ublas; |
14 | |
15 | int main() |
16 | { |
17 | int sz = 4; |
18 | ublas::symmetric_matrix<int, ublas::upper, ublas::column_major> UpCol (sz, sz); |
19 | ublas::symmetric_matrix<int, ublas::upper, ublas::row_major> UpRow (sz, sz); |
20 | ublas::symmetric_matrix<int, ublas::lower, ublas::column_major> LoCol (sz, sz); |
21 | ublas::symmetric_matrix<int, ublas::lower, ublas::row_major> LoRow (sz, sz); |
22 | |
23 | ublas::triangular_matrix<int, ublas::upper, ublas::column_major> TrUpCol (sz, sz); |
24 | ublas::triangular_matrix<int, ublas::upper, ublas::row_major> TrUpRow (sz, sz); |
25 | ublas::triangular_matrix<int, ublas::lower, ublas::column_major> TrLoCol (sz, sz); |
26 | ublas::triangular_matrix<int, ublas::lower, ublas::row_major> TrLoRow (sz, sz); |
27 | |
28 | for(int i=0; i<sz; ++i) |
29 | for(int j=i; j<sz; ++j) |
30 | { |
31 | // Symmetric |
32 | UpCol(i,j) = 10*i + j; |
33 | UpRow(i,j) = 10*i + j; |
34 | LoCol(i,j) = 10*i + j; |
35 | LoRow(i,j) = 10*i + j; |
36 | // Triangular |
37 | TrUpCol(i,j) = 10*i + j; |
38 | TrUpRow(i,j) = 10*i + j; |
39 | TrLoCol(j,i) = 10*i + j; |
40 | TrLoRow(j,i) = 10*i + j; |
41 | } |
42 | |
43 | //get pointers to data |
44 | int* uc = &(UpCol.data()[0]); |
45 | int* ur = &(UpRow.data()[0]); |
46 | int* lc = &(LoCol.data()[0]); |
47 | int* lr = &(LoRow.data()[0]); |
48 | int* tuc = &(TrUpCol.data()[0]); |
49 | int* tur = &(TrUpRow.data()[0]); |
50 | int* tlc = &(TrLoCol.data()[0]); |
51 | int* tlr = &(TrLoRow.data()[0]); |
52 | |
53 | // upper, column_major |
54 | // storage should be: 0 1 11 2 12 22 3 13 23 33 |
55 | int uc_correct[] = {0, 1, 11, 2, 12, 22, 3, 13, 23, 33}; |
56 | |
57 | // upper, row_major |
58 | // storage should be: 0 1 2 3 11 12 13 22 23 33 |
59 | int ur_correct[] = {0, 1, 2, 3, 11, 12, 13, 22, 23, 33}; |
60 | |
61 | // lower, column_major |
62 | // storage should be: 0 1 2 3 11 12 13 22 23 33 |
63 | int lc_correct[] = {0, 1, 2, 3, 11, 12, 13, 22, 23, 33}; |
64 | |
65 | // lower, row_major |
66 | // storage should be: 0 1 11 2 12 22 3 13 23 33 |
67 | int lr_correct[] = {0, 1, 11, 2, 12, 22, 3, 13, 23, 33}; |
68 | |
69 | bool success = true; |
70 | |
71 | // Test Symmetric |
72 | for(int i=0; i<sz*(sz+1)/2; ++i) |
73 | if(uc[i] != uc_correct[i]) |
74 | { |
75 | cout << "Storage error (Symmetric, Upper, Column major)" << endl; |
76 | success = false; |
77 | break; |
78 | } |
79 | |
80 | for(int i=0; i<sz*(sz+1)/2; ++i) |
81 | if(ur[i] != ur_correct[i]) |
82 | { |
83 | cout << "Storage error (Symmetric, Upper, Row major)" << endl; |
84 | success = false; |
85 | break; |
86 | } |
87 | |
88 | for(int i=0; i<sz*(sz+1)/2; ++i) |
89 | if(lc[i] != lc_correct[i]) |
90 | { |
91 | cout << "Storage error (Symmetric, Lower, Column major)" << endl; |
92 | success = false; |
93 | break; |
94 | } |
95 | |
96 | for(int i=0; i<sz*(sz+1)/2; ++i) |
97 | if(lr[i] != lr_correct[i]) |
98 | { |
99 | cout << "Storage error (Symmetric, Lower, Row major)" << endl; |
100 | success = false; |
101 | break; |
102 | } |
103 | |
104 | // Test Triangular |
105 | for(int i=0; i<sz*(sz+1)/2; ++i) |
106 | if(tuc[i] != uc_correct[i]) |
107 | { |
108 | cout << "Storage error (Triangular, Upper, Column major)" << endl; |
109 | success = false; |
110 | break; |
111 | } |
112 | |
113 | for(int i=0; i<sz*(sz+1)/2; ++i) |
114 | if(tur[i] != ur_correct[i]) |
115 | { |
116 | cout << "Storage error (Triangular, Upper, Row major)" << endl; |
117 | success = false; |
118 | break; |
119 | } |
120 | |
121 | for(int i=0; i<sz*(sz+1)/2; ++i) |
122 | if(tlc[i] != lc_correct[i]) |
123 | { |
124 | cout << "Storage error (Triangular, Lower, Column major)" << endl; |
125 | success = false; |
126 | break; |
127 | } |
128 | |
129 | for(int i=0; i<sz*(sz+1)/2; ++i) |
130 | if(tlr[i] != lr_correct[i]) |
131 | { |
132 | cout << "Storage error (Triangular, Lower, Row major)" << endl; |
133 | success = false; |
134 | break; |
135 | } |
136 | |
137 | |
138 | return (success)?boost::exit_success:boost::exit_failure; |
139 | } |
140 | |