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