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 }