#include <cstdio>
#include <cmath>
#include "emdata.h"
Include dependency graph for steepest.cpp:
Go to the source code of this file.
Defines | |
#define | MACHEPS 1e-15 |
Functions | |
void | Utilit1 (double *D, double *dd, int l) |
void | Utilit2 (double *X, double *X1, double *Y, double *D, double *dd, double xk, int l, float(*my_func)(EMData *, EMData *, EMData *, float, float, float), EMData *image, EMData *refim, EMData *mask) |
void | Derivatives (double *X, double *D, double *Y, double *dd, double xk, int l, float(*my_func)(EMData *, EMData *, EMData *, float, float, float), EMData *image, EMData *refim, EMData *mask) |
void | Steepda (double *X, double xk, double e, int l, int m, int *n, float(*my_func)(EMData *, EMData *, EMData *, float, float, float), EMData *image, EMData *refim, EMData *mask) |
void | Utilit2_G (double *X, double *X1, double *Y, double *D, double *dd, double xk, int l, float(*my_func)(EMData *, EMData *, EMData *, Util::KaiserBessel &, float, float, float), EMData *image, EMData *refim, EMData *mask, Util::KaiserBessel &kb) |
void | Derivatives_G (double *X, double *D, double *Y, double *dd, double xk, int l, float(*my_func)(EMData *, EMData *, EMData *, Util::KaiserBessel &, float, float, float), EMData *image, EMData *refim, EMData *mask, Util::KaiserBessel &kb) |
void | Steepda_G (double *X, double xk, double e, int l, int m, int *n, float(*my_func)(EMData *, EMData *, EMData *, Util::KaiserBessel &, float, float, float), EMData *image, EMData *refim, EMData *mask, Util::KaiserBessel &kb) |
|
Definition at line 44 of file steepest.cpp. |
|
Definition at line 79 of file steepest.cpp. References b, Utilit1(), X, and Y. Referenced by Steepda(). 00080 { 00081 double a,b,yy; 00082 int i; 00083 for (i=1; i<l+1; i++) { 00084 // Save X(i) 00085 a=X[i]; 00086 // Find increment 00087 b=D[i]*xk/(2.0*(*dd)); 00088 // Move increment in X(i) 00089 X[i]=X[i]+b; 00090 // Obtain yy 00091 yy=(*my_func)(image, refim, mask, (float)X[1], (float)X[2], (float)X[3]); 00092 // Guard against divide by zero near maximum 00093 if (b==0) b=1e-12; 00094 // Update D(i) 00095 D[i]=(yy-Y[3])/b; 00096 // Guard against locked up derivative 00097 if (D[i]==0) D[i]=1e-5; 00098 // Restore X(i) and yy 00099 X[i]=a; yy=Y[3]; 00100 } 00101 // Obtain dd 00102 Utilit1(D, dd, l); 00103 }
|
|
Definition at line 223 of file steepest.cpp. References b, Utilit1(), X, and Y. Referenced by Steepda_G(). 00224 { 00225 double a,b,yy; 00226 int i; 00227 for (i=1; i<l+1; i++) { 00228 // Save X(i) 00229 a=X[i]; 00230 // Find increment 00231 b=D[i]*xk/(2.0*(*dd)); 00232 // Move increment in X(i) 00233 X[i]=X[i]+b; 00234 // Obtain yy 00235 yy=(*my_func)(image, refim, mask, kb, (float)X[1], (float)X[2], (float)X[3]); 00236 // Guard against divide by zero near maximum 00237 if (b==0) b=1e-12; 00238 // Update D(i) 00239 D[i]=(yy-Y[3])/b; 00240 // Guard against locked up derivative 00241 if (D[i]==0) D[i]=1e-5; 00242 // Restore X(i) and yy 00243 X[i]=a; yy=Y[3]; 00244 } 00245 // Obtain dd 00246 Utilit1(D, dd, l); 00247 }
|
|
Definition at line 127 of file steepest.cpp. References Derivatives(), sqrt(), Utilit1(), Utilit2(), X, and Y. Referenced by EMAN::Util::twoD_fine_ali_SD(). 00128 { 00129 // Labels: e50,e51,e100,e200 00130 int i; 00131 double dd; 00132 double D[4], Y[4]; 00133 double X1[11]; 00134 00135 *n=0; 00136 //The routine needs three values of Y to get started 00137 //Generate starting D(i) values 00138 //These are not even good guesses and slow the program a little 00139 dd=1.0; 00140 D[1]=1.0/sqrt((double)l); 00141 for (i=2; i<l+1; i++) D[i]=D[i-1]; 00142 // Start initial probe 00143 for (i=1; i<l+1; i++) { 00144 // Obtain yy and D[i] 00145 Y[i]=(*my_func)(image, refim, mask, (float)X[1], (float)X[2], (float)X[3]); 00146 // Update X[i] 00147 Utilit1(D, &dd, l); 00148 Utilit2(X, X1, Y, D, &dd, xk, l, my_func, image, refim, mask); 00149 } 00150 // We now have a history to base the subsequent search on 00151 // Accelerate search if approach is monotonic 00152 e50: if (fabs(Y[2]-Y[1])<MACHEPS) goto e51; 00153 if ((Y[3]-Y[2])/(Y[2]-Y[1])>0.0) xk=xk*1.2; 00154 // Decelerate if heading the wrong way 00155 e51: if (Y[3]<Y[2]) xk=xk/2.0; 00156 // Update the Y[i] if value has decreased 00157 if (Y[3]>Y[2]) goto e100; 00158 // Restore the X[i] 00159 for (i=1; i<l+1; i++) { 00160 X[i]=X1[i]; 00161 } 00162 goto e200; 00163 e100: Y[1]=Y[2]; Y[2]=Y[3]; 00164 // Obtain new values 00165 e200: Y[3]=(*my_func)(image, refim, mask, (float)X[1], (float)X[2], (float)X[3]); 00166 Derivatives(X, D, Y, &dd, xk, l, my_func, image, refim, mask); // Get D(i) 00167 //if dd=0 then the precision limit of the computer has been reached 00168 if (dd==0) return; 00169 // Update X[i] 00170 Utilit2(X, X1, Y, D, &dd, xk, l, my_func, image, refim, mask); 00171 // Check for maximum iterations and convergence 00172 (*n)++; 00173 //printf("Step %3d: X[0]=%12.6f X[1]=%12.6f X[2]=%12.6f\n",*n,X[1],X[2],X[3]); 00174 if (*n>=m) return; 00175 if (fabs(Y[3]-Y[2])<e) return; 00176 // Try another iteration 00177 goto e50; 00178 } // Steepds()
|
|
Definition at line 251 of file steepest.cpp. References Derivatives_G(), sqrt(), Utilit1(), Utilit2_G(), X, and Y. Referenced by EMAN::Util::twoD_fine_ali_SD_G(). 00252 { 00253 // Labels: e50,e51,e100,e200 00254 int i; 00255 double dd; 00256 double D[4], Y[4]; 00257 double X1[11]; 00258 00259 *n=0; 00260 //The routine needs three values of Y to get started 00261 //Generate starting D(i) values 00262 //These are not even good guesses and slow the program a little 00263 dd=1.0; 00264 D[1]=1.0/sqrt((double)l); 00265 for (i=2; i<l+1; i++) D[i]=D[i-1]; 00266 // Start initial probe 00267 for (i=1; i<l+1; i++) { 00268 // Obtain yy and D[i] 00269 Y[i]=(*my_func)(image, refim, mask, kb, (float)X[1], (float)X[2], (float)X[3]); 00270 // Update X[i] 00271 Utilit1(D, &dd, l); 00272 Utilit2_G(X, X1, Y, D, &dd, xk, l, my_func, image, refim, mask, kb); 00273 } 00274 // We now have a history to base the subsequent search on 00275 // Accelerate search if approach is monotonic 00276 e50: if (fabs(Y[2]-Y[1])<MACHEPS) goto e51; 00277 if ((Y[3]-Y[2])/(Y[2]-Y[1])>0.0) xk=xk*1.2; 00278 // Decelerate if heading the wrong way 00279 e51: if (Y[3]<Y[2]) xk=xk/2.0; 00280 // Update the Y[i] if value has decreased 00281 if (Y[3]>Y[2]) goto e100; 00282 // Restore the X[i] 00283 for (i=1; i<l+1; i++) { 00284 X[i]=X1[i]; 00285 } 00286 goto e200; 00287 e100: Y[1]=Y[2]; Y[2]=Y[3]; 00288 // Obtain new values 00289 e200: Y[3]=(*my_func)(image, refim, mask, kb, (float)X[1], (float)X[2], (float)X[3]); 00290 Derivatives_G(X, D, Y, &dd, xk, l, my_func, image, refim, mask, kb); // Get D(i) 00291 //if dd=0 then the precision limit of the computer has been reached 00292 if (dd==0) return; 00293 // Update X[i] 00294 Utilit2_G(X, X1, Y, D, &dd, xk, l, my_func, image, refim, mask, kb); 00295 // Check for maximum iterations and convergence 00296 (*n)++; 00297 //printf("Step %3d: X[0]=%12.6f X[1]=%12.6f X[2]=%12.6f\n",*n,X[1],X[2],X[3]); 00298 if (*n>=m) return; 00299 if (fabs(Y[3]-Y[2])<e) return; 00300 // Try another iteration 00301 goto e50; 00302 } // Steepds()
|
|
Definition at line 57 of file steepest.cpp. References sqrt(). Referenced by Derivatives(), Derivatives_G(), Steepda(), and Steepda_G(). 00057 { 00058 int i; 00059 // Find the magnitude of the gradient 00060 *dd=0.0; 00061 for (i=1; i<l+1; i++) *dd += D[i]*D[i]; 00062 *dd=sqrt(*dd); 00063 }
|
|
Definition at line 65 of file steepest.cpp. Referenced by Steepda(). 00066 { 00067 int i; 00068 // Update the X[i] 00069 for (i=1; i<l+1; i++) { 00070 // Save old values 00071 X1[i]=X[i]; 00072 X[i] += xk*D[i]/(*dd); 00073 } 00074 Y[3]=(*my_func)(image, refim, mask, (float)X[1], (float)X[2], (float)X[3]); 00075 }
|
|
Definition at line 209 of file steepest.cpp. Referenced by Steepda_G(). 00210 { 00211 int i; 00212 // Update the X[i] 00213 for (i=1; i<l+1; i++) { 00214 // Save old values 00215 X1[i]=X[i]; 00216 X[i] += xk*D[i]/(*dd); 00217 } 00218 Y[3]=(*my_func)(image, refim, mask, kb, (float)X[1], (float)X[2], (float)X[3]); 00219 }
|