00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #ifndef MOD_APPATT_H
00038 #define MOD_APPATT_H
00039
00040 #include "sia_module.C.h"
00041 #include "../_lib/if/if.h"
00042 #include "../_lib/dbase/dbase_sia.h"
00043
00044 class APPATT;
00045
00046 #define EPS 0.0001
00047 #define EPS_DOWN 0.9999
00048 #define EPS_UP 1.0001
00049
00050 #define X_TOLERANCE 1.0e-3
00051 #define T_STAR_FACTOR 366.4678
00052
00053
00054
00055 typedef float MATRIX_FORMAT;
00056
00057 struct FP
00058 {
00059 DATA_SAMPLE f, p;
00060 };
00061
00062 struct IN_SOURCE
00063 {
00064 USER_DBTAB *table;
00065 HEADER *number,
00066 *freq,
00067 *power, *variance;
00068
00069 int num_f;
00070 double *spectrum;
00071
00072 };
00073
00074 struct OUT_TT
00075 {
00076 USER_DBTAB *table;
00077 HEADER *number,
00078 *arg,
00079 *value, *variance;
00080
00081
00082 int entry_length() const { return table ? table->entry.length() : 0; }
00083 };
00084
00085 struct OUT_RES_VAR
00086 {
00087 USER_DBTAB *table;
00088 HEADER *row, *column,
00089 *resolution, *covariance;
00090 };
00091
00094 struct APPATT_RANGES
00095 {
00096 APPATT_RANGES(APPATT &a) : A(a) {}
00097
00098 virtual double basis_fun ( const POINT &p, int k ) const = 0;
00100
00101 virtual int prepare() = 0;
00105
00106 virtual boolean check( const char *title ) { return OK; }
00110
00111 virtual int num_points() const { return 0; }
00112
00113 virtual void prepare( const POINT &p ) {}
00114
00115 virtual void output_gamma() {}
00116 virtual void output_kappa() {}
00117
00118 APPATT &A;
00119 };
00120
00121 class X_RANGES;
00122
00123 struct X_RANGE
00124 {
00125 X_RANGE() : num(0), used(FALSE) {}
00126 X_RANGE(const X_RANGE &from) { _copy(from);}
00127 X_RANGE &operator=(const X_RANGE &from) { _copy(from); return *this; }
00128
00129 int num,
00130 used;
00131
00132 float min,
00133 max,
00134 inc;
00135
00136 boolean read( const X_RANGES ¤t );
00138
00139 int num_points() const { return num; }
00140
00141 protected:
00142 void _copy(const X_RANGE &r)
00143 { num = r.num; used = r.used; min = r.min; max = r.max; inc = r.inc; }
00144 };
00145
00148 struct X_RANGES : public APPATT_RANGES, ARRAY<X_RANGE>
00149 {
00150 X_RANGES( APPATT &a ) : APPATT_RANGES(a), ARRAY<X_RANGE>() {}
00151
00152 double basis_fun ( const POINT &p, int k ) const { return basis_fun0(p.x,k); }
00154
00155 int prepare();
00159
00160 void prepare( const POINT &p );
00161 boolean check( const char *title );
00162
00163
00164
00165 void output_gamma();
00166 void output_kappa();
00167
00168 int num_points() const;
00169
00170 private:
00171 double basis_fun0 ( double x, int k ) const;
00173 };
00174
00177 struct APPATT : public SIA_MODULE, DBMODULE
00178 {
00179 APPATT();
00180
00181 SELECT *select;
00182
00183
00184
00185 int num_freq,
00186 num_iter;
00187
00188 HEADER_PARAM xg,
00189
00190 xt,
00191
00192 freq_min, freq_max, freq_inc,
00193 weight,
00194 power_weight_min,
00195 power_weight_max,
00196 power_range_width;
00197
00198 int trial_number;
00199 float shift_t_star,
00200 shift_g;
00201
00202
00203
00204 int num_xg;
00205 APPATT_RANGES *xg_range;
00206
00207 int num_xt;
00208 APPATT_RANGES *xt_range;
00209
00210
00211
00212 OUT_TT t_star,
00213 amplitude,
00214 source;
00215
00216 OUT_RES_VAR quality;
00217
00218
00219
00220 IN_SOURCE in_source;
00221
00222
00223
00224 int num_trials;
00225
00226 float min_freq_min, max_freq_min,
00227 min_freq_max, max_freq_max;
00228
00229
00230
00231 float min_freq, max_freq, inc_freq;
00232
00233 int num_u;
00234 MATRIX_FORMAT *u, *result;
00235
00236 ARRAY<FP> work;
00237
00238 double *old_t_star, *old_source;
00239
00240
00241 void proc ( boolean random_trial=TRUE );
00243
00244 void compute_quality();
00246
00247 void converge();
00250
00251 void fill_source();
00253
00254 CHARSTR module_name( boolean active );
00255 int edit();
00256 boolean process();
00257
00258 int branch ( int range ) const;
00261
00262 boolean trace_power ( TRACE *t, double freq, double &power ) const;
00265
00266 protected:
00267
00268 boolean pass_traces();
00269
00270 virtual double freq_basis ( double freq, int k );
00272 };
00273
00274 #endif