1 #ifndef NPSTAT_SAMPLEDISTRO1DWITHWEIGHT_HH_
2 #define NPSTAT_SAMPLEDISTRO1DWITHWEIGHT_HH_
29 enum SampleSizeInterpretation
55 template <
class AcceptanceFunction>
58 const AcceptanceFunction& fcn,
60 const double sampleSize,
61 const SampleSizeInterpretation whichSize,
62 std::vector<std::pair<double,double> >* sample)
64 if (sampleSize < 0.0)
throw std::invalid_argument(
65 "In npstat::sampleDistro1DWithWeight: "
66 "sample size can not be negative");
73 long double kishLimit = LDBL_MAX;
74 unsigned long nTriesLimit = ULONG_MAX;
75 unsigned long nGeneratedLimit = ULONG_MAX;
76 double lastTryProb = 1.0;
77 double lastGenProb = 1.0;
82 nTriesLimit = std::floor(sampleSize);
83 if (
static_cast<double>(nTriesLimit) != sampleSize)
85 lastTryProb = sampleSize - nTriesLimit;
90 case SIZE_IS_N_GENERATED:
91 nGeneratedLimit = std::floor(sampleSize);
92 if (
static_cast<double>(nGeneratedLimit) != sampleSize)
94 lastGenProb = sampleSize - nGeneratedLimit;
100 kishLimit = sampleSize;
104 assert(!
"In npstat::sampleDistro1DWithWeight: "
105 "unhandled switch case. This is a bug. Please report.");
108 unsigned long nTries = 0, nAccepted = 0;
109 long double effSize = 0.0L, sumW = 0.0L, sumWSq = 0.0L;
112 while (effSize < kishLimit &&
113 nAccepted < nGeneratedLimit &&
114 nTries < nTriesLimit)
116 if (nTries + 1U == nTriesLimit)
117 if (rng() > lastTryProb)
121 const double sf = fcnOrConst(fcn, tmp);
126 const double r = rng();
130 bool accepted =
true;
131 if (nAccepted == nGeneratedLimit)
132 if (rng() > lastGenProb)
136 const double w = 1.0/sf;
137 sample->push_back(std::pair<double,double>(tmp, w));
140 effSize = sumW/sumWSq*sumW;
150 eff =
static_cast<double>(nAccepted)/nTries;
Interface definition for 1-d continuous statistical distributions.
Interface definition for pseudo- and quasi-random number generators.
A simple analogue of std::pair with three components instead of two.
Templated utilities for use in various density estimation codes, etc.
Definition: AbsArrayProjector.hh:14
npstat::Triple< double, double, double > sampleDistro1DWithWeight(const AbsDistribution1D &distro, const AcceptanceFunction &fcn, AbsRandomGenerator &rng, const double sampleSize, const SampleSizeInterpretation whichSize, std::vector< std::pair< double, double > > *sample)
Definition: sampleDistro1DWithWeight.hh:56
Definition: AbsDistribution1D.hh:31
virtual unsigned random(AbsRandomGenerator &g, double *generatedRandom) const
Definition: AbsDistribution1D.hh:68
Definition: AbsRandomGenerator.hh:27