00001
00041
00042
00043 #ifndef _Model_H_
00044 #define _Model_H_
00045
00046 #include <fstream>
00047 #include <SharkDefs.h>
00048 #include <Array/Array.h>
00049
00050
00051
00052 class ErrorFunction;
00053 class Optimizer;
00054
00055
00134 class Model
00135 {
00136 public:
00138 Model();
00139
00141 virtual ~Model();
00142
00143
00144
00162 virtual void model(const Array<double>& input, Array<double>& output) = 0;
00163
00165 inline void model(const Array<double>& input, Array<double> &output) const
00166 {
00167 Model* pT = const_cast<Model*>(this);
00168 pT->model(input, output);
00169 }
00170
00171
00197 virtual void modelDerivative(const Array<double>& input, Array<double>& derivative);
00198
00200 inline void modelDerivative(const Array<double>& input, Array<double>& derivative) const
00201 {
00202 Model* pT = const_cast<Model*>(this);
00203 pT->modelDerivative(input, derivative);
00204 }
00205
00206
00233 virtual void modelDerivative(const Array<double>& input, Array<double>& output, Array<double>& derivative);
00234
00236 inline void modelDerivative(const Array<double>& input, Array<double>& output, Array<double>& derivative) const
00237 {
00238 Model* pT = const_cast<Model*>(this);
00239 pT->modelDerivative(input, output, derivative);
00240 }
00241
00242
00302 virtual void generalDerivative(const Array<double>& input, const Array<double>& coefficient, Array<double>& derivative);
00303
00305 inline void generalDerivative(const Array<double>& input, const Array<double>& coefficient, Array<double>& derivative) const
00306 {
00307 Model* pT = const_cast<Model*>(this);
00308 pT->generalDerivative(input, coefficient, derivative);
00309 }
00310
00326 virtual bool isFeasible();
00327
00329 inline bool isFeasible() const
00330 {
00331 Model* pT = const_cast<Model*>(this);
00332 return pT->isFeasible();
00333 }
00334
00336 const inline unsigned int getInputDimension() const
00337 {
00338 return inputDimension;
00339 }
00340
00342 const inline unsigned int getOutputDimension() const
00343 {
00344 return outputDimension;
00345 }
00346
00349 const inline unsigned int getParameterDimension() const
00350 {
00351 SIZE_CHECK(parameter.ndim() == 1);
00352 return parameter.dim(0);
00353 }
00354
00356 virtual double getParameter(unsigned int index) const;
00357
00359 virtual void setParameter(unsigned int index, double value);
00360
00361
00383 inline void setEpsilon(double eps)
00384 {
00385 epsilon = eps;
00386 };
00387
00401 inline Model* Clone()
00402 {
00403 Model* ret = CloneI();
00404 if (ret == NULL) return NULL;
00405 int p, pc = getParameterDimension();
00406 for (p=0; p<pc; p++) ret->setParameter(p, getParameter(p));
00407 return ret;
00408 }
00409
00410 protected:
00426 virtual Model* CloneI()
00427 {
00428 return NULL;
00429 }
00430
00436 Array<double> parameter;
00437
00439 unsigned int inputDimension;
00440
00442 unsigned int outputDimension;
00443
00445 double epsilon;
00446
00447 public:
00462 virtual void read(std::istream& is);
00463
00476 virtual void write(std::ostream& os) const;
00477
00490 friend std::istream& operator >> (std::istream& is, Model& model);
00491
00502 friend std::ostream& operator << (std::ostream& os, const Model& model);
00506 bool load(const char* filename);
00507
00511 bool save(const char* filename);
00512 };
00513
00514
00515 #endif
00516