Doxygen Source Code Documentation
Simplexx.c File Reference
Go to the source code of this file.
| Functions | |
| void | allocate_arrays (float ***simplex, float **centroid, float **response, float **step_size, float **test1, float **test2) | 
| void | deallocate_arrays (float ***simplex, float **centroid, float **response, float **step_size, float **test1, float **test2) | 
| void | eval_vertices (float *response, int *worst, int *next, int *best) | 
| void | restart (float **simplex, float *response, float *step_size) | 
| void | calc_centroid (float **simplex, int worst, float *centroid) | 
| void | calc_reflection (float **simplex, float *centroid, int worst, float coef, float *vertex) | 
| void | replace (float **simplex, float *response, int index, float *vertex, float resp) | 
| float | calc_good_fit (float *response) | 
| void | simplex_initialize (float *parameters, float **simplex, float *response, float *step_size) | 
| void | simplex_optimization (float *parameters, float *sse) | 
| Variables | |
| int | count = 0 | 
| int | number_restarts = 0 | 
Function Documentation
| 
 | ||||||||||||||||||||||||||||
| 
 Definition at line 39 of file Simplexx.c. References i, malloc, and test1(). Referenced by simplex_optimization(). 
 00042 {
00043   int i;
00044 
00045   *centroid = (float *) malloc (sizeof(float) * DIMENSION);
00046   *response = (float *) malloc (sizeof(float) * (DIMENSION+1));
00047   *step_size = (float *) malloc (sizeof(float) * DIMENSION);
00048   *test1 = (float *) malloc (sizeof(float) * DIMENSION);
00049   *test2 = (float *) malloc (sizeof(float) * DIMENSION);
00050    
00051   *simplex = (float **) malloc (sizeof(float *) * (DIMENSION+1));
00052 
00053   for (i = 0;  i < DIMENSION+1;  i++)
00054     (*simplex)[i] = (float *) malloc (sizeof(float) * DIMENSION);
00055        
00056 }
 | 
| 
 | ||||||||||||||||
| 
 Definition at line 157 of file Simplexx.c. References i. Referenced by simplex_optimization(). 
 00158 {
00159   int i, j;
00160 
00161   for (i = 0;  i < DIMENSION;  i++)
00162     {
00163       centroid[i] = 0.0;
00164 
00165       /* add each vertex, except the worst */
00166       for (j = 0;  j < DIMENSION+1;  j++)
00167         if (j != worst)
00168           centroid[i] += simplex[j][i];
00169     }
00170 
00171   /* divide by the number of vertices */
00172   for (i = 0;  i < DIMENSION;  i++)
00173     centroid[i] /= DIMENSION;
00174 }
 | 
| 
 | 
| 
 Definition at line 214 of file Simplexx.c. Referenced by simplex_optimization(). 
 00215 {
00216   int i;
00217 
00218   float avg, sd, tmp;
00219 
00220   /* average the response values */
00221   avg = 0.0;
00222   for (i = 0;  i < DIMENSION+1;  i++)
00223     avg += response[i];
00224   avg /= DIMENSION+1;
00225 
00226   /* compute standard deviation of response */
00227   sd = 0.0;
00228   for (i = 0;  i < DIMENSION+1;  i++)
00229     {
00230       tmp = response[i] - avg;
00231       sd += tmp*tmp;
00232     }
00233   sd /= DIMENSION;
00234 
00235   return (sqrt(sd));
00236 }
 | 
| 
 | ||||||||||||||||||||||||
| 
 Definition at line 182 of file Simplexx.c. References i. Referenced by simplex_optimization(). 
 | 
| 
 | ||||||||||||||||||||||||||||
| 
 Definition at line 61 of file Simplexx.c. References free, i, and test1(). Referenced by simplex_optimization(). 
 00064 {
00065   int i;
00066 
00067   free (*centroid);    *centroid = NULL;
00068   free (*response);    *response = NULL;
00069   free (*step_size);   *step_size = NULL;
00070   free (*test1);       *test1 = NULL;
00071   free (*test2);       *test2 = NULL;
00072 
00073   for (i = 0;  i < DIMENSION+1;  i++)
00074     {
00075       free ((*simplex)[i]);
00076       (*simplex)[i] = NULL;
00077     }
00078 
00079   free (*simplex);     *simplex = NULL;
00080        
00081 }
 | 
| 
 | ||||||||||||||||||||
