blob: c2c9b773380c2a205b0566a97a18b3a331a170a5 [file] [log] [blame]
Brian Silvermandc6866b2018-08-05 00:18:23 -07001/* 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
18using boost::numeric::ublas::iterator1_tag;
19using boost::numeric::ublas::iterator2_tag;
20#endif
21
22template < class MAT >
23void 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
53template < class MAT >
54void 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
84template < class MAT >
85typename MAT::value_type
86test_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
120int 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}