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
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
00185 std::istream& operator >> (std::istream& is, Model& model)
00186 {
00187 if(is) model.read(is);
00188 return is;
00189 }
00190
00191
00192 std::ostream& operator << (std::ostream& os, const Model& model)
00193 {
00194 if(os) model.write(os);
00195 return os;
00196 }
00197
00198