00001
00035
00036
00037 #ifndef _Model_H_
00038 #define _Model_H_
00039
00040 #include <fstream>
00041 #include <SharkDefs.h>
00042 #include <Array/Array.h>
00043
00044
00045
00046 class ErrorFunction;
00047 class Optimizer;
00048
00049
00128 class Model
00129 {
00130 public:
00132 Model();
00133
00135 virtual ~Model();
00136
00137
00138
00156 virtual void model(const Array<double>& input, Array<double>& output) = 0;
00157
00159 inline void model(const Array<double>& input, Array<double> &output) const
00160 {
00161 Model* pT = const_cast<Model*>(this);
00162 pT->model(input, output);
00163 }
00164
00165
00191 virtual void modelDerivative(const Array<double>& input, Array<double>& derivative);
00192
00194 inline void modelDerivative(const Array<double>& input, Array<double>& derivative) const
00195 {
00196 Model* pT = const_cast<Model*>(this);
00197 pT->modelDerivative(input, derivative);
00198 }
00199
00200
00227 virtual void modelDerivative(const Array<double>& input, Array<double>& output, Array<double>& derivative);
00228
00230 inline void modelDerivative(const Array<double>& input, Array<double>& output, Array<double>& derivative) const
00231 {
00232 Model* pT = const_cast<Model*>(this);
00233 pT->modelDerivative(input, output, derivative);
00234 }
00235
00236
00296 virtual void generalDerivative(const Array<double>& input, const Array<double>& coefficient, Array<double>& derivative);
00297
00299 inline void generalDerivative(const Array<double>& input, const Array<double>& coefficient, Array<double>& derivative) const
00300 {
00301 Model* pT = const_cast<Model*>(this);
00302 pT->generalDerivative(input, coefficient, derivative);
00303 }
00304
00320 virtual bool isFeasible();
00321
00323 inline bool isFeasible() const
00324 {
00325 Model* pT = const_cast<Model*>(this);
00326 return pT->isFeasible();
00327 }
00328
00330 const inline unsigned int getInputDimension() const
00331 {
00332 return inputDimension;
00333 }
00334
00336 const inline unsigned int getOutputDimension() const
00337 {
00338 return outputDimension;
00339 }
00340
00343 const inline unsigned int getParameterDimension() const
00344 {
00345 SIZE_CHECK(parameter.ndim() == 1);
00346 return parameter.dim(0);
00347 }
00348
00350 virtual double getParameter(unsigned int index) const;
00351
00353 virtual void setParameter(unsigned int index, double value);
00354
00355
00377 inline void setEpsilon(double eps)
00378 {
00379 epsilon = eps;
00380 };
00381
00395 inline Model* Clone()
00396 {
00397 Model* ret = CloneI();
00398 if (ret == NULL) return NULL;
00399 int p, pc = getParameterDimension();
00400 for (p=0; p<pc; p++) ret->setParameter(p, getParameter(p));
00401 return ret;
00402 }
00403
00404 protected:
00420 virtual Model* CloneI()
00421 {
00422 return NULL;
00423 }
00424
00430 Array<double> parameter;
00431
00433 unsigned int inputDimension;
00434
00436 unsigned int outputDimension;
00437
00439 double epsilon;
00440
00441 public:
00456 virtual void read(std::istream& is);
00457
00470 virtual void write(std::ostream& os) const;
00471
00484 friend std::istream& operator >> (std::istream& is, Model& model);
00485
00496 friend std::ostream& operator << (std::ostream& os, const Model& model);
00500 bool load(const char* filename);
00501
00505 bool save(const char* filename);
00506 };
00507
00508
00509 #endif
00510