// // Utility // #include #include #include #include "utility.h" typedef float(*utility_function_prototype)(float _x, float _eta, float _sig); float util_func_tanh(float _x, float _eta, float _sig); float util_func_gauss(float _x, float _eta, float _sig); struct utility_s { float target; int goal; int scale; bool flip; utility_function_prototype f; float eta; float sig; }; utility utility_create(float _target, int _goal, int _scale) { utility u = (utility) malloc(sizeof(struct utility_s)); u->target = _target; u->goal = _goal; u->scale = _scale; switch (u->goal) { case UTIL_GOAL_MIN: u->f = &util_func_tanh; u->eta = u->target; u->sig = 1.0f; u->flip = true; break; case UTIL_GOAL_MAX: u->f = &util_func_tanh; u->eta = u->target; u->sig = 1.0f; u->flip = false; break; case UTIL_GOAL_MEET: u->f = &util_func_gauss; u->eta = u->target; u->sig = 1.0f; u->flip = false; break; case UTIL_GOAL_AVOID: u->f = &util_func_gauss; u->eta = u->target; u->sig = 1.0f; u->flip = true; break; default:; } return u; } void utility_free(utility _u) { free(_u); } float utility_evaluate(utility _u, float _x) { float y = _x; if (_u->scale==UTIL_SCALE_LOG) y = logf(y); float v = _u->f( y, _u->eta, _u->sig); return (_u->flip) ? 1-v : v; } float util_func_tanh(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) ); }