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
12using namespace std;
13namespace ublas = boost::numeric::ublas;
14
15int 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

source code of boost/libs/numeric/ublas/test/triangular_layout.cpp