replaycontroller.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef __REPLAYCONTROLLER_H
00025 #define __REPLAYCONTROLLER_H
00026
00027 #include "abstractcontroller.h"
00028
00029
00030
00031
00032 class ReplayController : public AbstractController {
00033 public:
00034 ReplayController(const char* filename, bool repeat=false)
00035 : AbstractController("ReplayController", "1.0"),
00036 filename(filename), repeat(repeat) {
00037
00038 f=fopen(filename,"r");
00039 if(!f){
00040 std::cerr<< "ReplayController: error while opening file " << filename << std::endl;
00041 exit(1);
00042 }
00043 if(!parseDataFileForHeader(f)){
00044 std::cerr<< "ReplayController: error while seaching for header in file " << filename << std::endl;
00045 exit(1);
00046 }
00047 printf("ReplayController: columns: Senors [%i, %i], Motors [%i, %i]\n",
00048 sensorStart, sensorEnd, motorStart, motorEnd);
00049 }
00050
00051 virtual void init(int sensornumber, int motornumber, RandGen* randGen = 0){
00052
00053 assert(motornumber == motorEnd - motorStart + 1);
00054 }
00055
00056 virtual int getSensorNumber() const { return sensorEnd - sensorStart + 1;};
00057
00058 virtual int getMotorNumber() const { return motorEnd - motorStart + 1; };
00059
00060 virtual void step(const sensor* sensors, int sensornumber,
00061 motor* motors, int motornumber){
00062 stepNoLearning(sensors,sensornumber, motors, motornumber);
00063 }
00064
00065 virtual void stepNoLearning(const sensor* , int number_sensors,
00066 motor* motors, int number_motors){
00067
00068 if(!parseDataLine(m,f)){
00069 if(repeat){
00070 std::cout << "ReplayController: rewind" << std::endl;
00071 rewind(f);
00072 }else
00073 std::cout << "ReplayController: no datafile in file" << filename << std::endl;
00074 }else{
00075 m=m.rows(motorStart, motorEnd);
00076 }
00077 m.convertToBuffer(motors, sensorEnd-sensorStart + 1);
00078 }
00079
00080
00081
00082 virtual bool store(FILE* f) const {return false;}
00083
00084 virtual bool restore(FILE* f) {return false;}
00085
00086
00087 virtual std::list<iparamkey> getInternalParamNames()const { return std::list<iparamkey>(); }
00088 virtual std::list<iparamval> getInternalParams() const { return std::list<iparamval>(); }
00089
00090 protected:
00091
00092 bool parseDataFileForHeader(FILE* f){
00093 char buffer[1024];
00094 int i;
00095 sensorStart=-1;
00096 sensorEnd=-1;
00097 motorStart=-1;
00098 motorEnd=-1;
00099
00100 while(fgets(buffer, 1024, f)) {
00101 if(buffer[0]=='#' && buffer[1]=='C'){
00102
00103 i=0;
00104 char* p;
00105 p=strtok(buffer," ");
00106 if(!p) return false;
00107 while((p=strtok(NULL," "))!=NULL ) {
00108 if(p[0]=='x' && p[1]=='['){
00109 if(sensorStart==-1) sensorStart=i;
00110 sensorEnd=i;
00111 }
00112 if(p[0]=='y' && p[1]=='['){
00113 if(motorStart==-1) motorStart=i;
00114 motorEnd=i;
00115 }
00116 i++;
00117 }
00118 return true;
00119 }
00120 }
00121 return false;
00122 }
00123
00124 static bool isEmpty(const char* c){
00125 const char* p = c;
00126 bool foundsomething = false;
00127 while(*p != 0){
00128 if(*p > ' ') foundsomething = true;
00129 p++;
00130 }
00131 return !foundsomething;
00132 }
00133
00134
00135 static bool check4Number(const char* c){
00136 const char* p = c;
00137 while(*p != 0){
00138 if(*p >= '0' && *p <= '9') return true;
00139 p++;
00140 }
00141 return false;
00142 }
00143
00144 static bool parseDataLine(matrix::Matrix& data, FILE* f){
00145 char buffer[1024];
00146 int i;
00147 double dat[1024];
00148 while(fgets(buffer, 1024, f)){
00149 if(buffer[0]=='#' || isEmpty(buffer)){
00150 continue;
00151 }else{
00152 i=0;
00153 char* p;
00154 p=strtok(buffer," ");
00155 if(!p) return false;
00156 dat[i] = atof(p);
00157 i++;
00158 while((p=strtok(NULL," "))!=NULL ) {
00159 if(!check4Number(p)) continue;
00160 dat[i] = atof(p);
00161 i++;
00162 };
00163 data.set(i,1,dat);
00164 return true;
00165 }
00166 };
00167 return false;
00168 }
00169
00170
00171
00172 protected:
00173 int sensorStart;
00174 int sensorEnd;
00175 int motorStart;
00176 int motorEnd;
00177 matrix::Matrix m;
00178 const char* filename;
00179 FILE* f;
00180 bool repeat;
00181
00182 };
00183
00184 #endif