diff options
| author | Ethan Werner <mail@ethanwerner.com> | 2026-07-01 09:42:39 +0400 |
|---|---|---|
| committer | Ethan Werner <mail@ethanwerner.com> | 2026-07-01 09:42:39 +0400 |
| commit | 07e18043145f3d91c8ea7ec3ad41b3c905585277 (patch) | |
| tree | 2bdeae46973f4bdfce263679a4008ac768011f28 /test/gopalakrishnan_range_index.c | |
initial commit: ts time series analysis library v0.1.0
- 354 financial and mathematical time-series indicators
- Uniform C11 API with consistent function signatures
- 349 passing tests with -Werror
- Static and shared library builds
- pkg-config integration
- Python bindings
- Fuzzing and sanitizer support
- Security hardening flags
Diffstat (limited to 'test/gopalakrishnan_range_index.c')
| -rw-r--r-- | test/gopalakrishnan_range_index.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/test/gopalakrishnan_range_index.c b/test/gopalakrishnan_range_index.c new file mode 100644 index 0000000..6b8167a --- /dev/null +++ b/test/gopalakrishnan_range_index.c @@ -0,0 +1,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); +} |