1 #ifndef NPSTAT_ABSDISTRIBUTION1D_HH_
2 #define NPSTAT_ABSDISTRIBUTION1D_HH_
18 #include "geners/ClassId.hh"
35 virtual double density(
double x)
const = 0;
38 virtual double cdf(
double x)
const = 0;
54 {
return (
typeid(*
this) ==
typeid(r)) && this->
isEqual(r);}
58 {
return !(*
this == r);}
69 double* generatedRandom)
const
71 assert(generatedRandom);
93 unsigned nIntegrationPoints = 1024U,
94 bool useFejerQuadrature =
false)
const;
102 template <
class Functor>
104 unsigned nIntegrationPoints = 1024U,
105 bool useFejerQuadrature =
false)
const;
110 inline virtual bool write(std::ostream&)
const {
return false;}
113 static inline const char* classname()
114 {
return "npstat::AbsDistribution1D";}
115 static inline unsigned version() {
return 1;}
116 static AbsDistribution1D* read(
const gs::ClassId&
id, std::istream&);
123 template <
class Funct>
124 class ExpectationFunctor :
public Functor1<double, double>
127 inline ExpectationFunctor(
const Funct& fcn,
129 : fcn_(fcn), distro_(distro) {}
131 inline virtual ~ExpectationFunctor() {}
133 inline double operator()(
const double& x)
const
134 {
return fcn_(x)*distro_.density(x);}
151 class UnscaledDensityFunctor1D;
152 class UnscaledCdfFunctor1D;
169 const double scale) :
172 if (scale_ <= 0.0)
throw std::invalid_argument(
173 "In npstat::AbsScalableDistribution1D constructor: "
174 "scale parameter must be positive");
183 inline double scale()
const {
return scale_;}
191 if (v <= 0.0)
throw std::invalid_argument(
192 "In npstat::AbsScalableDistribution1D::setScale: "
193 "scale parameter must be positive");
200 {
return unscaledDensity((x - location_)/scale_)/scale_;}
202 inline double cdf(
const double x)
const
203 {
return unscaledCdf((x - location_)/scale_);}
206 {
return unscaledExceedance((x - location_)/scale_);}
209 {
return scale_*unscaledQuantile(x) + location_;}
212 double* generatedRandom)
const
214 const unsigned count = unscaledRandom(g, generatedRandom);
215 *generatedRandom *= scale_;
216 *generatedRandom += location_;
227 virtual bool write(std::ostream& os)
const;
246 return location_ == r.location_ && scale_ == r.scale_;
255 virtual double unscaledDensity(
double x)
const = 0;
256 virtual double unscaledCdf(
double x)
const = 0;
257 virtual double unscaledExceedance(
double x)
const = 0;
258 virtual double unscaledQuantile(
double x)
const = 0;
260 double* generatedRandom)
const
262 assert(generatedRandom);
263 *generatedRandom = unscaledQuantile(g());
282 const double normfactor=1.0)
283 : fcn_(fcn), norm_(normfactor) {}
287 inline virtual double operator()(
const double& a)
const
288 {
return norm_*fcn_.
density(a);}
301 const double normfactor=1.0)
302 : fcn_(fcn), norm_(normfactor) {}
306 inline virtual double operator()(
const double& a)
const
308 const double d = fcn_.
density(a);
309 return norm_*norm_*d*d;
326 const double normfactor=1.0)
327 : fcn_(fcn), norm_(normfactor) {}
331 inline virtual double operator()(
const double& a)
const
332 {
return norm_*fcn_.
cdf(a);}
345 const double normfactor=1.0)
346 : fcn_(fcn), norm_(normfactor) {}
350 inline virtual double operator()(
const double& a)
const
364 const double normfactor=1.0)
365 : fcn_(fcn), norm_(normfactor) {}
369 inline virtual double operator()(
const double& a)
const
383 const double normfactor=1.0)
384 : fcn_(fcn), norm_(normfactor) {}
388 inline virtual double operator()(
const double& a)
const
389 {
return norm_*fcn_.unscaledDensity(a);}
402 const double normfactor=1.0)
403 : fcn_(fcn), norm_(normfactor) {}
407 inline virtual double operator()(
const double& a)
const
408 {
return norm_*fcn_.unscaledCdf(a);}
427 const double maxDensityValue)
428 : fcn_(fcn), max_(maxDensityValue)
430 if (max_ <= 0.0)
throw std::invalid_argument(
431 "In npstat::AcceptanceFunctor1D constructor: "
432 "maximum density value must be positive");
437 inline virtual double operator()(
const double& a)
const
439 const double ratio = fcn_.
density(a)/max_;
440 if (ratio > 1.0)
throw std::runtime_error(
441 "In npstat::AcceptanceFunctor1D::operator(): "
442 "the maximum density parameter is too small");
461 const double minDensityValue)
462 : fcn_(fcn), min_(minDensityValue)
464 if (min_ <= 0.0)
throw std::invalid_argument(
465 "In npstat::AcceptanceFunctor1D constructor: "
466 "minimum density value must be positive");
471 inline virtual double operator()(
const double& a)
const
473 const double d = fcn_.
density(a);
475 const double ratio = min_/d;
476 if (ratio > 1.0)
throw std::runtime_error(
477 "In npstat::InverseAcceptanceFunctor1D::operator(): "
478 "the minimum density parameter is too large");
489 #include "npstat/stat/AbsDistribution1D.icc"
Interface definition for pseudo- and quasi-random number generators.
Interface definitions and concrete simple functors for a variety of functor-based calculations.
Definition: AbsDistribution1D.hh:165
static bool read(std::istream &is, double *location, double *scale)
double scale() const
Definition: AbsDistribution1D.hh:183
void setLocation(const double v)
Definition: AbsDistribution1D.hh:186
virtual unsigned random(AbsRandomGenerator &g, double *generatedRandom) const
Definition: AbsDistribution1D.hh:211
AbsScalableDistribution1D(const double location, const double scale)
Definition: AbsDistribution1D.hh:168
virtual bool isEqual(const AbsDistribution1D &other) const
Definition: AbsDistribution1D.hh:242
double density(const double x) const
Definition: AbsDistribution1D.hh:199
double exceedance(const double x) const
Definition: AbsDistribution1D.hh:205
void setScale(const double v)
Definition: AbsDistribution1D.hh:189
double cdf(const double x) const
Definition: AbsDistribution1D.hh:202
virtual gs::ClassId classId() const =0
double quantile(const double x) const
Definition: AbsDistribution1D.hh:208
double location() const
Definition: AbsDistribution1D.hh:180
virtual AbsScalableDistribution1D * clone() const =0
Definition: AbsDistribution1D.hh:424
Definition: AbsDistribution1D.hh:323
Definition: AbsDistribution1D.hh:279
Definition: AbsDistribution1D.hh:298
Definition: AbsDistribution1D.hh:342
Definition: AbsDistribution1D.hh:458
Definition: AbsDistribution1D.hh:361
Definition: AbsDistribution1D.hh:399
Definition: AbsDistribution1D.hh:380
Definition: AbsArrayProjector.hh:14
Definition: AbsDistribution1D.hh:31
virtual double density(double x) const =0
bool operator!=(const AbsDistribution1D &r) const
Definition: AbsDistribution1D.hh:57
virtual unsigned random(AbsRandomGenerator &g, double *generatedRandom) const
Definition: AbsDistribution1D.hh:68
bool operator==(const AbsDistribution1D &r) const
Definition: AbsDistribution1D.hh:53
virtual gs::ClassId classId() const =0
long double empiricalMoment(long double center, unsigned order, unsigned nIntegrationPoints=1024U, bool useFejerQuadrature=false) const
virtual AbsDistribution1D * clone() const =0
virtual double exceedance(double x) const =0
virtual double quantile(double x) const =0
double expectation(const Functor &fcn, unsigned nIntegrationPoints=1024U, bool useFejerQuadrature=false) const
virtual double cdf(double x) const =0
virtual bool isEqual(const AbsDistribution1D &) const =0
Definition: AbsRandomGenerator.hh:27
Definition: SimpleFunctors.hh:58