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

minimize_lsq_float.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 float 00006 #define MINIMIZE_LSQ minimize_lsq 00007 00008 #include "minimize_lsq_include.c" 00009 00010 public Real minimize_lsq_float( 00011 int n_parameters, 00012 Real constant_term, 00013 float linear_terms[], 00014 float square_terms[], 00015 int n_cross_terms[], 00016 int *cross_parms[], 00017 float *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_float( 00029 int n_parameters, 00030 Real *constant_term, 00031 float *linear_terms[], 00032 float *square_terms[], 00033 int *n_cross_terms[], 00034 int **cross_parms[], 00035 float **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.0f; 00050 (*square_terms)[parm] = 0.0f; 00051 (*n_cross_terms)[parm] = 0; 00052 } 00053 } 00054 00055 public void reset_lsq_terms_float( 00056 int n_parameters, 00057 Real *constant_term, 00058 float linear_terms[], 00059 float square_terms[], 00060 int n_cross_terms[], 00061 int *cross_parms[], 00062 float *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.0f; 00071 square_terms[parm] = 0.0f; 00072 for_less( n, 0, n_cross_terms[parm] ) 00073 cross_terms[parm][n] = 0.0f; 00074 } 00075 } 00076 00077 public void add_to_lsq_terms_float( 00078 int n_parameters, 00079 Real *constant_term, 00080 float linear_terms[], 00081 float square_terms[], 00082 int n_cross_terms[], 00083 int *cross_parms[], 00084 float *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]] += (float) (2.0 * weights[p] * constant); 00098 square_terms[list[p]] += (float) (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.0f; 00116 ++n_cross_terms[p1]; 00117 } 00118 00119 cross_terms[p1][t] += (float) (2.0 * weights[p] * weights[q]); 00120 } 00121 } 00122 } 00123 00124 public void realloc_lsq_terms_float( 00125 int n_parameters, 00126 int n_cross_terms[], 00127 int *cross_parms[], 00128 float *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_float( 00143 int n_parameters, 00144 float linear_terms[], 00145 float square_terms[], 00146 int n_cross_terms[], 00147 int *cross_parms[], 00148 float *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 } 00167 00168 public void create_lsq_hypersurface_float( 00169 STRING filename, 00170 int parm1, 00171 int parm2, 00172 int x_size, 00173 int y_size, 00174 Real x_min, 00175 Real x_max, 00176 Real y_min, 00177 Real y_max, 00178 Real scale, 00179 int n_parameters, 00180 Real constant, 00181 float linear_terms[], 00182 float square_terms[], 00183 int n_cross_terms[], 00184 int *cross_parms[], 00185 float *cross_terms[], 00186 Real parameters[] ) 00187 { 00188 Real save1, save2, p1, p2, val; 00189 object_struct *object; 00190 quadmesh_struct *quadmesh; 00191 Point point; 00192 Vector normal; 00193 int x, y; 00194 00195 object = create_object( QUADMESH ); 00196 quadmesh = get_quadmesh_ptr( object ); 00197 00198 initialize_quadmesh( quadmesh, WHITE, NULL, x_size, y_size ); 00199 00200 save1 = parameters[parm1]; 00201 save2 = parameters[parm2]; 00202 00203 for_less( x, 0, x_size ) 00204 for_less( y, 0, x_size ) 00205 { 00206 p1 = INTERPOLATE( (Real) x / (Real) (x_size-1), x_min, x_max ); 00207 p2 = INTERPOLATE( (Real) y / (Real) (y_size-1), y_min, y_max ); 00208 parameters[parm1] = p1; 00209 parameters[parm2] = p2; 00210 val = evaluate_fit( n_parameters, constant, linear_terms, square_terms, 00211 n_cross_terms, cross_parms, cross_terms, 00212 parameters ); 00213 val *= scale; 00214 00215 fill_Point( point, p1, p2, val ); 00216 fill_Point( normal, 0.0, 0.0, 1.0 ); 00217 set_quadmesh_point( quadmesh, x_size - 1 - x, y, &point, &normal ); 00218 } 00219 00220 parameters[parm1] = save1; 00221 parameters[parm2] = save2; 00222 00223 compute_quadmesh_normals( quadmesh ); 00224 00225 (void) output_graphics_file( filename, BINARY_FORMAT, 1, &object ); 00226 00227 delete_object( object ); 00228 }

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