| 
 Definition at line 86 of file Simplexx.c. References i. Referenced by restart(), simplex_initialize(), and simplex_optimization(). 
 00087 {
00088   int i;
00089 
00090   /* initialize values */
00091   *worst = 0;
00092   *best = 0;
00093 
00094   /* find the best and worst */
00095   for (i = 1;  i < DIMENSION+1;  i++)
00096     {
00097       if (response[i] > response[*worst])
00098         *worst = i;
00099       if (response[i] < response[*best])
00100         *best = i;
00101     }
00102 
00103   /* find the next worst index */
00104   if (*worst == 0)
00105     *next = 1;
00106   else
00107     *next = 0;
00108   
00109   for (i = 0;  i < DIMENSION+1;  i++)
00110     if ((i != *worst) && (response[i] > response[*next]))
00111       *next = i;
00112 }
 | 
| 
 | ||||||||||||||||||||||||
| 
 Definition at line 197 of file Simplexx.c. References i. Referenced by simplex_initialize(), and simplex_optimization(). 
 | 
| 
 | ||||||||||||||||
| 
 Definition at line 117 of file Simplexx.c. References calc_error(), eval_vertices(), i, maxval, and rand_uniform(). Referenced by simplex_optimization(). 
 00119 {
00120   const float STEP_FACTOR = 0.9;
00121   int i, j;
00122   int worst, next, best;
00123   float minval, maxval;
00124 
00125 
00126   /* find the current best vertex */
00127   eval_vertices (response, &worst, &next, &best); 
00128 
00129   /* set the first vertex to the current best */
00130   for (i = 0; i < DIMENSION;  i++)
00131     simplex[0][i] = simplex[best][i];
00132 
00133   /* decrease step size */
00134   for (i = 0;  i < DIMENSION;  i++)
00135     step_size[i] *= STEP_FACTOR;
00136 
00137   /* set up remaining vertices of simplex using new step size */
00138   for (i = 1;  i < DIMENSION+1;  i++)
00139     for (j = 0;  j < DIMENSION;  j++)
00140       {
00141         minval = simplex[0][j] - step_size[j];
00142         maxval = simplex[0][j] + step_size[j];
00143       simplex[i][j] = rand_uniform (minval, maxval);
00144       }
00145 
00146   /* initialize response for each vector */
00147   for (i = 0;  i < DIMENSION+1;  i++)
00148     response[i] = calc_error (simplex[i]);
00149 }
 | 
| 
 | ||||||||||||||||||||
| 
 Definition at line 244 of file Simplexx.c. References calc_error(), eval_vertices(), i, maxval, rand_uniform(), and replace(). Referenced by simplex_optimization(). 
 00246 {
00247   int i, j;
00248   int worst, next, best;
00249   float resp;
00250   float minval, maxval;
00251 
00252 
00253   for (j = 0;  j < DIMENSION;  j++)
00254     {
00255       simplex[0][j] = parameters[j];
00256       step_size[j] = 0.5 * parameters[j];
00257     }
00258 
00259   for (i = 1;  i < DIMENSION+1;  i++)
00260     for (j = 0;  j < DIMENSION;  j++)
00261       {
00262         minval = simplex[0][j] - step_size[j];
00263         maxval = simplex[0][j] + step_size[j];
00264         simplex[i][j] = rand_uniform (minval, maxval);
00265       }
00266 
00267   for (i = 0;  i < DIMENSION+1;  i++)
00268       response[i] = calc_error (simplex[i]);
00269 
00270   for (i = 1;  i < 500;  i++)
00271     {
00272       for (j = 0;  j < DIMENSION;  j++)
00273         {
00274           minval = simplex[0][j] - step_size[j];
00275           maxval = simplex[0][j] + step_size[j];
00276           parameters[j] = rand_uniform (minval, maxval);
00277         }
00278 
00279       resp = calc_error (parameters);
00280       eval_vertices (response, &worst, &next, &best);
00281       if (resp < response[worst])
00282         replace (simplex, response, worst, parameters, resp);
00283     }
00284 }
 | 
| 
 | ||||||||||||
