source: trunk/test/averager_test.cc @ 490

Last change on this file since 490 was 490, checked in by Peter, 17 years ago

added tests for AveragerPairWeighted?, corrected docs, and added an
add(vector) for AvergaerPair?

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.5 KB
Line 
1// $Id: averager_test.cc 490 2006-01-04 20:32:05Z peter $
2
3#include <c++_tools/statistics/Averager.h>
4#include <c++_tools/statistics/AveragerPair.h>
5#include <c++_tools/statistics/AveragerPairWeighted.h>
6#include <c++_tools/statistics/AveragerWeighted.h>
7#include <c++_tools/gslapi/vector.h>
8
9#include <fstream>
10#include <iostream>
11
12using namespace theplu::statistics;
13
14//Forward declarations
15bool equal(const Averager&, const Averager&);
16bool equal(const AveragerWeighted&, const AveragerWeighted&, const double, 
17           std::ostream* error);
18bool equal(const Averager&, const AveragerWeighted&, const double, 
19           std::ostream* error);
20bool equal(const AveragerPair&, const AveragerPair&, 
21           const double, std::ostream* error);
22bool equal(const AveragerPair&, const AveragerPairWeighted&, 
23           const double, std::ostream* error);
24bool equal(const AveragerPairWeighted&, const AveragerPairWeighted&, 
25           const double, std::ostream* error);
26
27
28int main(const int argc,const char* argv[])
29{ 
30
31  std::ostream* error;
32  if (argc>1 && argv[1]==std::string("-v"))
33    error = &std::cerr;
34  else {
35    error = new std::ofstream("/dev/null");
36    if (argc>1)
37      std::cout << "averager_test -v : for printing extra information\n";
38  }
39  bool ok = true;
40
41  // Testing Averager
42  *error << "testing Averager" << std::endl;
43  Averager a;
44  a.add(1);
45  a.add(3);
46  a.add(5);
47  if (a.n()!=3 || a.mean()!=3 || a.sum_xx()!=35){
48    ok=false;
49    *error << "error: add\n";
50  }
51
52  Averager* a1 = new Averager(1+3+5,1+9+25,3);
53  if (!equal(a,*a1)){
54    ok=false;
55    *error << "error: Averager(const double x,const double xx,const long n)\n";
56  }
57  delete a1;
58
59  a1 = new Averager(a);
60  if (!equal(a,*a1)){
61    ok=false;
62    *error << "error: Copy constructor\n";
63  }
64  delete a1;
65
66  a.add(3,5);
67  if (! a.standard_error()==sqrt(a.variance()/a.n())){
68    ok=false;
69    *error << "error: standard_error\n";
70  }
71     
72
73  if ( a.variance() != a.std()*a.std() ){
74    ok=false;
75    *error << "error: std squared should be variance" << std::endl;
76    *error << "std: " << a.std() << std::endl;
77    *error << "variance: " << a.variance() << std::endl;
78  }
79 
80  if ( a.variance() != a.variance(a.mean()) ){
81    ok=false;
82    *error << "error: variance incorrect\n" << std::endl;
83    *error << "variance: " << a.variance() << std::endl;
84    *error << "mean: " << a.mean() << std::endl;
85    *error << "variance(mean) " << a.variance(a.mean()) << std::endl;
86  }
87
88  // Testing AveragerWeighted
89  *error << "testing AveragerWeighted" << std::endl;
90  theplu::gslapi::vector x(3,0);
91  x(0)=0;
92  x(1)=1;
93  x(2)=2;
94  theplu::gslapi::vector w(3,1);
95  theplu::statistics::AveragerWeighted aw;
96  aw.add(x,w);
97  a.reset();
98  a.add(x);
99  const double tol=0.0001;
100  if (!equal(a,aw,tol,error)){
101    *error << "error: AveragerWeighted with unitary weights should " 
102           << "be equal to Averager" << std::endl;
103    ok=false;
104  }
105
106  AveragerWeighted* aw2 = new AveragerWeighted(aw);
107  if (!equal(aw,*aw2,tol,error)){
108    *error << "error: AveragerWeighted copy constructor " << std::endl;
109    ok=false;
110  }
111   
112  aw2->add(12,0);
113  if (!equal(aw,*aw2,tol,error)){
114    *error << "error: AveragerWeighted adding a data point with weight=0 " 
115           << "should make no change " << std::endl;
116    ok=false;
117  }
118     
119  aw2->reset();
120  w.scale(17);
121  aw2->add(x,w);
122  if (!equal(aw,*aw2,tol,error)){
123    *error << "error: AveragerWeighted rescaling weights " 
124           << "should make no change " << std::endl;
125    ok=false;
126  }
127  delete aw2;
128 
129
130  *error << "testing AveragerPair" << std::endl;
131  AveragerPair ap;
132  for (int i=0; i<10; i++)
133    ap.add(i,i);
134  if (fabs(ap.correlation()-1)>tol){
135    ok=false;
136    *error << "correlation: " << ap.correlation() << std::endl;
137    *error << "error: correlation between identical vectors should be unity" 
138           << std::endl;
139  }
140  if (ap.x_averager().variance()!=ap.covariance()){
141    ok=false;
142    *error << "error: covariance of identical vectors should equal to variance" 
143           << std::endl;
144  }
145  AveragerPair* ap2 = new AveragerPair(ap);
146  delete ap2;
147
148  *error << "testing AveragerPairWeighted" << std::endl;
149  AveragerPairWeighted apw;
150  x(0)=0; x(1)=1; x(2)=2;
151  theplu::gslapi::vector y(3,0);
152  x(0)=0; x(1)=0; x(2)=2;
153  apw.add(x,y,w,w);
154  ap.reset();
155  ap.add(x,y);
156  if (!equal(ap,apw,tol,error)){
157    *error << "error: AveragerPairWeighted with unitary weights should " 
158           << "be equal to AveragerPair" << std::endl;
159    ok=false;
160  }
161
162  AveragerPairWeighted* apw2 = new AveragerPairWeighted(apw);
163  if (!equal(apw,*apw2,tol,error)){
164    *error << "error: AveragerPairWeighted copy constructor " << std::endl;
165    ok=false;
166  }
167   
168  apw2->add(12,23222.03,32.3,0);
169  if (!equal(apw,*apw2,tol,error)){
170    *error << "error: AveragerWeighted adding a data point with weight=0 " 
171           << "should make no change " << std::endl;
172    ok=false;
173  }
174     
175  apw2->reset();
176  w.scale(17);
177  apw2->add(x,y,w,w);
178  if (!equal(apw,*apw2,tol,error)){
179    *error << "error: AveragerWeighted rescaling weights " 
180           << "should make no change " << std::endl;
181    ok=false;
182  }
183  delete apw2;
184
185  if (error!=&std::cerr)
186    delete error;
187
188  if (!ok)
189    return -1;
190  return 0;
191}
192
193bool equal(const Averager& a, const Averager& b)
194{
195  return (a.n()==b.n() && a.mean()==b.mean() && a.variance()==b.variance());
196}
197
198bool equal(const AveragerWeighted& a, const AveragerWeighted& b, 
199           const double tol, std::ostream* error)
200{
201  bool equal = true;
202  if  ( fabs(a.mean()-b.mean())>tol){
203    equal=false;
204    *error << "mean:\t" << a.mean() << "\t" << b.mean() << std::endl;
205  }
206  if ( fabs(a.variance()-b.variance())>tol ) {
207    equal=false;
208    *error << "error for variance:\t" << a.variance() << " " << b.variance() 
209           << std::endl;
210  } 
211  if ( fabs(a.standard_error()-b.standard_error())>tol ) {
212    equal =false;
213    *error << "error for standard error:\t" << std::endl;
214  }
215  return equal;
216}
217
218bool equal(const Averager& a, const AveragerWeighted& b, const double tol, 
219           std::ostream* error)
220{
221  bool equal = true;
222  if  ( fabs(a.mean()-b.mean())>tol){
223    equal=false;
224    *error << "mean:\t" << a.mean() << "\t" << b.mean() << std::endl;
225  }
226  if ( fabs(a.variance()-b.variance())>tol ) {
227    equal=false;
228    *error << "error for variance:\t" << a.variance() << " " << b.variance() 
229           << std::endl;
230  } 
231  if ( fabs(a.standard_error()-b.standard_error())>tol ) {
232    equal =false;
233    *error << "error for standard error:\t" << std::endl;
234  }
235  return equal;
236}
237
238bool equal(const AveragerPair& a, const AveragerPair& b, 
239           const double tol, std::ostream* error)
240{
241  bool ok = true;
242  if  ( fabs(a.covariance()-b.covariance())>tol){
243    ok=false;
244    *error << "error covariance: " << a.covariance() << "\t" 
245           << b.covariance() << std::endl;
246  }
247  if ( fabs(a.correlation()-b.correlation())>tol ) {
248    ok=false;
249    *error << "error correlation" << std::endl;
250  } 
251  return ok;
252}
253
254bool equal(const AveragerPair& a, const AveragerPairWeighted& b, 
255           const double tol, std::ostream* error)
256{
257  bool ok = true;
258  if  ( fabs(a.covariance()-b.covariance())>tol){
259    ok=false;
260    *error << "error covariance: " << a.covariance() << "\t" 
261           << b.covariance() << std::endl;
262  }
263  if ( fabs(a.correlation()-b.correlation())>tol ) {
264    ok=false;
265    *error << "error correlation" << std::endl;
266  } 
267  if ( !equal(a.x_averager(),b.x_averager(),tol,error)) {
268    ok =false;
269    *error << "error for x_averager():\t" << std::endl;
270  }
271  return ok;
272}
273bool equal(const AveragerPairWeighted& a, const AveragerPairWeighted& b, 
274           const double tol, std::ostream* error)
275{
276  bool ok = true;
277  if  ( fabs(a.covariance()-b.covariance())>tol){
278    ok=false;
279    *error << "error covariance: " << a.covariance() << "\t" 
280           << b.covariance() << std::endl;
281  }
282  if ( fabs(a.correlation()-b.correlation())>tol ) {
283    ok=false;
284    *error << "error correlation" << std::endl;
285  } 
286  if ( !equal(a.x_averager(),b.x_averager(),tol,error)) {
287    ok =false;
288    *error << "error for x_averager():\t" << std::endl;
289  }
290  return ok;
291}
292
293
294
Note: See TracBrowser for help on using the repository browser.