• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
main()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