Main Page | Namespace List | Class Hierarchy | Data Structures | File List | Namespace Members | Data Fields | Globals | Related Pages

rpms.h

Go to the documentation of this file.
00001 /*
00002 
00003 Copyright (c) 2003, Cornell University
00004 All rights reserved.
00005 
00006 Redistribution and use in source and binary forms, with or without
00007 modification, are permitted provided that the following conditions are met:
00008 
00009    - Redistributions of source code must retain the above copyright notice,
00010        this list of conditions and the following disclaimer.
00011    - Redistributions in binary form must reproduce the above copyright
00012        notice, this list of conditions and the following disclaimer in the
00013        documentation and/or other materials provided with the distribution.
00014    - Neither the name of Cornell University nor the names of its
00015        contributors may be used to endorse or promote products derived from
00016        this software without specific prior written permission.
00017 
00018 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00019 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00020 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00021 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
00022 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
00023 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
00024 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00025 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
00026 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
00027 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
00028 THE POSSIBILITY OF SUCH DAMAGE.
00029 
00030 */
00031 
00032 // -*- C++ -*-
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     /// the inputspace+realvalue.
00056     /// input is the output from a machine
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         // the realinput must be set after input is seted
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         // print the reasult
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             // we can compute rpms
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

Generated on Mon Jul 21 16:57:25 2003 for SECRET by doxygen 1.3.2