npstat is hosted by Hepforge, IPPP Durham
NPStat  5.10.0
DistributionsND.hh
Go to the documentation of this file.
1 #ifndef NPSTAT_DISTRIBUTIONSND_HH_
2 #define NPSTAT_DISTRIBUTIONSND_HH_
3 
4 /*!
5 // \file DistributionsND.hh
6 //
7 // \brief A number of useful multivariate continuous statistical distributions
8 //
9 // Author: I. Volobouev
10 //
11 // March 2010
12 */
13 
14 #include <cassert>
15 #include <stdexcept>
16 
17 #include "npstat/nm/Matrix.hh"
18 #include "npstat/nm/MathUtils.hh"
19 
23 
24 namespace npstat {
25  /**
26  // A generic product distribution. The argument distributions
27  // will be cloned internally.
28  */
30  {
31  public:
32  ProductDistributionND(const AbsDistribution1D** marginals,
33  unsigned nMarginals);
34 
35  // Convenience constructors. They are also good for use from Python.
37 
39  const AbsDistribution1D& m1);
40 
42  const AbsDistribution1D& m1,
43  const AbsDistribution1D& m2);
44 
46  const AbsDistribution1D& m1,
47  const AbsDistribution1D& m2,
48  const AbsDistribution1D& m3);
49 
51  const AbsDistribution1D& m1,
52  const AbsDistribution1D& m2,
53  const AbsDistribution1D& m3,
54  const AbsDistribution1D& m4);
55 
57  const AbsDistribution1D& m1,
58  const AbsDistribution1D& m2,
59  const AbsDistribution1D& m3,
60  const AbsDistribution1D& m4,
61  const AbsDistribution1D& m5);
62 
64  const AbsDistribution1D& m1,
65  const AbsDistribution1D& m2,
66  const AbsDistribution1D& m3,
67  const AbsDistribution1D& m4,
68  const AbsDistribution1D& m5,
69  const AbsDistribution1D& m6);
70 
72  const AbsDistribution1D& m1,
73  const AbsDistribution1D& m2,
74  const AbsDistribution1D& m3,
75  const AbsDistribution1D& m4,
76  const AbsDistribution1D& m5,
77  const AbsDistribution1D& m6,
78  const AbsDistribution1D& m7);
79 
81  const AbsDistribution1D& m1,
82  const AbsDistribution1D& m2,
83  const AbsDistribution1D& m3,
84  const AbsDistribution1D& m4,
85  const AbsDistribution1D& m5,
86  const AbsDistribution1D& m6,
87  const AbsDistribution1D& m7,
88  const AbsDistribution1D& m8);
89 
91  const AbsDistribution1D& m1,
92  const AbsDistribution1D& m2,
93  const AbsDistribution1D& m3,
94  const AbsDistribution1D& m4,
95  const AbsDistribution1D& m5,
96  const AbsDistribution1D& m6,
97  const AbsDistribution1D& m7,
98  const AbsDistribution1D& m8,
99  const AbsDistribution1D& m9);
100 
102  ProductDistributionND& operator=(const ProductDistributionND& r);
103 
104  virtual ~ProductDistributionND();
105 
106  inline virtual ProductDistributionND* clone() const
107  {return new ProductDistributionND(*this);}
108 
109  double density(const double* x, unsigned dim) const;
110  void unitMap(const double* rnd, unsigned bufLen, double* x) const;
111  inline bool mappedByQuantiles() const {return true;}
112 
113  /**
114  // Check whether all marginals are instances of
115  // AbsScalableDistribution1D
116  */
117  bool isScalable() const;
118 
119  /** Get the marginal distribution with the given index */
120  inline AbsDistribution1D* getMarginal(const unsigned i)
121  {return marginals_.at(i);}
122 
123  // Methods needed for I/O
124  inline virtual gs::ClassId classId() const {return gs::ClassId(*this);}
125  virtual bool write(std::ostream& os) const;
126 
127  static inline const char* classname()
128  {return "npstat::ProductDistributionND";}
129  static inline unsigned version() {return 1;}
130  static ProductDistributionND* read(const gs::ClassId& id,
131  std::istream& in);
132  protected:
133  virtual bool isEqual(const AbsDistributionND&) const;
134 
135  private:
136  inline explicit ProductDistributionND(const unsigned n)
137  : AbsDistributionND(n) {}
138  void cleanup();
139 
140  std::vector<AbsDistribution1D*> marginals_;
141  };
142 
143  /**
144  // Multivariate Gaussian distribution parameterized
145  // by its covariance matrix
146  */
147  class GaussND : public AbsDistributionND
148  {
149  public:
150  GaussND(const double* location1, unsigned dim1,
151  const Matrix<double>& covmat);
152 
153  inline virtual ~GaussND() {}
154  inline virtual GaussND* clone() const {return new GaussND(*this);}
155 
156  double density(const double* x, unsigned dim) const;
157  void unitMap(const double* rnd, unsigned bufLen, double* x) const;
158  inline bool mappedByQuantiles() const {return false;}
159 
160  inline double getLocation(const unsigned index) const
161  {return location_.at(index);}
162  inline const Matrix<double>& getCovMat() const {return covmat_;}
163  const Matrix<double>& getCorrMat() const;
164 
165  // Methods needed for I/O
166  inline virtual gs::ClassId classId() const {return gs::ClassId(*this);}
167  virtual bool write(std::ostream& os) const;
168 
169  static inline const char* classname() {return "npstat::GaussND";}
170  static inline unsigned version() {return 1;}
171  static GaussND* read(const gs::ClassId& id, std::istream&);
172 
173  protected:
174  virtual bool isEqual(const AbsDistributionND&) const;
175 
176  private:
177  void initialize();
178 
179  std::vector<double> location_;
180  mutable std::vector<double> buf_;
181  mutable Matrix<double> sqrt_;
182  Matrix<double> covmat_;
183  Matrix<double> invsqrt_;
184  mutable Matrix<double> corrmat_;
185  double norm_;
186 
187 #ifdef SWIG
188  public:
189  inline GaussND(const double* location1, unsigned dim1,
190  const double* covmat, unsigned nrows, unsigned ncols)
191  : AbsDistributionND(dim1), location_(location1, location1+dim1),
192  buf_(dim1), covmat_(nrows, ncols, covmat)
193  {
194  assert(location1);
195  assert(covmat);
196  covmat_ = (covmat_ + covmat_.T())/2.0;
197  initialize();
198  }
199 #endif // SWIG
200  };
201 
202  /** Multivariate uniform distribution */
204  {
205  public:
206  inline UniformND(const double* location, const double* scale,
207  const unsigned dim)
209 
210  inline virtual ~UniformND() {}
211 
212  inline virtual UniformND* clone() const {return new UniformND(*this);}
213  inline bool mappedByQuantiles() const {return true;}
214 
215  // Methods needed for I/O
216  inline virtual gs::ClassId classId() const {return gs::ClassId(*this);}
217  virtual bool write(std::ostream& of) const;
218 
219  static inline const char* classname() {return "npstat::UniformND";}
220  static inline unsigned version() {return 1;}
221  static UniformND* read(const gs::ClassId& id, std::istream& in);
222 
223  protected:
224  virtual bool isEqual(const AbsDistributionND& r) const
226 
227  private:
228  double unscaledDensity(const double* x) const;
229  void unscaledUnitMap(const double* rnd, unsigned bufLen,
230  double* x) const;
231 #ifdef SWIG
232  public:
233  inline UniformND(const double* location1, unsigned dim1,
234  const double* scale2, unsigned dim2)
235  : AbsScalableDistributionND(location1, scale2, dim2)
236  {
237  if (dim1 != dim2) throw std::invalid_argument(
238  "In npstat::UniformND constructor: "
239  "sizes of locations and scales are incompatible");
240  }
241 #endif // SWIG
242  };
243 
244  /**
245  // Multivariate symmetric distribution proportional to pow(1.0 - R^2, n)
246  // with the support region defined by 0 <= R <= 1, where R is the
247  // distance (after scaling) to the distribution location point.
248  // Can be scaled separately in each dimension.
249  */
251  {
252  public:
253  ScalableSymmetricBetaND(const double* location, const double* scale,
254  unsigned dim, double n);
255  inline virtual ScalableSymmetricBetaND* clone() const
256  {return new ScalableSymmetricBetaND(*this);}
257 
258  inline virtual ~ScalableSymmetricBetaND() {}
259 
260  inline bool mappedByQuantiles() const {return false;}
261  inline double power() const {return power_;}
262 
263  // Methods needed for I/O
264  inline virtual gs::ClassId classId() const {return gs::ClassId(*this);}
265  virtual bool write(std::ostream& os) const;
266 
267  static inline const char* classname()
268  {return "npstat::ScalableSymmetricBetaND";}
269  static inline unsigned version() {return 1;}
270  static ScalableSymmetricBetaND* read(const gs::ClassId& id, std::istream&);
271 
272  protected:
273  virtual bool isEqual(const AbsDistributionND&) const;
274 
275  private:
276  void initialize();
277  double unscaledDensity(const double* x) const;
278  void unscaledUnitMap(const double* rnd, unsigned bufLen,
279  double* x) const;
280 
281  double radialQuantile(double cdf) const;
282 
283  double power_;
284  double norm_;
285 
286 #ifdef SWIG
287  public:
288  inline ScalableSymmetricBetaND(const double* location1, unsigned dim1,
289  const double* scale2, unsigned dim2,
290  const double n)
291  : AbsScalableDistributionND(location1, scale2, dim2), power_(n)
292  {
293  if (dim1 != dim2) throw std::invalid_argument(
294  "In npstat::ScalableSymmetricBetaND constructor: "
295  "sizes of locations and scales are incompatible");
296  initialize();
297  }
298 #endif // SWIG
299  };
300 
301  /**
302  // Multidimensional Huber-like function. Gaussian near the
303  // coordinate origin and exponential when radius is above
304  // certain threshold. "tailWeight" parameter is the weight
305  // of the exponential tail. It must be between 0 and 1.
306  */
308  {
309  public:
310  ScalableHuberND(const double* location, const double* scale,
311  unsigned dim, double tailWeight);
312  inline virtual ScalableHuberND* clone() const
313  {return new ScalableHuberND(*this);}
314 
315  inline virtual ~ScalableHuberND() {}
316 
317  inline bool mappedByQuantiles() const {return false;}
318 
319  inline double tailWeight() const {return tWeight_;}
320  inline double transition() const {return a_;}
321 
322  // Methods needed for I/O
323  inline virtual gs::ClassId classId() const {return gs::ClassId(*this);}
324  virtual bool write(std::ostream& os) const;
325 
326  static inline const char* classname()
327  {return "npstat::ScalableHuberND";}
328  static inline unsigned version() {return 1;}
329  static ScalableHuberND* read(const gs::ClassId& id, std::istream& in);
330 
331  protected:
332  virtual bool isEqual(const AbsDistributionND&) const;
333 
334  private:
335  void initialize();
336  double unscaledDensity(const double* x) const;
337  void unscaledUnitMap(const double* rnd, unsigned bufLen,
338  double* x) const;
339 
340  // Weight of the Gaussian part
341  double norm1(double a) const;
342 
343  // Weight of the exponential part
344  double norm2(double a) const;
345 
346  double radialQuantile(double cdf) const;
347 
348  double tWeight_;
349  double a_;
350  double normfactor_;
351  double const1_;
352  double const2_;
353 
354 #ifdef SWIG
355  public:
356  inline ScalableHuberND(const double* location1, unsigned dim1,
357  const double* scale2, unsigned dim2,
358  const double alpha)
359  : AbsScalableDistributionND(location1, scale2, dim2), tWeight_(alpha)
360  {
361  if (dim1 != dim2) throw std::invalid_argument(
362  "In npstat::ScalableHuberND constructor: "
363  "sizes of locations and scales are incompatible");
364  initialize();
365  }
366 #endif // SWIG
367  };
368 
369  /** Product of symmetric beta distributions in each dimension */
371  public HomogeneousProductDistroND<SymmetricBeta1D>
372  {
373  ProductSymmetricBetaND(const double* location, const double* scale,
374  unsigned dim, double power);
375  inline virtual ProductSymmetricBetaND* clone() const
376  {return new ProductSymmetricBetaND(*this);}
377 
378  inline virtual ~ProductSymmetricBetaND() {}
379 
380  inline double power() const {return marginals_[0].power();}
381 
382  // Methods needed for I/O
383  inline virtual gs::ClassId classId() const {return gs::ClassId(*this);}
384  virtual bool write(std::ostream& os) const;
385 
386  static inline const char* classname()
387  {return "npstat::ProductSymmetricBetaND";}
388  static inline unsigned version() {return 1;}
389  static ProductSymmetricBetaND* read(const gs::ClassId& id,
390  std::istream& in);
391 #ifdef SWIG
392  public:
393  inline ProductSymmetricBetaND(const double* location1, unsigned dim1,
394  const double* scale2, unsigned dim2,
395  const double power)
396  : HomogeneousProductDistroND<SymmetricBeta1D>(dim2)
397  {
398  if (dim1 != dim2) throw std::invalid_argument(
399  "In npstat::ProductSymmetricBetaND constructor: "
400  "sizes of locations and scales are incompatible");
401  assert(location1);
402  assert(scale2);
403  for (unsigned i=0; i<dim2; ++i)
404  marginals_.emplace_back(location1[i], scale2[i], power);
405  }
406 #endif // SWIG
407  };
408 
409  /** Distribution defined by the interpolation table of its radial profile */
411  {
412  public:
413  /**
414  // "location", "scale", and "dim" are the usual multivariate
415  // density parameters which define the distribution location,
416  // scale in each dimension, and the number of dimensions.
417  //
418  // The "data" array gives density values, (d Prob)/(dx_1 ... dx_n),
419  // at equidistant radial intervals. data[0] is density at r = 0.0,
420  // and data[dataLen-1] is density at r = 1.0. If "dataLen" is
421  // less than 2, uniform distribution will be created. The total
422  // probability content will be automatically normalized to 1, so
423  // the "data" values do not have to be normalized by the user.
424  // Internally, the profile is kept in double precision.
425  //
426  // "interpolationDegree" is the order of the radial profile
427  // interpolation polynomial. It must be less than 4 and less
428  // than "dataLen".
429  */
430  template <typename Real>
431  RadialProfileND(const double* location, const double* scale,
432  unsigned dim,
433  const Real* data, unsigned dataLen,
434  unsigned interpolationDegree);
435 
436  inline virtual RadialProfileND* clone() const
437  {return new RadialProfileND(*this);}
438 
439  inline virtual ~RadialProfileND() {}
440 
441  inline bool mappedByQuantiles() const {return false;}
442 
443  inline unsigned interpolationDegree() const {return deg_;}
444  inline unsigned profileLength() const {return len_;}
445  inline const double* profileData() const {return &profile_[0];}
446 
447  // Methods needed for I/O
448  inline virtual gs::ClassId classId() const {return gs::ClassId(*this);}
449  virtual bool write(std::ostream& of) const;
450 
451  static inline const char* classname()
452  {return "npstat::RadialProfileND";}
453  static inline unsigned version() {return 1;}
454  static RadialProfileND* read(const gs::ClassId& id, std::istream& in);
455 
456  protected:
457  virtual bool isEqual(const AbsDistributionND&) const;
458 
459  private:
460  inline RadialProfileND(const double* location, const double* scale,
461  const unsigned dim)
463 
464  template <typename Real>
465  void initialize(const Real* data, unsigned dataLen);
466 
467  double unscaledDensity(const double* x) const;
468  void unscaledUnitMap(const double* rnd, unsigned bufLen,
469  double* x) const;
470  void calculateQuadratureCoeffs();
471  void normalize();
472  double radialPofile(double r) const;
473  double intervalInteg(unsigned intervalNumber,
474  double stepFraction=1.0) const;
475  double intervalIntegLowD(unsigned intervalNumber,
476  double stepFraction=1.0) const;
477  double radialQuantile(double cdf) const;
478 
479  std::vector<double> profile_;
480  std::vector<double> cdf_;
481  double ndSphereVol_;
482  double step_;
483  unsigned len_;
484  unsigned deg_;
485 
486  // Coefficients for Gaussian quadratures
487  double xg_[4], wg_[4];
488 
489 #ifdef SWIG
490  public:
491  inline RadialProfileND(const double* location1, unsigned dim1,
492  const double* scale2, unsigned dim2,
493  const double* data1, unsigned dataLen1,
494  unsigned interpolationDegree)
495  : AbsScalableDistributionND(location1, scale2, dim2),
496  ndSphereVol_(ndUnitSphereVolume(dim2)),
497  len_(dataLen1), deg_(interpolationDegree)
498  {
499  if (dim1 != dim2) throw std::invalid_argument(
500  "In npstat::RadialProfileND constructor: "
501  "sizes of locations and scales are incompatible");
502  this->initialize(data1, dataLen1);
503  }
504 #endif // SWIG
505  };
506 
507  /**
508  // Distribution defined by an interpolation table inside
509  // the unit box (which can be shifted and scaled). All grid
510  // points are inside the box, in the bin centers. Currently,
511  // interpolationDegree could be only 0 (faster, no interpolation)
512  // or 1 (multilinear interpolation).
513  */
515  {
516  public:
517  template <typename Num1, unsigned Len1, unsigned Dim1>
518  BinnedDensityND(const double* location, const double* scale,
519  unsigned locationAndScaleLength,
520  const ArrayND<Num1,Len1,Dim1>& histogram,
521  const unsigned interpolationDegree);
522 
523  inline virtual BinnedDensityND* clone() const
524  {return new BinnedDensityND(*this);}
525 
526  inline virtual ~BinnedDensityND() {}
527 
528  inline bool mappedByQuantiles() const {return true;}
529 
530  inline const ArrayND<double>& gridData() const
531  {return randomizer_.gridData();}
532 
533  inline unsigned interpolationDegree() const
534  {return randomizer_.interpolationDegree();}
535 
536  // Methods needed for I/O
537  inline virtual gs::ClassId classId() const {return gs::ClassId(*this);}
538  virtual bool write(std::ostream& os) const;
539 
540  static inline const char* classname() {return "npstat::BinnedDensityND";}
541  static inline unsigned version() {return 1;}
542  static BinnedDensityND* read(const gs::ClassId& id, std::istream& in);
543 
544  protected:
545  virtual bool isEqual(const AbsDistributionND&) const;
546 
547  private:
548  inline double unscaledDensity(const double* x) const
549  {return randomizer_.density(x, dim_);}
550 
551  inline void unscaledUnitMap(const double* rnd,
552  const unsigned bufLen, double* x) const
553  {randomizer_.generate(rnd, bufLen, x);}
554 
555  GridRandomizer randomizer_;
556 
557 #ifdef SWIG
558  public:
559  inline BinnedDensityND(const double* location1, unsigned dim1,
560  const double* scale2, unsigned dim2,
561  const ArrayND<double>& histogram,
562  const unsigned interpolationDegree)
563  : AbsScalableDistributionND(location1, scale2, dim2),
564  randomizer_(histogram, BoxND<double>::unitBox(histogram.rank()),
565  interpolationDegree)
566  {
567  if (dim1 != dim2 || dim1 != histogram.rank())
568  throw std::invalid_argument(
569  "In npstat::BinnedDensityND constructor: "
570  "incompatible argument dimensions");
571  }
572  inline BinnedDensityND(const double* location1, unsigned dim1,
573  const double* scale2, unsigned dim2,
574  const ArrayND<float>& histogram,
575  const unsigned interpolationDegree)
576  : AbsScalableDistributionND(location1, scale2, dim2),
577  randomizer_(histogram, BoxND<double>::unitBox(histogram.rank()),
578  interpolationDegree)
579  {
580  if (dim1 != dim2 || dim1 != histogram.rank())
581  throw std::invalid_argument(
582  "In npstat::BinnedDensityND constructor: "
583  "incompatible argument dimensions");
584  }
585  inline BinnedDensityND(const double* location1, unsigned dim1,
586  const double* scale2, unsigned dim2,
587  const ArrayND<int>& histogram,
588  const unsigned interpolationDegree)
589  : AbsScalableDistributionND(location1, scale2, dim2),
590  randomizer_(histogram, BoxND<double>::unitBox(histogram.rank()),
591  interpolationDegree)
592  {
593  if (dim1 != dim2 || dim1 != histogram.rank())
594  throw std::invalid_argument(
595  "In npstat::BinnedDensityND constructor: "
596  "incompatible argument dimensions");
597  }
598  inline BinnedDensityND(const double* location1, unsigned dim1,
599  const double* scale2, unsigned dim2,
600  const ArrayND<long>& histogram,
601  const unsigned interpolationDegree)
602  : AbsScalableDistributionND(location1, scale2, dim2),
603  randomizer_(histogram, BoxND<double>::unitBox(histogram.rank()),
604  interpolationDegree)
605  {
606  if (dim1 != dim2 || dim1 != histogram.rank())
607  throw std::invalid_argument(
608  "In npstat::BinnedDensityND constructor: "
609  "incompatible argument dimensions");
610  }
611  inline BinnedDensityND(const double* location1, unsigned dim1,
612  const double* scale2, unsigned dim2,
613  const ArrayND<unsigned char>& histogram,
614  const unsigned interpolationDegree)
615  : AbsScalableDistributionND(location1, scale2, dim2),
616  randomizer_(histogram, BoxND<double>::unitBox(histogram.rank()),
617  interpolationDegree)
618  {
619  if (dim1 != dim2 || dim1 != histogram.rank())
620  throw std::invalid_argument(
621  "In npstat::BinnedDensityND constructor: "
622  "incompatible argument dimensions");
623  }
624 #endif // SWIG
625  };
626 
627  /**
628  // Linear transform of another multivariate distribution. If the other
629  // distribution is a function of x, this distribution is obtained by
630  // substituting S^(-1)*(x - shift) in place of x, where S is some
631  // non-degenerate matrix.
632  */
634  {
635  public:
637  const double* shift, unsigned i_dim,
638  const Matrix<double>& S)
639  : AbsDistributionND(i_dim), distro_(d.clone()),
640  shift_(shift, shift+i_dim), buf_(2U*i_dim), S_(S)
641  {
642  assert(shift);
643  initialize();
644  }
645 
648  inline virtual LinTransformedDistroND* clone() const
649  {return new LinTransformedDistroND(*this);}
650 
651  inline virtual ~LinTransformedDistroND() {delete distro_;}
652 
653  double density(const double* x, unsigned dim) const;
654  void unitMap(const double* rnd, unsigned bufLen, double* x) const;
655  inline bool mappedByQuantiles() const {return false;}
656 
657  inline double getShift(const unsigned index) const
658  {return shift_.at(index);}
659  inline const Matrix<double>& getS() const {return S_;}
660  inline const Matrix<double>& getInverseS() const {return invS_;}
661 
662  // Methods needed for I/O
663  inline virtual gs::ClassId classId() const {return gs::ClassId(*this);}
664  virtual bool write(std::ostream& os) const;
665 
666  static inline const char* classname() {return "npstat::LinTransformedDistroND";}
667  static inline unsigned version() {return 1;}
668  static LinTransformedDistroND* read(const gs::ClassId& id, std::istream&);
669 
670  protected:
671  virtual bool isEqual(const AbsDistributionND&) const;
672 
673  private:
674  void initialize();
675 
676  AbsDistributionND* distro_;
677  std::vector<double> shift_;
678  mutable std::vector<double> buf_;
679  Matrix<double> S_;
680  Matrix<double> invS_;
681  double norm_;
682 
683 #ifdef SWIG
684  public:
685  inline LinTransformedDistroND(const AbsDistributionND& d,
686  const double* shift, unsigned i_dim,
687  const double* covmat, unsigned nrows, unsigned ncols)
688  : AbsDistributionND(i_dim), distro_(d.clone()), shift_(shift, shift+i_dim),
689  buf_(2U*i_dim), S_(nrows, ncols, covmat)
690  {
691  assert(shift);
692  assert(covmat);
693  initialize();
694  }
695 #endif // SWIG
696  };
697 }
698 
699 #include "npstat/stat/DistributionsND.icc"
700 
701 #endif // NPSTAT_DISTRIBUTIONSND_HH_
Interface definition for multivariate continuous statistical distributions.
A number of useful 1-d continuous statistical distributions.
Generate random numbers according to a multivariate distribution tabulated on a grid.
Various simple mathematical utilities which did not end up inside dedicated headers.
Template matrix class.
Definition: AbsDistributionND.hh:26
virtual AbsDistributionND * clone() const =0
unsigned dim() const
Definition: AbsDistributionND.hh:51
Definition: AbsDistributionND.hh:129
AbsScalableDistributionND(const double *location, const double *scale, unsigned dim)
virtual bool isEqual(const AbsDistributionND &) const
double location(unsigned i) const
Definition: AbsDistributionND.hh:141
double scale(unsigned i) const
Definition: AbsDistributionND.hh:144
Definition: ArrayND.hh:93
Definition: DistributionsND.hh:515
bool mappedByQuantiles() const
Definition: DistributionsND.hh:528
virtual gs::ClassId classId() const
Definition: DistributionsND.hh:537
virtual BinnedDensityND * clone() const
Definition: DistributionsND.hh:523
virtual bool isEqual(const AbsDistributionND &) const
Definition: DistributionsND.hh:148
virtual gs::ClassId classId() const
Definition: DistributionsND.hh:166
bool mappedByQuantiles() const
Definition: DistributionsND.hh:158
void unitMap(const double *rnd, unsigned bufLen, double *x) const
double density(const double *x, unsigned dim) const
virtual GaussND * clone() const
Definition: DistributionsND.hh:154
double density(const double *x, unsigned xLen) const
void generate(const double *uniformRandomInput, unsigned bufLen, double *resultBuf) const
const ArrayND< double > & gridData() const
Definition: GridRandomizer.hh:51
Definition: AbsDistributionND.hh:212
HomogeneousProductDistroND(unsigned dim)
Definition: AbsDistributionND.hh:218
Definition: DistributionsND.hh:634
bool mappedByQuantiles() const
Definition: DistributionsND.hh:655
double density(const double *x, unsigned dim) const
virtual gs::ClassId classId() const
Definition: DistributionsND.hh:663
virtual LinTransformedDistroND * clone() const
Definition: DistributionsND.hh:648
void unitMap(const double *rnd, unsigned bufLen, double *x) const
Definition: DistributionsND.hh:30
virtual gs::ClassId classId() const
Definition: DistributionsND.hh:124
double density(const double *x, unsigned dim) const
void unitMap(const double *rnd, unsigned bufLen, double *x) const
virtual ProductDistributionND * clone() const
Definition: DistributionsND.hh:106
bool mappedByQuantiles() const
Definition: DistributionsND.hh:111
AbsDistribution1D * getMarginal(const unsigned i)
Definition: DistributionsND.hh:120
Definition: DistributionsND.hh:411
virtual RadialProfileND * clone() const
Definition: DistributionsND.hh:436
RadialProfileND(const double *location, const double *scale, unsigned dim, const Real *data, unsigned dataLen, unsigned interpolationDegree)
virtual gs::ClassId classId() const
Definition: DistributionsND.hh:448
bool mappedByQuantiles() const
Definition: DistributionsND.hh:441
virtual bool isEqual(const AbsDistributionND &) const
Definition: DistributionsND.hh:308
virtual ScalableHuberND * clone() const
Definition: DistributionsND.hh:312
virtual bool isEqual(const AbsDistributionND &) const
virtual gs::ClassId classId() const
Definition: DistributionsND.hh:323
bool mappedByQuantiles() const
Definition: DistributionsND.hh:317
Definition: DistributionsND.hh:251
bool mappedByQuantiles() const
Definition: DistributionsND.hh:260
virtual gs::ClassId classId() const
Definition: DistributionsND.hh:264
virtual bool isEqual(const AbsDistributionND &) const
virtual ScalableSymmetricBetaND * clone() const
Definition: DistributionsND.hh:255
Definition: DistributionsND.hh:204
virtual UniformND * clone() const
Definition: DistributionsND.hh:212
virtual gs::ClassId classId() const
Definition: DistributionsND.hh:216
bool mappedByQuantiles() const
Definition: DistributionsND.hh:213
virtual bool isEqual(const AbsDistributionND &r) const
Definition: DistributionsND.hh:224
Definition: AbsArrayProjector.hh:14
double ndUnitSphereVolume(unsigned n)
Definition: AbsDistribution1D.hh:31
Definition: DistributionsND.hh:372
virtual gs::ClassId classId() const
Definition: DistributionsND.hh:383
virtual ProductSymmetricBetaND * clone() const
Definition: DistributionsND.hh:375