00001 #ifndef INDII_ML_ODE_STOCHASTICDIFFERENTIALMODEL_HPP
00002 #define INDII_ML_ODE_STOCHASTICDIFFERENTIALMODEL_HPP
00003
00004 #include "../aux/vector.hpp"
00005 #include "../aux/matrix.hpp"
00006
00007 #include "boost/serialization/serialization.hpp"
00008
00009 #include <vector>
00010
00011 namespace indii {
00012 namespace ml {
00013 namespace sde {
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061 template <class DT = indii::ml::aux::matrix,
00062 class DDT = indii::ml::aux::zero_matrix>
00063 class StochasticDifferentialModel {
00064 public:
00065
00066
00067
00068 StochasticDifferentialModel();
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078 StochasticDifferentialModel(const unsigned int dimensions);
00079
00080
00081
00082
00083
00084
00085
00086 StochasticDifferentialModel(const unsigned int dimensions,
00087 const unsigned int noiseDimensions);
00088
00089
00090
00091
00092 virtual ~StochasticDifferentialModel();
00093
00094
00095
00096
00097
00098
00099 unsigned int getDimensions();
00100
00101
00102
00103
00104
00105
00106 unsigned int getNoiseDimensions();
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120 virtual void calculateDrift(const double ts,
00121 const indii::ml::aux::vector& y, indii::ml::aux::vector& a);
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136 virtual void calculateDiffusion(const double ts,
00137 const indii::ml::aux::vector& y, DT& B);
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152 virtual void calculateDiffusionDerivatives(const double ts,
00153 const indii::ml::aux::vector& y, std::vector<DDT>& dBdy);
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168 virtual indii::ml::aux::vector calculateDrift(const double ts,
00169 const indii::ml::aux::vector& y);
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184 virtual DT calculateDiffusion(const double ts,
00185 const indii::ml::aux::vector& y);
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206 virtual std::vector<DDT> calculateDiffusionDerivatives(
00207 const double ts, const indii::ml::aux::vector& y);
00208
00209 private:
00210
00211
00212
00213 unsigned int dimensions;
00214
00215
00216
00217
00218 unsigned int noiseDimensions;
00219
00220
00221
00222
00223 template<class Archive>
00224 void serialize(Archive& ar, const unsigned int version);
00225
00226
00227
00228
00229 friend class boost::serialization::access;
00230
00231 };
00232
00233 }
00234 }
00235 }
00236
00237 template <class DT, class DDT>
00238 indii::ml::sde::StochasticDifferentialModel<DT,DDT>::StochasticDifferentialModel() {
00239 this->dimensions = 0;
00240 this->noiseDimensions = 0;
00241 }
00242
00243 template <class DT, class DDT>
00244 indii::ml::sde::StochasticDifferentialModel<DT,DDT>::StochasticDifferentialModel(
00245 const unsigned int dimensions) {
00246 this->dimensions = dimensions;
00247 this->noiseDimensions = dimensions;
00248 }
00249
00250 template <class DT, class DDT>
00251 indii::ml::sde::StochasticDifferentialModel<DT,DDT>::StochasticDifferentialModel(
00252 const unsigned int dimensions, const unsigned int noiseDimensions) {
00253 this->dimensions = dimensions;
00254 this->noiseDimensions = noiseDimensions;
00255 }
00256
00257 template <class DT, class DDT>
00258 indii::ml::sde::StochasticDifferentialModel<DT,DDT>::~StochasticDifferentialModel() {
00259
00260 }
00261
00262 template <class DT, class DDT>
00263 inline unsigned int
00264 indii::ml::sde::StochasticDifferentialModel<DT,DDT>::getDimensions() {
00265 return dimensions;
00266 }
00267
00268 template <class DT, class DDT>
00269 inline unsigned int indii::ml::sde::StochasticDifferentialModel<DT,DDT>::getNoiseDimensions() {
00270 return noiseDimensions;
00271 }
00272
00273 template <class DT, class DDT>
00274 void indii::ml::sde::StochasticDifferentialModel<DT,DDT>::calculateDrift(
00275 const double ts, const indii::ml::aux::vector& y,
00276 indii::ml::aux::vector& a) {
00277 noalias(a) = calculateDrift(ts, y);
00278 }
00279
00280 template <class DT, class DDT>
00281 void indii::ml::sde::StochasticDifferentialModel<DT,DDT>::calculateDiffusion(
00282 const double ts, const indii::ml::aux::vector& y, DT& B) {
00283 noalias(B) = calculateDiffusion(ts, y);
00284 }
00285
00286 template <class DT, class DDT>
00287 void indii::ml::sde::StochasticDifferentialModel<DT,DDT>::calculateDiffusionDerivatives(
00288 const double ts, const indii::ml::aux::vector& y,
00289 std::vector<DDT>& dBdy) {
00290 dBdy = calculateDiffusionDerivatives(ts, y);
00291 }
00292
00293 template <class DT, class DDT>
00294 indii::ml::aux::vector
00295 indii::ml::sde::StochasticDifferentialModel<DT,DDT>::calculateDrift(
00296 const double ts, const indii::ml::aux::vector& y) {
00297 indii::ml::aux::vector a(dimensions);
00298 a.clear();
00299
00300 return a;
00301 }
00302
00303 template <class DT, class DDT>
00304 DT indii::ml::sde::StochasticDifferentialModel<DT,DDT>::calculateDiffusion(
00305 const double ts, const indii::ml::aux::vector& y) {
00306 DT B(dimensions, noiseDimensions);
00307 B.clear();
00308
00309 return B;
00310 }
00311
00312 template <class DT, class DDT>
00313 std::vector<DDT> indii::ml::sde::StochasticDifferentialModel<DT,DDT>::calculateDiffusionDerivatives(
00314 const double ts, const indii::ml::aux::vector& y) {
00315 std::vector<DDT> nil;
00316
00317 return nil;
00318 }
00319
00320 template <class DT, class DDT>
00321 template<class Archive>
00322 void indii::ml::sde::StochasticDifferentialModel<DT,DDT>::serialize(Archive& ar,
00323 const unsigned int version) {
00324 ar & dimensions;
00325 ar & noiseDimensions;
00326 }
00327
00328 #endif
00329