Changeset 897
- Timestamp:
- Feb 19, 2008 2:48:42 PM (16 years ago)
- Location:
- trunk/optimizer
- Files:
-
- 19 added
- 1 deleted
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/optimizer/src/rp_optimizer.c
r809 r897 9 9 * ====================================================================== 10 10 * AUTHOR: Michael McLennan, Purdue University 11 * Copyright (c) 200 4-2007Purdue Research Foundation11 * Copyright (c) 2008 Purdue Research Foundation 12 12 * 13 13 * See the file "license.terms" for information on usage and … … 20 20 #include "rp_optimizer.h" 21 21 22 static void RpOptimCleanupParam _ANSI_ARGS_((RpOptimParam *paramPtr)); 23 22 24 /* 23 25 * ---------------------------------------------------------------------- … … 31 33 */ 32 34 RpOptimEnv* 33 RpOptimCreate() 35 RpOptimCreate(pluginData, cleanupPtr) 36 ClientData pluginData; /* special data created for this env */ 37 RpOptimCleanup *cleanupPtr; /* routine to clean up pluginData */ 34 38 { 35 39 RpOptimEnv *envPtr; 36 40 envPtr = (RpOptimEnv*)malloc(sizeof(RpOptimEnv)); 41 envPtr->pluginData = pluginData; 42 envPtr->cleanupPtr = cleanupPtr; 43 37 44 envPtr->numParams = 0; 38 envPtr->maxParams = 2;45 envPtr->maxParams = 5; 39 46 envPtr->paramList = (RpOptimParam**)malloc( 40 47 (size_t)(envPtr->maxParams*sizeof(RpOptimParam*)) … … 90 97 * ---------------------------------------------------------------------- 91 98 */ 92 void 93 RpOptimAddParamNumber(envPtr, name , min, max)99 RpOptimParam* 100 RpOptimAddParamNumber(envPtr, name) 94 101 RpOptimEnv *envPtr; /* context for this optimization */ 95 102 char *name; /* name of this parameter */ 96 double min; /* minimum value for this parameter */97 double max; /* minimum value for this parameter */98 103 { 99 104 RpOptimParamNumber *numPtr; … … 102 107 numPtr->base.type = RP_OPTIMPARAM_NUMBER; 103 108 numPtr->base.value.num = 0.0; 104 numPtr->min = min;105 numPtr->max = max;109 numPtr->min = -DBL_MAX; 110 numPtr->max = DBL_MAX; 106 111 107 112 RpOptimAddParam(envPtr, (RpOptimParam*)numPtr); 113 114 return (RpOptimParam*)numPtr; 108 115 } 109 116 … … 118 125 * ---------------------------------------------------------------------- 119 126 */ 120 void 121 RpOptimAddParamString(envPtr, name , allowedValues)127 RpOptimParam* 128 RpOptimAddParamString(envPtr, name) 122 129 RpOptimEnv *envPtr; /* context for this optimization */ 123 130 char *name; /* name of this parameter */ 124 char **allowedValues; /* null-term list of allowed values */ 125 { 126 int n; 127 RpOptimParam **endPtrPtr; 131 { 128 132 RpOptimParamString *strPtr; 129 133 strPtr = (RpOptimParamString*)malloc(sizeof(RpOptimParamString)); … … 131 135 strPtr->base.type = RP_OPTIMPARAM_STRING; 132 136 strPtr->base.value.str = NULL; 133 134 /* count the number of allowed values */ 135 if (allowedValues) { 136 for (n=0; allowedValues[n] != NULL; n++) 137 ; 138 } else { 139 n = 0; 140 } 141 strPtr->numValues = n; 142 strPtr->values = (char**)malloc(n*sizeof(char*)); 143 144 /* build a null-terminated list of copies of allowed values */ 145 for (n=0; n < strPtr->numValues; n++) { 146 strPtr->values[n] = strdup(allowedValues[n]); 147 } 137 strPtr->values = NULL; 148 138 149 139 RpOptimAddParam(envPtr, (RpOptimParam*)strPtr); 140 141 return (RpOptimParam*)strPtr; 142 } 143 144 /* 145 * ---------------------------------------------------------------------- 146 * RpOptimFindParam() 147 * 148 * Used to look for an existing parameter with the specified name. 149 * Returns a pointer to the parameter, or NULL if not found. 150 * ---------------------------------------------------------------------- 151 */ 152 RpOptimParam* 153 RpOptimFindParam(envPtr, name) 154 RpOptimEnv *envPtr; /* context for this optimization */ 155 char *name; /* name of this parameter */ 156 { 157 int n; 158 for (n=0; envPtr->numParams; n++) { 159 if (strcmp(name, envPtr->paramList[n]->name) == 0) { 160 return envPtr->paramList[n]; 161 } 162 } 163 return NULL; 164 } 165 166 /* 167 * ---------------------------------------------------------------------- 168 * RpOptimDeleteParam() 169 * 170 * Used to delete a parameter from the environment. This is especially 171 * useful when an error is found while configuring the parameter, just 172 * after it was created. If the name is not recognized, this function 173 * does nothing. 174 * ---------------------------------------------------------------------- 175 */ 176 void 177 RpOptimDeleteParam(envPtr, name) 178 RpOptimEnv *envPtr; /* context for this optimization */ 179 char *name; /* name of this parameter */ 180 { 181 int n, j; 182 for (n=0; envPtr->numParams; n++) { 183 if (strcmp(name, envPtr->paramList[n]->name) == 0) { 184 RpOptimCleanupParam(envPtr->paramList[n]); 185 for (j=n+1; j < envPtr->numParams; j++) { 186 envPtr->paramList[j-1] = envPtr->paramList[j]; 187 } 188 envPtr->numParams--; 189 break; 190 } 191 } 150 192 } 151 193 … … 172 214 RpOptimStatus status = RP_OPTIM_UNKNOWN; 173 215 174 int n, nruns, ival ;216 int n, nruns, ival, nvals; 175 217 double dval, fitness; 176 218 RpOptimParamNumber *numPtr; … … 201 243 case RP_OPTIMPARAM_STRING: 202 244 strPtr = (RpOptimParamString*)envPtr->paramList[n]; 203 ival = (int)floor(drand48() * strPtr->numValues); 245 for (nvals=0; strPtr->values[nvals]; nvals++) 246 ; /* count values */ 247 ival = (int)floor(drand48() * nvals); 204 248 envPtr->paramList[n]->value.str = strPtr->values[ival]; 205 249 break; … … 244 288 { 245 289 int n; 246 RpOptimParam *paramPtr; 290 291 for (n=0; n < envPtr->numParams; n++) { 292 RpOptimCleanupParam(envPtr->paramList[n]); 293 } 294 if (envPtr->cleanupPtr) { 295 (*envPtr->cleanupPtr)(envPtr->pluginData); 296 } 297 free(envPtr->paramList); 298 free(envPtr); 299 } 300 301 /* 302 * ---------------------------------------------------------------------- 303 * RpOptimCleanupParam() 304 * 305 * Used internally to free up the data associated with an optimization 306 * parameter. Looks at the parameter type and frees up the appropriate 307 * data. 308 * ---------------------------------------------------------------------- 309 */ 310 static void 311 RpOptimCleanupParam(paramPtr) 312 RpOptimParam *paramPtr; /* data to be freed */ 313 { 314 int n; 247 315 RpOptimParamNumber *numPtr; 248 316 RpOptimParamString *strPtr; 249 317 250 for (n=0; n < envPtr->numParams; n++) { 251 paramPtr = envPtr->paramList[n]; 252 free(paramPtr->name); 253 switch (paramPtr->type) { 254 case RP_OPTIMPARAM_NUMBER: 255 numPtr = (RpOptimParamNumber*)paramPtr; 256 /* nothing special to free here */ 257 break; 258 case RP_OPTIMPARAM_STRING: 259 strPtr = (RpOptimParamString*)paramPtr; 260 for (n=0; n < strPtr->numValues; n++) { 318 free(paramPtr->name); 319 switch (paramPtr->type) { 320 case RP_OPTIMPARAM_NUMBER: 321 numPtr = (RpOptimParamNumber*)paramPtr; 322 /* nothing special to free here */ 323 break; 324 case RP_OPTIMPARAM_STRING: 325 strPtr = (RpOptimParamString*)paramPtr; 326 if (strPtr->values) { 327 for (n=0; strPtr->values[n]; n++) { 261 328 free(strPtr->values[n]); 262 329 } 263 break; 264 } 265 free(paramPtr); 266 } 267 free(envPtr->paramList); 268 free(envPtr); 269 } 330 } 331 break; 332 } 333 free(paramPtr); 334 } -
trunk/optimizer/src/rp_optimizer.h
r809 r897 9 9 * ====================================================================== 10 10 * AUTHOR: Michael McLennan, Purdue University 11 * Copyright (c) 200 4-2007Purdue Research Foundation11 * Copyright (c) 2008 Purdue Research Foundation 12 12 * 13 13 * See the file "license.terms" for information on usage and … … 15 15 * ====================================================================== 16 16 */ 17 # undef _ANSI_ARGS_18 # undef CONST17 #ifndef RP_OPTIMIZER 18 #define RP_OPTIMIZER 19 19 20 #i fndef NO_CONST21 # define CONST const22 # else23 # define CONST24 # endif20 #include <tcl.h> 21 #include <math.h> 22 #include <float.h> 23 #include <string.h> 24 #include <malloc.h> 25 25 26 #ifndef NO_PROTOTYPES 27 # define _ANSI_ARGS_(x) x 28 #else 29 # define _ANSI_ARGS_(x) () 30 #endif 31 32 #ifdef EXTERN 33 # undef EXTERN 34 #endif 35 #ifdef __cplusplus 36 # define EXTERN extern "C" 37 #else 38 # define EXTERN extern 39 #endif 26 /* 27 * General-purpose allocation/cleanup routines: 28 * These are used, for example, for the plug-in architecture. 29 */ 30 typedef ClientData (RpOptimInit)_ANSI_ARGS_(()); 31 typedef void (RpOptimCleanup)_ANSI_ARGS_((ClientData cdata)); 40 32 41 33 /* … … 73 65 RpOptimParam base; /* basic parameter info */ 74 66 char **values; /* array of allowed values */ 75 int numValues; /* number of allowed values */76 67 } RpOptimParamString; 77 68 … … 81 72 */ 82 73 typedef struct RpOptimEnv { 74 ClientData pluginData; /* data created by plugin init routine */ 75 RpOptimCleanup *cleanupPtr; /* cleanup routine for pluginData */ 83 76 RpOptimParam **paramList; /* list of input parameters to vary */ 84 77 int numParams; /* current number of parameters */ … … 98 91 int numValues, double *fitnessPtr)); 99 92 100 101 93 /* 102 94 * Here are the functions in the API: 103 95 */ 104 EXTERN RpOptimEnv* RpOptimCreate _ANSI_ARGS_(()); 96 EXTERN RpOptimEnv* RpOptimCreate _ANSI_ARGS_((ClientData pluginData, 97 RpOptimCleanup *cleanupPtr)); 105 98 106 EXTERN voidRpOptimAddParamNumber _ANSI_ARGS_((RpOptimEnv *envPtr,107 char *name , double min, double max));99 EXTERN RpOptimParam* RpOptimAddParamNumber _ANSI_ARGS_((RpOptimEnv *envPtr, 100 char *name)); 108 101 109 EXTERN void RpOptimAddParamString _ANSI_ARGS_((RpOptimEnv *envPtr, 110 char *name, char **allowedValues)); 102 EXTERN RpOptimParam* RpOptimAddParamString _ANSI_ARGS_((RpOptimEnv *envPtr, 103 char *name)); 104 105 EXTERN RpOptimParam* RpOptimFindParam _ANSI_ARGS_((RpOptimEnv *envPtr, 106 char *name)); 107 108 EXTERN void RpOptimDeleteParam _ANSI_ARGS_((RpOptimEnv *envPtr, char *name)); 111 109 112 110 EXTERN RpOptimStatus RpOptimPerform _ANSI_ARGS_((RpOptimEnv *envPtr, … … 114 112 115 113 EXTERN void RpOptimDelete _ANSI_ARGS_((RpOptimEnv *envPtr)); 114 115 #endif
Note: See TracChangeset
for help on using the changeset viewer.