source: trunk/test/averager_test.cc @ 1664

Last change on this file since 1664 was 1664, checked in by Peter, 14 years ago

using test:Suite for comparison

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