/* statistics/test_int_source.c
 * 
 * Copyright (C) 1996, 1997, 1998, 1999, 2000 Jim Davies, Brian Gough
 * 
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or (at
 * your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 */

void FUNCTION (test, func) (const size_t stridea, const size_t strideb);

void
FUNCTION (test, func) (const size_t stridea, const size_t strideb)
{
  /* sample sets of integers */
  size_t i;
  const size_t ina = 20, inb = 20;

  const BASE raw1[] = {1, 2, 3, 4, 5, 6} ;
  
  const BASE irawa[] =
  {17, 18, 16, 18, 12,
   20, 18, 20, 20, 22,
   20, 10, 8, 12, 16,
   16, 18, 20, 18, 21};

  const BASE irawb[] =
  {19, 20, 22, 24, 10,
   25, 20, 22, 21, 23,
   20, 10, 12, 14, 12,
   20, 22, 24, 23, 17};

  BASE * sorted ;

  BASE * test1 = (BASE *) malloc (stridea * 6 * sizeof(BASE));
  BASE * igroupa = (BASE *) malloc (stridea * ina * sizeof(BASE));
  BASE * igroupb = (BASE *) malloc (strideb * inb * sizeof(BASE));

  double rel = 1e-10 ;

  for (i = 0 ; i < ina ; i++)
    igroupa[i * stridea] = irawa[i] ;

  for (i = 0 ; i < inb ; i++)
    igroupb[i * strideb] = irawb[i] ;

  for (i = 0 ; i < 6 ; i++)
    test1[i * stridea] = raw1[i] ;



  {
    double mean = FUNCTION(gsl_stats,mean) (igroupa, stridea, ina);
    double expected = 17.0;
    gsl_test_rel (mean,expected, rel, NAME(gsl_stats) "_mean (integer)");
  }

  {
    double mean = FUNCTION(gsl_stats,mean) (test1, stridea, 6);
    double expected = 3.5;
    gsl_test_rel (mean,expected, rel, NAME(gsl_stats) "_mean (fractional)");
  }

  {
    double mean = FUNCTION(gsl_stats,mean) (igroupa, stridea, ina);
    double var = FUNCTION(gsl_stats,variance_with_fixed_mean) (igroupa, stridea, ina, mean);
    double expected = 13.7;
    gsl_test_rel (var, expected, rel, NAME(gsl_stats) "_variance_with_fixed_mean");
  }

  {
    double mean = FUNCTION(gsl_stats,mean) (igroupa, stridea, ina);
    double sd = FUNCTION(gsl_stats,sd_with_fixed_mean) (igroupa, stridea, ina, mean);
    double expected = 3.70135110466435;
    gsl_test_rel (sd, expected, rel, NAME(gsl_stats) "_sd_with_fixed_mean");
  }

  {
    double var = FUNCTION(gsl_stats,variance) (igroupa, stridea, ina);
    double expected = 14.4210526315789;
    gsl_test_rel (var, expected, rel, NAME(gsl_stats) "_variance");
  }

  {
    double sd_est = FUNCTION(gsl_stats,sd) (igroupa, stridea, ina);
    double expected = 3.79750610685209;
    gsl_test_rel (sd_est, expected, rel, NAME(gsl_stats) "_sd");
  }

  {
    double absdev = FUNCTION(gsl_stats,absdev) (igroupa, stridea, ina);
    double expected = 2.9;
    gsl_test_rel (absdev, expected, rel, NAME(gsl_stats) "_absdev");
  }

  {
    double skew = FUNCTION(gsl_stats,skew) (igroupa, stridea, ina);
    double expected = -0.909355923168064;
    gsl_test_rel (skew, expected, rel, NAME(gsl_stats) "_skew");
  }

  {
    double kurt = FUNCTION(gsl_stats,kurtosis) (igroupa, stridea, ina);
    double expected = -0.233692524908094 ;
    gsl_test_rel (kurt, expected, rel, NAME(gsl_stats) "_kurtosis");
  }

  {
    double c = FUNCTION(gsl_stats,covariance) (igroupa, stridea, igroupb, strideb, inb);
    double expected = 14.5263157894737;
    gsl_test_rel (c, expected, rel, NAME(gsl_stats) "_covariance");
  }


  {
    double pv = FUNCTION(gsl_stats,pvariance) (igroupa, stridea, ina, igroupb, strideb, inb);
    double expected = 18.8421052631579;
    gsl_test_rel (pv, expected, rel, NAME(gsl_stats) "_pvariance");
  }

  {
    double t = FUNCTION(gsl_stats,ttest) (igroupa, stridea, ina, igroupb, strideb, inb);
    double expected = -1.45701922702927;
    gsl_test_rel (t, expected, rel, NAME(gsl_stats) "_ttest");
  }

  {
    int max = FUNCTION(gsl_stats,max) (igroupa, stridea, ina);
    int expected = 22;
    gsl_test (max != expected,
              NAME(gsl_stats) "_max (%d observed vs %d expected)", max, expected);
  }

  {
    int min = FUNCTION(gsl_stats,min) (igroupa, stridea, ina);
    int expected = 8;
    gsl_test (min != expected,
              NAME(gsl_stats) "_min (%d observed vs %d expected)", min, expected);
  }

  {
    BASE min, max;
    BASE expected_max = 22;
    BASE expected_min = 8;
    
    FUNCTION(gsl_stats,minmax) (&min, &max, igroupa, stridea, ina);
 
    gsl_test  (max != expected_max,
               NAME(gsl_stats) "_minmax max (" OUT_FORMAT " observed vs " OUT_FORMAT " expected)", 
               max, expected_max);
    gsl_test  (min != expected_min,
               NAME(gsl_stats) "_minmax min (" OUT_FORMAT " observed vs " OUT_FORMAT " expected)", 
               min, expected_min);
  }

  {
    int max_index = FUNCTION(gsl_stats,max_index) (igroupa, stridea, ina);
    int expected = 9 ;
    gsl_test (max_index != expected,
              NAME(gsl_stats) "_max_index (%d observed vs %d expected)",
              max_index, expected);
  }

  {
    int min_index = FUNCTION(gsl_stats,min_index) (igroupa, stridea, ina);
    int expected = 12 ;
    gsl_test (min_index != expected,
              NAME(gsl_stats) "_min_index (%d observed vs %d expected)",
              min_index, expected);
  }

  {
    size_t min_index, max_index;
    size_t expected_max_index = 9;
    size_t expected_min_index = 12;

    FUNCTION(gsl_stats,minmax_index) (&min_index, &max_index, igroupa, stridea, ina);

    gsl_test  (max_index != expected_max_index,
               NAME(gsl_stats) "_minmax_index max (%u observed vs %u expected)", 
               max_index, expected_max_index);
    gsl_test  (min_index != expected_min_index,
               NAME(gsl_stats) "_minmax_index min (%u observed vs %u expected)", 
               min_index, expected_min_index);
  }


  sorted = (BASE *) malloc(stridea * ina * sizeof(BASE)) ;

  for (i = 0 ; i < ina ; i++)
    sorted[stridea * i] = igroupa[stridea * i] ;


  TYPE(gsl_sort)(sorted, stridea, ina) ;

  {
    double median = FUNCTION(gsl_stats,median_from_sorted_data)(sorted, stridea, ina) ;
    double expected = 18;
    gsl_test_rel (median,expected, rel,
                  NAME(gsl_stats) "_median_from_sorted_data (even)");
  }

  {
    double median = FUNCTION(gsl_stats,median_from_sorted_data)(sorted, stridea, ina - 1) ;
    double expected = 18;
    gsl_test_rel (median,expected, rel,
                  NAME(gsl_stats) "_median_from_sorted_data (odd)");
  }


  {
    double zeroth = FUNCTION(gsl_stats,quantile_from_sorted_data)(sorted, stridea, ina, 0.0) ;
    double expected = 8;
    gsl_test_rel (zeroth,expected, rel,
                  NAME(gsl_stats) "_quantile_from_sorted_data (0)");
  }

  {
    double top = FUNCTION(gsl_stats,quantile_from_sorted_data)(sorted, stridea, ina, 1.0) ;
    double expected = 22;
    gsl_test_rel (top,expected, rel,
                  NAME(gsl_stats) "_quantile_from_sorted_data (100)");
  }

  {
    double median = FUNCTION(gsl_stats,quantile_from_sorted_data)(sorted, stridea, ina, 0.5) ;
    double expected = 18;
    gsl_test_rel (median,expected, rel,
                  NAME(gsl_stats) "_quantile_from_sorted_data (50, even)");
  }

  {
    double median = FUNCTION(gsl_stats,quantile_from_sorted_data)(sorted, stridea, ina - 1, 0.5);
    double expected = 18;
    gsl_test_rel (median,expected, rel,
                  NAME(gsl_stats) "_quantile_from_sorted_data (50, odd)");
  }

  free (sorted);
  free (igroupa);
  free (igroupb);
  free (test1);
}
