Doxygen Source Code Documentation
huber.c File Reference
#include "mrilib.h"Go to the source code of this file.
Data Structures | |
| struct | HUBER_interface |
Defines | |
| #define | MAX_PARAMETERS 10 |
| #define | XX(x) (((x)<cc && (x)>-cc) ? 0.5*(xx)*(xx) : 0.5*(cc)*(cc)) |
| #define | PSI(x) ( ((x)>=cc) ? cc : ((x)<=-cc) ? -cc : (x) ) |
| #define | IGN 2 |
Typedefs | |
| typedef void | void_func () |
Functions | |
| void | sin_func (float *abc, int nt, float *t, float *val) |
| void | sin_grad (int k, float *abc, int nt, float *t, float *gval) |
| float | huber_aa (float c) |
| void | huber_func (int num, double to, double dt, float *vec, char **str) |
Variables | |
| HUBER_interface | hhint |
| float | range [5] = {100.0 , 0.310 , 1.555 , 300.0 , 0.02} |
Define Documentation
|
|
Definition at line 84 of file huber.c. Referenced by huber_func(). |
|
|
Definition at line 10 of file huber.c. Referenced by huber_func(). |
|
|
Definition at line 82 of file huber.c. Referenced by huber_func(). |
|
|
|
Typedef Documentation
|
|
|
Function Documentation
|
|
Definition at line 66 of file huber.c. Referenced by huber_func().
|
|
||||||||||||||||||||||||
|
Definition at line 86 of file huber.c. References dt, free, HUBER_interface::func_func, HUBER_interface::grad_func, huber_aa(), IGN, lsqfit(), malloc, MAX_PARAMETERS, HUBER_interface::numpar, HUBER_interface::pinit, PSI, range, THD_zzprintf(), v, vec, and XX. Referenced by MAIN_workprocess().
00087 {
00088 static float * t = NULL ; static int ntold = 0 ;
00089 static float * v = NULL ;
00090 static float * w = NULL ;
00091 static float ** g = NULL ; static int ngold = 0 ;
00092 static float new_to,new_dt , old_to,old_dt ;
00093 static float cc = 1.0 , aa = -1.0 ;
00094 static char * strout = NULL ;
00095
00096 float parm[MAX_PARAMETERS] , sig , xx , yy , *tau ;
00097 float pold[MAX_PARAMETERS] , rold ;
00098 int ii , nt , nparm , kk , nite ;
00099
00100 nt = num ;
00101 nparm = hhint.numpar ;
00102 if( nt <= 2*nparm ){ *str = NULL ; return ; } /* do nothing */
00103
00104 if( ntold < nt || ngold < nparm ){ /* reallocate memory */
00105 if( t != NULL ) free(t) ;
00106 if( v != NULL ) free(v) ;
00107 if( w != NULL ) free(w) ;
00108 t = (float *) malloc( sizeof(float)*nt ) ;
00109 v = (float *) malloc( sizeof(float)*nt ) ;
00110 w = (float *) malloc( sizeof(float)*nt ) ;
00111
00112 if( g != NULL ){
00113 for( ii=0 ; ii < ngold ; ii++ ) free(g[ii]) ;
00114 free(g) ;
00115 }
00116 g = (float **) malloc( sizeof(float *)*nparm ) ;
00117 for( kk=0 ; kk < nparm ; kk++ )
00118 g[kk] = (float *) malloc( sizeof(float)*nt ) ;
00119 ngold = nparm ;
00120
00121 ntold = nt ;
00122 old_to=-666.0 ; old_dt=-555.5 ;
00123
00124 for( ii=0 ; ii < nt ; ii++ ) w[ii] = (ii<IGN) ? 0.0 : 1.0 ;
00125 }
00126
00127 /* time points */
00128
00129 new_to = to ; new_dt = dt ;
00130 if( new_to != old_to || new_dt != old_dt ){
00131 for( ii=0 ; ii < nt ; ii++ ) t[ii] = new_to + new_dt * ii ;
00132 }
00133
00134 if( aa < 0.0 ) aa = huber_aa(cc) ; /* Huber's 'a' constant */
00135
00136 /* initialize parameters */
00137
00138 for( kk=0 ; kk < nparm ; kk++ ) pold[kk] = hhint.pinit[kk] ;
00139 hhint.func_func( pold , nt , t , v ) ;
00140 xx = 0.0 ;
00141 for( ii=IGN ; ii < nt ; ii++ ) xx += fabs(vec[ii]-v[ii]) ;
00142 rold = xx ;
00143
00144 for( nite=0 ; nite < 9999 ; nite++ ){
00145 for( kk=0 ; kk < nparm ; kk++ )
00146 parm[kk] = hhint.pinit[kk] + (drand48()-0.5)*range[kk] ;
00147 hhint.func_func( parm , nt , t , v ) ;
00148 xx = 0.0 ;
00149 for( ii=IGN ; ii < nt ; ii++ ) xx += fabs(vec[ii]-v[ii]) ;
00150 if( xx < rold ){
00151 for( kk=0 ; kk < nparm ; kk++ ) pold[kk] = parm[kk] ;
00152 rold = xx ;
00153 }
00154 }
00155 for( kk=0 ; kk < nparm ; kk++ ) parm[kk] = pold[kk] ;
00156 sig = rold / (nt-IGN) ;
00157
00158 nite = 0 ;
00159 do{
00160 hhint.func_func( parm , nt , t , v ) ; /* eval funcs */
00161
00162 for( ii=0 ; ii < IGN ; ii++ ) v[ii] = 0.0 ;
00163 yy = 0 ;
00164 for( ii=IGN ; ii < nt ; ii++ ){
00165 v[ii] = vec[ii] - v[ii] ; /* residuals */
00166 xx = v[ii] / sig ; yy += XX(xx) ;
00167 }
00168 sig *= sqrt( yy / ((nt-hhint.numpar-IGN) * aa) ) ; /* Huber scale */
00169
00170 for( ii=0 ; ii < nt ; ii++ ){ /* Winsorize */
00171 xx = v[ii] / sig ; v[ii] = PSI(xx) * sig ;
00172 }
00173
00174 for( kk=0 ; kk < nparm ; kk++ ) /* gradients */
00175 hhint.grad_func( kk , parm , nt , t , g[kk] ) ;
00176
00177 tau = lsqfit( nt , v , w , nparm , g ) ; /* fit residuals */
00178 if( tau == NULL ){
00179 fprintf(stderr,"*** lsqfit fails in huber!\n") ;
00180 *str = NULL ; return ;
00181 }
00182
00183 for( kk=0 ; kk < nparm ; kk++ ) parm[kk] += tau[kk] ; /* update */
00184
00185 free(tau) ; nite++ ;
00186 } while(nite < 10) ;
00187
00188 hhint.func_func( parm , nt , t , vec ) ; /* eval funcs */
00189
00190 if( strout != NULL ){ free(strout) ; strout = NULL ; }
00191
00192 strout = THD_zzprintf( strout , "\n" ) ;
00193 for( kk=0 ; kk < nparm ; kk++ )
00194 strout = THD_zzprintf( strout , "param %d = %g\n" , kk,parm[kk] ) ;
00195
00196 *str = strout ;
00197 return ;
00198 }
|
|
||||||||||||||||||||
|
Definition at line 23 of file huber.c.
|
|
||||||||||||||||||||||||
|
Definition at line 35 of file huber.c.
00036 {
00037 float a=abc[0], b=abc[1], c=abc[2], d=abc[3], e=abc[4] ;
00038 int ii ;
00039
00040 switch( k ){
00041
00042 case 0:
00043 for( ii=0 ; ii < nt ; ii++ ) gval[ii] = sin(b*t[ii]+c) ;
00044 return ;
00045
00046 case 1:
00047 for( ii=0 ; ii < nt ; ii++ ) gval[ii] = a*t[ii]*cos(b*t[ii]+c) ;
00048 return ;
00049
00050 case 2:
00051 for( ii=0 ; ii < nt ; ii++ ) gval[ii] = a*cos(b*t[ii]+c) ;
00052 return ;
00053
00054 case 3:
00055 for( ii=0 ; ii < nt ; ii++ ) gval[ii] = 1 ;
00056 return ;
00057
00058 case 4:
00059 for( ii=0 ; ii < nt ; ii++ ) gval[ii] = t[ii] ;
00060 return ;
00061 }
00062 }
|
Variable Documentation
|
|
Initial value: { 5, sin_func, sin_grad,
{100.0,0.314,0.333,100.0,0.01} } |
|
|
Definition at line 79 of file huber.c. Referenced by huber_func(). |