Doxygen Source Code Documentation
estpdf.c File Reference
#include "randgen.c"Go to the source code of this file.
Defines | |
| #define | DIMENSION 9 |
| #define | MAX(a, b) (((a)<(b)) ? (b) : (a)) |
| #define | MIN(a, b) (((a)>(b)) ? (b) : (a)) |
| #define | NPMAX 128 |
Functions | |
| void | find_base_value (int nxyz, short *sfim) |
| Boolean | estpdf_initialize () |
| void | generate_initial_guess (float *parameters) |
| void | write_parameter_vector (float *parameters) |
| float | normal (float x, float mean, float sigma) |
| float | estimate (float *parameters, float x) |
| float | calc_sse (float *vertex) |
| 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) |
| void | output_pdf_results (float *vertex, float sse) |
| Boolean | estpdf (float *parameters) |
Variables | |
| int * | hist_data |
| int | hist_min |
| int | hist_max |
| int | gpeak |
| int | wpeak |
| int | numpts |
| int | count = 0 |
| int | number_restarts = 0 |
Define Documentation
|
|
Definition at line 35 of file estpdf.c. Referenced by allocate_arrays(), calc_centroid(), calc_good_fit(), calc_reflection(), deallocate_arrays(), eval_vertices(), replace(), restart(), simplex_initialize(), simplex_optimization(), and write_parameter_vector(). |
|
|
|
|
|
|
|
|
Definition at line 63 of file estpdf.c. Referenced by find_base_value(). |
Function Documentation
|
||||||||||||||||||||||||||||
|
Definition at line 453 of file estpdf.c. References DIMENSION, i, malloc, and test1().
00456 {
00457 int i;
00458
00459 *centroid = (float *) malloc (sizeof(float) * DIMENSION);
00460 *response = (float *) malloc (sizeof(float) * (DIMENSION+1));
00461 *step_size = (float *) malloc (sizeof(float) * DIMENSION);
00462 *test1 = (float *) malloc (sizeof(float) * DIMENSION);
00463 *test2 = (float *) malloc (sizeof(float) * DIMENSION);
00464
00465 *simplex = (float **) malloc (sizeof(float *) * (DIMENSION+1));
00466
00467 for (i = 0; i < DIMENSION+1; i++)
00468 (*simplex)[i] = (float *) malloc (sizeof(float) * DIMENSION);
00469
00470 }
|
|
||||||||||||||||
|
Definition at line 571 of file estpdf.c.
00572 {
00573 int i, j;
00574
00575 for (i = 0; i < DIMENSION; i++)
00576 {
00577 centroid[i] = 0.0;
00578
00579 /* add each vertex, except the worst */
00580 for (j = 0; j < DIMENSION+1; j++)
00581 if (j != worst)
00582 centroid[i] += simplex[j][i];
00583 }
00584
00585 /* divide by the number of vertices */
00586 for (i = 0; i < DIMENSION; i++)
00587 centroid[i] /= DIMENSION;
00588 }
|
|
|
Definition at line 628 of file estpdf.c. References avg, DIMENSION, and i.
00629 {
00630 int i;
00631
00632 float avg, sd, tmp;
00633
00634 /* average the response values */
00635 avg = 0.0;
00636 for (i = 0; i < DIMENSION+1; i++)
00637 avg += response[i];
00638 avg /= DIMENSION+1;
00639
00640 /* compute standard deviation of response */
00641 sd = 0.0;
00642 for (i = 0; i < DIMENSION+1; i++)
00643 {
00644 tmp = response[i] - avg;
00645 sd += tmp*tmp;
00646 }
00647 sd /= DIMENSION;
00648
00649 return (sqrt(sd));
00650 }
|
|
||||||||||||||||||||||||
|
Definition at line 596 of file estpdf.c.
|
|
|
Definition at line 386 of file estpdf.c. References BIG_NUMBER, count, estimate(), hist_data, hist_max, hist_min, i, and numpts.
00388 {
00389 const float delt = 1.0; /* histogram bin size */
00390 const float BIG_NUMBER = 1.0e+10; /* return when constraints are violated */
00391
00392 float b, bmean, bsigma, g, gmean, gsigma, w, wmean, wsigma; /* parameters */
00393 float deltah, deltam; /* rough estimate of spread of distribution */
00394
00395 int i;
00396 float t;
00397 float diff, sse;
00398
00399 count += 1;
00400
00401
00402 /*----- Assign local variables -----*/
00403 b = vertex[0];
00404 bmean = vertex[1];
00405 bsigma = vertex[2];
00406 g = vertex[3];
00407 gmean = vertex[4];
00408 gsigma = vertex[5];
00409 w = vertex[6];
00410 wmean = vertex[7];
00411 wsigma = vertex[8];
00412
00413 deltah = hist_max - hist_min;
00414 deltam = wmean - gmean;
00415
00416
00417 /*----- Apply constraints? -----*/
00418 if ((b < 0.05) || (b > 1.5)) return (BIG_NUMBER);
00419 if ((g < 0.05) || (g > 1.0)) return (BIG_NUMBER);
00420 if ((w < 0.05) || (w > 1.0)) return (BIG_NUMBER);
00421 if ((b+g+w < 1.0) || (b+g+w > 2.0)) return (BIG_NUMBER);
00422
00423 if ((bmean < hist_min) || (bmean > hist_max)) return (BIG_NUMBER);
00424 if ((gmean < hist_min) || (gmean > hist_max)) return (BIG_NUMBER);
00425 if ((wmean < hist_min) || (wmean > hist_max)) return (BIG_NUMBER);
00426 if ((gmean < bmean) || (gmean > wmean)) return (BIG_NUMBER);
00427
00428 if ((gmean-bmean) < 0.10*(wmean-bmean)) return (BIG_NUMBER);
00429 if ((wmean-gmean) < 0.10*(wmean-bmean)) return (BIG_NUMBER);
00430
00431 if ((bsigma < 0.01*deltah) || (bsigma > 0.5*deltah)) return (BIG_NUMBER);
00432 if ((gsigma < 0.01*deltam) || (gsigma > 0.5*deltam)) return (BIG_NUMBER);
00433 if ((wsigma < 0.01*deltam) || (wsigma > 0.5*deltam)) return (BIG_NUMBER);
00434
00435
00436 /*----- Not constrained, so calculate actual error sum of squares -----*/
00437 sse = 0.0;
00438
00439 for (i = hist_min; i < hist_max; i++)
00440 {
00441 t = i * delt;
00442 diff = ((float) hist_data[i])/numpts - estimate (vertex, t);
00443 sse += diff * diff;
00444 }
00445
00446
00447 return (sse);
00448 }
|
|
||||||||||||||||||||||||||||
|
Definition at line 475 of file estpdf.c. References DIMENSION, free, i, and test1().
00478 {
00479 int i;
00480
00481 free (*centroid); *centroid = NULL;
00482 free (*response); *response = NULL;
00483 free (*step_size); *step_size = NULL;
00484 free (*test1); *test1 = NULL;
00485 free (*test2); *test2 = NULL;
00486
00487 for (i = 0; i < DIMENSION+1; i++)
00488 {
00489 free ((*simplex)[i]);
00490 (*simplex)[i] = NULL;
00491 }
00492
00493 free (*simplex); *simplex = NULL;
00494
00495 }
|
|
||||||||||||
|
Definition at line 351 of file estpdf.c. References normal().
00353 {
00354 float b, bmean, bsigma, g, gmean, gsigma, w, wmean, wsigma;
00355 float z, fval;
00356
00357
00358 /*----- Initialize local variables -----*/
00359 b = parameters[0];
00360 bmean = parameters[1];
00361 bsigma = parameters[2];
00362 g = parameters[3];
00363 gmean = parameters[4];
00364 gsigma = parameters[5];
00365 w = parameters[6];
00366 wmean = parameters[7];
00367 wsigma = parameters[8];
00368
00369
00370 /*----- Calculate the sum of three normal PDF's -----*/
00371 fval = b * normal (x, bmean, bsigma);
00372 fval += g * normal (x, gmean, gsigma);
00373 fval += w * normal (x, wmean, wsigma);
00374
00375
00376 return (fval);
00377
00378 }
|
|
|
Definition at line 872 of file estpdf.c. References estpdf_initialize(), free, generate_initial_guess(), hist_data, output_pdf_results(), and simplex_optimization().
00873 {
00874 float sse;
00875 Boolean ok;
00876
00877
00878 /*----- Progress report -----*/
00879 if (! quiet) printf ("\nEstimating PDF of voxel intensities \n");
00880
00881
00882 /*----- Initialization for PDF estimation -----*/
00883 ok = estpdf_initialize ();
00884 if (! ok) return (FALSE);
00885
00886 generate_initial_guess (parameters);
00887
00888
00889 /*----- Get least squares estimate for PDF parameters -----*/
00890 simplex_optimization (parameters, &sse);
00891
00892
00893 /*----- Report PDF parameters -----*/
00894 if (! quiet) output_pdf_results (parameters, sse);
00895
00896
00897 /*----- Free memory -----*/
00898 free (hist_data); hist_data = NULL;
00899
00900
00901 return (TRUE);
00902 }
|
|
|
Definition at line 220 of file estpdf.c. References DSET_BRICK_ARRAY, DSET_NX, DSET_NY, DSET_NZ, find_base_value(), hist_data, hist_max, hist_min, numpts, and nz. Referenced by estpdf().
00222 {
00223 int nx, ny, nz, nxy, nxyz, ixyz; /* voxel counters */
00224 int n; /* histogram bin index */
00225 short * sfim; /* pointer to anat data */
00226
00227
00228 /*----- Initialize local variables -----*/
00229 if (anat == NULL) return (FALSE);
00230 nx = DSET_NX(anat); ny = DSET_NY(anat); nz = DSET_NZ(anat);
00231 nxy = nx*ny; nxyz = nxy*nz;
00232 sfim = (short *) DSET_BRICK_ARRAY(anat,0) ;
00233 if (sfim == NULL) return (FALSE);
00234
00235
00236 /*----- Set up histogram, and get initial parameter estimates -----*/
00237 find_base_value (nxyz, sfim);
00238
00239
00240 /*----- Count number of voxels inside histogram intensity limits -----*/
00241 numpts = 0;
00242 for (n = hist_min; n < hist_max; n++)
00243 numpts += hist_data[n];
00244
00245
00246 /*----- Initialize random number generator -----*/
00247 srand48 (1234567);
00248
00249
00250 return (TRUE);
00251 }
|
|
||||||||||||||||||||
|
Definition at line 500 of file estpdf.c.
00501 {
00502 int i;
00503
00504 /* initialize values */
00505 *worst = 0;
00506 *best = 0;
00507
00508 /* find the best and worst */
00509 for (i = 1; i < DIMENSION+1; i++)
00510 {
00511 if (response[i] > response[*worst])
00512 *worst = i;
00513 if (response[i] < response[*best])
00514 *best = i;
00515 }
00516
00517 /* find the next worst index */
00518 if (*worst == 0)
00519 *next = 1;
00520 else
00521 *next = 0;
00522
00523 for (i = 0; i < DIMENSION+1; i++)
00524 if ((i != *worst) && (response[i] > response[*next]))
00525 *next = i;
00526 }
|
|
||||||||||||
|
Definition at line 66 of file estpdf.c. References a, c, free, gpeak, hist_data, hist_max, hist_min, malloc, MAX, MIN, NPMAX, and wpeak. Referenced by estpdf_initialize(), and main().
00067 {
00068 float bper = 50.0 , bmin = 1 ;
00069 float tper = 98.0;
00070
00071 int ii , kk , nbin , sval , sum , nbot , a,b,c , npeak,ntop , nvox ;
00072 int * fbin ;
00073 int kmin[NPMAX] , kmax[NPMAX] ;
00074 int nmin , nmax ;
00075
00076 /*-- make histogram of shorts --*/
00077
00078 fbin = (int *) malloc( sizeof(int) * 32768 ) ;
00079
00080 for( kk=0 ; kk < 32768 ; kk++ ) fbin[kk] = 0 ;
00081
00082 nvox = 0 ;
00083
00084 for( ii=0 ; ii < nxyz ; ii++ ){
00085 kk = sfim[ii] ; if( kk >= 0 ){ fbin[kk]++ ; nvox++ ; }
00086 }
00087
00088 /*-- find largest value --*/
00089
00090 for( kk=32767 ; kk > 0 ; kk-- ) if( fbin[kk] > 0 ) break ;
00091 if( kk == 0 ){fprintf(stderr,"** find_base_value: All voxels are zero!\n");exit(1);}
00092 nbin = kk+1 ;
00093
00094 /*-- find bper point in cumulative distribution --*/
00095
00096 sval = 0.01 * bper * nvox ;
00097 sum = 0 ;
00098 for( kk=0 ; kk < nbin ; kk++ ){
00099 sum += fbin[kk] ; if( sum >= sval ) break ;
00100 }
00101 nbot = kk ; if( nbot == 0 ) nbot = 1 ; if( bmin > nbot ) nbot = bmin ;
00102 if( nbot >= nbin-9 ){
00103 fprintf(stderr,"** find_base_value: Base point on histogram too high\n");
00104 exit(1);
00105 }
00106
00107 hist_min = nbot;
00108
00109
00110 /*-- find tper point in cumulative distribution --*/
00111
00112 sval = 0.01 * tper * nvox ;
00113 sum = 0 ;
00114 for( kk=0 ; kk < nbin ; kk++ ){
00115 sum += fbin[kk] ; if( sum >= sval ) break ;
00116 }
00117
00118 hist_max = kk ;
00119
00120
00121 /*----- Save original histogram data -----*/
00122 hist_data = (int *) malloc( sizeof(int) * nbin ) ;
00123 for (kk = 0; kk < nbin; kk++)
00124 hist_data[kk] = fbin[kk];
00125
00126
00127 /*-- smooth histogram --*/
00128
00129 b = fbin[nbot-1] ; c = fbin[nbot] ;
00130 for( kk=nbot ; kk < nbin ; kk++ ){
00131 a = b ; b = c ; c = fbin[kk+1] ; fbin[kk] = 0.25*(a+c+2*b) ;
00132 }
00133
00134 /*-- find minima and maxima above bper point --*/
00135
00136 nmin = nmax = 0 ;
00137 for( kk=nbot+1 ; kk < nbin ; kk++ ){
00138 if( fbin[kk] < fbin[kk-1] && fbin[kk] < fbin[kk+1] && nmin < NPMAX ){
00139 kmin[nmin++] = kk ;
00140 } else if( fbin[kk] > fbin[kk-1] && fbin[kk] > fbin[kk+1] && nmax < NPMAX ){
00141 kmax[nmax++] = kk ;
00142 }
00143 }
00144
00145
00146 /*-- find the largest two maxima --*/
00147
00148 if( nmax == 0 ){
00149 fprintf(stderr,"** find_base_value: No histogram maxima above base point\n");
00150 exit(1);
00151 }
00152
00153 if( nmax == 1 ){
00154 npeak = kmax[0] ; ntop = 0 ;
00155 } else {
00156 int f1,f2 , k1,k2 , fk , klow,kup ;
00157
00158 k1 = 0 ; f1 = fbin[kmax[0]] ;
00159 k2 = 1 ; f2 = fbin[kmax[1]] ;
00160 if( f1 < f2 ){
00161 k1 = 1 ; f1 = fbin[kmax[1]] ;
00162 k2 = 0 ; f2 = fbin[kmax[0]] ;
00163 }
00164
00165 for( kk=2 ; kk < nmax ; kk++ ){
00166 fk = fbin[kmax[kk]] ;
00167 if( fk > f1 ){
00168 f2 = f1 ; k2 = k1 ;
00169 f1 = fk ; k1 = kk ;
00170 } else if( fk > f2 ){
00171 f2 = fk ; k2 = kk ;
00172 }
00173 }
00174 npeak = MIN( kmax[k1] , kmax[k2] ) ; /* smaller bin of the 2 top peaks */
00175
00176 /* find valley between 2 peaks */
00177
00178 ntop = MAX( kmax[k1] , kmax[k2] ) ;
00179
00180 gpeak = npeak;
00181 wpeak = ntop;
00182
00183
00184 fk = fbin[ntop] ; klow = ntop ;
00185 for( kk=ntop-1 ; kk >= npeak ; kk-- ){
00186 if( fbin[kk] < fk ){ fk = fbin[kk] ; klow = kk ; }
00187 }
00188 fk = MAX( 0.10*fk , 0.05*fbin[ntop] ) ;
00189 kup = MIN( nbin-1 , ntop+3*(ntop-klow+2) ) ;
00190 for( kk=ntop+1 ; kk <= kup ; kk++ ) if( fbin[kk] < fk ) break ;
00191
00192 ntop = kk ;
00193 }
00194
00195 for( kk=npeak-1 ; kk > 0 ; kk-- )
00196 if( fbin[kk] < fbin[kk-1] && fbin[kk] < fbin[kk+1] ) break ;
00197
00198
00199 if (kk > hist_min) hist_min = kk ;
00200
00201 if( ntop == 0 )
00202 {
00203 ntop = npeak + (npeak-kk) ;
00204 gpeak = npeak;
00205 wpeak = ntop;
00206 }
00207
00208 free (fbin);
00209
00210 return ;
00211 }
|
|
|
Definition at line 259 of file estpdf.c. References gpeak, hist_max, hist_min, and wpeak.
00260 {
00261 float b; /* coefficient for background distribution */
00262 float bmean; /* mean for background distribution */
00263 float bsigma; /* std. dev. for background distribution */
00264 float g; /* coefficient for gray-matter distribution */
00265 float gmean; /* mean for gray-matter distribution */
00266 float gsigma; /* std. dev. for gray-matter distribution */
00267 float w; /* coefficient for white-matter distribution */
00268 float wmean; /* mean for white-matter distribution */
00269 float wsigma; /* std. dev. for white-matter distribution */
00270
00271
00272 /*----- Initialize distribution coefficients -----*/
00273 b = 0.75;
00274 g = 0.25;
00275 w = 0.25;
00276
00277
00278 /*----- Initialize distribution means -----*/
00279 bmean = hist_min;
00280
00281 if ((gpeak > hist_min) && (gpeak < hist_max) && (gpeak < wpeak))
00282 gmean = gpeak;
00283 else
00284 gmean = hist_min;
00285
00286 if ((wpeak > hist_min) && (wpeak < hist_max) && (wpeak > gpeak))
00287 wmean = wpeak;
00288 else
00289 wmean = hist_max;
00290
00291 if ((gmean-bmean) < 0.25*(wmean-bmean)) gmean = bmean + 0.25*(wmean-bmean);
00292 if ((wmean-gmean) < 0.25*(wmean-bmean)) gmean = wmean - 0.25*(wmean-bmean);
00293
00294
00295 /*----- Initialize distribution standard deviations -----*/
00296 bsigma = 0.25 * (hist_max - hist_min);
00297 gsigma = 0.25 * (wmean - gmean);
00298 wsigma = 0.25 * (wmean - gmean);
00299
00300
00301 /*----- Set parameter vector -----*/
00302 parameters[0] = b;
00303 parameters[1] = bmean;
00304 parameters[2] = bsigma;
00305 parameters[3] = g;
00306 parameters[4] = gmean;
00307 parameters[5] = gsigma;
00308 parameters[6] = w;
00309 parameters[7] = wmean;
00310 parameters[8] = wsigma;
00311
00312 }
|
|
||||||||||||||||
|
Definition at line 335 of file estpdf.c.
00337 {
00338 float z;
00339
00340 z = (x - mean) / sigma;
00341
00342 return ( (1.0/(sqrt(2.0*PI)*sigma)) * exp (-0.5 * z * z) );
00343 }
|
|
||||||||||||
|
Definition at line 835 of file estpdf.c. References gpeak, hist_max, hist_min, and wpeak.
00836 {
00837 float b, bmean, bsigma, g, gmean, gsigma, w, wmean, wsigma;
00838
00839
00840 /*----- Assign variables -----*/
00841 b = vertex[0];
00842 bmean = vertex[1];
00843 bsigma = vertex[2];
00844 g = vertex[3];
00845 gmean = vertex[4];
00846 gsigma = vertex[5];
00847 w = vertex[6];
00848 wmean = vertex[7];
00849 wsigma = vertex[8];
00850
00851 printf ("hist_min = %d hist_max = %d \n", hist_min, hist_max);
00852 printf ("gpeak = %d wpeak = %d \n", gpeak, wpeak);
00853 printf ("rmse = %f \n", sqrt (sse / (hist_max - hist_min) ) );
00854 printf ("\nProbability Density Function Estimates: \n");
00855 printf ("Background Coef = %f \n", b);
00856 printf ("Background Mean = %f \n", bmean);
00857 printf ("Background Std Dev = %f \n", bsigma);
00858 printf ("Gray Matter Coef = %f \n", g);
00859 printf ("Gray Matter Mean = %f \n", gmean);
00860 printf ("Gray Matter Std Dev = %f \n", gsigma);
00861 printf ("White Matter Coef = %f \n", w);
00862 printf ("White Matter Mean = %f \n", wmean);
00863 printf ("White Matter Std Dev = %f \n", wsigma);
00864 }
|
|
||||||||||||||||||||||||
|
Definition at line 611 of file estpdf.c.
|
|
||||||||||||||||
|
Definition at line 531 of file estpdf.c. References calc_sse(), DIMENSION, eval_vertices(), i, maxval, and rand_uniform().
00533 {
00534 const float STEP_FACTOR = 0.9;
00535 int i, j;
00536 int worst, next, best;
00537 float minval, maxval;
00538
00539
00540 /* find the current best vertex */
00541 eval_vertices (response, &worst, &next, &best);
00542
00543 /* set the first vertex to the current best */
00544 for (i = 0; i < DIMENSION; i++)
00545 simplex[0][i] = simplex[best][i];
00546
00547 /* decrease step size */
00548 for (i = 0; i < DIMENSION; i++)
00549 step_size[i] *= STEP_FACTOR;
00550
00551 /* set up remaining vertices of simplex using new step size */
00552 for (i = 1; i < DIMENSION+1; i++)
00553 for (j = 0; j < DIMENSION; j++)
00554 {
00555 minval = simplex[0][j] - step_size[j];
00556 maxval = simplex[0][j] + step_size[j];
00557 simplex[i][j] = rand_uniform (minval, maxval);
00558 }
00559
00560 /* initialize response for each vector */
00561 for (i = 0; i < DIMENSION+1; i++)
00562 response[i] = calc_sse (simplex[i]);
00563 }
|
|
||||||||||||||||||||
|
Definition at line 658 of file estpdf.c. References calc_sse(), DIMENSION, eval_vertices(), i, maxval, rand_uniform(), and replace().
00660 {
00661 int i, j;
00662 int worst, next, best;
00663 float resp;
00664 float minval, maxval;
00665
00666
00667 for (j = 0; j < DIMENSION; j++)
00668 {
00669 simplex[0][j] = parameters[j];
00670 step_size[j] = 0.5 * parameters[j];
00671 }
00672
00673 for (i = 1; i < DIMENSION+1; i++)
00674 for (j = 0; j < DIMENSION; j++)
00675 {
00676 minval = simplex[0][j] - step_size[j];
00677 maxval = simplex[0][j] + step_size[j];
00678 simplex[i][j] = rand_uniform (minval, maxval);
00679 }
00680
00681 for (i = 0; i < DIMENSION+1; i++)
00682 response[i] = calc_sse (simplex[i]);
00683
00684 for (i = 1; i < 500; i++)
00685 {
00686 for (j = 0; j < DIMENSION; j++)
00687 {
00688 minval = simplex[0][j] - step_size[j];
00689 maxval = simplex[0][j] + step_size[j];
00690 parameters[j] = rand_uniform (minval, maxval);
00691 }
00692
00693 resp = calc_sse (parameters);
00694 eval_vertices (response, &worst, &next, &best);
00695 if (resp < response[worst])
00696 replace (simplex, response, worst, parameters, resp);
00697 }
00698 }
|
|
||||||||||||
|
Definition at line 708 of file estpdf.c. References allocate_arrays(), calc_centroid(), calc_good_fit(), calc_reflection(), calc_sse(), deallocate_arrays(), DIMENSION, eval_vertices(), fit, i, number_restarts, replace(), restart(), simplex_initialize(), and test1().
00709 {
00710 const int MAX_ITERATIONS = 100;
00711 const int MAX_RESTARTS = 25;
00712 const float EXPANSION_COEF = 2.0;
00713 const float REFLECTION_COEF = 1.0;
00714 const float CONTRACTION_COEF = 0.5;
00715 const float TOLERANCE = 1.0e-10;
00716
00717 float ** simplex = NULL;
00718 float * centroid = NULL;
00719 float * response = NULL;
00720 float * step_size = NULL;
00721 float * test1 = NULL;
00722 float * test2 = NULL;
00723 float resp1, resp2;
00724 int i, worst, best, next;
00725 int num_iter, num_restarts;
00726 int done;
00727 float fit;
00728
00729
00730 allocate_arrays (&simplex, ¢roid, &response, &step_size, &test1, &test2);
00731
00732 simplex_initialize (parameters, simplex, response, step_size);
00733
00734 /* start loop to do simplex optimization */
00735 num_iter = 0;
00736 num_restarts = 0;
00737 done = 0;
00738
00739 while (!done)
00740 {
00741 /* find the worst vertex and compute centroid of remaining simplex,
00742 discarding the worst vertex */
00743 eval_vertices (response, &worst, &next, &best);
00744 calc_centroid (simplex, worst, centroid);
00745
00746 /* reflect the worst point through the centroid */
00747 calc_reflection (simplex, centroid, worst,
00748 REFLECTION_COEF, test1);
00749 resp1 = calc_sse (test1);
00750
00751 /* test the reflection against the best vertex and expand it if the
00752 reflection is better. if not, keep the reflection */
00753 if (resp1 < response[best])
00754 {
00755 /* try expanding */
00756 calc_reflection (simplex, centroid, worst, EXPANSION_COEF, test2);
00757 resp2 = calc_sse (test2);
00758 if (resp2 <= resp1) /* keep expansion */
00759 replace (simplex, response, worst, test2, resp2);
00760 else /* keep reflection */
00761 replace (simplex, response, worst, test1, resp1);
00762 }
00763 else if (resp1 < response[next])
00764 {
00765 /* new response is between the best and next worst
00766 so keep reflection */
00767 replace (simplex, response, worst, test1, resp1);
00768 }
00769 else
00770 {
00771 /* try contraction */
00772 if (resp1 >= response[worst])
00773 calc_reflection (simplex, centroid, worst,
00774 -CONTRACTION_COEF, test2);
00775 else
00776 calc_reflection (simplex, centroid, worst,
00777 CONTRACTION_COEF, test2);
00778 resp2 = calc_sse (test2);
00779
00780 /* test the contracted response against the worst response */
00781 if (resp2 > response[worst])
00782 {
00783 /* new contracted response is worse, so decrease step size
00784 and restart */
00785 num_iter = 0;
00786 num_restarts += 1;
00787 restart (simplex, response, step_size);
00788 }
00789 else /* keep contraction */
00790 replace (simplex, response, worst, test2, resp2);
00791 }
00792
00793 /* test to determine when to stop.
00794 first, check the number of iterations */
00795 num_iter += 1; /* increment iteration counter */
00796 if (num_iter >= MAX_ITERATIONS)
00797 {
00798 /* restart with smaller steps */
00799 num_iter = 0;
00800 num_restarts += 1;
00801 restart (simplex, response, step_size);
00802 }
00803
00804 /* limit the number of restarts */
00805 if (num_restarts == MAX_RESTARTS) done = 1;
00806
00807 /* compare relative standard deviation of vertex responses
00808 against a defined tolerance limit */
00809 fit = calc_good_fit (response);
00810 if (fit <= TOLERANCE) done = 1;
00811
00812 /* if done, copy the best solution to the output array */
00813 if (done)
00814 {
00815 eval_vertices (response, &worst, &next, &best);
00816 for (i = 0; i < DIMENSION; i++)
00817 parameters[i] = simplex[best][i];
00818 *sse = response[best];
00819 }
00820
00821 } /* while (!done) */
00822
00823 number_restarts = num_restarts;
00824 deallocate_arrays (&simplex, ¢roid, &response, &step_size,
00825 &test1, &test2);
00826
00827 }
|
|
|
Definition at line 320 of file estpdf.c.
|
Variable Documentation
|
|
Definition at line 46 of file estpdf.c. Referenced by calc_sse(). |
|
|
Definition at line 42 of file estpdf.c. Referenced by estpdf_float(), estpdf_float_initialize(), estpdf_short(), estpdf_short_initialize(), find_base_value(), generate_initial_guess(), and output_pdf_results(). |
|
|
Definition at line 37 of file estpdf.c. Referenced by calc_sse(), estpdf(), estpdf_initialize(), and find_base_value(). |
|
|
Definition at line 40 of file estpdf.c. Referenced by calc_sse(), estpdf_initialize(), find_base_value(), generate_initial_guess(), and output_pdf_results(). |
|
|
Definition at line 38 of file estpdf.c. Referenced by calc_sse(), estpdf_initialize(), find_base_value(), generate_initial_guess(), and output_pdf_results(). |
|
|
Definition at line 47 of file estpdf.c. Referenced by simplex_optimization(). |
|
|
Definition at line 44 of file estpdf.c. Referenced by calc_sse(), and estpdf_initialize(). |
|
|
Definition at line 43 of file estpdf.c. Referenced by estpdf_float(), estpdf_float_initialize(), estpdf_short(), estpdf_short_initialize(), find_base_value(), generate_initial_guess(), and output_pdf_results(). |