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 #ifndef __HOMEOKINBASE_H
00027 #define __HOMEOKINBASE_H
00028
00029 #include "abstractcontroller.h"
00030 #include "controller_misc.h"
00031 #include <stdlib.h>
00032 #include <string.h>
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 class HomeokinBase : public AbstractController {
00043 public:
00044 HomeokinBase( unsigned short buffersize ,
00045 const std::string& name, const std::string& revision)
00046 : AbstractController(name, revision){
00047 this->buffersize = buffersize;
00048 addParameterDef("epsC", &epsC, 0.1);
00049 addParameterDef("epsA",&epsA, 0.1);
00050 addParameterDef("s4delay",&s4delay,1);
00051 addParameterDef("s4avg",&s4avg,1);
00052 addParameterDef("factorB",&factorB,0.2);
00053 addParameterDef("squashsize",&squashSize,0.01);
00054 addParameterDef("rootE",&rootE,0);
00055 addParameterDef("logaE",&logaE,0);
00056 t=0;
00057 initialised = false;
00058 }
00059
00060
00061 protected:
00062 paramval epsC;
00063 paramval epsA;
00064 paramval factorB;
00065 paramint s4delay;
00066 paramint s4avg;
00067 paramint logaE;
00068 paramint rootE;
00069
00070
00071 paramval squashSize;
00072
00073 int t;
00074 unsigned short buffersize;
00075 bool initialised;
00076
00077 protected:
00078
00079 void putInBuffer(matrix::Matrix* buffer, const matrix::Matrix& vec, int delay=0){
00080 buffer[(t-delay)%buffersize] = vec;
00081 }
00082
00083
00084 virtual matrix::Matrix calculateDelayedValues(const matrix::Matrix* buffer,
00085 int number_steps_of_delay_){
00086
00087 assert ((unsigned)number_steps_of_delay_ < buffersize);
00088 return buffer[(t - number_steps_of_delay_) % buffersize];
00089 };
00090
00091
00092 virtual matrix::Matrix calculateSmoothValues(const matrix::Matrix* buffer,
00093 int number_steps_for_averaging_){
00094
00095 assert ((int)number_steps_for_averaging_ <= buffersize);
00096
00097 matrix::Matrix result(buffer[t % buffersize]);
00098 for (int k = 1; k < number_steps_for_averaging_; k++) {
00099 result += buffer[(t - k + buffersize) % buffersize];
00100 }
00101 result *= 1/((double) (number_steps_for_averaging_));
00102 return result;
00103 };
00104
00105
00106 virtual double calcErrorFactor(const matrix::Matrix& e, bool loga, bool root) {
00107 double error_factor = 1;
00108 if (loga){
00109 error_factor= 1/(e.multTM().val(0,0)+0.000001)*0.01;
00110 }
00111 if (root){
00112 error_factor= 1/sqrt(e.multTM().val(0,0)+0.000001)*0.1;
00113 }
00114 return error_factor;
00115 }
00116
00117
00118
00119 static double g(double z)
00120 {
00121 return tanh(z);
00122 };
00123
00124
00125
00126 };
00127
00128 #endif