00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef __PERFORMANCETERM_H__
00017 #define __PERFORMANCETERM_H__
00018
00019
00020
00021 #include <string>
00022
00023
00024
00025 #include "../utilities/vector.h"
00026 #include "../utilities/matrix.h"
00027 #include "../utilities/numerical_differentiation.h"
00028
00029 #include "../data_set/data_set.h"
00030 #include "../mathematical_model/mathematical_model.h"
00031
00032 #include "../neural_network/neural_network.h"
00033
00034
00035
00036 #include "../../parsers/tinyxml/tinyxml.h"
00037
00038 namespace OpenNN
00039 {
00040
00044
00045 class PerformanceTerm
00046 {
00047
00048 public:
00049
00050
00051
00052 explicit PerformanceTerm(void);
00053
00054
00055
00056 explicit PerformanceTerm(NeuralNetwork*);
00057
00058
00059
00060 explicit PerformanceTerm(DataSet*);
00061
00062
00063
00064 explicit PerformanceTerm(MathematicalModel*);
00065
00066
00067
00068 explicit PerformanceTerm(NeuralNetwork*, DataSet*);
00069
00070
00071
00072 explicit PerformanceTerm(NeuralNetwork*, MathematicalModel*);
00073
00074
00075
00076 explicit PerformanceTerm(NeuralNetwork*, MathematicalModel*, DataSet*);
00077
00078
00079
00080 explicit PerformanceTerm(TiXmlElement*);
00081
00082
00083
00084 PerformanceTerm(const PerformanceTerm&);
00085
00086
00087
00088 virtual ~PerformanceTerm(void);
00089
00090
00091
00092 virtual PerformanceTerm& operator = (const PerformanceTerm&);
00093
00094
00095
00096 virtual bool operator == (const PerformanceTerm&) const;
00097
00098
00099
00102
00103 struct ZeroOrderEvaluation
00104 {
00106
00107 double evaluation;
00108 };
00109
00112
00113 struct FirstOrderEvaluation
00114 {
00116
00117 double evaluation;
00118
00120
00121 Vector<double> gradient;
00122 };
00123
00124
00127
00128 struct SecondOrderEvaluation
00129 {
00131
00132 double evaluation;
00133
00135
00136 Vector<double> gradient;
00137
00139
00140 Matrix<double> Hessian;
00141 };
00142
00143
00146
00147 struct FirstOrderEvaluationTerms
00148 {
00150
00151 Vector<double> evaluation_terms;
00152
00154
00155 Matrix<double> Jacobian_terms;
00156 };
00157
00158
00159
00160
00161
00162
00164
00165 inline NeuralNetwork* get_neural_network_pointer(void) const
00166 {
00167 return(neural_network_pointer);
00168 }
00169
00170
00172
00173 inline MathematicalModel* get_mathemtaical_model_pointer(void) const
00174 {
00175 return(mathematical_model_pointer);
00176 }
00177
00178
00180
00181 inline DataSet* get_data_set_pointer(void) const
00182 {
00183 return(data_set_pointer);
00184 }
00185
00186
00188
00189 inline NumericalDifferentiation* get_numerical_differentiation_pointer(void) const
00190 {
00191 return(numerical_differentiation_pointer);
00192 }
00193
00194 const bool& get_display(void) const;
00195
00196
00197
00198 virtual void set(void);
00199 virtual void set(NeuralNetwork*);
00200 virtual void set(DataSet*);
00201 virtual void set(MathematicalModel*);
00202 virtual void set(NeuralNetwork*, DataSet*);
00203 virtual void set(NeuralNetwork*, MathematicalModel*);
00204 virtual void set(NeuralNetwork*, MathematicalModel*, DataSet*);
00205 virtual void set(const PerformanceTerm&);
00206
00207 virtual void set_neural_network_pointer(NeuralNetwork*);
00208
00209 virtual void set_mathematical_model_pointer(MathematicalModel*);
00210 virtual void set_data_set_pointer(DataSet*);
00211
00212 void set_numerical_differentiation_pointer(NumericalDifferentiation*);
00213
00214 virtual void set_default(void);
00215
00216 void set_display(const bool&);
00217
00218
00219
00220 void construct_numerical_differentiation(void);
00221 void delete_numerical_differentiation_pointer(void);
00222
00223
00224
00225 virtual void check(void) const;
00226
00227
00228
00229 Vector< Vector<double> > calculate_layers_delta(const Vector< Vector<double> >&, const Vector<double>&) const;
00230 Vector< Vector<double> > calculate_layers_delta(const Vector< Vector<double> >&, const Vector<double>&, const Vector<double>&) const;
00231
00232
00233
00234 Matrix< Matrix <double> > calculate_interlayers_Delta(const Vector< Vector<double> >&, const Vector< Vector<double> >&, const Matrix< Matrix<double> >&, const Vector<double>&, const Matrix<double>&, const Vector< Vector<double> >&) const;
00235
00236
00237
00238 Vector<double> calculate_point_gradient(const Vector<double>&, const Vector< Vector<double> >&, const Vector< Vector<double> >&) const;
00239 Vector<double> calculate_point_gradient(const Vector< Matrix<double> >&, const Vector< Vector<double> >&) const;
00240
00241 Matrix<double> calculate_point_Hessian(const Vector< Vector<double> >&, const Vector< Vector< Vector<double> > >&, const Matrix< Matrix<double> >&, const Vector< Vector<double> >&, const Matrix< Matrix<double> >&) const;
00242
00243
00244
00246
00247 virtual double calculate_evaluation(void) const = 0;
00248
00250
00251 virtual double calculate_evaluation(const Vector<double>&) const
00252 {
00253 return(0.0);
00254 };
00255
00257
00258 virtual double calculate_generalization_evaluation(void) const
00259 {
00260 return(0.0);
00261 }
00262
00264
00265 virtual Vector<double> calculate_gradient(void) const;
00266
00268
00269 virtual Matrix<double> calculate_Hessian(void) const;
00270
00271 virtual Vector<double> calculate_evaluation_terms(void) const;
00272 virtual Vector<double> calculate_evaluation_terms(const Vector<double>&) const;
00273
00274 virtual Matrix<double> calculate_Jacobian_terms(void) const;
00275
00276 virtual PerformanceTerm::FirstOrderEvaluationTerms calculate_first_order_evaluation_terms(void) const;
00277
00278 virtual std::string write_performance_term_type(void) const;
00279
00280 virtual std::string write_information(void) const;
00281
00282
00283
00284 virtual std::string to_string(void) const;
00285
00286 virtual TiXmlElement* to_XML(void) const;
00287 virtual void from_XML(TiXmlElement*);
00288
00289 unsigned int calculate_Kronecker_delta(const unsigned int&, const unsigned int&) const;
00290
00291 protected:
00292
00294
00295 NeuralNetwork* neural_network_pointer;
00296
00298
00299 DataSet* data_set_pointer;
00300
00302
00303 MathematicalModel* mathematical_model_pointer;
00304
00306
00307 NumericalDifferentiation* numerical_differentiation_pointer;
00308
00310
00311 bool display;
00312 };
00313
00314 }
00315
00316 #endif
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333