#include <OMKNumericPolator.h>
Inheritance diagram for OMK::Type::NumericPolatorT< Type >:
Public Member Functions | |
NumericPolatorT (void) | |
virtual | ~NumericPolatorT (void) |
virtual const SimpleTypeT< Type > & | interpolate (SimpleTypeT< Type > &resultPlaceHolder, const int interprecisionLevel, const Date &dateNeeded, const Date &dateAfter, const SimpleTypeT< Type > &valueAfter, const Date &dateBefore, int offsetToMostRecentOfDateBefore) const |
virtual const SimpleTypeT< Type > & | extrapolate (SimpleTypeT< Type > &resultPlaceHolder, const int requestedPrecisionLevel, const Date &t, const Date &tIndice) const |
virtual const SimpleTypeT< Type > & | antepolate (SimpleTypeT< Type > &resultPlaceHolder, const int requestedPrecisionLevel, const Date &t, const Date &tIndice, unsigned int indice) const |
template<> | |
int | convert (double v) |
template<> | |
float | convert (double v) |
template<> | |
double | convert (double v) |
Static Public Member Functions | |
static Type | linearInterpolate (long t, long t1, Type v1, long t0, Type v0) |
Calculate linear interpolation between two values. | |
static Type | quadraticInterpolate (long t, long t2, Type v2, long t1, Type v1, long t0, Type v0) |
Calculate 2nde degre interpolation between 3 values. | |
static Type | cubicInterpolate (long t, long t3, Type v3, long t2, Type v2, long t1, Type v1, long t0, Type v0) |
Calculate 3rd degre interpolation with 4 values. | |
static Type | linearExtrapolate (long t, long t1, Type v1, long t0, Type v0) |
linear extrapolation | |
static Type | quadraticExtrapolate (long t, long t2, Type v2, long t1, Type v1, long t0, Type v0) |
Quadratic extrapolation. | |
static Type | cubicExtrapolate (long t, long t3, Type v3, long t2, Type v2, long t1, Type v1, long t0, Type v0) |
Cubic extrapolation. | |
Static Private Member Functions | |
static Type | convert (double v) |
Convertion function to avoid compilation warning. |
This polator supports 4 levels of polation : from none to 3, which supposes second degre continuity
Definition at line 36 of file OMKNumericPolator.h.
OMK::Type::NumericPolatorT< Type >::NumericPolatorT | ( | void | ) | [inline] |
OMK::Type::NumericPolatorT< Type >::~NumericPolatorT | ( | void | ) | [inline, virtual] |
const SimpleTypeT< Type > & OMK::Type::NumericPolatorT< Type >::interpolate | ( | SimpleTypeT< Type > & | resultPlaceHolder, | |
const int | interprecisionLevel, | |||
const Date & | dateNeeded, | |||
const Date & | dateAfter, | |||
const SimpleTypeT< Type > & | valueAfter, | |||
const Date & | dateBefore, | |||
int | offsetToMostRecentOfDateBefore | |||
) | const [inline, virtual] |
Definition at line 247 of file OMKNumericPolator.h.
References OMK::Type::PolatorNT::Constant, OMK::Type::PolatorNT::ConstantContinuous, OMK::Type::PolatorNT::Cubic, OMK::Type::PolatorNT::CubicContinuous, OMK::Type::NumericPolatorT< Type >::cubicInterpolate(), OMK::Type::Polator< T >::get(), OMK::Type::Polator< T >::getDate(), OMK::Type::PolatorNT::Linear, OMK::Type::PolatorNT::LinearContinuous, OMK::Type::NumericPolatorT< Type >::linearInterpolate(), OMK_DEBUG_OMK_TYPE, OMTRACEID, OMK::Type::PolatorNT::Quadratic, OMK::Type::PolatorNT::QuadraticContinuous, and OMK::Type::NumericPolatorT< Type >::quadraticInterpolate().
00254 { 00255 00256 #ifdef _DEBUGTYPEUTIL 00257 cout << "*********************************************" << endl ; 00258 cout << "NumericPolatorT<Type>::interpolate" << endl; 00259 cout << "interpolate level : " << interprecisionLevel <<endl ; 00260 cout << "Date dateAfter <----- : " << dateAfter << endl ; 00261 cout << "Date dateNeeded <----- : " << dateNeeded << endl ; 00262 cout << "Date dateBefore <----- : " << dateBefore << endl ; 00263 cout << "Type : valueAfter " << valueAfter << endl ; 00264 cout << "int : offsetToMostRecentOfDateBefore " << offsetToMostRecentOfDateBefore << endl ; 00265 cout << "*********************************************" << endl ; 00266 #endif 00267 00268 switch ( interprecisionLevel ) 00269 { 00270 case PolatorNT::Constant : 00271 case PolatorNT::ConstantContinuous : 00272 resultPlaceHolder = ( ( dateAfter - dateNeeded ) <= ( dateNeeded - dateBefore ) ) ? 00273 valueAfter : get (offsetToMostRecentOfDateBefore) ; 00274 break ; 00275 case PolatorNT::Linear : 00276 case PolatorNT::LinearContinuous : 00277 resultPlaceHolder = 00278 linearInterpolate( dateNeeded, 00279 dateAfter, (Type)valueAfter, 00280 dateBefore, (Type)get( offsetToMostRecentOfDateBefore ) ) ; 00281 break ; 00282 case PolatorNT::Quadratic : 00283 case PolatorNT::QuadraticContinuous : 00284 resultPlaceHolder = 00285 quadraticInterpolate( dateNeeded, 00286 dateAfter, (Type)valueAfter, 00287 dateBefore, (Type)get (offsetToMostRecentOfDateBefore) , 00288 getDate( offsetToMostRecentOfDateBefore + 1 ), 00289 (Type)get( offsetToMostRecentOfDateBefore + 1 ) ) ; 00290 break ; 00291 case PolatorNT::Cubic : 00292 case PolatorNT::CubicContinuous : 00293 resultPlaceHolder = 00294 cubicInterpolate( dateNeeded, 00295 dateAfter, (Type)valueAfter, 00296 dateBefore, (Type)get( offsetToMostRecentOfDateBefore ), 00297 getDate( offsetToMostRecentOfDateBefore + 1 ), 00298 (Type)get( offsetToMostRecentOfDateBefore + 1 ), 00299 getDate( offsetToMostRecentOfDateBefore + 2 ), 00300 (Type)get( offsetToMostRecentOfDateBefore + 2 ) ) ; 00301 break ; 00302 default : 00303 OMTRACEID( OMK_DEBUG_OMK_TYPE, "NumericPolatorT<Type>::interpolate : unknown polation level, using PolatorNT::Constant" ) ; 00304 resultPlaceHolder = ( ( dateAfter - dateNeeded ) <= ( dateNeeded - dateBefore ) ) ? 00305 valueAfter : get( offsetToMostRecentOfDateBefore ) ; 00306 break ; 00307 } 00308 return resultPlaceHolder ; 00309 }
const SimpleTypeT< Type > & OMK::Type::NumericPolatorT< Type >::extrapolate | ( | SimpleTypeT< Type > & | resultPlaceHolder, | |
const int | requestedPrecisionLevel, | |||
const Date & | t, | |||
const Date & | tIndice | |||
) | const [inline, virtual] |
Definition at line 315 of file OMKNumericPolator.h.
References OMK::Type::PolatorNT::Constant, OMK::Type::PolatorNT::ConstantContinuous, OMK::Type::PolatorNT::Cubic, OMK::Type::PolatorNT::CubicContinuous, OMK::Type::NumericPolatorT< Type >::cubicExtrapolate(), OMK::Type::Polator< T >::get(), OMK::Type::Polator< T >::getDate(), OMK::Type::Polator< T >::getNumberOfPresentValues(), OMK::Type::PolatorNT::Linear, OMK::Type::PolatorNT::LinearContinuous, OMK::Type::NumericPolatorT< Type >::linearExtrapolate(), OMK::Type::NumericPolatorT< Type >::linearInterpolate(), OMK_DEBUG_OMK_TYPE, OMTRACEID, OMK::Type::PolatorNT::Quadratic, OMK::Type::PolatorNT::QuadraticContinuous, OMK::Type::NumericPolatorT< Type >::quadraticExtrapolate(), and OMK::Type::SimpleTypeT< T >::setValue().
00319 { 00320 //extrapolate à la sauce David Margery 00321 //il s'agit d'une extrapolation par morceaux 00322 //on cherche à trouver la valeur à t 00323 #ifdef _DEBUGPOLATION 00324 cerr << "NumericPolatorT<Type>::extrapolate (" <<requestedPrecisionLevel<<", "<<t<<", "<<tIndice<<")"<<endl; 00325 #endif 00326 switch (requestedPrecisionLevel) 00327 { 00328 case PolatorNT::Constant : 00329 resultPlaceHolder = get( 0 ) ; 00330 break ; 00331 case PolatorNT::ConstantContinuous : 00332 resultPlaceHolder = get( 0 ) ; 00333 if( 1 < getNumberOfPresentValues() ) 00334 { 00335 resultPlaceHolder.setValue( 00336 linearInterpolate( t, tIndice, (Type)get( 1 ), 00337 2 * tIndice - getDate( 1 ), (Type)get( 0 ) ) ) ; 00338 } 00339 break ; 00340 case PolatorNT::Linear : 00341 resultPlaceHolder.setValue( 00342 linearExtrapolate( t, tIndice, (Type)get( 0 ), 00343 getDate( 1 ), (Type)get( 1 ) ) ) ; 00344 break ; 00345 case PolatorNT::LinearContinuous : 00346 resultPlaceHolder.setValue( 00347 linearExtrapolate( t, tIndice, (Type)get( 0 ), 00348 getDate( 1 ), (Type)get( 1 ) ) ) ; 00349 if( 2 < getNumberOfPresentValues() ) 00350 { 00351 Type oldResult = 00352 linearExtrapolate( t, getDate( 1 ), (Type)get( 1 ), 00353 getDate( 2 ), (Type)get( 2 ) ) ; 00354 resultPlaceHolder.setValue( 00355 linearInterpolate( t, tIndice, oldResult, 00356 2 * tIndice - getDate( 1 ), (Type)resultPlaceHolder ) ) ; 00357 } 00358 break ; 00359 00360 case PolatorNT::Quadratic : 00361 resultPlaceHolder.setValue( 00362 quadraticExtrapolate( t, tIndice, (Type)get( 0 ), 00363 getDate( 1 ), (Type)get( 1 ), 00364 getDate( 2 ), (Type)get( 2 ) ) ) ; 00365 break; 00366 case PolatorNT::QuadraticContinuous : 00367 resultPlaceHolder.setValue( 00368 quadraticExtrapolate( t, tIndice, (Type)get( 0 ), 00369 getDate( 1 ), (Type)get( 1 ), 00370 getDate( 2 ), (Type)get( 2 ) ) ) ; 00371 00372 if( getNumberOfPresentValues() > 3 ) 00373 { 00374 Type oldResult= 00375 quadraticExtrapolate( t, getDate( 1 ), (Type)get( 1 ), 00376 getDate( 2 ), (Type)get( 2 ), 00377 getDate( 3 ), (Type)get( 3 ) ) ; 00378 resultPlaceHolder.setValue( 00379 linearInterpolate( t, tIndice, oldResult, 00380 2 * tIndice - getDate( 1 ), (Type)resultPlaceHolder ) ) ; 00381 } 00382 break; 00383 00384 case PolatorNT::Cubic : 00385 resultPlaceHolder.setValue( cubicExtrapolate( t, tIndice, (Type)get( 0 ), 00386 getDate( 1 ), (Type)get( 1 ), 00387 getDate( 2 ), (Type)get( 2 ), 00388 getDate( 3 ), (Type)get( 3 ) ) ) ; 00389 break; 00390 00391 case PolatorNT::CubicContinuous : 00392 resultPlaceHolder.setValue( cubicExtrapolate( t, tIndice, (Type)get( 0 ), 00393 getDate( 1 ), (Type)get( 1 ), 00394 getDate( 2 ), (Type)get( 2 ), 00395 getDate( 3 ), (Type)get( 3 ) ) ) ; 00396 if( 4 < getNumberOfPresentValues() ) 00397 { 00398 Type oldResult= 00399 cubicExtrapolate( t, getDate( 1 ), (Type)get( 1 ), 00400 getDate( 2 ), (Type)get( 2 ), 00401 getDate( 3 ), (Type)get( 3 ), 00402 getDate( 4 ), (Type)get( 4 ) ) ; 00403 resultPlaceHolder.setValue( 00404 linearInterpolate( t, tIndice, oldResult, 00405 2*tIndice - getDate( 1 ), (Type)resultPlaceHolder ) ) ; 00406 } 00407 00408 break; 00409 default : 00410 OMTRACEID( OMK_DEBUG_OMK_TYPE, "NumericPolatorT<Type>::interpolate : unknown polation level, using PolatorNT::Constant" ) ; 00411 resultPlaceHolder = get( 0 ) ; 00412 } 00413 return resultPlaceHolder ; 00414 }
const SimpleTypeT< Type > & OMK::Type::NumericPolatorT< Type >::antepolate | ( | SimpleTypeT< Type > & | resultPlaceHolder, | |
const int | requestedPrecisionLevel, | |||
const Date & | t, | |||
const Date & | tIndice, | |||
unsigned int | indice | |||
) | const [inline, virtual] |
Definition at line 419 of file OMKNumericPolator.h.
References OMK::Type::PolatorNT::Constant, OMK::Type::PolatorNT::ConstantContinuous, OMK::Type::PolatorNT::Cubic, OMK::Type::PolatorNT::CubicContinuous, OMK::Type::NumericPolatorT< Type >::cubicExtrapolate(), OMK::Type::Polator< T >::get(), OMK::Type::Polator< T >::getDate(), OMK::Type::PolatorNT::Linear, OMK::Type::PolatorNT::LinearContinuous, OMK::Type::NumericPolatorT< Type >::linearExtrapolate(), OMK_DEBUG_OMK_TYPE, OMTRACEID, OMK::Type::PolatorNT::Quadratic, OMK::Type::PolatorNT::QuadraticContinuous, and OMK::Type::NumericPolatorT< Type >::quadraticExtrapolate().
00424 { 00425 00426 #ifdef _DEBUGTYPEUTIL 00427 cout << "*********************************************" << endl ; 00428 cout << "NumericPolatorT<Type>::antepolate" << endl; 00429 cout << "Date t <----- : " << t << endl ; 00430 cout << "Date tIndice <----- : " << tIndice << endl ; 00431 cout << "polation level : " << requestedPrecisionLevel << endl ; 00432 cout << "index " << indice << endl ; 00433 cout << "*********************************************" << endl ; 00434 #endif 00435 00436 switch (requestedPrecisionLevel) 00437 { 00438 case PolatorNT::Constant : 00439 case PolatorNT::ConstantContinuous : 00440 resultPlaceHolder = get( indice ) ; 00441 break ; 00442 case PolatorNT::Linear : 00443 case PolatorNT::LinearContinuous : 00444 resultPlaceHolder = 00445 linearExtrapolate( t, tIndice, (Type)get( indice ), 00446 getDate( indice - 1 ), (Type)get( indice - 1 ) ) ; 00447 break ; 00448 case PolatorNT::Quadratic : 00449 case PolatorNT::QuadraticContinuous : 00450 resultPlaceHolder = 00451 quadraticExtrapolate( t, tIndice, (Type)get( indice ), 00452 getDate( indice - 1 ), (Type)get( indice - 1 ), 00453 getDate( indice - 2 ), (Type)get( indice - 2 ) ) ; 00454 break; 00455 case PolatorNT::Cubic : 00456 case PolatorNT::CubicContinuous : 00457 resultPlaceHolder = 00458 cubicExtrapolate( t, tIndice, (Type)get( indice ), 00459 getDate( indice - 1 ), (Type)get( indice - 1 ), 00460 getDate( indice - 2 ), (Type)get( indice - 2 ), 00461 getDate( indice - 3 ), (Type)get( indice - 3 ) ) ; 00462 break; 00463 default : 00464 OMTRACEID( OMK_DEBUG_OMK_TYPE, "NumericPolatorT<Type>::interpolate : unknown polation level, using PolatorNT::Constant" ) ; 00465 resultPlaceHolder = get(indice) ; 00466 } 00467 return resultPlaceHolder ; 00468 }
static Type OMK::Type::NumericPolatorT< Type >::convert | ( | double | v | ) | [static, private] |
Convertion function to avoid compilation warning.
Referenced by OMK::Type::NumericPolatorT< Type >::cubicExtrapolate(), OMK::Type::NumericPolatorT< Type >::linearExtrapolate(), and OMK::Type::NumericPolatorT< Type >::quadraticExtrapolate().
static Type OMK::Type::NumericPolatorT< Type >::linearInterpolate | ( | long | t, | |
long | t1, | |||
Type | v1, | |||
long | t0, | |||
Type | v0 | |||
) | [inline, static] |
Calculate linear interpolation between two values.
t | date of the produced values | |
t1 | t1 > t | |
v1 | value at t1 | |
t0 | t0 < t | |
v0 | value at t0 |
Definition at line 78 of file OMKNumericPolator.h.
References OMK::Type::NumericPolatorT< Type >::linearExtrapolate().
Referenced by OMK::Type::NumericPolatorT< Type >::extrapolate(), and OMK::Type::NumericPolatorT< Type >::interpolate().
00081 { 00082 return linearExtrapolate( t, t1, v1, t0, v0 ) ; 00083 }
static Type OMK::Type::NumericPolatorT< Type >::quadraticInterpolate | ( | long | t, | |
long | t2, | |||
Type | v2, | |||
long | t1, | |||
Type | v1, | |||
long | t0, | |||
Type | v0 | |||
) | [inline, static] |
Calculate 2nde degre interpolation between 3 values.
t | date of the produced values | |
t2 | t2 > t | |
v2 | value at t2 | |
t1 | t1 < t | |
v1 | value at t1 | |
t0 | t0 < t1 | |
v0 | value at t0 |
Definition at line 93 of file OMKNumericPolator.h.
References OMK::Type::NumericPolatorT< Type >::quadraticExtrapolate().
Referenced by OMK::Type::NumericPolatorT< Type >::interpolate().
00097 { 00098 return quadraticExtrapolate( t, t2, v2, t1, v1, t0, v0 ) ; 00099 }
static Type OMK::Type::NumericPolatorT< Type >::cubicInterpolate | ( | long | t, | |
long | t3, | |||
Type | v3, | |||
long | t2, | |||
Type | v2, | |||
long | t1, | |||
Type | v1, | |||
long | t0, | |||
Type | v0 | |||
) | [inline, static] |
Calculate 3rd degre interpolation with 4 values.
t | date of the produced values | |
t3 | t3 > t | |
v3 | value at t3 | |
t2 | t2 < t | |
v2 | value at t2 | |
t1 | t1 < t2 | |
v1 | value at t1 | |
t0 | t0 < t1 | |
v0 | value at t0 |
Definition at line 112 of file OMKNumericPolator.h.
References OMK::Type::NumericPolatorT< Type >::cubicExtrapolate().
Referenced by OMK::Type::NumericPolatorT< Type >::interpolate().
00117 { 00118 return cubicExtrapolate( t, t3, v3, t2, v2, t1, v1, t0, v0 ) ; 00119 }
static Type OMK::Type::NumericPolatorT< Type >::linearExtrapolate | ( | long | t, | |
long | t1, | |||
Type | v1, | |||
long | t0, | |||
Type | v0 | |||
) | [inline, static] |
linear extrapolation
t | date of returned value | |
t1 | t1 < t | |
v1 | value at t1 | |
t0 | t0 < t1 | |
v0 | value at t0 |
Definition at line 130 of file OMKNumericPolator.h.
References OMK::Type::NumericPolatorT< Type >::convert(), and OMASSERTM.
Referenced by OMK::Type::NumericPolatorT< Type >::antepolate(), OMK::Type::NumericPolatorT< Type >::extrapolate(), and OMK::Type::NumericPolatorT< Type >::linearInterpolate().
00133 { 00134 double d0 = t1 - t0 ; OMASSERTM ( d0, "Will divide by 0" ) ; 00135 double f0 = t - t0 ; 00136 // formula : ((t - t0) / d0) * v1 +((t1 - t) / d0)* v0 ; 00137 return convert( ( v1 - v0 ) * ( f0 / d0 ) + v0 ) ; 00138 }
static Type OMK::Type::NumericPolatorT< Type >::quadraticExtrapolate | ( | long | t, | |
long | t2, | |||
Type | v2, | |||
long | t1, | |||
Type | v1, | |||
long | t0, | |||
Type | v0 | |||
) | [inline, static] |
Quadratic extrapolation.
t | date of returned value | |
t2 | t2 < t | |
v2 | value at t2 | |
t1 | t1 < t2 | |
v1 | value at t1 | |
t0 | t0 < t1 | |
v0 | value at t0 |
Definition at line 150 of file OMKNumericPolator.h.
References OMK::Type::NumericPolatorT< Type >::convert(), and OMASSERTM.
Referenced by OMK::Type::NumericPolatorT< Type >::antepolate(), OMK::Type::NumericPolatorT< Type >::extrapolate(), and OMK::Type::NumericPolatorT< Type >::quadraticInterpolate().
00154 { 00155 double d0 = t1 - t0 ; OMASSERTM( d0, "Will divide by 0" ) ; 00156 double d1 = t2 - t0 ; OMASSERTM( d1, "Will divide by 0" ) ; 00157 double d2 = t1 - t2 ; OMASSERTM( d2, "Will divide by 0" ) ; 00158 00159 double k0 = ( t - t1 ) / d1 ; 00160 double k1 = ( t - t2 ) / d0 ; 00161 double k2 = ( t - t0 ) / d2 ; 00162 // formula : (v1*(k2*k1)) - (v2*(k2*k0)) + ((k0*k1)*v0) 00163 return convert( ( ( v1 - v0 ) * k1 - ( v2 - v0 ) * k0 ) * k2 + v0 ) ; 00164 }
static Type OMK::Type::NumericPolatorT< Type >::cubicExtrapolate | ( | long | t, | |
long | t3, | |||
Type | v3, | |||
long | t2, | |||
Type | v2, | |||
long | t1, | |||
Type | v1, | |||
long | t0, | |||
Type | v0 | |||
) | [inline, static] |
Cubic extrapolation.
t | date of returned value | |
t3 | t3 < t | |
v3 | value at t3 | |
t2 | t2 < t3 | |
v2 | value at t2 | |
t1 | t1 < t2 | |
v1 | value at t1 | |
t0 | t0 < t1 | |
v0 | value at t0 |
Definition at line 178 of file OMKNumericPolator.h.
References OMK::Type::NumericPolatorT< Type >::convert(), and OMASSERTM.
Referenced by OMK::Type::NumericPolatorT< Type >::antepolate(), OMK::Type::NumericPolatorT< Type >::cubicInterpolate(), and OMK::Type::NumericPolatorT< Type >::extrapolate().
00183 { 00184 double d0 = t0 - t1 ; OMASSERTM( d0, "Will divide by 0" ) ; 00185 double d1 = t2 - t0 ; OMASSERTM( d1, "Will divide by 0" ) ; 00186 double d2 = t0 - t3 ; OMASSERTM( d2, "Will divide by 0" ) ; 00187 double d3 = t1 - t2 ; OMASSERTM( d3, "Will divide by 0" ) ; 00188 double d4 = t1 - t3 ; OMASSERTM( d4, "Will divide by 0" ) ; 00189 double d5 = t3 - t2 ; OMASSERTM( d5, "Will divide by 0" ) ; 00190 00191 double f0 = t - t0 ; 00192 double f1 = t - t1 ; 00193 double f2 = t - t2 ; 00194 double f3 = t - t3 ; 00195 00196 double k0 = f1 * ( f2 / d2 ) ; 00197 double k1 = f0 * ( f3 / d3 ) ; 00198 // formula : v3*((f0/d5)*(k0/d4))+v2*((f1/d1)*(k1/d5))-v1*((k1/d0)*(f2/d4))-v0*((k0/d0)*(f3/d1)) 00199 return convert( ( v3 - v0 ) * ( ( f0 / d5 ) * ( k0 / d4 ) ) 00200 + ( v2 - v0 ) * ( ( f1 / d1 ) * ( k1 / d5 ) ) 00201 - ( v1 - v0 ) * ( ( k1 / d0 ) * ( f2 / d4 ) ) 00202 + v0 ) ; 00203 }
int OMK::Type::NumericPolatorT< int >::convert | ( | double | v | ) | [inline] |
float OMK::Type::NumericPolatorT< float >::convert | ( | double | v | ) | [inline] |
double OMK::Type::NumericPolatorT< double >::convert | ( | double | v | ) | [inline] |
Documentation generated on Mon Jun 9 11:46:05 2008 |
Generated with doxygen by Dimitri van Heesch , 1997-2007 |