00001
00002
00003
00004
00005
00006
00007
00008 #include <math.h>
00009
00010 #define Act_Logistic(sum, bias) ( (sum+bias<10000.0) ? ( 1.0/(1.0 + exp(-sum-bias) ) ) : 0.0 )
00011 #ifndef NULL
00012 #define NULL (void *)0
00013 #endif
00014
00015 typedef struct UT {
00016 float act;
00017 float Bias;
00018 int NoOfSources;
00019 struct UT **sources;
00020 float *weights;
00021 } UnitType, *pUnit;
00022
00023
00024 static UnitType Units[13];
00025
00026 static pUnit Sources[] = {
00027 Units + 1, Units + 2, Units + 3, Units + 4, Units + 5,
00028 Units + 1, Units + 2, Units + 3, Units + 4, Units + 5,
00029 Units + 1, Units + 2, Units + 3, Units + 4, Units + 5,
00030 Units + 1, Units + 2, Units + 3, Units + 4, Units + 5,
00031 Units + 1, Units + 2, Units + 3, Units + 4, Units + 5,
00032 Units + 1, Units + 2, Units + 3, Units + 4, Units + 5,
00033 Units + 6, Units + 7, Units + 8, Units + 9, Units + 10, Units + 11,
00034
00035 };
00036
00037
00038 static float Weights[] = {
00039 -25.288549, -4.046800, 5.016060, 0.513620, 0.626160,
00040 2.070870, -0.100070, 2.819970, 25.874180, -4.198960,
00041 7.204980, 6.118720, -0.542130, 0.093370, 5.098960,
00042 -4.418000, 2.607140, 7.771570, -2.675650, 18.379610,
00043 -9.906980, 6.152710, 2.138680, -0.293120, 36.910759,
00044 8.016760, -2.452140, -6.188510, -11.696310, -6.958790,
00045 -4.582510, -3.758210, -8.969600, 2.015460, 7.999760, -1.914720,
00046
00047 };
00048
00049
00050 static UnitType Units[13] =
00051 {
00052 { 0.0, 0.0, 0, NULL , NULL },
00053 {
00054 0.0, 0.858420, 0,
00055 &Sources[0] ,
00056 &Weights[0] ,
00057 },
00058 {
00059 0.0, -0.234780, 0,
00060 &Sources[0] ,
00061 &Weights[0] ,
00062 },
00063 {
00064 0.0, 0.597270, 0,
00065 &Sources[0] ,
00066 &Weights[0] ,
00067 },
00068 {
00069 0.0, 0.585270, 0,
00070 &Sources[0] ,
00071 &Weights[0] ,
00072 },
00073 {
00074 0.0, 0.605490, 0,
00075 &Sources[0] ,
00076 &Weights[0] ,
00077 },
00078 {
00079 0.0, -5.710260, 5,
00080 &Sources[0] ,
00081 &Weights[0] ,
00082 },
00083 {
00084 0.0, -0.678110, 5,
00085 &Sources[5] ,
00086 &Weights[5] ,
00087 },
00088 {
00089 0.0, -1.901810, 5,
00090 &Sources[10] ,
00091 &Weights[10] ,
00092 },
00093 {
00094 0.0, -2.729140, 5,
00095 &Sources[15] ,
00096 &Weights[15] ,
00097 },
00098 {
00099 0.0, -6.891270, 5,
00100 &Sources[20] ,
00101 &Weights[20] ,
00102 },
00103 {
00104 0.0, 4.918040, 5,
00105 &Sources[25] ,
00106 &Weights[25] ,
00107 },
00108 {
00109 0.0, 2.315280, 6,
00110 &Sources[30] ,
00111 &Weights[30] ,
00112 }
00113
00114 };
00115
00116
00117
00118 int LCDNNTrackAttachGhostZpole(float *in, float *out, int init)
00119 {
00120 int member, source;
00121 float sum;
00122 enum{OK, Error, Not_Valid};
00123 pUnit unit;
00124
00125
00126
00127
00128 static pUnit Input[5] = {Units + 1, Units + 2, Units + 3, Units + 4, Units + 5};
00129
00130 static pUnit Hidden1[6] = {Units + 6, Units + 7, Units + 8, Units + 9, Units + 10, Units + 11};
00131
00132 static pUnit Output1[1] = {Units + 12};
00133
00134 static int Output[1] = {12};
00135
00136 for(member = 0; member < 5; member++) {
00137 Input[member]->act = in[member];
00138 }
00139
00140 for (member = 0; member < 6; member++) {
00141 unit = Hidden1[member];
00142 sum = 0.0;
00143 for (source = 0; source < unit->NoOfSources; source++) {
00144 sum += unit->sources[source]->act
00145 * unit->weights[source];
00146 }
00147 unit->act = Act_Logistic(sum, unit->Bias);
00148 };
00149
00150 for (member = 0; member < 1; member++) {
00151 unit = Output1[member];
00152 sum = 0.0;
00153 for (source = 0; source < unit->NoOfSources; source++) {
00154 sum += unit->sources[source]->act
00155 * unit->weights[source];
00156 }
00157 unit->act = Act_Logistic(sum, unit->Bias);
00158 };
00159
00160 for(member = 0; member < 1; member++) {
00161 out[member] = Units[Output[member]].act;
00162 }
00163
00164 return(OK);
00165 }