• Main Page
  • Related Pages
  • Classes
  • Files
  • Examples
  • File List
  • File Members

Model.cpp

Go to the documentation of this file.
00001 //===========================================================================
00041 //===========================================================================
00042 
00043 #include <ReClaM/Model.h>
00044 
00045 
00046 Model::Model()
00047 {
00048     epsilon = 1e-8;
00049 }
00050 
00051 Model::~Model()
00052 {
00053 }
00054 
00055 
00056 void Model::modelDerivative(const Array<double>& input, Array<double>& derivative)
00057 {
00058     if (input.ndim() == 1)
00059     {
00060         double old;
00061         int p, pc = parameter.dim(0);
00062         Array<double> output;
00063         Array<double> perturbed_output;
00064         model(input, output);
00065         int o, oc = output.dim(0);
00066         derivative.resize(oc, pc, false);
00067         for (p = 0; p < pc; p++)
00068         {
00069             old = getParameter(p);
00070             setParameter(p, old + epsilon);
00071             model(input, perturbed_output);
00072             for (o = 0; o < oc; o++)
00073             {
00074                 derivative(o, p) = (perturbed_output(o) - output(o)) / epsilon;
00075             }
00076             setParameter(p, old);
00077         }
00078     }
00079     else throw SHARKEXCEPTION("[Model::modelDerivative] invalid number of dimensions.");
00080 }
00081 
00082 void Model::modelDerivative(const Array<double>& input, Array<double>& output, Array<double>& derivative)
00083 {
00084     model(input, output);
00085     modelDerivative(input, derivative);
00086 }
00087 
00088 void Model::generalDerivative(const Array<double>& input, const Array<double>& coefficient, Array<double>& derivative)
00089 {
00090     Array<double> md;
00091     modelDerivative(input, md);
00092 
00093     int o, oc = getOutputDimension();
00094     int p, pc = getParameterDimension();
00095 
00096     derivative.resize(pc, false);
00097 
00098     for (p = 0; p < pc; p++)
00099     {
00100         double td = 0.0;
00101         for (o = 0; o < oc; o++)
00102         {
00103             td += coefficient(o) * md(o, p);
00104         }
00105         derivative(p) = td;
00106     }
00107 }
00108 
00109 bool Model::isFeasible()
00110 {
00111     return true;
00112 }
00113 
00114 double Model::getParameter(unsigned int index) const
00115 {
00116     return parameter(index);
00117 }
00118 
00119 void Model::setParameter(unsigned int index, double value)
00120 {
00121     parameter(index) = value;
00122 }
00123 
00124 void Model::read(std::istream& is)
00125 {
00126     char c;
00127     double value;
00128     std::vector<double> v;
00129     int p, pc;
00130     while (true)
00131     {
00132         is >> value;
00133         v.push_back(value);
00134         is.read(&c, 1);
00135         if (c == '\r')
00136         {
00137             is.read(&c, 1);
00138             if (! is.good() || c != '\n') throw SHARKEXCEPTION("[Model::operator >>] invalid data format");
00139             break;
00140         }
00141         if (! is.good() || c != ' ') throw SHARKEXCEPTION("[Model::operator >>] invalid data format");
00142     }
00143     pc = v.size();
00144     parameter.resize(pc, false);
00145     for (p = 0; p < pc; p++) setParameter(p, v[p]);
00146 }
00147 
00148 // friend of Model
00149 void Model::write(std::ostream& os) const
00150 {
00151     int oldprec = os.precision();
00152     os.precision(16);
00153     int p, pc = parameter.dim(0);
00154     for (p = 0; p < pc; p++)
00155     {
00156         if (p != 0) os << " ";
00157         os << parameter(p);
00158     }
00159     os.write("\r\n", 2);
00160     os.precision(oldprec);
00161 }
00162 
00163 bool Model::load(const char* filename)
00164 {
00165     std::ifstream is;
00166     is.open(filename);
00167     if (! is.is_open()) return false;
00168     read(is);
00169     is.close();
00170     return true;
00171 }
00172 
00173 bool Model::save(const char* filename)
00174 {
00175     std::ofstream os;
00176     os.open(filename);
00177     if (! os.is_open()) return false;
00178     write(os);
00179     os.close();
00180     return true;
00181 }
00182 
00183 
00184 // friend of Model
00185 std::istream& operator >> (std::istream& is, Model& model)
00186 {
00187     if(is) model.read(is);
00188     return is;
00189 }
00190 
00191 // friend of Model
00192 std::ostream& operator << (std::ostream& os, const Model& model)
00193 {
00194     if(os) model.write(os);
00195     return os;
00196 }
00197 
00198 
  • Shark Main Page
  • Array
  • Rng
  • LinAlg
  • FileUtil
  • EALib
  • MOO-EALib
  • ReClaM
  • Fuzzy
  • Mixture
  • Tutorials
  • FAQ