13 #ifndef ROOT_Math_UnuranDistr
14 #define ROOT_Math_UnuranDistr
27 template<
class Function>
31 static double Pdf(
double x,
const UNUR_DISTR * dist) {
32 const Function * func =
reinterpret_cast<const Function *
> ( unur_distr_get_extobj(dist) );
33 return func->operator()(x);
36 static double Dpdf(
double x,
const UNUR_DISTR * dist) {
37 const Function * func =
reinterpret_cast<const Function *
> ( unur_distr_get_extobj(dist) );
38 return func->Derivative(x);
41 static double Cdf(
double x,
const UNUR_DISTR * dist) {
42 const Function * func =
reinterpret_cast<const Function *
> ( unur_distr_get_extobj(dist) );
52 template<
class Function>
53 struct UnuranDistrMulti {
56 static double Pdf(
const double * x, UNUR_DISTR * dist) {
57 const Function * func =
reinterpret_cast<const Function *
> ( unur_distr_get_extobj(dist) );
59 return func->operator()(x);
63 static int Dpdf(
double * grad,
const double * x, UNUR_DISTR * dist) {
64 const Function * func =
reinterpret_cast<const Function *
> ( unur_distr_get_extobj(dist) );
65 func->Gradient(x,grad);
70 static double Pdpdf(
const double * x,
int coord, UNUR_DISTR * dist) {
71 const Function * func =
reinterpret_cast<const Function *
> ( unur_distr_get_extobj(dist) );
72 return func->Gradient(x,coord);
75 static double Logpdf(
const double * x, UNUR_DISTR * dist) {
80 return std::log( Pdf(x,dist) );
83 static int Dlogpdf(
double * grad,
const double * x, UNUR_DISTR * dist) {
84 int dim = unur_distr_get_dim(dist);
85 double pdf = Pdf(x,dist);
86 int ret = Dpdf(grad,x,dist);
87 for (
int i = 0; i < dim; ++i) {
93 static double Pdlogpdf(
const double * x,
int coord, UNUR_DISTR * dist) {
94 return Pdpdf(x,coord,dist)/ Pdf(x,dist);