diff options
Diffstat (limited to 'lib/crossover.c')
| -rw-r--r-- | lib/crossover.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/lib/crossover.c b/lib/crossover.c new file mode 100644 index 0000000..92a0c9e --- /dev/null +++ b/lib/crossover.c @@ -0,0 +1,60 @@ +// Crossover +// +// crossover - crossover +// +// ⎧ -1 if x0_i < x1_i and x0_i-1 > x1_i-1 +// y_i = ⎨ 0 if x = 0 +// ⎩ 1 if x0_i > x1_i and x0_i-1 < x1_i-1 +// +// Inputs: 2 +// Outputs: 1 +// Constants: 0 + + +#include <math.h> +#include "ts.h" + + + +ts_parameter_t const ts_crossover_p = { .n_inputs = 2, .n_outputs = 1, .n_constants = 0, .params_size = 0 }; + + +uint_t ts_crossover_offset( ts_constant_t const *c ) +{ + ( void )c; + return ( 1 ); +} + +int ts_crossover( + 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_crossover_p ); + (void)c; + if ( n < 2 ) return -1; + + uint_t xi; + uint_t yi; + + xi = 1; + yi = 1; + + y[0][0] = 0; + for( ; xi < n; xi++, yi++ ) + { + if( x[0][xi] > x[1][xi] && x[0][xi - 1] <= x[1][xi - 1] ) + y[0][yi] = 1; + + else if( x[0][xi] < x[1][xi] && x[0][xi - 1] >= x[1][xi - 1] ) + y[0][yi] = -1; + + else + y[0][yi] = 0; + } + return 0; +} + + + |