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");
static double Pdpdf(const double *x, int coord, UNUR_DISTR *dist)
double dist(Rotation3D const &r1, Rotation3D const &r2)
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.
static double Pdf(const double *x, UNUR_DISTR *dist)
evaluate the probality density function
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)
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)
TUnuranEmpDist class for describing empiral distributions.
void Error(const char *location, const char *msgfmt,...)
unsigned int NDim() const
Number of data dimensions.
bool SetContDistribution(const TUnuranContDist &dist)
static double Pmf(int x, const UNUR_DISTR *dist)
evaluate the probality mesh function
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
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
bool SetDiscreteDistribution(const TUnuranDiscrDist &dist)
static constexpr double s
bool SetRandomGenerator()
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
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)