triangular_access.cpp 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. /* Test program to test find functions of triagular matrices
  2. *
  3. * author: Gunter Winkler ( guwi17 at gmx dot de )
  4. */
  5. // Copyright 2008 Gunter Winkler <guwi17@gmx.de>
  6. // Distributed under the Boost Software License, Version 1.0. (See
  7. // accompanying file LICENSE_1_0.txt or copy at
  8. // http://www.boost.org/LICENSE_1_0.txt)
  9. #include <boost/numeric/ublas/triangular.hpp>
  10. #include <boost/numeric/ublas/io.hpp>
  11. #include <boost/cstdlib.hpp>
  12. #include "common/testhelper.hpp"
  13. #ifdef BOOST_UBLAS_NO_NESTED_CLASS_RELATION
  14. using boost::numeric::ublas::iterator1_tag;
  15. using boost::numeric::ublas::iterator2_tag;
  16. #endif
  17. template < class MAT >
  18. void test_iterator( MAT & A ) {
  19. #ifndef NOMESSAGES
  20. std::cout << "=>";
  21. #endif
  22. // check mutable iterators
  23. typename MAT::iterator1 it1 = A.begin1();
  24. typename MAT::iterator1 it1_end = A.end1();
  25. for ( ; it1 != it1_end; ++it1 ) {
  26. #ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION
  27. typename MAT::iterator2 it2 = it1.begin();
  28. typename MAT::iterator2 it2_end = it1.end();
  29. #else
  30. typename MAT::iterator2 it2 = begin(it1, iterator1_tag());
  31. typename MAT::iterator2 it2_end = end(it1, iterator1_tag());
  32. #endif
  33. for ( ; it2 != it2_end ; ++ it2 ) {
  34. #ifndef NOMESSAGES
  35. std::cout << "( " << it2.index1() << ", " << it2.index2() << ") " << std::flush;
  36. #endif
  37. * it2 = ( 10 * it2.index1() + it2.index2() );
  38. }
  39. #ifndef NOMESSAGES
  40. std::cout << std::endl;
  41. #endif
  42. }
  43. }
  44. template < class MAT >
  45. void test_iterator2( MAT & A ) {
  46. #ifndef NOMESSAGES
  47. std::cout << "=>";
  48. #endif
  49. // check mutable iterators
  50. typename MAT::iterator2 it2 = A.begin2();
  51. typename MAT::iterator2 it2_end = A.end2();
  52. for ( ; it2 != it2_end; ++it2 ) {
  53. #ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION
  54. typename MAT::iterator1 it1 = it2.begin();
  55. typename MAT::iterator1 it1_end = it2.end();
  56. #else
  57. typename MAT::iterator1 it1 = begin(it2, iterator2_tag());
  58. typename MAT::iterator1 it1_end = end(it2, iterator2_tag());
  59. #endif
  60. for ( ; it1 != it1_end ; ++ it1 ) {
  61. #ifndef NOMESSAGES
  62. std::cout << "( " << it1.index1() << ", " << it1.index2() << ") " << std::flush;
  63. #endif
  64. * it1 = ( 10 * it1.index1() + it1.index2() );
  65. }
  66. #ifndef NOMESSAGES
  67. std::cout << std::endl;
  68. #endif
  69. }
  70. }
  71. template < class MAT >
  72. typename MAT::value_type
  73. test_iterator3( const MAT & A ) {
  74. #ifndef NOMESSAGES
  75. std::cout << "=>";
  76. #endif
  77. typename MAT::value_type result = 0;
  78. // check mutable iterators
  79. typename MAT::const_iterator1 it1 = A.begin1();
  80. typename MAT::const_iterator1 it1_end = A.end1();
  81. for ( ; it1 != it1_end; ++it1 ) {
  82. #ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION
  83. typename MAT::const_iterator2 it2 = it1.begin();
  84. typename MAT::const_iterator2 it2_end = it1.end();
  85. #else
  86. typename MAT::const_iterator2 it2 = begin(it1, iterator1_tag());
  87. typename MAT::const_iterator2 it2_end = end(it1, iterator1_tag());
  88. #endif
  89. for ( ; it2 != it2_end ; ++ it2 ) {
  90. #ifndef NOMESSAGES
  91. std::cout << "( " << it2.index1() << ", " << it2.index2() << ") " << std::flush;
  92. #endif
  93. result += * it2;
  94. }
  95. #ifndef NOMESSAGES
  96. std::cout << std::endl;
  97. #endif
  98. }
  99. return result;
  100. }
  101. int main () {
  102. using namespace boost::numeric::ublas;
  103. typedef double VALUE_TYPE;
  104. typedef triangular_matrix<VALUE_TYPE, lower> LT;
  105. typedef triangular_matrix<VALUE_TYPE, unit_lower> ULT;
  106. typedef triangular_matrix<VALUE_TYPE, strict_lower> SLT;
  107. typedef triangular_matrix<VALUE_TYPE, upper> UT;
  108. typedef triangular_matrix<VALUE_TYPE, unit_upper> UUT;
  109. typedef triangular_matrix<VALUE_TYPE, strict_upper> SUT;
  110. LT A(5,5);
  111. test_iterator(A);
  112. test_iterator2(A);
  113. ULT B(5,5);
  114. test_iterator(B);
  115. test_iterator2(B);
  116. SLT C(5,5);
  117. test_iterator(C);
  118. test_iterator2(C);
  119. UT D(5,5);
  120. test_iterator(D);
  121. test_iterator2(D);
  122. UUT E(5,5);
  123. test_iterator(E);
  124. test_iterator2(E);
  125. SUT F(5,5);
  126. test_iterator(F);
  127. test_iterator2(F);
  128. assertTrue("Write access using iterators: ", true);
  129. assertEquals(" LT: ",420.0,test_iterator3(A));
  130. assertEquals("ULT: ",315.0,test_iterator3(B));
  131. assertEquals("SLT: ",310.0,test_iterator3(C));
  132. assertEquals(" UT: ",240.0,test_iterator3(D));
  133. assertEquals("UUT: ",135.0,test_iterator3(E));
  134. assertEquals("SUT: ",130.0,test_iterator3(F));
  135. assertTrue("Read access using iterators: ", true);
  136. #ifndef NOMESSAGES
  137. std::cout << A << B << C << D << E << F << std::endl;
  138. #endif
  139. typedef matrix<VALUE_TYPE> MATRIX;
  140. MATRIX mat(5,5);
  141. triangular_adaptor<MATRIX, lower> lta((mat));
  142. triangular_adaptor<MATRIX, unit_lower> ulta((mat));
  143. triangular_adaptor<MATRIX, strict_lower> slta((mat));
  144. triangular_adaptor<MATRIX, upper> uta((mat));
  145. triangular_adaptor<MATRIX, unit_upper> uuta((mat));
  146. triangular_adaptor<MATRIX, strict_upper> suta((mat));
  147. test_iterator ( lta );
  148. test_iterator2( lta );
  149. test_iterator ( ulta );
  150. test_iterator2( ulta );
  151. test_iterator ( slta );
  152. test_iterator2( slta );
  153. test_iterator ( uta );
  154. test_iterator2( uta );
  155. test_iterator ( uuta );
  156. test_iterator2( uuta );
  157. test_iterator ( suta );
  158. test_iterator2( suta );
  159. assertTrue("Write access using adaptors: ", true);
  160. assertEquals(" LTA: ",420.0,test_iterator3( lta ));
  161. assertEquals("ULTA: ",315.0,test_iterator3( ulta ));
  162. assertEquals("SLTA: ",310.0,test_iterator3( slta ));
  163. assertEquals(" UTA: ",240.0,test_iterator3( uta ));
  164. assertEquals("UUTA: ",135.0,test_iterator3( uuta ));
  165. assertEquals("SUTA: ",130.0,test_iterator3( suta ));
  166. assertTrue("Read access using adaptors: ", true);
  167. #ifndef NOMESSAGES
  168. std::cout << mat << std::endl;
  169. #endif
  170. return (getResults().second > 0) ? boost::exit_failure : boost::exit_success;
  171. }