npstat is hosted by Hepforge, IPPP Durham
NPStat  5.10.0
EllipticalDistribution.hh
Go to the documentation of this file.
1 #ifndef NPSTAT_ELLIPTICALDISTRIBUTION_HH_
2 #define NPSTAT_ELLIPTICALDISTRIBUTION_HH_
3 
4 /*!
5 // \file EllipticalDistribution.hh
6 //
7 // \brief Multivariate elliptical ditributions
8 //
9 // Author: I. Volobouev
10 //
11 // September 2022
12 */
13 
14 #include <vector>
15 
16 #include "npstat/nm/Matrix.hh"
17 
20 
21 namespace npstat {
23  {
24  public:
25  /**
26  // The constructor arguments are as follows:
27  //
28  // location, dim The shift and the dimensionality of
29  // the distribution. The array "location"
30  // must have at least "dim" elements.
31  //
32  // transformationMatrix The square matrix for generating random
33  // variables from this density according to
34  // x = location + transformationMatrix*y,
35  // where y is a spherically distributed
36  // random variable. For multivariate normal,
37  // transformationMatrix is the square root
38  // of the covariance matrix.
39  //
40  // gDistro The "generator" distribution. The
41  // multivariate density is going to be
42  // proportional to gDistro.density(chi-square),
43  // where chi-square variable is constructed
44  // as in the multivariate normal.
45  // Must have gDistro.quantile(0.0) = 0.0.
46  //
47  // hDistro Distribution of the r^2 variable. Must have
48  // hDistro.quantile(0.0) = 0.0.
49  */
50  EllipticalDistribution(const double* location, unsigned dim,
51  const Matrix<double>& transformationMatrix,
52  const AbsDistribution1D& gDistro,
53  const AbsDistribution1D& hDistro);
54 
57 
58  inline virtual EllipticalDistribution* clone() const
59  {return new EllipticalDistribution(*this);}
60 
61  inline virtual ~EllipticalDistribution() {cleanup();}
62 
63  virtual double density(const double* x, unsigned dim) const;
64  virtual void unitMap(const double* rnd, unsigned bufLen, double* x) const;
65  inline virtual bool mappedByQuantiles() const {return false;}
66  virtual unsigned random(AbsRandomGenerator& g,
67  double* x, unsigned lenX) const;
68 
69  /** This function returns the value of the quadratic form */
70  double chiSquare(const double* x, unsigned dim) const;
71 
72  inline const AbsDistribution1D& getGDistro() const {return *g_;}
73  inline const AbsDistribution1D& getHDistro() const {return *h_;}
74  inline const Matrix<double>& getTransformationMatrix() const
75  {return A_;}
76  inline const std::vector<double>& getShift() const {return mu_;}
77 
78  // Methods needed for I/O
79  inline virtual gs::ClassId classId() const {return gs::ClassId(*this);}
80  virtual bool write(std::ostream& os) const;
81 
82  static inline const char* classname()
83  {return "npstat::EllipticalDistribution";}
84  static inline unsigned version() {return 1;}
85  static EllipticalDistribution* read(const gs::ClassId& id,
86  std::istream& in);
87  protected:
88  virtual bool isEqual(const AbsDistributionND&) const;
89 
90  std::vector<double> mu_;
91  Matrix<double> A_;
92  Matrix<double> InvCovmat_;
93  AbsDistribution1D* g_;
94  AbsDistribution1D* h_;
95  double det_;
96  double gNorm_;
97 
98  private:
100  void initialize(const AbsDistribution1D& g, const AbsDistribution1D& h);
101  void cleanup();
102 
103  mutable std::vector<double> buf_;
104 
105 #ifdef SWIG
106  public:
107  inline EllipticalDistribution(const double* location1, unsigned dim1,
108  const double* transform, unsigned nrows, unsigned ncols,
109  const AbsDistribution1D& gDistro,
110  const AbsDistribution1D& hDistro)
111  : AbsDistributionND(dim1),
112  mu_(location1, location1+dim1),
113  A_(nrows, ncols, transform),
114  g_(0),
115  h_(0),
116  det_(0.0),
117  gNorm_(0.0),
118  buf_(dim1)
119  {
120  assert(location1);
121  assert(dim1);
122  assert(transform);
123  initialize(gDistro, hDistro);
124  }
125 
126  inline AbsDistribution1D* getGDistro2() const {return g_->clone();}
127  inline AbsDistribution1D* getHDistro2() const {return h_->clone();}
128  inline Matrix<double> getTransformationMatrix2() const
129  {return A_;}
130  inline std::vector<double> getShift2() const {return mu_;}
131 #endif // SWIG
132  };
133 }
134 
135 #endif // NPSTAT_ELLIPTICALDISTRIBUTION_HH_
Interface definition for 1-d continuous statistical distributions.
Interface definition for multivariate continuous statistical distributions.
Template matrix class.
Definition: AbsDistributionND.hh:26
unsigned dim() const
Definition: AbsDistributionND.hh:51
Definition: EllipticalDistribution.hh:23
virtual bool mappedByQuantiles() const
Definition: EllipticalDistribution.hh:65
EllipticalDistribution(const double *location, unsigned dim, const Matrix< double > &transformationMatrix, const AbsDistribution1D &gDistro, const AbsDistribution1D &hDistro)
double chiSquare(const double *x, unsigned dim) const
virtual gs::ClassId classId() const
Definition: EllipticalDistribution.hh:79
virtual EllipticalDistribution * clone() const
Definition: EllipticalDistribution.hh:58
virtual unsigned random(AbsRandomGenerator &g, double *x, unsigned lenX) const
virtual double density(const double *x, unsigned dim) const
virtual void unitMap(const double *rnd, unsigned bufLen, double *x) const
Definition: AbsArrayProjector.hh:14
Definition: AbsDistribution1D.hh:31
Definition: AbsRandomGenerator.hh:27