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 #ifndef _RPMS_H
00034 #define _RPMS_H
00035
00036 #include "consumer.h"
00037 #include <math.h>
00038
00039 namespace CLUS
00040 {
00041
00042 class RPMSConsumer: public DataConsumer
00043 {
00044
00045 protected:
00046 double mse;
00047 double mae;
00048 double ym;
00049 double y2m;
00050 int nrData;
00051 ofstream* out;
00052 string filename;
00053 int nrinputs;
00054
00055
00056
00057 Vector<double>* realinput;
00058 public:
00059 RPMSConsumer(int NrInputs, char* FileName=NULL, Vector<double>* Input=NULL,
00060 Vector<double>* RealInput=NULL):
00061 DataConsumer(Input), out(NULL),
00062 filename(FileName),nrinputs(NrInputs),realinput(RealInput)
00063 {}
00064
00065 inline void SetRealInput(Vector<double>* RealInput)
00066 {
00067
00068 realinput=RealInput;
00069 ExitIf( (nrinputs+input->dim()!=realinput->dim()) && (nrinputs!=realinput->dim()),
00070 "Wrong dimensions in RPMSConsumer");
00071 }
00072
00073 inline void SetFileName(char* FileName)
00074 {
00075 filename=FileName;
00076 }
00077
00078 virtual bool Tick(void)
00079 {
00080
00081 for(int i=0; i<nrinputs; i++)
00082 (*out) << (*realinput)[i] << " ";
00083
00084 (*out) << " ";
00085
00086 for(int i=0; i<input->dim(); i++)
00087 (*out) << (*input)[i] << " ";
00088
00089 (*out) << endl;
00090 if (realinput->dim()>nrinputs)
00091 {
00092
00093 for(int i=0; i<input->dim(); i++)
00094 {
00095 mse+=pow2((*input)[i]-(*realinput)[i+nrinputs]);
00096 mae+=fabs((*input)[i]-(*realinput)[i+nrinputs]);
00097 ym+=(*realinput)[i+nrinputs];
00098 y2m+=pow2( (*realinput)[i+nrinputs] );
00099 }
00100 nrData+=input->dim();
00101 }
00102 return true;
00103 }
00104
00105 virtual void Start(void)
00106 {
00107 mse=0.0;
00108 mae=0.0;
00109 ym=0;
00110 y2m=0;
00111 nrData=0;
00112 out = new ofstream(filename.c_str());
00113 #ifdef HAS_FORM
00114
00115 out->form("# %10d %4d\n",0,input->dim());
00116 #else
00117
00118 char str[100];
00119 sprintf(str,"# %10d %4d\n",0,input->dim());
00120 (*out) << str;
00121 #endif
00122
00123 }
00124
00125 virtual void Stop(void)
00126 {
00127 if (nrData!=0)
00128 {
00129 mse=mse/nrData;
00130 mae=mae/nrData;
00131 ym=ym/nrData;
00132 y2m=y2m/nrData;
00133 }
00134 out->seekp(0);
00135 #ifdef HAS_FORM
00136
00137 out->form("# %10d %4d\n",nrData/input->dim(),nrinputs+input->dim());
00138 #else
00139
00140 char str[100];
00141 sprintf(str,"# %10d %4d\n",nrData/input->dim(),nrinputs+input->dim());
00142 (*out) << str;
00143 #endif
00144
00145 delete out;
00146 }
00147
00148 double GetRMSE(void)
00149 {
00150 return sqrt(mse);
00151 }
00152
00153 double GetMSE(void)
00154 {
00155 return mse;
00156 }
00157
00158 double GetNRMSE(void)
00159 {
00160 return GetRMSE()/sqrt(y2m-pow2(ym));
00161 }
00162
00163 double GetMAE(void)
00164 {
00165 return mae;
00166 }
00167 };
00168 }
00169
00170 #endif // _RPMS_H