Main Page | Modules | Data Structures | File List | Data Fields | Globals | Related Pages

real_quadratic.c

Go to the documentation of this file.
00001 #include <volume_io/internal_volume_io.h> 00002 #include <bicpl/numerical.h> 00003 00004 public void initialize_quadratic_real( 00005 int n_parameters, 00006 Real *constant_term, 00007 Real *linear_terms[], 00008 Real *square_terms[], 00009 int *n_cross_terms[], 00010 int **cross_parms[], 00011 Real **cross_terms[] ) 00012 { 00013 int parm; 00014 00015 ALLOC( *linear_terms, n_parameters ); 00016 ALLOC( *square_terms, n_parameters ); 00017 ALLOC( *n_cross_terms, n_parameters ); 00018 ALLOC( *cross_parms, n_parameters ); 00019 ALLOC( *cross_terms, n_parameters ); 00020 00021 *constant_term = 0.0; 00022 00023 for_less( parm, 0, n_parameters ) 00024 { 00025 (*linear_terms)[parm] = 0.0; 00026 (*square_terms)[parm] = 0.0; 00027 (*n_cross_terms)[parm] = 0; 00028 } 00029 } 00030 00031 public void zero_quadratic_real( 00032 int n_parameters, 00033 Real *constant_term, 00034 Real linear_terms[], 00035 Real square_terms[], 00036 int n_cross_terms[], 00037 int *cross_parms[], 00038 Real *cross_terms[] ) 00039 { 00040 int parm, n; 00041 00042 *constant_term = 0.0; 00043 00044 for_less( parm, 0, n_parameters ) 00045 { 00046 linear_terms[parm] = 0.0; 00047 square_terms[parm] = 0.0; 00048 for_less( n, 0, n_cross_terms[parm] ) 00049 cross_terms[parm][n] = 0.0; 00050 } 00051 } 00052 00053 public void add_to_quadratic_cross_term_real( 00054 int *n_cross_terms[], 00055 int **cross_parms[], 00056 Real **cross_terms[], 00057 int parm1, 00058 int parm2, 00059 Real value, 00060 int alloc_increment ) 00061 { 00062 int p1, p2, t; 00063 00064 p1 = MIN( parm1, parm2 ); 00065 p2 = MAX( parm1, parm2 ); 00066 00067 for_less( t, 0, (*n_cross_terms)[p1] ) 00068 { 00069 if( (*cross_parms)[p1][t] == p2 ) 00070 break; 00071 } 00072 00073 if( t >= (*n_cross_terms)[p1] ) 00074 { 00075 t = (*n_cross_terms)[p1]; 00076 SET_ARRAY_SIZE( (*cross_terms)[p1], t, t+1, alloc_increment ); 00077 SET_ARRAY_SIZE( (*cross_parms)[p1], t, t+1, alloc_increment ); 00078 (*cross_parms)[p1][t] = p2; 00079 (*cross_terms)[p1][t] = 0.0; 00080 ++(*n_cross_terms)[p1]; 00081 } 00082 00083 (*cross_terms)[p1][t] += value; 00084 } 00085 00086 public void realloc_quadratic_cross_terms_real( 00087 int n_parameters, 00088 int n_cross_terms[], 00089 int **cross_parms[], 00090 Real **cross_terms[] ) 00091 { 00092 int p; 00093 00094 for_less( p, 0, n_parameters ) 00095 { 00096 if( n_cross_terms[p] > 0 ) 00097 { 00098 REALLOC( (*cross_terms)[p], n_cross_terms[p] ); 00099 REALLOC( (*cross_parms)[p], n_cross_terms[p] ); 00100 } 00101 } 00102 } 00103 00104 public void delete_quadratic_real( 00105 int n_parameters, 00106 Real linear_terms[], 00107 Real square_terms[], 00108 int n_cross_terms[], 00109 int *cross_parms[], 00110 Real *cross_terms[] ) 00111 { 00112 int p; 00113 00114 for_less( p, 0, n_parameters ) 00115 { 00116 if( n_cross_terms[p] > 0 ) 00117 { 00118 FREE( cross_parms[p] ); 00119 FREE( cross_terms[p] ); 00120 } 00121 } 00122 00123 FREE( linear_terms ); 00124 FREE( square_terms ); 00125 FREE( n_cross_terms ); 00126 FREE( cross_terms ); 00127 FREE( cross_parms ); 00128 } 00129 00130 public Real evaluate_quadratic_real( 00131 int n_parameters, 00132 Real parameters[], 00133 Real constant, 00134 Real linear[], 00135 Real square[], 00136 int n_cross_terms[], 00137 int *cross_parms[], 00138 Real *cross_terms[] ) 00139 { 00140 int parm, c; 00141 Real fit, x, inc; 00142 00143 fit = constant; 00144 00145 for_less( parm, 0, n_parameters ) 00146 { 00147 x = parameters[parm]; 00148 00149 inc = linear[parm] + x * square[parm]; 00150 00151 for_less( c, 0, n_cross_terms[parm] ) 00152 inc += parameters[cross_parms[parm][c]] * cross_terms[parm][c]; 00153 00154 fit += x * inc; 00155 } 00156 00157 return( fit ); 00158 } 00159 00160 public void evaluate_quadratic_deriv_real( 00161 int n_parameters, 00162 Real parameters[], 00163 Real linear[], 00164 Real square[], 00165 int n_cross_terms[], 00166 int *cross_parms[], 00167 Real *cross_terms[], 00168 Real deriv[] ) 00169 { 00170 int parm, c, n_index; 00171 Real tx, dx, x; 00172 00173 for_less( parm, 0, n_parameters ) 00174 { 00175 x = parameters[parm]; 00176 00177 dx = linear[parm] + 2.0 * x * square[parm]; 00178 00179 for_less( c, 0, n_cross_terms[parm] ) 00180 { 00181 n_index = cross_parms[parm][c]; 00182 tx = cross_terms[parm][c]; 00183 00184 deriv[n_index] += x * tx; 00185 dx += parameters[n_index] * tx; 00186 } 00187 00188 deriv[parm] += dx; 00189 } 00190 }

Generated on Wed Jul 28 09:10:58 2004 for BICPL by doxygen 1.3.7