|
Packit |
67cb25 |
#include <config.h>
|
|
Packit |
67cb25 |
#include <math.h>
|
|
Packit |
67cb25 |
#include <gsl/gsl_statistics.h>
|
|
Packit |
67cb25 |
#include <gsl/gsl_vector.h>
|
|
Packit |
67cb25 |
#include <gsl/gsl_sort_vector.h>
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
static int compute_rank(gsl_vector *v);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
#define BASE_LONG_DOUBLE
|
|
Packit |
67cb25 |
#include "templates_on.h"
|
|
Packit |
67cb25 |
#include "covariance_source.c"
|
|
Packit |
67cb25 |
#include "templates_off.h"
|
|
Packit |
67cb25 |
#undef BASE_LONG_DOUBLE
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
#define BASE_DOUBLE
|
|
Packit |
67cb25 |
#include "templates_on.h"
|
|
Packit |
67cb25 |
#include "covariance_source.c"
|
|
Packit |
67cb25 |
#include "templates_off.h"
|
|
Packit |
67cb25 |
#undef BASE_DOUBLE
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
#define BASE_FLOAT
|
|
Packit |
67cb25 |
#include "templates_on.h"
|
|
Packit |
67cb25 |
#include "covariance_source.c"
|
|
Packit |
67cb25 |
#include "templates_off.h"
|
|
Packit |
67cb25 |
#undef BASE_FLOAT
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
#define BASE_ULONG
|
|
Packit |
67cb25 |
#include "templates_on.h"
|
|
Packit |
67cb25 |
#include "covariance_source.c"
|
|
Packit |
67cb25 |
#include "templates_off.h"
|
|
Packit |
67cb25 |
#undef BASE_ULONG
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
#define BASE_LONG
|
|
Packit |
67cb25 |
#include "templates_on.h"
|
|
Packit |
67cb25 |
#include "covariance_source.c"
|
|
Packit |
67cb25 |
#include "templates_off.h"
|
|
Packit |
67cb25 |
#undef BASE_LONG
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
#define BASE_UINT
|
|
Packit |
67cb25 |
#include "templates_on.h"
|
|
Packit |
67cb25 |
#include "covariance_source.c"
|
|
Packit |
67cb25 |
#include "templates_off.h"
|
|
Packit |
67cb25 |
#undef BASE_UINT
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
#define BASE_INT
|
|
Packit |
67cb25 |
#include "templates_on.h"
|
|
Packit |
67cb25 |
#include "covariance_source.c"
|
|
Packit |
67cb25 |
#include "templates_off.h"
|
|
Packit |
67cb25 |
#undef BASE_INT
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
#define BASE_USHORT
|
|
Packit |
67cb25 |
#include "templates_on.h"
|
|
Packit |
67cb25 |
#include "covariance_source.c"
|
|
Packit |
67cb25 |
#include "templates_off.h"
|
|
Packit |
67cb25 |
#undef BASE_USHORT
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
#define BASE_SHORT
|
|
Packit |
67cb25 |
#include "templates_on.h"
|
|
Packit |
67cb25 |
#include "covariance_source.c"
|
|
Packit |
67cb25 |
#include "templates_off.h"
|
|
Packit |
67cb25 |
#undef BASE_SHORT
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
#define BASE_UCHAR
|
|
Packit |
67cb25 |
#include "templates_on.h"
|
|
Packit |
67cb25 |
#include "covariance_source.c"
|
|
Packit |
67cb25 |
#include "templates_off.h"
|
|
Packit |
67cb25 |
#undef BASE_UCHAR
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
#define BASE_CHAR
|
|
Packit |
67cb25 |
#include "templates_on.h"
|
|
Packit |
67cb25 |
#include "covariance_source.c"
|
|
Packit |
67cb25 |
#include "templates_off.h"
|
|
Packit |
67cb25 |
#undef BASE_CHAR
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
/*
|
|
Packit |
67cb25 |
compute_rank()
|
|
Packit |
67cb25 |
Compute rank of a sorted vector
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
Inputs: v - sorted data vector on input; rank vector on output
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
Notes: ranks are always computed in double precision
|
|
Packit |
67cb25 |
*/
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
static int
|
|
Packit |
67cb25 |
compute_rank(gsl_vector *v)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
const size_t n = v->size;
|
|
Packit |
67cb25 |
size_t i = 0;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
while (i < n - 1)
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
double vi = gsl_vector_get(v, i);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
if (vi == gsl_vector_get(v, i + 1))
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
size_t j = i + 2;
|
|
Packit |
67cb25 |
size_t k;
|
|
Packit |
67cb25 |
double rank = 0.0;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
/* we have detected a tie, find number of equal elements */
|
|
Packit |
67cb25 |
while (j < n && vi == gsl_vector_get(v, j))
|
|
Packit |
67cb25 |
++j;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
/* compute rank */
|
|
Packit |
67cb25 |
for (k = i; k < j; ++k)
|
|
Packit |
67cb25 |
rank += k + 1.0;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
/* divide by number of ties */
|
|
Packit |
67cb25 |
rank /= (double) (j - i);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
for (k = i; k < j; ++k)
|
|
Packit |
67cb25 |
gsl_vector_set(v, k, rank);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
i = j;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
else
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
/* no tie - set rank to natural ordered position */
|
|
Packit |
67cb25 |
gsl_vector_set(v, i, i + 1.0);
|
|
Packit |
67cb25 |
++i;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
if (i == n - 1)
|
|
Packit |
67cb25 |
gsl_vector_set(v, n - 1, (double) n);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
return GSL_SUCCESS;
|
|
Packit |
67cb25 |
} /* compute_rank() */
|