#include #include #include #include #include "ts.h" fp_t * ts_fill( fp_t *x, uint_t n, fp_t x0, fp_t x1 ) { if ( !x || n == 0 ) return x; fp_t step = n > 1 ? ( x1 - x0 ) / ( fp_t )( n - 1 ) : 0.0; if( fabs( x0 ) < TS_FILL_ZERO_THRESHOLD && fabs( x1 ) < TS_FILL_ZERO_THRESHOLD ) { memset( x, 0, sizeof( fp_t ) * n ); } else { for( uint_t i = 0; i < n; i++ ) { x[i] = x0 + ( (fp_t)i * step ); } } return x; } void ts_print( fp_t const *x, uint_t n, FILE *stream ) { if ( !x || n == 0 ) return; FILE *out = stream ? stream : stdout; fputc( '[', out ); for ( uint_t i = 0; i < n - 1; i++ ) { fprintf( out, "%f,", x[i] ); } fprintf( out, "%f]", x[n - 1] ); } void ts_pretty_print( fp_t const * const *x, uint_t m, uint_t n, FILE *stream ) { if ( !x || m == 0 || n == 0 ) return; FILE *out = stream ? stream : stdout; if( m > 1 ) { for( uint_t i = 0; i < n; i++ ) { for( uint_t j = 0; j < m; j++ ) { fprintf( out, "%f ", x[j][i] ); } fputs( "\n", out ); } } else { for( uint_t i = 0; i < n; i++ ) { fprintf( out, "%f\n", x[0][i] ); } } } fp_t _ts_square( fp_t x ) { return x * x; } fp_t _ts_reciprocal( fp_t x ) { return x != 0 ? 1.0 / x : INFINITY; } fp_t _ts_square_pyramidal_number( fp_t x ) { return ( x * ( x + 1 ) * ( 2 * x + 1 ) ) / 6; } fp_t _ts_triangle_number( fp_t x ) { return ( ( x ) * ( ( x ) + 1 ) ) * 0.5; } fp_t _ts_sum_to_covariance( fp_t sum_xy, fp_t sum_x, fp_t sum_y, uint_t k ) { if ( k == 0 ) return 0.0; return ( sum_xy - ( sum_x * sum_y / k ) ) / k; } fp_t _ts_sum_to_variance( fp_t sum_x2, fp_t sum_x, uint_t k ) { return fmax( 0.0, _ts_sum_to_covariance( sum_x2, sum_x, sum_x, k ) ); } uint_t _ts_circle_increment( uint_t i, uint_t k ) { if ( k == 0 ) return i; return ( i + 1 ) % k; }