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 #ifndef __REPLAYCONTROLLER_H
00043 #define __REPLAYCONTROLLER_H
00044
00045 #include "abstractcontroller.h"
00046
00047
00048
00049
00050 class ReplayController : public AbstractController {
00051 public:
00052 ReplayController(const char* filename, bool repeat=false)
00053 : AbstractController("ReplayController", "$Id: replaycontroller.h,v 1.4 2008/04/17 14:54:45 martius Exp $"),
00054 filename(filename), repeat(repeat) {
00055
00056 f=fopen(filename,"r");
00057 if(!f){
00058 std::cerr<< "ReplayController: error while opening file " << filename << std::endl;
00059 exit(1);
00060 }
00061 if(!parseDataFileForHeader(f)){
00062 std::cerr<< "ReplayController: error while seaching for header in file " << filename << std::endl;
00063 exit(1);
00064 }
00065 printf("ReplayController: columns: Senors [%i, %i], Motors [%i, %i]\n",
00066 sensorStart, sensorEnd, motorStart, motorEnd);
00067 }
00068
00069 virtual void init(int sensornumber, int motornumber, RandGen* randGen = 0){
00070
00071 assert(motornumber == motorEnd - motorStart + 1);
00072 }
00073
00074 virtual int getSensorNumber() const { return sensorEnd - sensorStart + 1;};
00075
00076 virtual int getMotorNumber() const { return motorEnd - motorStart + 1; };
00077
00078 virtual void step(const sensor* sensors, int sensornumber,
00079 motor* motors, int motornumber){
00080 stepNoLearning(sensors,sensornumber, motors, motornumber);
00081 }
00082
00083 virtual void stepNoLearning(const sensor* , int number_sensors,
00084 motor* motors, int number_motors){
00085
00086 if(!parseDataLine(m,f)){
00087 if(repeat){
00088 std::cout << "ReplayController: rewind" << std::endl;
00089 rewind(f);
00090 }else
00091 std::cout << "ReplayController: no datafile in file" << filename << std::endl;
00092 }else{
00093 m=m.rows(motorStart, motorEnd);
00094 }
00095 m.convertToBuffer(motors, sensorEnd-sensorStart + 1);
00096 }
00097
00098
00099
00100 virtual bool store(FILE* f) const {return false;}
00101
00102 virtual bool restore(FILE* f) {return false;}
00103
00104
00105 virtual std::list<iparamkey> getInternalParamNames()const { return std::list<iparamkey>(); }
00106 virtual std::list<iparamval> getInternalParams() const { return std::list<iparamval>(); }
00107
00108 protected:
00109
00110 bool parseDataFileForHeader(FILE* f){
00111 char buffer[1024];
00112 int i;
00113 sensorStart=-1;
00114 sensorEnd=-1;
00115 motorStart=-1;
00116 motorEnd=-1;
00117
00118 while(fgets(buffer, 1024, f)) {
00119 if(buffer[0]=='#' && buffer[1]=='C'){
00120
00121 i=0;
00122 char* p;
00123 p=strtok(buffer," ");
00124 if(!p) return false;
00125 while((p=strtok(NULL," "))!=NULL ) {
00126 if(p[0]=='x' && p[1]=='['){
00127 if(sensorStart==-1) sensorStart=i;
00128 sensorEnd=i;
00129 }
00130 if(p[0]=='y' && p[1]=='['){
00131 if(motorStart==-1) motorStart=i;
00132 motorEnd=i;
00133 }
00134 i++;
00135 }
00136 return true;
00137 }
00138 }
00139 return false;
00140 }
00141
00142 static bool isEmpty(const char* c){
00143 const char* p = c;
00144 bool foundsomething = false;
00145 while(*p != 0){
00146 if(*p > ' ') foundsomething = true;
00147 p++;
00148 }
00149 return !foundsomething;
00150 }
00151
00152
00153 static bool check4Number(const char* c){
00154 const char* p = c;
00155 while(*p != 0){
00156 if(*p >= '0' && *p <= '9') return true;
00157 p++;
00158 }
00159 return false;
00160 }
00161
00162 static bool parseDataLine(matrix::Matrix& data, FILE* f){
00163 char buffer[1024];
00164 int i;
00165 double dat[1024];
00166 while(fgets(buffer, 1024, f)){
00167 if(buffer[0]=='#' || isEmpty(buffer)){
00168 continue;
00169 }else{
00170 i=0;
00171 char* p;
00172 p=strtok(buffer," ");
00173 if(!p) return false;
00174 dat[i] = atof(p);
00175 i++;
00176 while((p=strtok(NULL," "))!=NULL ) {
00177 if(!check4Number(p)) continue;
00178 dat[i] = atof(p);
00179 i++;
00180 };
00181 data.set(i,1,dat);
00182 return true;
00183 }
00184 };
00185 return false;
00186 }
00187
00188
00189
00190 protected:
00191 int sensorStart;
00192 int sensorEnd;
00193 int motorStart;
00194 int motorEnd;
00195 matrix::Matrix m;
00196 const char* filename;
00197 FILE* f;
00198 bool repeat;
00199
00200 };
00201
00202 #endif