Brian Silverman | dc6866b | 2018-08-05 00:18:23 -0700 | [diff] [blame^] | 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 | |
| 10 | |
| 11 | #include <boost/numeric/ublas/triangular.hpp> |
| 12 | #include <boost/numeric/ublas/io.hpp> |
| 13 | #include <boost/cstdlib.hpp> |
| 14 | |
| 15 | #include "common/testhelper.hpp" |
| 16 | |
| 17 | #ifdef BOOST_UBLAS_NO_NESTED_CLASS_RELATION |
| 18 | using boost::numeric::ublas::iterator1_tag; |
| 19 | using boost::numeric::ublas::iterator2_tag; |
| 20 | #endif |
| 21 | |
| 22 | template < class MAT > |
| 23 | void test_iterator( MAT & A ) { |
| 24 | |
| 25 | #ifndef NOMESSAGES |
| 26 | std::cout << "=>"; |
| 27 | #endif |
| 28 | // check mutable iterators |
| 29 | typename MAT::iterator1 it1 = A.begin1(); |
| 30 | typename MAT::iterator1 it1_end = A.end1(); |
| 31 | |
| 32 | for ( ; it1 != it1_end; ++it1 ) { |
| 33 | #ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION |
| 34 | typename MAT::iterator2 it2 = it1.begin(); |
| 35 | typename MAT::iterator2 it2_end = it1.end(); |
| 36 | #else |
| 37 | typename MAT::iterator2 it2 = begin(it1, iterator1_tag()); |
| 38 | typename MAT::iterator2 it2_end = end(it1, iterator1_tag()); |
| 39 | #endif |
| 40 | for ( ; it2 != it2_end ; ++ it2 ) { |
| 41 | #ifndef NOMESSAGES |
| 42 | std::cout << "( " << it2.index1() << ", " << it2.index2() << ") " << std::flush; |
| 43 | #endif |
| 44 | * it2 = ( 10 * it2.index1() + it2.index2() ); |
| 45 | } |
| 46 | #ifndef NOMESSAGES |
| 47 | std::cout << std::endl; |
| 48 | #endif |
| 49 | } |
| 50 | |
| 51 | } |
| 52 | |
| 53 | template < class MAT > |
| 54 | void test_iterator2( MAT & A ) { |
| 55 | |
| 56 | #ifndef NOMESSAGES |
| 57 | std::cout << "=>"; |
| 58 | #endif |
| 59 | // check mutable iterators |
| 60 | typename MAT::iterator2 it2 = A.begin2(); |
| 61 | typename MAT::iterator2 it2_end = A.end2(); |
| 62 | |
| 63 | for ( ; it2 != it2_end; ++it2 ) { |
| 64 | #ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION |
| 65 | typename MAT::iterator1 it1 = it2.begin(); |
| 66 | typename MAT::iterator1 it1_end = it2.end(); |
| 67 | #else |
| 68 | typename MAT::iterator1 it1 = begin(it2, iterator2_tag()); |
| 69 | typename MAT::iterator1 it1_end = end(it2, iterator2_tag()); |
| 70 | #endif |
| 71 | for ( ; it1 != it1_end ; ++ it1 ) { |
| 72 | #ifndef NOMESSAGES |
| 73 | std::cout << "( " << it1.index1() << ", " << it1.index2() << ") " << std::flush; |
| 74 | #endif |
| 75 | * it1 = ( 10 * it1.index1() + it1.index2() ); |
| 76 | } |
| 77 | #ifndef NOMESSAGES |
| 78 | std::cout << std::endl; |
| 79 | #endif |
| 80 | } |
| 81 | |
| 82 | } |
| 83 | |
| 84 | template < class MAT > |
| 85 | typename MAT::value_type |
| 86 | test_iterator3( const MAT & A ) { |
| 87 | |
| 88 | #ifndef NOMESSAGES |
| 89 | std::cout << "=>"; |
| 90 | #endif |
| 91 | typename MAT::value_type result = 0; |
| 92 | |
| 93 | // check mutable iterators |
| 94 | typename MAT::const_iterator1 it1 = A.begin1(); |
| 95 | typename MAT::const_iterator1 it1_end = A.end1(); |
| 96 | |
| 97 | for ( ; it1 != it1_end; ++it1 ) { |
| 98 | #ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION |
| 99 | typename MAT::const_iterator2 it2 = it1.begin(); |
| 100 | typename MAT::const_iterator2 it2_end = it1.end(); |
| 101 | #else |
| 102 | typename MAT::const_iterator2 it2 = begin(it1, iterator1_tag()); |
| 103 | typename MAT::const_iterator2 it2_end = end(it1, iterator1_tag()); |
| 104 | #endif |
| 105 | for ( ; it2 != it2_end ; ++ it2 ) { |
| 106 | #ifndef NOMESSAGES |
| 107 | std::cout << "( " << it2.index1() << ", " << it2.index2() << ") " << std::flush; |
| 108 | #endif |
| 109 | result += * it2; |
| 110 | } |
| 111 | #ifndef NOMESSAGES |
| 112 | std::cout << std::endl; |
| 113 | #endif |
| 114 | } |
| 115 | return result; |
| 116 | |
| 117 | } |
| 118 | |
| 119 | |
| 120 | int main () { |
| 121 | using namespace boost::numeric::ublas; |
| 122 | |
| 123 | typedef double VALUE_TYPE; |
| 124 | typedef triangular_matrix<VALUE_TYPE, lower> LT; |
| 125 | typedef triangular_matrix<VALUE_TYPE, unit_lower> ULT; |
| 126 | typedef triangular_matrix<VALUE_TYPE, strict_lower> SLT; |
| 127 | typedef triangular_matrix<VALUE_TYPE, upper> UT; |
| 128 | typedef triangular_matrix<VALUE_TYPE, unit_upper> UUT; |
| 129 | typedef triangular_matrix<VALUE_TYPE, strict_upper> SUT; |
| 130 | |
| 131 | LT A(5,5); |
| 132 | |
| 133 | test_iterator(A); |
| 134 | test_iterator2(A); |
| 135 | |
| 136 | ULT B(5,5); |
| 137 | |
| 138 | test_iterator(B); |
| 139 | test_iterator2(B); |
| 140 | |
| 141 | SLT C(5,5); |
| 142 | |
| 143 | test_iterator(C); |
| 144 | test_iterator2(C); |
| 145 | |
| 146 | UT D(5,5); |
| 147 | |
| 148 | test_iterator(D); |
| 149 | test_iterator2(D); |
| 150 | |
| 151 | UUT E(5,5); |
| 152 | |
| 153 | test_iterator(E); |
| 154 | test_iterator2(E); |
| 155 | |
| 156 | SUT F(5,5); |
| 157 | |
| 158 | test_iterator(F); |
| 159 | test_iterator2(F); |
| 160 | |
| 161 | assertTrue("Write access using iterators: ", true); |
| 162 | |
| 163 | assertEquals(" LT: ",420.0,test_iterator3(A)); |
| 164 | assertEquals("ULT: ",315.0,test_iterator3(B)); |
| 165 | assertEquals("SLT: ",310.0,test_iterator3(C)); |
| 166 | assertEquals(" UT: ",240.0,test_iterator3(D)); |
| 167 | assertEquals("UUT: ",135.0,test_iterator3(E)); |
| 168 | assertEquals("SUT: ",130.0,test_iterator3(F)); |
| 169 | |
| 170 | assertTrue("Read access using iterators: ", true); |
| 171 | |
| 172 | #ifndef NOMESSAGES |
| 173 | std::cout << A << B << C << D << E << F << std::endl; |
| 174 | #endif |
| 175 | |
| 176 | typedef matrix<VALUE_TYPE> MATRIX; |
| 177 | MATRIX mat(5,5); |
| 178 | triangular_adaptor<MATRIX, lower> lta((mat)); |
| 179 | triangular_adaptor<MATRIX, unit_lower> ulta((mat)); |
| 180 | triangular_adaptor<MATRIX, strict_lower> slta((mat)); |
| 181 | triangular_adaptor<MATRIX, upper> uta((mat)); |
| 182 | triangular_adaptor<MATRIX, unit_upper> uuta((mat)); |
| 183 | triangular_adaptor<MATRIX, strict_upper> suta((mat)); |
| 184 | |
| 185 | test_iterator ( lta ); |
| 186 | test_iterator2( lta ); |
| 187 | |
| 188 | test_iterator ( ulta ); |
| 189 | test_iterator2( ulta ); |
| 190 | |
| 191 | test_iterator ( slta ); |
| 192 | test_iterator2( slta ); |
| 193 | |
| 194 | test_iterator ( uta ); |
| 195 | test_iterator2( uta ); |
| 196 | |
| 197 | test_iterator ( uuta ); |
| 198 | test_iterator2( uuta ); |
| 199 | |
| 200 | test_iterator ( suta ); |
| 201 | test_iterator2( suta ); |
| 202 | |
| 203 | assertTrue("Write access using adaptors: ", true); |
| 204 | |
| 205 | assertEquals(" LTA: ",420.0,test_iterator3( lta )); |
| 206 | assertEquals("ULTA: ",315.0,test_iterator3( ulta )); |
| 207 | assertEquals("SLTA: ",310.0,test_iterator3( slta )); |
| 208 | |
| 209 | assertEquals(" UTA: ",240.0,test_iterator3( uta )); |
| 210 | assertEquals("UUTA: ",135.0,test_iterator3( uuta )); |
| 211 | assertEquals("SUTA: ",130.0,test_iterator3( suta )); |
| 212 | |
| 213 | assertTrue("Read access using adaptors: ", true); |
| 214 | |
| 215 | #ifndef NOMESSAGES |
| 216 | std::cout << mat << std::endl; |
| 217 | #endif |
| 218 | |
| 219 | return (getResults().second > 0) ? boost::exit_failure : boost::exit_success; |
| 220 | } |