1 #ifndef NPSTAT_MODULATEDDISTRIBUTION1D_HH_
2 #define NPSTAT_MODULATEDDISTRIBUTION1D_HH_
24 template<
class Functor>
51 const double fcnXmin = -DBL_MAX,
52 const double fcnXmax = DBL_MAX,
53 const unsigned nIntegPoints = 1024,
54 const unsigned nIntegIntervals = 1)
55 : distro_(0), fcn_(fcn), norm_(1.0),
56 nIntegPoints_(nIntegPoints), nIntegIntervals_(nIntegIntervals)
58 if (!(fcnXmin < fcnXmax))
throw std::invalid_argument(
59 "In npstat::ModulatedDistribution1D constructor: "
60 "invalid support specification for the modulating function");
61 xmin_ = std::max(distro.
quantile(0.0), fcnXmin);
62 xmax_ = std::min(distro.
quantile(1.0), fcnXmax);
63 if (!(xmin_ < xmax_))
throw std::invalid_argument(
64 "In npstat::ModulatedDistribution1D constructor: "
65 "supports of the density and of the modulating function "
68 if (!nIntegIntervals_)
throw std::invalid_argument(
69 "In npstat::ModulatedDistribution1D constructor: "
70 "number of integration intervals must be positive");
71 distro_ = distro.
clone();
73 xmin_, xmax_, nIntegIntervals_);
78 : distro_(r.distro_->
clone()), fcn_(r.fcn_),
79 xmin_(r.xmin_), xmax_(r.xmax_), norm_(r.norm_),
80 nIntegPoints_(r.nIntegPoints_),
81 nIntegIntervals_(r.nIntegIntervals_) {}
83 inline ModulatedDistribution1D& operator=(
const ModulatedDistribution1D& r)
87 AbsDistribution1D* p = r.distro_->clone();
94 nIntegPoints_ = r.nIntegPoints_;
95 nIntegIntervals_ = r.nIntegIntervals_;
106 inline virtual double density(
const double x)
const
108 if (x >= xmin_ && x <= xmax_)
110 const double d = distro_->
density(x)*fcn_(x)/norm_;
119 inline virtual double cdf(
const double x)
const
129 xmin_, x, nIntegIntervals_);
144 x, xmax_, nIntegIntervals_);
149 inline virtual double quantile(
const double r1)
const
151 if (!(r1 >= 0.0 && r1 <= 1.0))
throw std::domain_error(
152 "In npstat::ModulatedDistribution1D::quantile: "
153 "cdf argument outside of [0, 1] interval");
160 const double tol = 2.0*std::numeric_limits<double>::epsilon();
173 inline virtual gs::ClassId
classId()
const {
return gs::ClassId(*
this);}
175 static inline const char* classname()
176 {
return "npstat::ModulatedDistribution1D";}
177 static inline unsigned version() {
return 1;}
191 unsigned nIntegPoints_;
192 unsigned nIntegIntervals_;
196 template<
class Functor>
197 inline ModulatedDistribution1D<Functor>
200 const double fcnXmin = -DBL_MAX,
201 const double fcnXmax = DBL_MAX,
202 const unsigned nIntegPoints = 1024,
203 const unsigned nIntegIntervals = 1)
206 distro, fcn, fcnXmin, fcnXmax, nIntegPoints, nIntegIntervals);
Interface definition for 1-d continuous statistical distributions.
Gauss-Legendre quadratures in long double precision.
Definition: AbsDistribution1D.hh:323
Definition: AbsDistribution1D.hh:279
Definition: GaussLegendreQuadrature.hh:27
long double integrate(const Functor1< FcnResult, FcnArg > &fcn, long double a, long double b) const
Definition: ModulatedDistribution1D.hh:26
virtual double exceedance(const double x) const
Definition: ModulatedDistribution1D.hh:134
virtual gs::ClassId classId() const
Definition: ModulatedDistribution1D.hh:173
virtual double cdf(const double x) const
Definition: ModulatedDistribution1D.hh:119
virtual double density(const double x) const
Definition: ModulatedDistribution1D.hh:106
virtual bool isEqual(const AbsDistribution1D &other) const
Definition: ModulatedDistribution1D.hh:180
virtual double quantile(const double r1) const
Definition: ModulatedDistribution1D.hh:149
virtual ModulatedDistribution1D * clone() const
Definition: ModulatedDistribution1D.hh:100
ModulatedDistribution1D(const AbsDistribution1D &distro, const Functor &fcn, const double fcnXmin=-DBL_MAX, const double fcnXmax=DBL_MAX, const unsigned nIntegPoints=1024, const unsigned nIntegIntervals=1)
Definition: ModulatedDistribution1D.hh:49
Root finding with the bisection method.
Definition: AbsArrayProjector.hh:14
ModulatedDistribution1D< Functor > make_ModulatedDistribution1D(const AbsDistribution1D &distro, const Functor &fcn, const double fcnXmin=-DBL_MAX, const double fcnXmax=DBL_MAX, const unsigned nIntegPoints=1024, const unsigned nIntegIntervals=1)
Definition: ModulatedDistribution1D.hh:198
bool findRootUsingBisections(const Functor1< Result, Arg1 > &f, Result rhs, Arg1 x0, Arg1 x1, Arg1 tol, Arg1 *root)
Definition: AbsDistribution1D.hh:31
virtual double density(double x) const =0
virtual AbsDistribution1D * clone() const =0
virtual double quantile(double x) const =0