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

minimize_lsq.c

Go to the documentation of this file.
00001 #include <volume_io/internal_volume_io.h> 00002 #include <bicpl/numerical.h> 00003 #include <bicpl/prog_utils.h> 00004 00005 #define LSQ_TYPE Real 00006 #define MINIMIZE_LSQ minimize_lsq 00007 00008 #include "minimize_lsq_include.c" 00009 00010 public Real minimize_lsq( 00011 int n_parameters, 00012 Real constant_term, 00013 Real linear_terms[], 00014 Real square_terms[], 00015 int n_cross_terms[], 00016 int *cross_parms[], 00017 Real *cross_terms[], 00018 Real max_step_size, 00019 int n_iters, 00020 Real node_values[] ) 00021 { 00022 return( private_minimize_lsq( n_parameters, constant_term, 00023 linear_terms, square_terms, 00024 n_cross_terms, cross_parms, cross_terms, 00025 max_step_size, n_iters, node_values ) ); 00026 } 00027 00028 public void initialize_lsq_terms( 00029 int n_parameters, 00030 Real *constant_term, 00031 Real *linear_terms[], 00032 Real *square_terms[], 00033 int *n_cross_terms[], 00034 int **cross_parms[], 00035 Real **cross_terms[] ) 00036 { 00037 int parm; 00038 00039 ALLOC( *linear_terms, n_parameters ); 00040 ALLOC( *square_terms, n_parameters ); 00041 ALLOC( *n_cross_terms, n_parameters ); 00042 ALLOC( *cross_parms, n_parameters ); 00043 ALLOC( *cross_terms, n_parameters ); 00044 00045 *constant_term = 0.0; 00046 00047 for_less( parm, 0, n_parameters ) 00048 { 00049 (*linear_terms)[parm] = 0.0; 00050 (*square_terms)[parm] = 0.0; 00051 (*n_cross_terms)[parm] = 0; 00052 } 00053 } 00054 00055 public void reset_lsq_terms( 00056 int n_parameters, 00057 Real *constant_term, 00058 Real linear_terms[], 00059 Real square_terms[], 00060 int n_cross_terms[], 00061 int *cross_parms[], 00062 Real *cross_terms[] ) 00063 { 00064 int parm, n; 00065 00066 *constant_term = 0.0; 00067 00068 for_less( parm, 0, n_parameters ) 00069 { 00070 linear_terms[parm] = 0.0; 00071 square_terms[parm] = 0.0; 00072 for_less( n, 0, n_cross_terms[parm] ) 00073 cross_terms[parm][n] = 0.0; 00074 } 00075 } 00076 00077 public void add_to_lsq_terms( 00078 int n_parameters, 00079 Real *constant_term, 00080 Real linear_terms[], 00081 Real square_terms[], 00082 int n_cross_terms[], 00083 int *cross_parms[], 00084 Real *cross_terms[], 00085 int n_in_list, 00086 int list[], 00087 Real weights[], 00088 Real constant, 00089 int alloc_increment ) 00090 { 00091 int p, q, p1, p2, t; 00092 00093 *constant_term += constant * constant; 00094 00095 for_less( p, 0, n_in_list ) 00096 { 00097 linear_terms[list[p]] += 2.0 * weights[p] * constant; 00098 square_terms[list[p]] += weights[p] * weights[p]; 00099 for_less( q, p+1, n_in_list ) 00100 { 00101 p1 = MIN( list[p], list[q] ); 00102 p2 = MAX( list[p], list[q] ); 00103 for_less( t, 0, n_cross_terms[p1] ) 00104 { 00105 if( cross_parms[p1][t] == p2 ) 00106 break; 00107 } 00108 00109 if( t >= n_cross_terms[p1] ) 00110 { 00111 t = n_cross_terms[p1]; 00112 SET_ARRAY_SIZE( cross_terms[p1], t, t+1, alloc_increment ); 00113 SET_ARRAY_SIZE( cross_parms[p1], t, t+1, alloc_increment ); 00114 cross_parms[p1][t] = p2; 00115 cross_terms[p1][t] = 0.0; 00116 ++n_cross_terms[p1]; 00117 } 00118 00119 cross_terms[p1][t] += 2.0 * weights[p] * weights[q]; 00120 } 00121 } 00122 } 00123 00124 public void realloc_lsq_terms( 00125 int n_parameters, 00126 int n_cross_terms[], 00127 int *cross_parms[], 00128 Real *cross_terms[] ) 00129 { 00130 int p; 00131 00132 for_less( p, 0, n_parameters ) 00133 { 00134 if( n_cross_terms[p] > 0 ) 00135 { 00136 REALLOC( cross_terms[p], n_cross_terms[p] ); 00137 REALLOC( cross_parms[p], n_cross_terms[p] ); 00138 } 00139 } 00140 } 00141 00142 public void delete_lsq_terms( 00143 int n_parameters, 00144 Real linear_terms[], 00145 Real square_terms[], 00146 int n_cross_terms[], 00147 int *cross_parms[], 00148 Real *cross_terms[] ) 00149 { 00150 int p; 00151 00152 for_less( p, 0, n_parameters ) 00153 { 00154 if( n_cross_terms[p] > 0 ) 00155 { 00156 FREE( cross_parms[p] ); 00157 FREE( cross_terms[p] ); 00158 } 00159 } 00160 00161 FREE( linear_terms ); 00162 FREE( square_terms ); 00163 FREE( n_cross_terms ); 00164 FREE( cross_terms ); 00165 FREE( cross_parms ); 00166 }

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