triangular_layout.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  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. #include <iostream>
  7. #include <boost/numeric/ublas/symmetric.hpp>
  8. #include <boost/numeric/ublas/triangular.hpp>
  9. #include <boost/cstdlib.hpp>
  10. using namespace std;
  11. namespace ublas = boost::numeric::ublas;
  12. int main()
  13. {
  14. int sz = 4;
  15. ublas::symmetric_matrix<int, ublas::upper, ublas::column_major> UpCol (sz, sz);
  16. ublas::symmetric_matrix<int, ublas::upper, ublas::row_major> UpRow (sz, sz);
  17. ublas::symmetric_matrix<int, ublas::lower, ublas::column_major> LoCol (sz, sz);
  18. ublas::symmetric_matrix<int, ublas::lower, ublas::row_major> LoRow (sz, sz);
  19. ublas::triangular_matrix<int, ublas::upper, ublas::column_major> TrUpCol (sz, sz);
  20. ublas::triangular_matrix<int, ublas::upper, ublas::row_major> TrUpRow (sz, sz);
  21. ublas::triangular_matrix<int, ublas::lower, ublas::column_major> TrLoCol (sz, sz);
  22. ublas::triangular_matrix<int, ublas::lower, ublas::row_major> TrLoRow (sz, sz);
  23. for(int i=0; i<sz; ++i)
  24. for(int j=i; j<sz; ++j)
  25. {
  26. // Symmetric
  27. UpCol(i,j) = 10*i + j;
  28. UpRow(i,j) = 10*i + j;
  29. LoCol(i,j) = 10*i + j;
  30. LoRow(i,j) = 10*i + j;
  31. // Triangular
  32. TrUpCol(i,j) = 10*i + j;
  33. TrUpRow(i,j) = 10*i + j;
  34. TrLoCol(j,i) = 10*i + j;
  35. TrLoRow(j,i) = 10*i + j;
  36. }
  37. //get pointers to data
  38. int* uc = &(UpCol.data()[0]);
  39. int* ur = &(UpRow.data()[0]);
  40. int* lc = &(LoCol.data()[0]);
  41. int* lr = &(LoRow.data()[0]);
  42. int* tuc = &(TrUpCol.data()[0]);
  43. int* tur = &(TrUpRow.data()[0]);
  44. int* tlc = &(TrLoCol.data()[0]);
  45. int* tlr = &(TrLoRow.data()[0]);
  46. // upper, column_major
  47. // storage should be: 0 1 11 2 12 22 3 13 23 33
  48. int uc_correct[] = {0, 1, 11, 2, 12, 22, 3, 13, 23, 33};
  49. // upper, row_major
  50. // storage should be: 0 1 2 3 11 12 13 22 23 33
  51. int ur_correct[] = {0, 1, 2, 3, 11, 12, 13, 22, 23, 33};
  52. // lower, column_major
  53. // storage should be: 0 1 2 3 11 12 13 22 23 33
  54. int lc_correct[] = {0, 1, 2, 3, 11, 12, 13, 22, 23, 33};
  55. // lower, row_major
  56. // storage should be: 0 1 11 2 12 22 3 13 23 33
  57. int lr_correct[] = {0, 1, 11, 2, 12, 22, 3, 13, 23, 33};
  58. bool success = true;
  59. // Test Symmetric
  60. for(int i=0; i<sz*(sz+1)/2; ++i)
  61. if(uc[i] != uc_correct[i])
  62. {
  63. cout << "Storage error (Symmetric, Upper, Column major)" << endl;
  64. success = false;
  65. break;
  66. }
  67. for(int i=0; i<sz*(sz+1)/2; ++i)
  68. if(ur[i] != ur_correct[i])
  69. {
  70. cout << "Storage error (Symmetric, Upper, Row major)" << endl;
  71. success = false;
  72. break;
  73. }
  74. for(int i=0; i<sz*(sz+1)/2; ++i)
  75. if(lc[i] != lc_correct[i])
  76. {
  77. cout << "Storage error (Symmetric, Lower, Column major)" << endl;
  78. success = false;
  79. break;
  80. }
  81. for(int i=0; i<sz*(sz+1)/2; ++i)
  82. if(lr[i] != lr_correct[i])
  83. {
  84. cout << "Storage error (Symmetric, Lower, Row major)" << endl;
  85. success = false;
  86. break;
  87. }
  88. // Test Triangular
  89. for(int i=0; i<sz*(sz+1)/2; ++i)
  90. if(tuc[i] != uc_correct[i])
  91. {
  92. cout << "Storage error (Triangular, Upper, Column major)" << endl;
  93. success = false;
  94. break;
  95. }
  96. for(int i=0; i<sz*(sz+1)/2; ++i)
  97. if(tur[i] != ur_correct[i])
  98. {
  99. cout << "Storage error (Triangular, Upper, Row major)" << endl;
  100. success = false;
  101. break;
  102. }
  103. for(int i=0; i<sz*(sz+1)/2; ++i)
  104. if(tlc[i] != lc_correct[i])
  105. {
  106. cout << "Storage error (Triangular, Lower, Column major)" << endl;
  107. success = false;
  108. break;
  109. }
  110. for(int i=0; i<sz*(sz+1)/2; ++i)
  111. if(tlr[i] != lr_correct[i])
  112. {
  113. cout << "Storage error (Triangular, Lower, Row major)" << endl;
  114. success = false;
  115. break;
  116. }
  117. return (success)?boost::exit_success:boost::exit_failure;
  118. }