summaryrefslogtreecommitdiffstats
path: root/test/gopalakrishnan_range_index.c
blob: 6b8167a475ff7b1330bb225029db35ddafa08d8a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <math.h>
#include <stddef.h>
#include "ts.h"

bool ts_test_gopalakrishnan_range_index( void )
{
    fp_t const x0[] = { 10, 10, 10, 20, 20, 20 };
    fp_t const x1[] = { 14, 13, 14, 24, 23, 24 };
    fp_t const x2[] = { 8,  9,  8,  18, 19, 18 };
    fp_t const x3[] = { 12, 11, 13, 22, 21, 23 };

    fp_t const * const x[] = { x0, x1, x2, x3 };

    uint_t k = 2;

    fp_t sum_abs = fabs( x3[1] - x3[0] ) + fabs( x3[2] - x3[1] );
    fp_t sum_range = ( x1[1] - x2[1] ) + ( x1[2] - x2[2] );
    fp_t e0 = sum_range != 0 ? sum_abs / sum_range : 0;

    fp_t abs_ring[2] = { fabs(x3[1]-x3[0]), fabs(x3[2]-x3[1]) };
    fp_t range_ring[2] = { x1[1]-x2[1], x1[2]-x2[2] };
    fp_t e[4] = { e0 };

    for ( uint_t i = 3; i < 6; ++i )
    {
        fp_t new_abs = fabs( x3[i] - x3[i-1] );
        fp_t new_range = x1[i] - x2[i];
        uint_t idx = ( i - k - 1 ) % k;
        sum_abs += new_abs - abs_ring[ idx ];
        sum_range += new_range - range_ring[ idx ];
        abs_ring[ ( i - 1 ) % k ] = new_abs;
        range_ring[ ( i - 1 ) % k ] = new_range;
        e[ i - k ] = sum_range != 0 ? sum_abs / sum_range : 0;
    }

    fp_t const * const exp[1] = { e };

    return ts_test(ts_gopalakrishnan_range_index, ts_gopalakrishnan_range_index_offset, x, exp, sizeof( x0 ) / sizeof( *x0 ), (ts_constant_t *)&k, &ts_gopalakrishnan_range_index_p);
}