Brief description of class still missing. More...
#include <PdfCurve.h>
Public Member Functions | |
| void | printCumulative (const ModelSet &models, const Parameter &p) |
| double | randomValue (UniqueRandom &generator, const ModelSet &models, int &cellIndex) |
| void | toStream (QTextStream &s, const ModelSet &models) |
Brief description of class still missing.
Full description of class still missing
| void DinverCore::PdfCurve::printCumulative | ( | const ModelSet & | models, |
| const Parameter & | p | ||
| ) |
References QGpCoreTools::Curve< PdfPoint >::at(), QGpCoreTools::Curve< PdfPoint >::count(), QGpCoreTools::Curve< PdfPoint >::first(), DinverCore::PdfPoint::probability(), DinverCore::Parameter::realValue(), TRACE, and DinverCore::PdfPoint::x().
{
TRACE;
int n=count();
double * cumProb=new double [ n ];
cumProb[0]=0.0;
const PdfPoint * p1, *p2;
p2=&first();
for(int i=1; i<n; i++) {
p1=p2;
p2=&at(i);
cumProb[i]=cumProb[i-1] + (p2->x() - p1->x()) * p1->probability(models);
}
for(int i=1; i<n; i++) {
printf("%lf %lg\n", p.realValue(at(i).x()), cumProb[i]/cumProb[n-1]);
}
delete [] cumProb;
}
| double DinverCore::PdfCurve::randomValue | ( | UniqueRandom & | generator, |
| const ModelSet & | models, | ||
| int & | cellIndex | ||
| ) |
Generate a random value that follow the probability dentsity function given by pdf. pdf is not necessarely normalized. It is defined by constant steps:
pdf[x] pdf[y] 25 23 23 if 25 < x < 30 30 35 35 if 30 < x < 35 35 45 45 if 35 < x < 37 37 50 50 if 37 < x < 41 41 20 20 if 41 < x < 50 50 10 10 if 50 < x < 70 70 10 last value not used, only the x is used for max of last class
References QGpCoreTools::Curve< PdfPoint >::at(), QGpCoreTools::Curve< PdfPoint >::count(), QGpCoreTools::Curve< PdfPoint >::first(), DinverCore::PdfPoint::probability(), TRACE, DinverCore::UniqueRandom::uniform(), and DinverCore::PdfPoint::x().
Referenced by DinverCore::ImportanceSampling::generate().
{
TRACE;
int n=count();
double * cumProb=new double [ n ];
cumProb[0]=0.0;
const PdfPoint * p1, *p2;
p2=&first();
for(int i=1; i<n; i++) {
p1=p2;
p2=&at(i);
cumProb[i]=cumProb[i-1] + (p2->x() - p1->x()) * p1->probability(models);
}
double val=generator.uniform() * cumProb[n-1];
n--;
int index;
if(n<12) {
for(index=1; index<n; index++ ) {
if(val<cumProb[index]) break;
}
} else {
int n2=1;
while(n2 < n) n2=n2 << 1; // multiply by 2
index=n2;
int step2=index >> 1;
while(step2 > 0) {
if(index > n) index -= step2;
else if(val <= cumProb[index] ) {
if(val > cumProb[index-1] ) break;
index -= step2;
} else
index += step2;
step2=step2 >> 1;
}
}
cellIndex=at(index-1).cell();
return at(index-1).x()+ (val-cumProb[index-1])
/(cumProb[index] - cumProb[index-1] )
* (at(index).x() - at(index-1).x());
}
| void DinverCore::PdfCurve::toStream | ( | QTextStream & | s, |
| const ModelSet & | models | ||
| ) |