// // Utility // #include #include #include "utility.h" typedef float(*utility_function_prototype)(float _x, float _eta, float _sig); float util_func_atan(float _x, float _eta, float _sig); float util_func_gauss(float _x, float _eta, float _sig); struct utility_s { float target; int shape; int scale; int minmax; utility_function_prototype f; float eta; float sig; }; utility utility_create(float _target, int _shape, int _scale, int _minmax) { utility u = (utility) malloc(sizeof(struct utility_s)); u->target = _target; u->shape = _shape; u->scale = _scale; u->minmax = _minmax; switch (u->shape) { case UTIL_SHAPE_BELL: u->f = &util_func_gauss; u->eta = u->target; u->sig = 1.0f; break; case UTIL_SHAPE_RAMP: u->f = &util_func_atan; u->eta = 0.0f; u->sig = 1.0f; break; default:; } return u; } void utility_free(utility _u) { free(_u); } float utility_evaluate(utility _u, float _x) { float y = _x / _u->target; if (_u->scale==UTIL_REL_LOG) y = logf(y); return _u->f( y, _u->eta, _u->sig); } float util_func_atan(float _x, float _eta, float _sig) { return tanhf((_x-_eta)/_sig); } float util_func_gauss(float _x, float _eta, float _sig) { return expf( -powf((_x-_eta),2)/(2*_sig*_sig) ); }