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
00038
00039
00040
00041
00042
00043
00044
00045
00046 #ifndef __INVERTMOTORCONTROLLER_H
00047 #define __INVERTMOTORCONTROLLER_H
00048
00049 #include "abstractcontroller.h"
00050 #include "controller_misc.h"
00051 #include <stdlib.h>
00052 #include <string.h>
00053
00054
00055
00056
00057
00058
00059
00060
00061 class InvertMotorController : public AbstractController {
00062 public:
00063 InvertMotorController( unsigned short buffersize ,
00064 const std::string& name, const std::string& revision)
00065 : AbstractController(name, revision){
00066 this->buffersize = buffersize;
00067 epsC=0.1;
00068 desens=0.0;
00069 s4delay=1;
00070 s4avg=1;
00071 steps=1;
00072 epsA=0.1;
00073 dampA=0;
00074 factorB=0.2;
00075 zetaupdate=0;
00076 squashSize=0.01;
00077 logaE=0;
00078 rootE=0;
00079 relativeE=0;
00080 adaptRate=0.005;
00081 nomUpdate=0.005;
00082 noiseB = 0.001;
00083 noiseY = 0.1;
00084 teacher = 5;
00085 t=0;
00086 initialised = false;
00087 }
00088
00089
00090
00091 virtual paramval getParam(const paramkey& key) const{
00092 if(key == "epsC") return epsC;
00093 else if(key == "epsA") return epsA;
00094 else if(key == "dampA") return dampA;
00095 else if(key == "adaptrate") return adaptRate;
00096 else if(key == "nomupdate") return nomUpdate;
00097 else if(key == "desens") return desens;
00098 else if(key == "s4delay") return s4delay;
00099 else if(key == "s4avg") return s4avg;
00100 else if(key == "steps") return steps;
00101 else if(key == "zetaupdate") return zetaupdate;
00102 else if(key == "squashsize") return squashSize;
00103 else if(key == "logaE") return logaE;
00104 else if(key == "rootE") return rootE;
00105 else if(key == "relativeE") return relativeE;
00106 else if(key == "factorB") return factorB;
00107 else if(key == "noiseB") return noiseB;
00108 else if(key == "noiseY") return noiseY;
00109 else if(key == "teacher") return teacher;
00110 else return AbstractController::getParam(key);
00111 }
00112
00113 virtual bool setParam(const paramkey& key, paramval val){
00114 if(key == "epsC") epsC=val;
00115 else if(key == "epsA") epsA=val;
00116 else if(key == "dampA") dampA=val;
00117 else if(key == "adaptrate") adaptRate=val;
00118 else if(key == "nomupdate") nomUpdate=val;
00119 else if(key == "desens") desens=val;
00120 else if(key == "s4delay") s4delay=val;
00121 else if(key == "s4avg") s4avg=val;
00122 else if(key == "steps") steps=val;
00123 else if(key == "zetaupdate") zetaupdate=val;
00124 else if(key == "squashsize") squashSize=val;
00125 else if(key == "logaE") logaE=(short)val;
00126 else if(key == "rootE") rootE=(short)val;
00127 else if(key == "relativeE") relativeE=(short)val;
00128 else if(key == "factorB") factorB=val;
00129 else if(key == "noiseB") noiseB=val;
00130 else if(key == "noiseY") noiseY=val;
00131 else if(key == "teacher") teacher=val;
00132 else return AbstractController::setParam(key, val);
00133
00134 return true;
00135 }
00136
00137 virtual paramlist getParamList() const{
00138 paramlist list;
00139 list.push_back(std::pair<paramkey, paramval> ("epsA", epsA));
00140 list.push_back(std::pair<paramkey, paramval> ("epsC", epsC));
00141 list.push_back(std::pair<paramkey, paramval> ("dampA", dampA));
00142 list.push_back(std::pair<paramkey, paramval> ("adaptrate", adaptRate));
00143 list.push_back(std::pair<paramkey, paramval> ("nomupdate", nomUpdate));
00144 list.push_back(std::pair<paramkey, paramval> ("desens", desens));
00145 list.push_back(std::pair<paramkey, paramval> ("s4delay", s4delay ));
00146 list.push_back(std::pair<paramkey, paramval> ("s4avg", s4avg));
00147 list.push_back(std::pair<paramkey, paramval> ("steps", steps));
00148 list.push_back(std::pair<paramkey, paramval> ("zetaupdate", zetaupdate));
00149 list.push_back(std::pair<paramkey, paramval> ("squashsize", squashSize));
00150 list.push_back(std::pair<paramkey, paramval> ("logaE", logaE));
00151 list.push_back(std::pair<paramkey, paramval> ("rootE", rootE));
00152 list.push_back(std::pair<paramkey, paramval> ("relativeE", relativeE));
00153 list.push_back(std::pair<paramkey, paramval> ("factorB", factorB));
00154 list.push_back(std::pair<paramkey, paramval> ("noiseB", noiseB));
00155 list.push_back(std::pair<paramkey, paramval> ("noiseY", noiseY));
00156 list.push_back(std::pair<paramkey, paramval> ("teacher", teacher));
00157 return list;
00158 }
00159
00160 protected:
00161 paramval epsC;
00162 paramval desens;
00163 paramval s4delay;
00164 paramval s4avg;
00165 paramval steps;
00166 paramval epsA;
00167 paramval factorB;
00168 paramval zetaupdate;
00169 paramval dampA;
00170 short logaE;
00171 short rootE;
00172 short relativeE;
00173
00174 paramval squashSize;
00175 paramval adaptRate;
00176 paramval nomUpdate;
00177 paramval noiseB;
00178 paramval noiseY;
00179 paramval teacher;
00180
00181 int t;
00182 unsigned short buffersize;
00183 std::string name;
00184 bool initialised;
00185
00186 protected:
00187
00188 void putInBuffer(matrix::Matrix* buffer, const matrix::Matrix& vec, int delay = 0){
00189 buffer[(t-delay)%buffersize] = vec;
00190 }
00191
00192
00193 virtual matrix::Matrix calculateDelayedValues(const matrix::Matrix* buffer,
00194 int number_steps_of_delay_){
00195
00196 assert ((unsigned)number_steps_of_delay_ < buffersize);
00197 return buffer[(t - number_steps_of_delay_) % buffersize];
00198 };
00199
00200
00201 virtual matrix::Matrix calculateSmoothValues(const matrix::Matrix* buffer,
00202 int number_steps_for_averaging_){
00203
00204 assert ((int)number_steps_for_averaging_ <= buffersize);
00205
00206 matrix::Matrix result(buffer[t % buffersize]);
00207 for (int k = 1; k < number_steps_for_averaging_; k++) {
00208 result += buffer[(t - k) % buffersize];
00209 }
00210 result *= 1/((double) (number_steps_for_averaging_));
00211 return result;
00212 };
00213
00214
00215 virtual double calcErrorFactor(const matrix::Matrix& e, bool loga, bool root) {
00216 double error_factor = 1;
00217 if (loga){
00218 error_factor= 1/(e.multTM().val(0,0)+0.000001)*0.01;
00219 }
00220 if (root){
00221 error_factor= 1/sqrt(e.multTM().val(0,0)+0.000001)*0.1;
00222 }
00223 return error_factor;
00224 }
00225
00226
00227
00228 static double g(double z)
00229 {
00230 return tanh(z);
00231 };
00232
00233
00234 static double g_s(double z)
00235 {
00236 double k=tanh(z);
00237 return 1.025 - k*k;
00238
00239
00240 };
00241
00242
00243 static double g_s_inv(double z)
00244 {
00245 double k=tanh(z);
00246 return 1/(1.025 - k*k);
00247
00248
00249 };
00250
00251
00252
00253
00254 static double g_s(double z, double xsi) {
00255 double Z = clip(z, -3.0, 3.0) + clip(xsi, -1.0, 1.0);
00256 double k=tanh(Z);
00257 return 1 - k*k;
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269 };
00270
00271
00272 static double g_2s_div_s(double z, double xsi) {
00273
00274 double Z = clip(z, -3.0, 3.0) + clip(xsi, -1.0, 1.0);
00275
00276 return -2*g(Z);
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293 };
00294
00295
00296 static double squash(double z)
00297 {
00298 return z < -0.1 ? -0.1 : ( z > 0.1 ? 0.1 : z );
00299
00300 };
00301
00302
00303 static double squash(void* d, double z) {
00304 double size = *((double*)d);
00305 return z < -size ? -size : ( z > size ? size : z );
00306 };
00307
00308 };
00309
00310 #endif