48 unur_set_default_debug(UNUR_DEBUG_ALL);
49 else if (debugLevel == 1)
50 unur_set_default_debug(UNUR_DEBUG_INIT);
52 unur_set_default_debug(UNUR_DEBUG_OFF);
75 if (
this == &rhs)
return *
this;
82 std::string
s =
dist +
" & " + method;
83 fGen = unur_str2gen(
s.c_str() );
85 Error(
"Init",
"Cannot create generator object");
115 fDist.reset(distNew);
130 fDist.reset(distNew);
144 fDist.reset(distNew);
159 if (
fRng == 0)
return false;
160 if (
fGen == 0)
return false;
163 if (
fUrng == 0)
return false;
164 unsigned int ret = 0;
167 if (ret != 0)
return false;
177 fUdistr = unur_distr_cont_new();
178 if (
fUdistr == 0)
return false;
179 unsigned int ret = 0;
181 if ( !
dist.IsLogPdf() ) {
196 Error(
"SetContDistribution",
"invalid domain xmin = %g xmax = %g ",
xmin,
xmax);
200 if (
dist.HasMode() ) {
201 ret = unur_distr_cont_set_mode(
fUdistr,
dist.Mode());
203 Error(
"SetContDistribution",
"invalid mode given, mode = %g ",
dist.Mode());
207 if (
dist.HasPdfArea() ) {
208 ret = unur_distr_cont_set_pdfarea(
fUdistr,
dist.PdfArea());
210 Error(
"SetContDistribution",
"invalid area given, area = %g ",
dist.PdfArea());
215 return (ret ==0) ? true :
false;
224 if (
fUdistr == 0)
return false;
225 unsigned int ret = 0;
227 if ( !
dist.IsLogPdf() ) {
238 const double *
xmin =
dist.GetLowerDomain();
239 const double *
xmax =
dist.GetUpperDomain();
243 Error(
"SetMultiDistribution",
"invalid domain");
247 Error(
"SetMultiDistribution",
"domain setting not available in UNURAN 0.8.1");
252 const double * xmode =
dist.GetMode();
254 ret = unur_distr_cvec_set_mode(
fUdistr, xmode);
256 Error(
"SetMultiDistribution",
"invalid mode");
260 return (ret ==0) ? true :
false;
267 if (
dist.NDim() == 1)
268 fUdistr = unur_distr_cemp_new();
272 if (
fUdistr == 0)
return false;
273 unsigned int ret = 0;
277 if (
dist.IsBinned() ) {
278 int nbins =
dist.Data().size();
279 double min =
dist.LowerBin();
280 double max =
dist.UpperBin();
281 const double * pv = &(
dist.Data().front());
282 ret |= unur_distr_cemp_set_hist(
fUdistr, pv, nbins, min, max);
284 Error(
"SetEmpiricalDistribution",
"hist method not available in UNURAN 0.8.1");
288 const double * pv = &
dist.Data().front();
291 if (
dist.NDim() == 1)
292 ret |= unur_distr_cemp_set_data(
fUdistr, pv,
n);
294 ret |= unur_distr_cvemp_set_data(
fUdistr, pv,
n);
297 Error(
"SetEmpiricalDistribution",
"invalid distribution object");
308 fUdistr = unur_distr_discr_new();
309 if (
fUdistr == 0)
return false;
310 unsigned int ret = 0;
312 if (
dist.ProbVec().size() == 0) {
320 ret |= unur_distr_discr_set_pv(
fUdistr, &
dist.ProbVec().front(),
dist.ProbVec().size() );
327 Error(
"SetDiscrDistribution",
"invalid domain xmin = %d xmax = %d ",
xmin,
xmax);
331 if (
dist.HasMode() ) {
332 ret = unur_distr_discr_set_mode(
fUdistr,
dist.Mode());
334 Error(
"SetContDistribution",
"invalid mode given, mode = %d ",
dist.Mode());
338 if (
dist.HasProbSum() ) {
339 ret = unur_distr_discr_set_pmfsum(
fUdistr,
dist.ProbSum());
341 Error(
"SetContDistribution",
"invalid sum given, mode = %g ",
dist.ProbSum());
346 return (ret ==0) ? true :
false;
355 if (
fUdistr == 0)
return false;
357 struct unur_slist *mlist = NULL;
361 Error(
"SetMethod",
"missing distribution information or syntax error");
362 if (mlist != 0) _unur_slist_free(mlist);
368 unur_set_use_distr_privatecopy (par,
false);
372 fGen = unur_init(par);
373 _unur_slist_free(mlist);
375 Error(
"SetMethod",
"initializing Unuran: condition for method violated");
386 return unur_sample_discr(
fGen);
393 return unur_sample_cont(
fGen);
399 if (
fGen == 0)
return false;
400 unur_sample_vec(
fGen,
x);
410 if (
fGen == 0)
return false;
413 ret |= unur_chg_debug(
fGen, UNUR_DEBUG_ALL);
414 else if (debugLevel == 1)
415 ret |= unur_chg_debug(
fGen, UNUR_DEBUG_ALL);
417 ret |= unur_chg_debug(
fGen, UNUR_DEBUG_OFF);
419 return (ret ==0) ? true :
false;
428 fUdistr = unur_distr_poisson(p,1);
431 if (
fUdistr == 0)
return false;
443 fUdistr = unur_distr_binomial(par,2);
446 if (
fUdistr == 0)
return false;
456 if (!
fGen )
return false;
458 unur_distr_discr_set_pmfparams(
fUdistr,par,npar);
459 int iret = unur_reinit(
fGen);
460 if (iret)
Warning(
"ReInitDiscrDist",
"re-init failed - a full initizialization must be performed");
void Error(const char *location, const char *msgfmt,...)
void Warning(const char *location, const char *msgfmt,...)
R__EXTERN TRandom * gRandom
This is the base class for the ROOT Random number generators.
virtual void SetSeed(ULong_t seed=0)
Set the random generator seed.
TUnuranContDist class describing one dimensional continuous distribution.
virtual TUnuranContDist * Clone() const
Clone (required by base class)
TUnuranDiscrDist class for one dimensional discrete distribution.
virtual TUnuranDiscrDist * Clone() const
Clone (required by base class)
TUnuranEmpDist class for describing empiral distributions.
unsigned int NDim() const
Number of data dimensions.
TUnuranEmpDist * Clone() const
Clone (required by base class)
bool IsBinned() const
Flag to control if data are binned.
TUnuranMultiContDist class describing multi dimensional continuous distributions.
virtual TUnuranMultiContDist * Clone() const
Clone (required by base class)
TUnuran(TRandom *r=0, unsigned int log=0)
Constructor with a generator instance and given level of log output.
bool SetMethodAndInit()
change the method and initialize Unuran with the previously given distribution
int SampleDiscr()
Sample discrete distributions User is responsible for having previously correctly initialized with TU...
std::unique_ptr< TUnuranBaseDist > fDist
bool SetDiscreteDistribution(const TUnuranDiscrDist &dist)
bool InitBinomial(unsigned int ntot, double prob, const std::string &method="dstd")
Initialize method for the Binomial distribution Used to generate poisson numbers for a constant param...
bool SetContDistribution(const TUnuranContDist &dist)
bool SampleMulti(double *x)
Sample multidimensional distributions User is responsible for having previously correctly initialized...
bool ReInitDiscrDist(unsigned int npar, double *params)
Reinitialize UNURAN by changing the distribution parameters but mantaining same distribution and meth...
bool Init(const std::string &distr, const std::string &method)
initialize with Unuran string interface
bool SetRandomGenerator()
bool SetLogLevel(unsigned int iflag=1)
set log level
bool SetMultiDistribution(const TUnuranMultiContDist &dist)
double Sample()
Sample 1D distribution User is responsible for having previously correctly initialized with TUnuran::...
bool SetEmpiricalDistribution(const TUnuranEmpDist &dist)
bool InitPoisson(double mu, const std::string &method="dstd")
Initialize method for the Poisson distribution Used to generate poisson numbers for a constant parame...
TUnuran & operator=(const TUnuran &rhs)
Assignment operator.
void SetSeed(unsigned int seed)
set the seed for the random number generator
double dist(Rotation3D const &r1, Rotation3D const &r2)
static constexpr double s
static double Cdf(double x, const UNUR_DISTR *dist)
evaluate the Cumulative distribution function, integral of the pdf
static double Pdf(double x, const UNUR_DISTR *dist)
evaluate the probality density function
static double Dpdf(double x, const UNUR_DISTR *dist)
evaluate the derivative of the pdf
static double Pmf(int x, const UNUR_DISTR *dist)
evaluate the probality mesh function
static double Cdf(int x, const UNUR_DISTR *dist)
evaluate the cumulative function
static double Pdf(const double *x, UNUR_DISTR *dist)
evaluate the probality density function
static int Dpdf(double *grad, const double *x, UNUR_DISTR *dist)
static double Pdpdf(const double *x, int coord, UNUR_DISTR *dist)
UnuranRng class for interface ROOT random generators to Unuran.