npstat is hosted by Hepforge, IPPP Durham
NPStat  5.10.0
AbsDiscreteDistribution1D.hh
Go to the documentation of this file.
1 #ifndef NPSTAT_ABSDISCRETEDISTRIBUTION1D_HH_
2 #define NPSTAT_ABSDISCRETEDISTRIBUTION1D_HH_
3 
4 /*!
5 // \file AbsDiscreteDistribution1D.hh
6 //
7 // \brief Interface definition for 1-d discrete statistical distributions
8 //
9 // Author: I. Volobouev
10 //
11 // May 2013
12 */
13 
14 #include "geners/ClassId.hh"
16 
17 namespace npstat {
19  {
20  inline virtual ~AbsDiscreteDistribution1D() {}
21 
22  /** Probability */
23  virtual double probability(long x) const = 0;
24 
25  /** Cumulative distribution function */
26  virtual double cdf(double x) const = 0;
27 
28  /** 1 - cdf, implementations should avoid subtractive cancellation */
29  virtual double exceedance(double x) const = 0;
30 
31  /** The quantile function */
32  virtual long quantile(double x) const = 0;
33 
34  /**
35  // Derived classes should not implement "operator==", implement
36  // "isEqual" instead
37  */
38  inline bool operator==(const AbsDiscreteDistribution1D& r) const
39  {return (typeid(*this) == typeid(r)) && this->isEqual(r);}
40 
41  /** Logical negation of operator== */
42  inline bool operator!=(const AbsDiscreteDistribution1D& r) const
43  {return !(*this == r);}
44 
45  /** "Virtual copy constructor" */
46  virtual AbsDiscreteDistribution1D* clone() const = 0;
47 
48  /**
49  // Random number generator according to the given distribution.
50  // Should return the number of random points used up from the
51  // generator.
52  */
53  inline virtual unsigned random(AbsRandomGenerator& g,
54  long* generatedRandom) const
55  {
56  assert(generatedRandom);
57  *generatedRandom = quantile(g());
58  return 1U;
59  }
60 
61  //@{
62  /** Prototype needed for I/O */
63  virtual gs::ClassId classId() const = 0;
64  virtual bool write(std::ostream&) const {return false;}
65  //@}
66 
67  static inline const char* classname()
68  {return "npstat::AbsDiscreteDistribution1D";}
69  static inline unsigned version() {return 1;}
70  static AbsDiscreteDistribution1D* read(const gs::ClassId& id,
71  std::istream& is);
72  protected:
73  /** Comparison for equality. To be implemented by derived classes. */
74  virtual bool isEqual(const AbsDiscreteDistribution1D&) const = 0;
75 
76 #ifdef SWIG
77  public:
78  inline long random2(AbsRandomGenerator& g) const
79  {
80  long l;
81  this->random(g, &l);
82  return l;
83  }
84 #endif // SWIG
85  };
86 
87  /**
88  // This base class is used to model discrete distributions which
89  // have "trivial" behavior w.r.t. location parameter. That is,
90  // if the distribution density is g(x), the density with location
91  // parameter "mu" is g(x - mu).
92  */
94  {
95  public:
96  inline explicit ShiftableDiscreteDistribution1D(const long location) :
97  location_(location) {}
98 
99  inline virtual ~ShiftableDiscreteDistribution1D() {}
100 
101  /** Get the location parameter */
102  inline long location() const {return location_;}
103 
104  /** Set the location parameter */
105  inline void setLocation(const long v) {location_ = v;}
106 
107  //@{
108  /** Method overriden from the AbsDiscreteDistribution1D base class */
109  inline double probability(const long x) const
110  {return unshiftedProbability(x - location_);}
111 
112  inline double cdf(const double x) const
113  {return unshiftedCdf(x - location_);}
114 
115  inline double exceedance(const double x) const
116  {return unshiftedExceedance(x - location_);}
117 
118  inline long quantile(const double x) const
119  {return unshiftedQuantile(x) + location_;}
120  //@}
121 
122  /** "Virtual copy constructor" */
124 
125  /** Method related to "geners" I/O */
126  virtual gs::ClassId classId() const = 0;
127 
128  protected:
129  /**
130  // Derived classes should override the following method as long as
131  // they have at least one additional data member. Don't forget to
132  // call "isEqual" of the base class inside the derived classes.
133  */
134  virtual bool isEqual(const AbsDiscreteDistribution1D& other) const
135  {
137  static_cast<const ShiftableDiscreteDistribution1D&>(other);
138  return location_ == r.location_;
139  }
140 
141  private:
143 
144  virtual double unshiftedProbability(long x) const = 0;
145  virtual double unshiftedCdf(double x) const = 0;
146  virtual double unshiftedExceedance(double x) const = 0;
147  virtual long unshiftedQuantile(double x) const = 0;
148 
149  long location_;
150  };
151 
152  /**
153  // Interface class for calculating some kind of a distance measure
154  // between two distributions. If the distance is asymmetric, the
155  // "reference" distribution (more precise in some sense) should
156  // be the second argument of operator()(...). The pointer to the
157  // pooled distribution can be NULL. If it is not NULL then it may
158  // or may not be ignored by the distance functor.
159  */
161  {
162  inline virtual ~AbsDiscreteDistribution1DDistance() {}
163 
164  virtual double operator()(const AbsDiscreteDistribution1D& prob1,
165  const AbsDiscreteDistribution1D& prob2,
166  const AbsDiscreteDistribution1D* pooled,
167  long first, long oneAboveLast) const = 0;
168  };
169 }
170 
171 #endif // NPSTAT_ABSDISCRETEDISTRIBUTION1D_HH_
Interface definition for pseudo- and quasi-random number generators.
Definition: AbsDiscreteDistribution1D.hh:94
double cdf(const double x) const
Definition: AbsDiscreteDistribution1D.hh:112
virtual bool isEqual(const AbsDiscreteDistribution1D &other) const
Definition: AbsDiscreteDistribution1D.hh:134
virtual ShiftableDiscreteDistribution1D * clone() const =0
double probability(const long x) const
Definition: AbsDiscreteDistribution1D.hh:109
long quantile(const double x) const
Definition: AbsDiscreteDistribution1D.hh:118
double exceedance(const double x) const
Definition: AbsDiscreteDistribution1D.hh:115
long location() const
Definition: AbsDiscreteDistribution1D.hh:102
virtual gs::ClassId classId() const =0
void setLocation(const long v)
Definition: AbsDiscreteDistribution1D.hh:105
Definition: AbsArrayProjector.hh:14
Definition: AbsDiscreteDistribution1D.hh:161
Definition: AbsDiscreteDistribution1D.hh:19
virtual AbsDiscreteDistribution1D * clone() const =0
virtual bool isEqual(const AbsDiscreteDistribution1D &) const =0
bool operator==(const AbsDiscreteDistribution1D &r) const
Definition: AbsDiscreteDistribution1D.hh:38
virtual double probability(long x) const =0
virtual gs::ClassId classId() const =0
virtual double cdf(double x) const =0
bool operator!=(const AbsDiscreteDistribution1D &r) const
Definition: AbsDiscreteDistribution1D.hh:42
virtual unsigned random(AbsRandomGenerator &g, long *generatedRandom) const
Definition: AbsDiscreteDistribution1D.hh:53
virtual long quantile(double x) const =0
virtual double exceedance(double x) const =0
Definition: AbsRandomGenerator.hh:27