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 }