source: trunk/test/averager_test.cc @ 775

Last change on this file since 775 was 775, checked in by Jari Häkkinen, 16 years ago

Fixes #200.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 9.2 KB
Line 
1// $Id: averager_test.cc 775 2007-03-01 23:53:03Z jari $
2
3/*
4  Copyright (C) The authors contributing to this file.
5
6  This file is part of the yat library, http://lev.thep.lu.se/trac/yat
7
8  The yat library is free software; you can redistribute it and/or
9  modify it under the terms of the GNU General Public License as
10  published by the Free Software Foundation; either version 2 of the
11  License, or (at your option) any later version.
12
13  The yat library is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  General Public License for more details.
17
18  You should have received a copy of the GNU General Public License
19  along with this program; if not, write to the Free Software
20  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
21  02111-1307, USA.
22*/
23
24#include "yat/statistics/Averager.h"
25#include "yat/statistics/AveragerPair.h"
26#include "yat/statistics/AveragerPairWeighted.h"
27#include "yat/statistics/AveragerWeighted.h"
28#include "yat/utility/vector.h"
29
30#include <fstream>
31#include <limits>
32#include <iostream>
33
34using namespace theplu::yat::statistics;
35
36//Forward declarations
37bool equal(const Averager&, const Averager&);
38bool equal(const AveragerWeighted&, const AveragerWeighted&, const double, 
39           std::ostream* error);
40bool equal(const Averager&, const AveragerWeighted&, const double, 
41           std::ostream* error);
42bool equal(const AveragerPair&, const AveragerPair&, 
43           const double, std::ostream* error);
44bool equal(const AveragerPair&, const AveragerPairWeighted&, 
45           const double, std::ostream* error);
46bool equal(const AveragerPairWeighted&, const AveragerPairWeighted&, 
47           const double, std::ostream* error);
48
49
50int main(const int argc,const char* argv[])
51{ 
52
53  std::ostream* error;
54  if (argc>1 && argv[1]==std::string("-v"))
55    error = &std::cerr;
56  else {
57    error = new std::ofstream("/dev/null");
58    if (argc>1)
59      std::cout << "averager_test -v : for printing extra information\n";
60  }
61  bool ok = true;
62
63  // Testing Averager
64  *error << "testing Averager" << std::endl;
65  Averager a;
66  a.add(1);
67  a.add(3);
68  a.add(5);
69  if (a.n()!=3 || a.mean()!=3 || a.sum_xx()!=35){
70    ok=false;
71    *error << "error: add\n";
72  }
73
74
75  Averager* a1 = new Averager(1.0+3+5,1.0+9+25,3);
76  if (!equal(a,*a1)){
77    ok=false;
78    std::cout.precision(25);
79    std::cout << equal(a,*a1) << std::endl;
80    std::cout << a.sum_x() << '\t' << a1->sum_x() << std::endl;
81    std::cout << a.sum_xx() << '\t' << a1->sum_xx() << std::endl;
82    std::cout << a.n() << '\t' << a1->n() << std::endl;
83    std::cout << a.variance() << '\t' << a1->variance() << std::endl;
84    std::cout << a.mean() << '\t' << a1->mean() << std::endl;
85    std::cout << a.mean() - a1->mean() << std::endl;
86    std::cout << a.variance() - a1->variance() << std::endl;
87    *error << "error: Averager(double x, double xx, u_long n)\n";
88  }
89  delete a1;
90
91  a1 = new Averager(a);
92  if (!equal(a,*a1)){
93    ok=false;
94    *error << "error: Copy constructor\n";
95  }
96  delete a1;
97
98  a.add(3,5);
99  if (! a.standard_error()==sqrt(a.variance()/a.n())){
100    ok=false;
101    *error << "error: standard_error\n";
102  }
103     
104
105  if ( fabs(a.variance() - a.std()*a.std())>
106       std::numeric_limits<double>().round_error() ){
107    ok=false;
108    *error << "error: std squared should be variance" << std::endl;
109    *error << "std2: " << a.std()*a.std() << std::endl;
110    *error << "variance: " << a.variance() << std::endl;
111    *error << "difference is: " << a.std()*a.std()-a.variance() << std::endl;
112  }
113 
114  if ( a.variance() != a.variance(a.mean()) ){
115    ok=false;
116    *error << "error: variance incorrect\n" << std::endl;
117    *error << "variance: " << a.variance() << std::endl;
118    *error << "mean: " << a.mean() << std::endl;
119    *error << "variance(mean) " << a.variance(a.mean()) << std::endl;
120  }
121
122  // Testing AveragerWeighted
123  *error << "testing AveragerWeighted" << std::endl;
124  theplu::yat::utility::vector x(3,0);
125  x(0)=0;
126  x(1)=1;
127  x(2)=2;
128  theplu::yat::utility::vector w(3,1);
129  theplu::yat::statistics::AveragerWeighted aw;
130  aw.add_values(x,w);
131  a.reset();
132  a.add_values(x);
133  const double tol=std::numeric_limits<double>().round_error();
134  if (!equal(a,aw,tol,error)){
135    *error << "error: AveragerWeighted with unitary weights should " 
136           << "be equal to Averager" << std::endl;
137    ok=false;
138  }
139
140  AveragerWeighted* aw2 = new AveragerWeighted(aw);
141  if (!equal(aw,*aw2,tol,error)){
142    *error << "error: AveragerWeighted copy constructor " << std::endl;
143    ok=false;
144  }
145   
146  aw2->add(12,0);
147  if (!equal(aw,*aw2,tol,error)){
148    *error << "error: AveragerWeighted adding a data point with weight=0 " 
149           << "should make no change " << std::endl;
150    ok=false;
151  }
152     
153  aw2->reset();
154  w*=17;
155  aw2->add_values(x,w);
156  if (!equal(aw,*aw2,tol,error)){
157    *error << "error: AveragerWeighted rescaling weights " 
158           << "should make no change " << std::endl;
159    ok=false;
160  }
161  delete aw2;
162 
163
164  *error << "testing AveragerPair" << std::endl;
165  AveragerPair ap;
166  for (int i=0; i<10; i++)
167    ap.add(static_cast<double>(i),i);
168  if (fabs(ap.correlation()-1)>tol){
169    ok=false;
170    *error << "correlation: " << ap.correlation() << std::endl;
171    *error << "error: correlation between identical vectors should be unity" 
172           << std::endl;
173  }
174  if (ap.x_averager().variance()!=ap.covariance()){
175    ok=false;
176    *error << "error: covariance of identical vectors should equal to variance" 
177           << std::endl;
178  }
179  AveragerPair* ap2 = new AveragerPair(ap);
180  delete ap2;
181
182  *error << "testing AveragerPairWeighted" << std::endl;
183  AveragerPairWeighted apw;
184  x(0)=0; x(1)=1; x(2)=2;
185  theplu::yat::utility::vector y(3,0);
186  x(0)=0; x(1)=0; x(2)=2;
187  apw.add_values(x,y,w,w);
188  ap.reset();
189  ap.add_values(x,y);
190  if (!equal(ap,apw,tol,error)){
191    *error << "error: AveragerPairWeighted with unitary weights should " 
192           << "be equal to AveragerPair" << std::endl;
193    ok=false;
194  }
195
196  AveragerPairWeighted* apw2 = new AveragerPairWeighted(apw);
197  if (!equal(apw,*apw2,tol,error)){
198    *error << "error: AveragerPairWeighted copy constructor " << std::endl;
199    ok=false;
200  }
201   
202  apw2->add(12,23222.03,32.3,0);
203  if (!equal(apw,*apw2,tol,error)){
204    *error << "error: AveragerWeighted adding a data point with weight=0 " 
205           << "should make no change " << std::endl;
206    ok=false;
207  }
208     
209  apw2->reset();
210  w*=17;
211  apw2->add_values(x,y,w,w);
212  if (!equal(apw,*apw2,tol,error)){
213    *error << "error: AveragerWeighted rescaling weights " 
214           << "should make no change " << std::endl;
215    ok=false;
216  }
217  delete apw2;
218
219  if (error!=&std::cerr)
220    delete error;
221
222  if (!ok)
223    return -1;
224  return 0;
225}
226
227bool equal(const Averager& a, const Averager& b)
228{
229//  std::cout << (a.n()==b.n()) << std::endl;
230//  std::cout << (a.mean()==b.mean()) << std::endl;
231//  std::cout << (a.variance()==b.variance()) << std::endl;
232  return (a.n()==b.n() && a.mean()==b.mean() && a.variance()==b.variance());
233}
234
235bool equal(const AveragerWeighted& a, const AveragerWeighted& b, 
236           const double tol, std::ostream* error)
237{
238  bool equal = true;
239  if  ( fabs(a.mean()-b.mean())>tol){
240    equal=false;
241    *error << "mean:\t" << a.mean() << "\t" << b.mean() << std::endl;
242  }
243  if ( fabs(a.variance()-b.variance())>tol ) {
244    equal=false;
245    *error << "error for variance:\t" << a.variance() << " " << b.variance() 
246           << std::endl;
247  } 
248  if ( fabs(a.standard_error()-b.standard_error())>tol ) {
249    equal =false;
250    *error << "error for standard error:\t" << std::endl;
251  }
252  return equal;
253}
254
255bool equal(const Averager& a, const AveragerWeighted& b, const double tol, 
256           std::ostream* error)
257{
258  bool equal = true;
259  if  ( fabs(a.mean()-b.mean())>tol){
260    equal=false;
261    *error << "mean:\t" << a.mean() << "\t" << b.mean() << std::endl;
262  }
263  if ( fabs(a.variance()-b.variance())>tol ) {
264    equal=false;
265    *error << "error for variance:\t" << a.variance() << " " << b.variance() 
266           << std::endl;
267  } 
268  if ( fabs(a.standard_error()-b.standard_error())>tol ) {
269    equal =false;
270    *error << "error for standard error:\t" << std::endl;
271  }
272  return equal;
273}
274
275bool equal(const AveragerPair& a, const AveragerPair& b, 
276           const double tol, std::ostream* error)
277{
278  bool ok = true;
279  if  ( fabs(a.covariance()-b.covariance())>tol){
280    ok=false;
281    *error << "error covariance: " << a.covariance() << "\t" 
282           << b.covariance() << std::endl;
283  }
284  if ( fabs(a.correlation()-b.correlation())>tol ) {
285    ok=false;
286    *error << "error correlation" << std::endl;
287  } 
288  return ok;
289}
290
291bool equal(const AveragerPair& a, const AveragerPairWeighted& b, 
292           const double tol, std::ostream* error)
293{
294  bool ok = true;
295  if  ( fabs(a.covariance()-b.covariance())>tol){
296    ok=false;
297    *error << "error covariance: " << a.covariance() << "\t" 
298           << b.covariance() << std::endl;
299  }
300  if ( fabs(a.correlation()-b.correlation())>tol ) {
301    ok=false;
302    *error << "error correlation" << std::endl;
303  } 
304  if ( !equal(a.x_averager(),b.x_averager(),tol,error)) {
305    ok =false;
306    *error << "error for x_averager():\t" << std::endl;
307  }
308  return ok;
309}
310bool equal(const AveragerPairWeighted& a, const AveragerPairWeighted& b, 
311           const double tol, std::ostream* error)
312{
313  bool ok = true;
314  if  ( fabs(a.covariance()-b.covariance())>tol){
315    ok=false;
316    *error << "error covariance: " << a.covariance() << "\t" 
317           << b.covariance() << std::endl;
318  }
319  if ( fabs(a.correlation()-b.correlation())>tol ) {
320    ok=false;
321    *error << "error correlation" << std::endl;
322  } 
323  if ( !equal(a.x_averager(),b.x_averager(),tol,error)) {
324    ok =false;
325    *error << "error for x_averager():\t" << std::endl;
326  }
327  return ok;
328}
329
330
331
Note: See TracBrowser for help on using the repository browser.