| 
 Definition at line 294 of file Simplexx.c. References allocate_arrays(), calc_centroid(), calc_error(), calc_good_fit(), calc_reflection(), deallocate_arrays(), eval_vertices(), fit, i, number_restarts, replace(), restart(), simplex_initialize(), and test1(). Referenced by calc_full_model(), estpdf(), estpdf_float(), and estpdf_short(). 
 00295 {
00296   const int MAX_ITERATIONS = 100;
00297   const int MAX_RESTARTS = 25;
00298   const float EXPANSION_COEF = 2.0;
00299   const float REFLECTION_COEF = 1.0;
00300   const float CONTRACTION_COEF = 0.5;
00301   const float TOLERANCE = 1.0e-10;
00302 
00303   float ** simplex   = NULL;
00304   float * centroid   = NULL;
00305   float * response   = NULL;
00306   float * step_size  = NULL;
00307   float * test1      = NULL;
00308   float * test2      = NULL;
00309   float resp1, resp2;
00310   int i, worst, best, next;
00311   int num_iter, num_restarts;
00312   int done;
00313   float fit;
00314 
00315 
00316   allocate_arrays (&simplex, ¢roid, &response, &step_size, &test1, &test2);
00317   
00318   simplex_initialize (parameters, simplex, response, step_size);
00319 
00320   /* start loop to do simplex optimization */
00321   num_iter = 0;
00322   num_restarts = 0;
00323   done = 0;
00324   
00325   while (!done)
00326     {
00327       /* find the worst vertex and compute centroid of remaining simplex, 
00328          discarding the worst vertex */
00329       eval_vertices (response, &worst, &next, &best);
00330       calc_centroid (simplex, worst, centroid);
00331       
00332       /* reflect the worst point through the centroid */
00333       calc_reflection (simplex, centroid, worst, 
00334                        REFLECTION_COEF, test1);
00335       resp1 = calc_error (test1);
00336 
00337       /* test the reflection against the best vertex and expand it if the
00338          reflection is better.  if not, keep the reflection */
00339       if (resp1 < response[best])
00340         {
00341           /* try expanding */
00342           calc_reflection (simplex, centroid, worst, EXPANSION_COEF, test2);
00343           resp2 = calc_error (test2);
00344           if (resp2 <= resp1)    /* keep expansion */     
00345             replace (simplex, response, worst, test2, resp2);
00346           else                   /* keep reflection */
00347             replace (simplex, response, worst, test1, resp1);
00348         }
00349       else if (resp1 < response[next])
00350         {
00351           /* new response is between the best and next worst 
00352              so keep reflection */
00353           replace (simplex, response, worst, test1, resp1); 
00354         }
00355           else
00356         {
00357           /* try contraction */
00358           if (resp1 >= response[worst])
00359             calc_reflection (simplex, centroid, worst, 
00360                              -CONTRACTION_COEF, test2);
00361           else
00362             calc_reflection (simplex, centroid, worst, 
00363                              CONTRACTION_COEF, test2);
00364           resp2 =  calc_error (test2);
00365           
00366           /* test the contracted response against the worst response */
00367           if (resp2 > response[worst])
00368             {
00369               /* new contracted response is worse, so decrease step size
00370                  and restart */
00371               num_iter = 0;
00372               num_restarts += 1;
00373               restart (simplex, response, step_size);
00374             }
00375           else       /* keep contraction */
00376             replace (simplex, response, worst, test2, resp2);
00377         }
00378 
00379       /* test to determine when to stop.  
00380          first, check the number of iterations */
00381       num_iter += 1;    /* increment iteration counter */
00382       if (num_iter >= MAX_ITERATIONS)
00383         {
00384           /* restart with smaller steps */
00385           num_iter = 0;
00386           num_restarts += 1;
00387           restart (simplex, response, step_size);
00388         }
00389 
00390       /* limit the number of restarts */
00391       if (num_restarts == MAX_RESTARTS)  done = 1;
00392 
00393       /* compare relative standard deviation of vertex responses 
00394          against a defined tolerance limit */
00395       fit = calc_good_fit (response);
00396       if (fit <= TOLERANCE)  done = 1;
00397 
00398       /* if done, copy the best solution to the output array */
00399       if (done) 
00400         {
00401           eval_vertices (response, &worst, &next, &best);
00402           for (i = 0;  i < DIMENSION;  i++)
00403             parameters[i] = simplex[best][i];
00404           *sse = response[best];
00405         }
00406 
00407     }  /* while (!done) */
00408  
00409   number_restarts = num_restarts;
00410   deallocate_arrays (&simplex, ¢roid, &response, &step_size,
00411                      &test1, &test2);
00412 
00413 }
 | 
Variable Documentation
| 
 | 
| 
 Definition at line 33 of file Simplexx.c. | 
| 
 | 
| 
 Definition at line 34 of file Simplexx.c. Referenced by simplex_optimization(). | 
 
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
 
 
 
 
       
	   
	   
	   
	  