00001 /* 00002 * This file is part of openMask © INRIA, CNRS, Universite de Rennes 1 1993-2002, thereinafter the Software 00003 * 00004 * The Software has been developped within the Siames Project. 00005 * INRIA, the University of Rennes 1 and CNRS jointly hold intellectual property rights 00006 * 00007 * The Software has been registered with the Agence pour la Protection des 00008 * Programmes (APP) under registration number IDDN.FR.001.510008.00.S.P.2001.000.41200 00009 * 00010 * This file may be distributed under the terms of the Q Public License 00011 * version 1.0 as defined by Trolltech AS of Norway and appearing in the file 00012 * LICENSE.QPL included in the packaging of this file. 00013 * 00014 * Licensees holding valid specific licenses issued by INRIA, CNRS or Université de Rennes 1 00015 * for the software may use this file in accordance with that specific license 00016 * 00017 */ 00018 #ifndef PsPolatorNUMERIQUEHEADER 00019 #define PsPolatorNUMERIQUEHEADER 00020 00021 //template <class Type> class PsnAbstractFifo; 00022 #include <PsNumericType.h> 00023 #include <PsPolator.h> 00024 #include "PsUserException.h" 00025 //------------------------------------------------------------------------ 00026 00031 template <typename Type> 00032 class PsNumericPolatorT : public PsPolator< PsNumericTypeT<Type> > 00033 { 00034 public: 00035 00036 PsNumericPolatorT(void) ; 00037 virtual ~PsNumericPolatorT(void) ; 00038 00039 virtual const PsNumericTypeT<Type> & interpolate (PsNumericTypeT<Type> & resultPlaceHolder, 00040 const int interprecisionLevel, 00041 const PsDate & dateNeeded, 00042 const PsDate & dateAfter, 00043 const PsNumericTypeT<Type> & valueAfter, 00044 const PsDate & dateBefore, 00045 int offsetToMostRecentOfDateBefore 00046 ) const ; 00047 00048 virtual const PsNumericTypeT<Type> & extrapolate(PsNumericTypeT<Type> & resultPlaceHolder, 00049 const int requestedPrecisionLevel, 00050 const PsDate & t, 00051 const PsDate & tIndice 00052 ) const ; 00053 virtual const PsNumericTypeT<Type> & antepolate(PsNumericTypeT<Type> & resultPlaceHolder, 00054 const int requestedPrecisionLevel, 00055 const PsDate & t, 00056 const PsDate & tIndice, 00057 unsigned int indice 00058 ) const ; 00059 private: 00060 00061 }; 00062 00063 //--------------------------------------------------------------- 00064 template <typename Type> 00065 inline PsNumericPolatorT<Type>::PsNumericPolatorT(void) : PsPolator< PsNumericTypeT<Type> > (3) 00066 { 00067 } 00068 00069 //--------------------------------------------------------------- 00070 template <typename Type> 00071 inline PsNumericPolatorT<Type>::~PsNumericPolatorT(void) 00072 { 00073 } 00074 //------------------------------------------------------------------------ 00075 00076 template <typename Type> 00077 inline const PsNumericTypeT<Type> & PsNumericPolatorT<Type>::interpolate (PsNumericTypeT<Type> & resultPlaceHolder, 00078 const int interprecisionLevel, 00079 const PsDate & dateNeeded, 00080 const PsDate & dateAfter, 00081 const PsNumericTypeT<Type> & valueAfter, 00082 const PsDate & dateBefore, 00083 int offsetToMostRecentOfDateBefore 00084 ) const { 00085 00086 #ifdef _DEBUGTYPEUTIL 00087 cout << "*********************************************" << endl ; 00088 cout << "PsNumericPolatorT<Type>::interpolate" << endl; 00089 cout << "interpolate level : " << interprecisionLevel <<endl ; 00090 cout << "PsDate dateAfter <----- : " << dateAfter << endl ; 00091 cout << "PsDate dateNeeded <----- : " << dateNeeded << endl ; 00092 cout << "PsDate dateBefore <----- : " << dateBefore << endl ; 00093 cout << "Type : valueAfter " << valueAfter << endl ; 00094 cout << "int : offsetToMostRecentOfDateBefore " << offsetToMostRecentOfDateBefore << endl ; 00095 cout << "*********************************************" << endl ; 00096 #endif 00097 00098 switch ( interprecisionLevel ) { 00099 case PsPolatorNT::Constant : 00100 if ( (dateAfter - dateNeeded) <= (dateNeeded - dateBefore) ) { 00101 resultPlaceHolder = valueAfter ; 00102 } 00103 else { 00104 resultPlaceHolder = get (offsetToMostRecentOfDateBefore) ; 00105 } 00106 break ; 00107 case PsPolatorNT::Linear : 00108 resultPlaceHolder = PsNumericType::linearInterpolate(dateNeeded, 00109 dateAfter, 00110 valueAfter, 00111 dateBefore, 00112 get (offsetToMostRecentOfDateBefore) ); 00113 case PsPolatorNT::Quadratic : 00114 resultPlaceHolder = PsNumericType::quadraticInterpolate(dateNeeded, 00115 dateAfter, 00116 valueAfter, 00117 dateBefore, 00118 get (offsetToMostRecentOfDateBefore) , 00119 getDate (offsetToMostRecentOfDateBefore + 1), 00120 get (offsetToMostRecentOfDateBefore + 1) ) ; 00121 case PsPolatorNT::Cubic : 00122 resultPlaceHolder = PsNumericType::cubicInterpolate(dateNeeded, 00123 dateAfter, 00124 valueAfter, 00125 dateBefore, 00126 get (offsetToMostRecentOfDateBefore), 00127 getDate (offsetToMostRecentOfDateBefore + 1), 00128 get (offsetToMostRecentOfDateBefore + 1), 00129 getDate (offsetToMostRecentOfDateBefore + 2), 00130 get (offsetToMostRecentOfDateBefore + 2) ) ; 00131 break ; 00132 default : 00133 throw PsUserException ("PsNumericPolatorT<Type>::interpolate : unknown polation level") ; 00134 } 00135 return resultPlaceHolder ; 00136 } 00137 00138 //------------------------------------------------------------------------ 00139 template <typename Type> 00140 00141 inline const PsNumericTypeT<Type> & PsNumericPolatorT<Type>::extrapolate (PsNumericTypeT<Type> & resultPlaceHolder, 00142 const int requestedPrecisionLevel, 00143 const PsDate & t, 00144 const PsDate & tIndice 00145 ) const { 00146 //extrapolate ŕ la sauce David Margery 00147 //il s'agit d'une extrapolation par morceaux 00148 //on cherche ŕ trouver la valeur ŕ t 00149 00150 double v0,v1,v2,v3 ; 00151 long t0,t1,t2,t3 ; 00152 00153 #ifdef _DEBUGPOLATION 00154 cerr << "PsNumericPolatorT<Type>::extrapolate (" <<requestedPrecisionLevel<<", "<<t<<", "<<tIndice<<")"<<endl; 00155 #endif 00156 switch (requestedPrecisionLevel) { 00157 case PsPolatorNT::Constant : 00158 resultPlaceHolder = get(0) ; 00159 break ; 00160 case PsPolatorNT::Linear : 00161 v1 = get(0) ; 00162 v0 = get(1); 00163 t0 = getDate(1); 00164 t1 = tIndice ; 00165 #ifdef _DEBUGPOLATION 00166 cerr<<"calling linearExtrapolate("<<t<<", "<<t1<<", "<<v1<<", "<<t0<<", "<<v0<<")"<<endl; 00167 assert (t != tIndice ) ; 00168 assert (t0 != tIndice ) ; 00169 #endif 00170 resultPlaceHolder = PsNumericType::linearExtrapolate(t, t1, v1, t0, v0) ; 00171 break ; 00172 case PsPolatorNT::Quadratic : 00173 //calculating v3, next value after v0,v1,v2, 00174 v2 = get( 0 ) ; 00175 t2 = tIndice ; 00176 v1 = get( 1 ); 00177 t1 = getDate( 1 ); 00178 v0 = get( 2 ); 00179 t0 = getDate( 2 ); 00180 #ifdef _DEBUGPOLATION 00181 cerr<<"calling quadraticExtrapolate("<<t<<", "<<t2<<", "<<v2<<", "<<t1<<", "<<v1<<", "<<t0<<", "<<v0<<")"<<endl; 00182 #endif 00183 resultPlaceHolder = PsNumericType::quadraticExtrapolate(t, t2, v2, t1, v1, t0, v0) ; 00184 break; 00185 case PsPolatorNT::Cubic : 00186 v3 = get( 0 ) ; 00187 t3 = tIndice ; 00188 v2 = get( 1 ); 00189 t2 = getDate( 1 ); 00190 v1 = get( 2 ); 00191 t1 = getDate( 2 ); 00192 v0 = get( 3 ); 00193 t0 = getDate( 3 ); 00194 resultPlaceHolder = PsNumericType::cubicExtrapolate(t, t3, v3, t2, v2, t1, v1, t0, v0) ; 00195 break; 00196 default : 00197 throw PsUserException ("PsInterpoleurNumerique::extrapolate : unknown polation level") ; 00198 } 00199 return resultPlaceHolder ; 00200 } 00201 //------------------------------------------------------------------------ 00202 template <typename Type> 00203 inline const PsNumericTypeT<Type> & PsNumericPolatorT<Type>::antepolate (PsNumericTypeT<Type> & resultPlaceHolder, 00204 const int requestedPrecisionLevel, 00205 const PsDate & t, 00206 const PsDate & tIndice, 00207 unsigned int indice 00208 ) const 00209 { 00210 00211 #ifdef _DEBUGTYPEUTIL 00212 cout << "*********************************************" << endl ; 00213 cout << "PsNumericPolatorT<Type>::antepolate" << endl; 00214 cout << "PsDate t <----- : " << t << endl ; 00215 cout << "PsDate tIndice <----- : " << tIndice << endl ; 00216 cout << "polation level : " << requestedPrecisionLevel << endl ; 00217 cout << "index " << indice << endl ; 00218 cout << "*********************************************" << endl ; 00219 #endif 00220 00221 double v0,v1,v2,v3 ; 00222 long t0,t1,t2,t3 ; 00223 00224 #ifdef _DEBUGPOLATION 00225 cerr << "PsNumericPolatorT<Type>::antepolate (" <<requestedPrecisionLevel<<", "<<t<<", "<<tIndice<<" "<<indice<<")"<<endl; 00226 #endif 00227 switch (requestedPrecisionLevel) { 00228 case PsPolatorNT::Constant : 00229 resultPlaceHolder = get(indice) ; 00230 break ; 00231 case PsPolatorNT::Linear : 00232 v0 = get(indice-1); 00233 t0 = getDate(indice-1); 00234 v1 = get(indice) ; 00235 t1 = tIndice ; 00236 #ifdef _DEBUGPOLATION 00237 cerr<<"calling linearExtrapolate("<<t<<", "<<t1<<", "<<v1<<", "<<t0<<", "<<v0<<")"<<endl; 00238 assert (t != tIndice ) ; 00239 assert (t0 != tIndice ) ; 00240 #endif 00241 resultPlaceHolder = PsNumericType::linearExtrapolate(t, t1, v1, t0, v0) ; 00242 break ; 00243 case PsPolatorNT::Quadratic : 00244 v0 = get( indice - 2 ); 00245 t0 = getDate( indice - 2 ); 00246 v1 = get( indice - 1 ); 00247 t1 = getDate( indice - 1 ); 00248 v2 = get( indice ) ; 00249 t2 = tIndice ; 00250 #ifdef _DEBUGPOLATION 00251 cerr<<"calling quadraticExtrapolate("<<t<<", "<<t2<<", "<<v2<<", "<<t1<<", "<<v1<<", "<<t0<<", "<<v0<<")"<<endl; 00252 #endif 00253 resultPlaceHolder = PsNumericType::quadraticExtrapolate(t, t2, v2, t1, v1, t0, v0) ; 00254 break; 00255 case PsPolatorNT::Cubic : 00256 v0 = get( indice - 3 ); 00257 t0 = getDate( indice - 3 ); 00258 v1 = get( indice - 2 ); 00259 t1 = getDate( indice - 2 ); 00260 v2 = get( indice - 1 ); 00261 t2 = getDate( indice - 1 ); 00262 v3 = get( indice ) ; 00263 t3 = tIndice ; 00264 resultPlaceHolder = PsNumericType:: cubicExtrapolate(t, t3, v3, t2, v2, t1, v1, t0, v0) ; 00265 break; 00266 default : 00267 throw PsUserException ("PsInterpoleurNumerique::antepolate : unknown polation level") ; 00268 } 00269 return resultPlaceHolder ; 00270 } 00271 00272 #endif 00273 00274 00275 00276 00277 00278 00279 00280 00281 00282
| Documentation generated on Mon Nov 25 15:25:01 2002 |
Generated with doxygen 1.2.12 by Dimitri van Heesch , 1997-2001 |