Show
Ignore:
Timestamp:
10/08/08 11:06:37 (16 years ago)
Author:
jgaeddert
Message:

reformatting goals, etc.; still needs work

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • vtcross/trunk/src/utility.c

    r14 r15  
    55#include <math.h> 
    66#include <stdlib.h> 
     7#include <stdbool.h> 
     8 
    79#include "utility.h" 
    810 
    911typedef float(*utility_function_prototype)(float _x, float _eta, float _sig); 
    10 float util_func_atan(float _x, float _eta, float _sig); 
     12float util_func_tanh(float _x, float _eta, float _sig); 
    1113float util_func_gauss(float _x, float _eta, float _sig); 
    1214 
    1315struct utility_s { 
    1416    float target; 
    15     int shape; 
     17    int goal; 
    1618    int scale; 
    17     int minmax; 
     19    bool flip; 
    1820    utility_function_prototype f; 
    1921    float eta; 
     
    2123}; 
    2224 
    23 utility utility_create(float _target, int _shape, int _scale, int _minmax) 
     25utility utility_create(float _target, int _goal, int _scale) 
    2426{ 
    2527    utility u = (utility) malloc(sizeof(struct utility_s)); 
    2628    u->target = _target; 
    27     u->shape = _shape; 
     29    u->goal = _goal; 
    2830    u->scale = _scale; 
    29     u->minmax = _minmax; 
    3031 
    31     switch (u->shape) { 
    32     case UTIL_SHAPE_BELL: 
     32    switch (u->goal) { 
     33    case UTIL_GOAL_MIN: 
     34        u->f = &util_func_tanh; 
     35        u->eta = u->target; 
     36        u->sig = 1.0f; 
     37        u->flip = true; 
     38        break; 
     39    case UTIL_GOAL_MAX: 
     40        u->f = &util_func_tanh; 
     41        u->eta = u->target; 
     42        u->sig = 1.0f; 
     43        u->flip = false; 
     44        break; 
     45    case UTIL_GOAL_MEET: 
    3346        u->f = &util_func_gauss; 
    3447        u->eta = u->target; 
    3548        u->sig = 1.0f; 
     49        u->flip = false; 
    3650        break; 
    37     case UTIL_SHAPE_RAMP: 
    38         u->f = &util_func_atan; 
    39         u->eta = 0.0f; 
     51    case UTIL_GOAL_AVOID: 
     52        u->f = &util_func_gauss; 
     53        u->eta = u->target; 
    4054        u->sig = 1.0f; 
     55        u->flip = true; 
    4156        break; 
    4257    default:; 
     
    5368float utility_evaluate(utility _u, float _x) 
    5469{ 
    55     float y = _x / _u->target; 
    56     if (_u->scale==UTIL_REL_LOG) 
     70    float y = _x; 
     71    if (_u->scale==UTIL_SCALE_LOG) 
    5772        y = logf(y); 
    58     return _u->f( y, _u->eta, _u->sig); 
     73    float v = _u->f( y, _u->eta, _u->sig); 
     74    return (_u->flip) ? 1-v : v; 
    5975 
    6076} 
    6177 
    62 float util_func_atan(float _x, float _eta, float _sig) { 
     78float util_func_tanh(float _x, float _eta, float _sig) { 
    6379    return tanhf((_x-_eta)/_sig); 
    6480}