npstat is hosted by Hepforge, IPPP Durham
NPStat  5.10.0
CompositeDistributionND.hh
Go to the documentation of this file.
1 #ifndef NPSTAT_COMPOSITEDISTRIBUTIONND_HH_
2 #define NPSTAT_COMPOSITEDISTRIBUTIONND_HH_
3 
4 /*!
5 // \file CompositeDistributionND.hh
6 //
7 // \brief Multivariate statistical distributions decomposed into copula
8 // and marginals
9 //
10 // Author: I. Volobouev
11 //
12 // March 2010
13 */
14 
15 #include <vector>
16 
17 #include "npstat/nm/ArrayND.hh"
18 
21 
22 namespace npstat {
23  /**
24  // This class represents multivariate statistical distributions
25  // decomposed into copula and marginals
26  */
28  {
29  public:
30  /**
31  // Constructor from pre-calculated copula and the marginals.
32  // If "assumePointerOwnership" is true then all argument
33  // distributions will be deleted in the destructor. If
34  // "assumePointerOwnership" is false then the constructor
35  // will build copies of all distributions (which will be
36  // later deleted in the destructor).
37  */
40  const std::vector<const AbsDistribution1D*> marginals,
41  bool assumePointerOwnership=false);
42 
43  //@{
44  /**
45  // Convenience constructor from copula and several marginals.
46  // The dimensionality of the copula must be consistent with
47  // the number of marginals provided.
48  */
50  const AbsDistribution1D& m0,
51  const AbsDistribution1D& m1);
53  const AbsDistribution1D& m0,
54  const AbsDistribution1D& m1,
55  const AbsDistribution1D& m2);
57  const AbsDistribution1D& m0,
58  const AbsDistribution1D& m1,
59  const AbsDistribution1D& m2,
60  const AbsDistribution1D& m3);
62  const AbsDistribution1D& m0,
63  const AbsDistribution1D& m1,
64  const AbsDistribution1D& m2,
65  const AbsDistribution1D& m3,
66  const AbsDistribution1D& m4);
67  //@}
68 
69  /** Start with the copula and add marginals later */
71 
72  /**
73  // Add a marginal. An exception will be thrown in case an attempt
74  // is made to add more marginals than copula has dimensions.
75  */
77 
78  /**
79  // Constructor from a histogram. The copula and the marginals
80  // are generated internally. "interpolationDegree" should be
81  // either 0 or 1 (limited by the abilities of BinnedDensityND class).
82  */
83  template <typename Num1, unsigned Len1, unsigned Dim1>
85  const double* location, const double* scale,
86  unsigned locationAndScaleLength,
87  const ArrayND<Num1,Len1,Dim1>& histogram,
88  const ArrayShape& copulaShape,
89  const unsigned interpolationDegree);
90 
93 
94  virtual ~CompositeDistributionND();
95 
96  inline virtual CompositeDistributionND* clone() const
97  {return new CompositeDistributionND(*this);}
98 
99  inline bool mappedByQuantiles() const {return true;}
100 
101  /** Return the copula */
102  inline const AbsDistributionND* copula() const
103  {return copula_;}
104 
105  /** Return the marginal distribution for the given dimension */
106  inline const AbsDistribution1D* marginal(unsigned index) const
107  {return marginals_.at(index);}
108 
109  double density(const double* x, unsigned dim) const;
110  double copulaDensity(const double* x, unsigned dim) const;
111  double productOfTheMarginals(const double* x, unsigned dim) const;
112 
113  void unitMap(const double* rnd, unsigned dim, double* x) const;
114 
115  //@{
116  /** Method needed for "geners" I/O */
117  virtual gs::ClassId classId() const {return gs::ClassId(*this);}
118  virtual bool write(std::ostream& of) const;
119  //@}
120 
121  static inline const char* classname()
122  {return "npstat::CompositeDistributionND";}
123  static inline unsigned version() {return 1;}
124 
125  static CompositeDistributionND* read(
126  const gs::ClassId& id, std::istream& in);
127 
128  protected:
129  virtual bool isEqual(const AbsDistributionND&) const;
130 
131  private:
132  void initAndCopyCopula(const AbsDistributionND& i_copula,
133  unsigned expectedDim);
134  void cleanup();
135  void validate() const;
136 
137  const AbsDistributionND* copula_;
138  std::vector<const AbsDistribution1D*> marginals_;
139  mutable std::vector<double> work_;
140 
141 #ifdef SWIG
142  public:
144  const double* location, unsigned lenLocation,
145  const double* scale, unsigned lenScale,
146  const ArrayND<double>& histogram,
147  const ArrayShape& copulaShape,
148  const unsigned interpolationDegree);
150  const double* location, unsigned lenLocation,
151  const double* scale, unsigned lenScale,
152  const ArrayND<float>& histogram,
153  const ArrayShape& copulaShape,
154  const unsigned interpolationDegree);
156  const double* location, unsigned lenLocation,
157  const double* scale, unsigned lenScale,
158  const ArrayND<int>& histogram,
159  const ArrayShape& copulaShape,
160  const unsigned interpolationDegree);
162  const double* location, unsigned lenLocation,
163  const double* scale, unsigned lenScale,
164  const ArrayND<long>& histogram,
165  const ArrayShape& copulaShape,
166  const unsigned interpolationDegree);
168  const double* location, unsigned lenLocation,
169  const double* scale, unsigned lenScale,
170  const ArrayND<unsigned char>& histogram,
171  const ArrayShape& copulaShape,
172  const unsigned interpolationDegree);
173 #endif // SWIG
174  };
175 }
176 
177 #include "npstat/stat/CompositeDistributionND.icc"
178 
179 #endif // NPSTAT_COMPOSITEDISTRIBUTIONND_HH_
Interface definition for 1-d continuous statistical distributions.
Interface definition for multivariate continuous statistical distributions.
Arbitrary-dimensional array template.
Definition: AbsDistributionND.hh:26
unsigned dim() const
Definition: AbsDistributionND.hh:51
Definition: ArrayND.hh:93
Definition: CompositeDistributionND.hh:28
CompositeDistributionND(const AbsDistributionND &copula)
bool mappedByQuantiles() const
Definition: CompositeDistributionND.hh:99
CompositeDistributionND(const double *location, const double *scale, unsigned locationAndScaleLength, const ArrayND< Num1, Len1, Dim1 > &histogram, const ArrayShape &copulaShape, const unsigned interpolationDegree)
virtual CompositeDistributionND * clone() const
Definition: CompositeDistributionND.hh:96
const AbsDistribution1D * marginal(unsigned index) const
Definition: CompositeDistributionND.hh:106
void addMarginal(const AbsDistribution1D &marginal)
double density(const double *x, unsigned dim) const
CompositeDistributionND(const AbsDistributionND &copula, const AbsDistribution1D &m0, const AbsDistribution1D &m1)
virtual gs::ClassId classId() const
Definition: CompositeDistributionND.hh:117
const AbsDistributionND * copula() const
Definition: CompositeDistributionND.hh:102
CompositeDistributionND(const AbsDistributionND *copula, const std::vector< const AbsDistribution1D * > marginals, bool assumePointerOwnership=false)
void unitMap(const double *rnd, unsigned dim, double *x) const
Definition: AbsArrayProjector.hh:14
std::vector< unsigned > ArrayShape
Definition: ArrayShape.hh:21
Definition: AbsDistribution1D.hh:31