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 #include<stdlib.h>
00026 #include<math.h>
00027
00028 #include "aibicom.h"
00029
00030 double *SS_DOMAIN;
00031 double *SS_MASK;
00032 double *SS_ESTIMATE;
00033 double *ESTIMATE;
00034 double SS_RD1;
00035 double SS_RD2;
00037 int SS_OUTI;
00039 void SS_LinSpace(void)
00040 {
00041 int i;
00042
00043 for (i = 0; i < SS_RES; i++)
00044 SS_DOMAIN[i] = ((((double)i / (SS_RES - 1)) * (SS_RD1)) + SS_MIND1);
00045 }
00046
00047 double SS_GetD1(int i)
00048 {
00049 return SS_DOMAIN[i];
00050 }
00051
00052 double SS_GetD2(int i)
00053 {
00054 double tmp;
00055
00056 tmp = (SS_C * SS_DOMAIN[i]);
00057 while ((tmp > SS_MAXD1) || (tmp < SS_MIND1))
00058 if (tmp >= 0.0)
00059 tmp = tmp - SS_RD1;
00060 else
00061 tmp = tmp + SS_RD1;
00062
00063 return (((tmp - SS_MIND1) / SS_RD1) * SS_RD2) + SS_MIND2;
00064 }
00065
00066 void SS_UpdateMask(void)
00067 {
00068 int i;
00069 double s, d, dd1, dd2;
00070
00071 s = SS_MWIDTH / 2.0;
00072
00073 for (i = 0; i < SS_RES; i++)
00074 {
00075
00076 if (SS_2D)
00077 {
00078 dd1 = ((SS_GetD1(i) - SS_GetD1(SS_OUTI)) / SS_RD1);
00079 dd2 = ((SS_GetD2(i) - SS_GetD2(SS_OUTI)) / SS_RD2);
00080 d = sqrt((dd1 * dd1) + (dd2 * dd2));
00081 }
00082 else
00083 d = fabs(SS_GetD1(i) - SS_GetD1(SS_OUTI)) / SS_RD1;
00084
00085
00086 switch (SS_MTYPE)
00087 {
00088
00089 case 0:
00090 if(i==SS_OUTI)
00091 SS_MASK[i] = 1;
00092 else
00093 SS_MASK[i] = 0;
00094 break;
00095
00096 case 1:
00097 if((i==SS_OUTI) || ((SS_GetD1(i) == 0.0) && (SS_GetD2(i) == 0.0)))
00098 SS_MASK[i] = 1;
00099 else
00100 SS_MASK[i] = 0;
00101 break;
00102
00103 case 2:
00104 if (d <= s)
00105 SS_MASK[i] = 1.0 - (d / s);
00106 else
00107 SS_MASK[i] = 0.0;
00108 break;
00109
00110
00111 case 3:
00112 if (d <= s)
00113 SS_MASK[i] = 1.0 - (d / s);
00114 else
00115 SS_MASK[i] = 0.0;
00116 if ((SS_GetD1(i) == 0.0) && (SS_GetD2(i) == 0.0))
00117 SS_MASK[i] = 1.0;
00118 break;
00119 }
00120 }
00121 }
00122
00123 int SS_FindMin(double *V)
00124 {
00125 double min;
00126 int i, j, minc, mini, minj;
00127
00128
00129 min = 1.0;
00130 mini = 0;
00131 for (i = 0; i < SS_RES; i++)
00132 {
00133 if (V[i] < min)
00134 {
00135 min = V[i];
00136 mini = i;
00137 }
00138 }
00139
00140
00141 minc = 0;
00142 for (i = 0; i < SS_RES; i++)
00143 {
00144 V[i] = V[i] - min;
00145 if (V[i] == 0.0)
00146 minc++;
00147 }
00148
00149 if (minc > 1) printf("More than 1 minimum found!\n");
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162 if (minc > 1)
00163 {
00164 minj = rand() % minc;
00165 i = -1;
00166 j = -1;
00167 while(j < minj)
00168 {
00169 i++;
00170 if (V[i] == 0.0)
00171 j++;
00172 }
00173 mini = i;
00174 }
00175
00176 return mini;
00177
00178 }
00179
00180 void SS_Init(void)
00181 {
00182
00183 int i;
00184
00185 SS_DOMAIN = malloc(SS_RES * sizeof(double));
00186 SS_MASK = malloc(SS_RES * sizeof(double));
00187 SS_ESTIMATE = malloc(SS_RES * sizeof(double));
00188 ESTIMATE = malloc(SS_RES * sizeof(double));
00189
00190 SS_RD1 = SS_MAXD1 - SS_MIND1;
00191 SS_RD2 = SS_MAXD2 - SS_MIND2;
00192
00193 SS_LinSpace();
00194
00195
00196 for (i = 0; i < SS_RES; i++)
00197 {
00198 SS_MASK[i] = 0.0;
00199 if ((SS_GetD1(i) == 0.0) && (SS_GetD2(i) == 0.0) && (SS_MTYPE == 2))
00200 SS_MASK[i] = 1.0;
00201 SS_ESTIMATE[i] = (double)rand() / (RAND_MAX + 1.0);
00202 }
00203
00204 }
00205
00206 void SS_ApplyDecay(double *V, double K)
00207 {
00208 int i;
00209
00210
00211
00212
00213
00214
00215 for (i = 0; i < SS_RES; i++)
00216 V[i] = K * V[i];
00217 }
00218
00219 int SS_IfExecute(void)
00220 {
00221 int i, OUTI;
00222
00223 for (i = 0; i < SS_RES; i++)
00224 ESTIMATE[i] = SS_ESTIMATE[i];
00225
00226
00227 SS_ApplyDecay(ESTIMATE, SS_K);
00228
00229
00230 for (i = 0; i < SS_RES; i++)
00231 ESTIMATE[i] = ESTIMATE[i] + (SS_MASK[i] * (1.0 - ESTIMATE[i]));
00232
00233 OUTI = SS_FindMin(ESTIMATE);
00234
00235 return OUTI;
00236 }
00237
00238 int SS_Execute(void)
00239 {
00240 int i;
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254 SS_ApplyDecay(SS_ESTIMATE, SS_K);
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268 for (i = 0; i < SS_RES; i++)
00269 SS_ESTIMATE[i] = SS_ESTIMATE[i] + (SS_MASK[i] * (1.0 - SS_ESTIMATE[i]));
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280 SS_OUTI = SS_FindMin(SS_ESTIMATE);
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293 SS_UpdateMask();
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317 return SS_OUTI;
00318
00319 }
00320
00321 void SS_Clear(void)
00322 {
00323 free(SS_DOMAIN);
00324 free(SS_MASK);
00325 free(SS_ESTIMATE);
00326 free(ESTIMATE);
00327 }
00328