00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
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