Ignore:
Timestamp:
Aug 20, 2008, 1:15:32 AM (13 years ago)
Author:
Peter
Message:

refs #366 - need to polish on some special cases

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/test/statistics_test.cc

    r1404 r1418  
    3333#include "yat/utility/Vector.h"
    3434
    35 #include <vector>
     35#include <cmath>
    3636#include <cstdlib>
    3737#include <iostream>
    38 #include <cmath>
     38#include <map>
     39#include <vector>
     40
     41using namespace theplu::yat;
     42void test_percentiler(test::Suite&);
     43
     44template<typename RandomAccessIterator>
     45void test_percentiler(test::Suite&, RandomAccessIterator,
     46                      RandomAccessIterator,
     47                      double p, double correct);
     48
     49template<typename RandomAccessIterator1, typename RandomAccessIterator2>
     50void cmp_percentiler(test::Suite&,
     51                     RandomAccessIterator1,
     52                     RandomAccessIterator1,
     53                     RandomAccessIterator2,
     54                     RandomAccessIterator2);
    3955
    4056int main(int argc, char* argv[])
    4157
    42   using namespace theplu::yat;
    4358  test::Suite suite(argc, argv);
    4459
     
    5873  statistics::median(data.begin(), data.end());
    5974  // testing percentile2
    60   data.resize(5);
    61   std::copy(gsl_vec.begin(), gsl_vec.begin()+5, data.begin());
    62   std::map<double, double> correct;
    63   correct[0]=0;
    64   correct[10]=0;
    65   correct[30]=1;
    66   correct[40]=1.5;
    67   correct[50]=2;
    68   correct[70]=3;
    69   correct[90]=4;
    70   correct[100]=4;
    71   for (std::map<double, double>::const_iterator i=correct.begin();
    72        i!=correct.end(); ++i) {
    73     if (!suite.add(suite.equal(statistics::percentile2(data.begin(), data.end(),
    74                                                        i->first),
    75                                i->second))) {
    76       suite.err() << "error: unweighted percentile2 " << i->first
    77                   << "th percentile = "
    78                   << statistics::percentile2(data.begin(),data.end(),i->first)
    79                   << " expected to be " << i->second
    80                   << std::endl;
    81     }
    82   }
    83 
    84   utility::MatrixWeighted mw(1,data.size(),1);
    85   for (size_t i=0; i<mw.columns(); ++i)
    86     mw(0,i).data()=data[i];
    87   if (!suite.equal(statistics::median(mw.begin_row(0), mw.end_row(0), true),2))
    88     suite.err() << "error: weighted median sorted failed" << std::endl;
    89   if (!suite.equal(statistics::median(mw.begin_row(0), mw.end_row(0), false),2))
    90     suite.err() << "error: weighted median failed" << std::endl;
    91   for (std::map<double, double>::const_iterator i=correct.begin();
    92        i!=correct.end(); ++i) {
    93     if (!suite.add(suite.equal(statistics::percentile2(mw.begin_row(0),
    94                                                        mw.end_row(0),
    95                                                        i->first),
    96                                i->second))) {
    97       suite.err() << "error: weighted percentile2 " << i->first
    98                   << "th percentile = "
    99                   << statistics::percentile2(mw.begin_row(0),
    100                                              mw.end_row(0), i->first)
    101                   << " expected to be " << i->second
    102                   << std::endl;
    103     }
    104   }
     75  test_percentiler(suite);
    10576
    10677  double skewness_gsl=statistics::skewness(gsl_vec);
     
    11990  return suite.return_value();
    12091}
     92
     93void test_percentiler(test::Suite& suite)
     94{
     95  suite.err() << "testing unweighted percentile2" << std::endl;
     96  std::vector<double> x;
     97  x.reserve(6);
     98  for (unsigned int i=0; i<5; i++){
     99    x.push_back(static_cast<double>(i));
     100  }
     101  test_percentiler(suite, x.begin(), x.end(), 50, 2);
     102  x.push_back(5);
     103  test_percentiler(suite, x.begin(), x.end(), 50, 2.5);
     104  test_percentiler(suite, x.begin(), x.end(), 25, 1);
     105  test_percentiler(suite, x.begin(), x.end(), 0, 0);
     106  test_percentiler(suite, x.begin(), x.end(), 10, 0);
     107
     108  suite.err() << "testing duplication of data\n";
     109  std::vector<double> x2(x);
     110  for (size_t i=0; i<x.size(); ++i)
     111    x2.push_back(x[i]);
     112  cmp_percentiler(suite, x.begin(), x.end(), x2.begin(), x2.end());
     113
     114
     115  // testing weighted
     116
     117  suite.err() << "testing weighted percentile2" << std::endl;
     118  std::vector<utility::DataWeight> xw(x.size());
     119  for (size_t i=0; i<xw.size(); ++i) {
     120    xw[i].data() = x[i];
     121    xw[i].weight() = 1.0;
     122  }
     123  const std::vector<utility::DataWeight> xw_orig(xw);
     124  suite.err() << "testing weighted with unity weights" << std::endl;
     125  cmp_percentiler(suite, x.begin(), x.end(), xw.begin(), xw.end());
     126
     127  suite.err() << "testing that w=0 equals removed data point\n";
     128  xw=xw_orig;
     129  std::vector<utility::DataWeight> xw2(xw_orig);
     130  xw[3].weight() = 0.0;
     131  xw2.erase(xw2.begin()+3);
     132  cmp_percentiler(suite, xw.begin(), xw.end(), xw2.begin(), xw2.end());
     133
     134  suite.err() << "testing rescaling of weights\n";
     135  xw2 = xw;
     136  for (size_t i=0; i<xw2.size(); ++i)
     137    xw2[i].weight()*=2;
     138  cmp_percentiler(suite, xw.begin(), xw.end(), xw2.begin(), xw2.end());
     139
     140}
     141
     142template<typename RandomAccessIterator>
     143void test_percentiler(test::Suite& suite,
     144                      RandomAccessIterator first,
     145                      RandomAccessIterator last,
     146                      double p, double correct)
     147{
     148  using statistics::percentile2;
     149  double x = percentile2(first, last, p);
     150  if (!suite.add(suite.equal(x, correct, 10))) {
     151    suite.err() << "Error in percentile2\n";
     152    suite.err() << "  calculated value: " << x << "\n";
     153    suite.err() << "  expected value: " << correct << "\n";
     154  }
     155}
     156
     157template<typename RandomAccessIterator1, typename RandomAccessIterator2>
     158void cmp_percentiler(test::Suite& suite,
     159                     RandomAccessIterator1 first1,
     160                     RandomAccessIterator1 last1,
     161                     RandomAccessIterator2 first2,
     162                     RandomAccessIterator2 last2)
     163{
     164  for (double p=0; p<100; p+=10) {
     165    double correct=statistics::percentile2(first1, last1, p);
     166    test_percentiler(suite, first2, last2, p, correct);
     167  }
     168
     169}
Note: See TracChangeset for help on using the changeset viewer.