// Linear Decay // // decay_linear - decay // // Propogates the maximum values of a function into the future for at most k periods // // y_i = max( x_i, y_i-1 - k ) // // Inputs: 1 // Outputs: 1 // Constants: 0 #include #include "ts.h" typedef struct { uint_t k; } ts_decay_linear_params_t; ts_parameter_t const ts_decay_linear_p = { .n_inputs = 1, .n_outputs = 1, .n_constants = 1, .params_size = sizeof(ts_decay_linear_params_t) }; uint_t ts_decay_linear_offset( ts_constant_t const *c ) { ( void )c; return ( c ? ((ts_decay_linear_params_t const *)c)->k : 0 ); } int ts_decay_linear( fp_t * const *y, uint_t y_n, fp_t const * const *x, uint_t x_n, uint_t n, ts_constant_t const *c ) { TS_PROLOGUE( ts_decay_linear_p ); if ( !c ) return -1; uint_t k = ((ts_decay_linear_params_t const *)c)->k; if (k == 0 || n < k) return -1; for (uint_t zi = 0; zi < k; ++zi) y[0][zi] = 0; uint_t xi = 1; fp_t prev = x[0][0]; fp_t r = prev / (fp_t)k; for( ; xi < k; xi++ ) { prev -= r; if( x[0][xi] > prev ) { prev = x[0][xi]; r = x[0][xi] / (fp_t)k; } else { prev = fmax( prev, 0 ); } } for( uint_t yi = k; xi < n; xi++, yi++ ) { fp_t curr = prev - r; if( x[0][xi] > curr ) { curr = x[0][xi]; r = x[0][xi] / (fp_t)k; } else { curr = fmax( curr, 0 ); } y[0][yi] = curr; prev = curr; } return 0; }