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;
180 ret = unur_distr_set_extobj(
fUdistr, &dist);
194 ret = unur_distr_cont_set_domain(
fUdistr,xmin,xmax);
196 Error(
"SetContDistribution",
"invalid domain xmin = %g xmax = %g ",xmin,xmax);
201 ret = unur_distr_cont_set_mode(
fUdistr, dist.
Mode());
203 Error(
"SetContDistribution",
"invalid mode given, mode = %g ",dist.
Mode());
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;
226 ret |= unur_distr_set_extobj(
fUdistr, &dist );
240 if ( xmin != 0 || xmax != 0 ) {
241 ret = unur_distr_cvec_set_domain_rect(
fUdistr,xmin,xmax);
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;
278 int nbins = dist.
Data().size();
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) {
313 ret = unur_distr_set_extobj(
fUdistr, &dist );
325 ret = unur_distr_discr_set_domain(
fUdistr,xmin,xmax);
327 Error(
"SetDiscrDistribution",
"invalid domain xmin = %d xmax = %d ",xmin,xmax);
332 ret = unur_distr_discr_set_mode(
fUdistr, dist.
Mode());
334 Error(
"SetContDistribution",
"invalid mode given, mode = %d ",dist.
Mode());
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");
bool HasPdfArea() const
check if distribution has a pre-computed area below the Pdf
static double Pdpdf(const double *x, int coord, UNUR_DISTR *dist)
double dist(Rotation3D const &r1, Rotation3D const &r2)
bool IsLogPdf() const
flag to control if given function represent the log of a pdf
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...
double Sample()
Sample 1D distribution User is responsible for having previously correctly initialized with TUnuran::...
bool ReInitDiscrDist(unsigned int npar, double *params)
Reinitialize UNURAN by changing the distribution parameters but mantaining same distribution and meth...
static double Cdf(int x, const UNUR_DISTR *dist)
evaluate the cumulative function
TUnuran & operator=(const TUnuran &rhs)
Assignment operator.
const double * GetMode() const
get the mode (vector of coordinate positions of the maxima of the distribution) If a mode has not def...
static double Pdf(const double *x, UNUR_DISTR *dist)
evaluate the probality density function
bool GetDomain(double &xmin, double &xmax) const
check if distribution has a defined domain and return in case its domain
const double * GetLowerDomain() const
get the distribution lower domain values.
unsigned int NDim() const
get number of dimension of the distribution
bool GetDomain(int &xmin, int &xmax) const
check if distribution has domain and return in case its domain
double UpperBin() const
upper value of binned data (return 0 for unbinned data)
int SampleDiscr()
Sample discrete distributions User is responsible for having previously correctly initialized with TU...
UnuranRng class for interface ROOT random generators to Unuran.
bool SampleMulti(double *x)
Sample multidimensional distributions User is responsible for having previously correctly initialized...
static double Dpdf(double x, const UNUR_DISTR *dist)
evaluate the derivative of the pdf
bool SetLogLevel(unsigned int iflag=1)
set log level
static int Dpdf(double *grad, const double *x, UNUR_DISTR *dist)
const std::vector< double > & Data() const
Return reference to data vector (unbinned or binned data)
This is the base class for the ROOT Random number generators.
virtual TUnuranDiscrDist * Clone() const
Clone (required by base class)
virtual void SetSeed(ULong_t seed=0)
Set the random generator seed.
bool InitPoisson(double mu, const std::string &method="dstd")
Initialize method for the Poisson distribution Used to generate poisson numbers for a constant parame...
void SetSeed(unsigned int seed)
set the seed for the random number generator
virtual TUnuranMultiContDist * Clone() const
Clone (required by base class)
TUnuranDiscrDist class for one dimensional discrete distribution.
bool SetMultiDistribution(const TUnuranMultiContDist &dist)
bool HasCdf() const
check if a cdf function is provided for the distribution
TUnuranEmpDist class for describing empiral distributions.
bool IsLogPdf() const
flag to control if given function represent the log of a pdf
void Error(const char *location, const char *msgfmt,...)
unsigned int NDim() const
Number of data dimensions.
double LowerBin() const
Min value of binned data (return 0 for unbinned data)
bool SetContDistribution(const TUnuranContDist &dist)
static double Pmf(int x, const UNUR_DISTR *dist)
evaluate the probality mesh function
bool HasProbSum() const
flag to control if distribution provides the total area of the probability function ...
double ProbSum() const
return area of the pdf
const std::vector< double > & ProbVec() const
retrieve a reference to the vector of the probabilities : Prob(i) If the distribution is defined from...
bool HasMode() const
flag to control if distribution provides the mode
static double Pdf(double x, const UNUR_DISTR *dist)
evaluate the probality density function
TUnuranMultiContDist class describing multi dimensional continuous distributions. ...
static double Cdf(double x, const UNUR_DISTR *dist)
evaluate the Cumulative distribution function, integral of the pdf
void Warning(const char *location, const char *msgfmt,...)
R__EXTERN TRandom * gRandom
int Mode() const
get the mode (x location of function maximum)
TUnuran(TRandom *r=0, unsigned int log=0)
Constructor with a generator instance and given level of log output.
bool HasCdf() const
flag to control if distribution provides also a Cdf
bool SetMethodAndInit()
change the method and initialize Unuran with the previously given distribution
bool SetDiscreteDistribution(const TUnuranDiscrDist &dist)
static constexpr double s
double PdfArea() const
return area below the pdf
bool SetRandomGenerator()
const double * GetUpperDomain() const
get the distribution upper domain values.
TUnuranContDist class describing one dimensional continuous distribution.
bool IsBinned() const
Flag to control if data are binned.
bool Init(const std::string &distr, const std::string &method)
initialize with Unuran string interface
bool HasMode() const
check if distribution has a pre-computed mode
std::unique_ptr< TUnuranBaseDist > fDist
bool SetEmpiricalDistribution(const TUnuranEmpDist &dist)
virtual TUnuranContDist * Clone() const
Clone (required by base class)
TUnuranEmpDist * Clone() const
Clone (required by base class)
double Mode() const
return the mode (x location of maximum of the pdf)