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 }