Main Page | Namespace List | Class Hierarchy | Alphabetical List | Data Structures | File List | Namespace Members | Data Fields | Globals

ProbaHolder.h

Go to the documentation of this file.
00001 /*
00002          _/_/_/     _/_/_/   _/_/_/_/    _/_/_/    _/    _/  _/_/_/_/ _/_/_/_/    _/_/_/   _/_/_/_/
00003         _/    _/  _/    _/  _/     _/  _/     _/  _/    _/  _/       _/     _/  _/    _/  _/     _/
00004        _/    _/  _/    _/  _/     _/  _/     _/  _/    _/  _/       _/     _/  _/    _/  _/     _/
00005       _/_/_/    _/    _/  _/_/_/_/   _/     _/  _/    _/  _/_/_/   _/_/_/_/   _/    _/  _/_/_/_/
00006      _/     _/ _/    _/  _/  _/     _/     _/  _/    _/  _/       _/  _/     _/    _/  _/  _/
00007     _/     _/ _/    _/  _/   _/    _/   _/_/  _/    _/  _/       _/   _/    _/    _/  _/   _/
00008    _/     _/ _/    _/  _/    _/     _/_/_/   _/    _/  _/       _/    _/   _/    _/  _/    _/
00009   _/_/_/_/   _/_/_/   _/     _/         _/   _/_/_/   _/_/_/_/ _/     _/   _/_/_/   _/     _/
00010 
00011   \author Hannosset Christophe
00012   \date 04 - Nov - 2003
00013 */
00014 
00015 #if !defined( __PROBA_HOLDER_H__ )
00016 #define __PROBA_HOLDER_H__
00017 
00018 struct ProbaHolder
00019 {
00020         Random  *gen;
00021         Real    *a;
00022         const int n;
00023         Real    maxn , minn;
00024         Real    count;
00025 
00026         Real    mean , sd;
00027 
00028         ProbaHolder( Random *aGen )
00029         : n( -1 ) , atN( 0 ) , count( 0 ) , mean( 0 ) , sd( 0 ) , a( 0 ) , maxn( 0 ) , minn( 1.0 ) , gen( aGen )
00030         {}
00031 
00032         ProbaHolder( const int aNr , Random &aGen , const double aCount )
00033         : n( aNr ) , count( aCount - 0.001 ) , mean( 0 ) , sd( 0 ) , gen( 0 ) , atN( 0 )
00034         {
00035                 a = new Real[ aNr ];
00036                 maxn = minn = a[0] = aGen.Next();
00037                 for( int i = 1 ; i < n ; i++ )
00038                 {
00039                         a[i] = aGen.Next();
00040                         minn = min( minn , a[i] );
00041                         maxn = max( maxn , a[i] );
00042               mean += a[i];
00043                 }
00044            mean /= n;
00045         }
00046         int     atN;
00047         const double Next( const int i )
00048         {
00049                 Real rat = 0.0;
00050 
00051                 if( a )
00052                 {
00053                         if( atN >= n )
00054                                 atN = 0;
00055                         rat = (maxn != minn) ? (a[atN++] - minn) / (maxn - minn) : 1.0;
00056                 }
00057                 else if( gen )
00058                 {
00059                         Real v = gen->Next();
00060                         minn = min( minn , v );
00061                         maxn = max( maxn , v );
00062                         rat = (maxn != minn) ? (v - minn) / (maxn - minn) : 1.0;
00063                         mean = (mean + v) / 2;
00064                 }
00065                 return (double(i - 0.001) * rat);
00066         }
00067 
00068         const int       operator[]( const int i )
00069         {
00070                 Real rat = 0.0;
00071 
00072                 if( a )
00073                         rat = (maxn != minn) ? (a[i] - minn) / (maxn - minn) : 1.0;
00074                 else if( gen )
00075                 {
00076                         Real v = gen->Next();
00077                         minn = min( minn , v );
00078                         maxn = max( maxn , v );
00079                         rat = (maxn != minn) ? (v - minn) / (maxn - minn) : 1.0;
00080                         mean = (mean + v) / 2;
00081                         count = (i - 0.001);
00082                 }
00083                 return (int)(count * rat);
00084         }
00085 
00086         ~ProbaHolder( void )
00087         {
00088    #ifdef MONITOR
00089       tron << "destructing ProbaHolder\n";
00090    #endif
00091                 if( a )
00092                         delete[] a;
00093                 a = 0;
00094                 if( gen )
00095                         delete gen; 
00096                 gen = 0;
00097         }
00098 };
00099 
00100 struct DiscreteProba    {
00101         Real    *P;
00102         int     n , Nr;
00103         Random  *rand;
00104         Normal  nn;
00105 
00106         Real    *a , count;
00107         Real    maxn , minn;
00108 
00109         DiscreteProba( void )
00110         : P( 0 ) , rand( 0 ) , count( 0 )
00111         , a( 0 ) , maxn( 0 ) , minn( 1.0 ) , at( 0 )
00112         {}
00113 
00114         ~DiscreteProba( void )
00115         {
00116    #ifdef MONITOR
00117       tron << "destructing DiscreteProba\n";
00118    #endif
00119                 Reset();
00120         }
00121 
00125         void Setup( vector<double> &aP , const int an , const int aNr = 10000 )
00126         {
00127                 Nr = aNr;
00128                 Reset();
00129                 count = an - 0.001;
00130                 P = new Real[ an ];
00131                 for( int j = 0 ; j < an ; j++ )
00132                         P[j] = aP[j];
00133                 n = an;
00134                 
00135                 a = new Real[ aNr ];
00136                 rand = new DiscreteGen( n , P );
00137                 maxn = minn = a[0] = rand->Next();
00138                 for( int i = 1 ; i < aNr ; i++ )
00139                 {
00140                         a[i] = rand->Next();
00141                         minn = min( minn , a[i] );
00142                         maxn = max( maxn , a[i] );
00143                 }
00144         }
00145         const int Next( void )
00146         {
00147                 if( a )
00148                         while( 1 )
00149                         {
00150                                 Real rat = a[at++];
00151                                 if( at >= Nr )
00152                                         at = 0;
00153                                 if( P[(int)rat] != 0 )
00154                                         return (int)(rat);
00155                                 else
00156                                         at = 0;
00157                         }
00158                 return -1;
00159         }
00160 
00161 private:
00162 
00163         int     at;
00164         void Reset( void )
00165         {
00166                 at = 0;
00167 
00168                 if( rand )
00169                         delete rand;
00170                 rand = 0;
00171                 if( P )
00172                         delete [] P;
00173                 P = 0;
00174                 if( a )
00175                         delete[] a;
00176                 a = 0;
00177         }
00178 };
00179 
00180 #endif

Generated on Fri Dec 5 04:06:00 2003 for Borqueror by doxygen 1.3.3