|
Go to the documentation of this file. 1 #ifndef NPSTAT_DISTRIBUTIONSND_HH_
2 #define NPSTAT_DISTRIBUTIONSND_HH_
110 void unitMap( const double* rnd, unsigned bufLen, double* x) const;
121 { return marginals_.at(i);}
124 inline virtual gs::ClassId classId() const { return gs::ClassId(* this);}
125 virtual bool write(std::ostream& os) const;
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,
133 virtual bool isEqual( const AbsDistributionND&) const;
136 inline explicit ProductDistributionND( const unsigned n)
137 : AbsDistributionND(n) {}
140 std::vector<AbsDistribution1D*> marginals_;
150 GaussND( const double* location1, unsigned dim1,
157 void unitMap( const double* rnd, unsigned bufLen, double* x) const;
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;
166 inline virtual gs::ClassId classId() const { return gs::ClassId(* this);}
167 virtual bool write(std::ostream& os) const;
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&);
174 virtual bool isEqual( const AbsDistributionND&) const;
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_;
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)
196 covmat_ = (covmat_ + covmat_.T())/2.0;
216 inline virtual gs::ClassId classId() const { return gs::ClassId(* this);}
217 virtual bool write(std::ostream& of) const;
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);
228 double unscaledDensity( const double* x) const;
229 void unscaledUnitMap( const double* rnd, unsigned bufLen,
233 inline UniformND( const double* location1, unsigned dim1,
234 const double* scale2, unsigned dim2)
237 if (dim1 != dim2) throw std::invalid_argument(
238 "In npstat::UniformND constructor: "
239 "sizes of locations and scales are incompatible");
254 unsigned dim, double n);
261 inline double power() const { return power_;}
264 inline virtual gs::ClassId classId() const { return gs::ClassId(* this);}
265 virtual bool write(std::ostream& os) const;
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&);
277 double unscaledDensity( const double* x) const;
278 void unscaledUnitMap( const double* rnd, unsigned bufLen,
281 double radialQuantile( double cdf) const;
289 const double* scale2, unsigned dim2,
293 if (dim1 != dim2) throw std::invalid_argument(
294 "In npstat::ScalableSymmetricBetaND constructor: "
295 "sizes of locations and scales are incompatible");
311 unsigned dim, double tailWeight);
319 inline double tailWeight() const { return tWeight_;}
320 inline double transition() const { return a_;}
323 inline virtual gs::ClassId classId() const { return gs::ClassId(* this);}
324 virtual bool write(std::ostream& os) const;
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);
336 double unscaledDensity( const double* x) const;
337 void unscaledUnitMap( const double* rnd, unsigned bufLen,
341 double norm1( double a) const;
344 double norm2( double a) const;
346 double radialQuantile( double cdf) const;
357 const double* scale2, unsigned dim2,
361 if (dim1 != dim2) throw std::invalid_argument(
362 "In npstat::ScalableHuberND constructor: "
363 "sizes of locations and scales are incompatible");
374 unsigned dim, double power);
380 inline double power() const { return marginals_[0].power();}
383 inline virtual gs::ClassId classId() const { return gs::ClassId(* this);}
384 virtual bool write(std::ostream& os) const;
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,
393 inline ProductSymmetricBetaND( const double* location1, unsigned dim1,
394 const double* scale2, unsigned dim2,
398 if (dim1 != dim2) throw std::invalid_argument(
399 "In npstat::ProductSymmetricBetaND constructor: "
400 "sizes of locations and scales are incompatible");
403 for ( unsigned i=0; i<dim2; ++i)
404 marginals_.emplace_back(location1[i], scale2[i], power);
430 template < typename Real>
433 const Real* data, unsigned dataLen,
434 unsigned interpolationDegree);
443 inline unsigned interpolationDegree() const { return deg_;}
444 inline unsigned profileLength() const { return len_;}
445 inline const double* profileData() const { return &profile_[0];}
448 inline virtual gs::ClassId classId() const { return gs::ClassId(* this);}
449 virtual bool write(std::ostream& of) const;
451 static inline const char* classname()
452 { return "npstat::RadialProfileND";}
453 static inline unsigned version() { return 1;}
464 template < typename Real>
465 void initialize( const Real* data, unsigned dataLen);
467 double unscaledDensity( const double* x) const;
468 void unscaledUnitMap( const double* rnd, unsigned bufLen,
470 void calculateQuadratureCoeffs();
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;
479 std::vector<double> profile_;
480 std::vector<double> cdf_;
487 double xg_[4], wg_[4];
492 const double* scale2, unsigned dim2,
493 const double* data1, unsigned dataLen1,
494 unsigned interpolationDegree)
497 len_(dataLen1), deg_(interpolationDegree)
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);
517 template < typename Num1, unsigned Len1, unsigned Dim1>
519 unsigned locationAndScaleLength,
521 const unsigned interpolationDegree);
533 inline unsigned interpolationDegree() const
534 { return randomizer_.interpolationDegree();}
537 inline virtual gs::ClassId classId() const { return gs::ClassId(* this);}
538 virtual bool write(std::ostream& os) const;
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);
548 inline double unscaledDensity( const double* x) const
549 { return randomizer_. density(x, dim_);}
551 inline void unscaledUnitMap( const double* rnd,
552 const unsigned bufLen, double* x) const
553 {randomizer_. generate(rnd, bufLen, x);}
555 GridRandomizer randomizer_;
559 inline BinnedDensityND( const double* location1, unsigned dim1,
560 const double* scale2, unsigned dim2,
561 const ArrayND<double>& histogram,
562 const unsigned interpolationDegree)
564 randomizer_(histogram, BoxND<double>::unitBox(histogram.rank()),
567 if (dim1 != dim2 || dim1 != histogram.rank())
568 throw std::invalid_argument(
569 "In npstat::BinnedDensityND constructor: "
570 "incompatible argument dimensions");
572 inline BinnedDensityND( const double* location1, unsigned dim1,
573 const double* scale2, unsigned dim2,
574 const ArrayND<float>& histogram,
575 const unsigned interpolationDegree)
577 randomizer_(histogram, BoxND<double>::unitBox(histogram.rank()),
580 if (dim1 != dim2 || dim1 != histogram.rank())
581 throw std::invalid_argument(
582 "In npstat::BinnedDensityND constructor: "
583 "incompatible argument dimensions");
585 inline BinnedDensityND( const double* location1, unsigned dim1,
586 const double* scale2, unsigned dim2,
587 const ArrayND<int>& histogram,
588 const unsigned interpolationDegree)
590 randomizer_(histogram, BoxND<double>::unitBox(histogram.rank()),
593 if (dim1 != dim2 || dim1 != histogram.rank())
594 throw std::invalid_argument(
595 "In npstat::BinnedDensityND constructor: "
596 "incompatible argument dimensions");
598 inline BinnedDensityND( const double* location1, unsigned dim1,
599 const double* scale2, unsigned dim2,
600 const ArrayND<long>& histogram,
601 const unsigned interpolationDegree)
603 randomizer_(histogram, BoxND<double>::unitBox(histogram.rank()),
606 if (dim1 != dim2 || dim1 != histogram.rank())
607 throw std::invalid_argument(
608 "In npstat::BinnedDensityND constructor: "
609 "incompatible argument dimensions");
611 inline BinnedDensityND( const double* location1, unsigned dim1,
612 const double* scale2, unsigned dim2,
613 const ArrayND<unsigned char>& histogram,
614 const unsigned interpolationDegree)
616 randomizer_(histogram, BoxND<double>::unitBox(histogram.rank()),
619 if (dim1 != dim2 || dim1 != histogram.rank())
620 throw std::invalid_argument(
621 "In npstat::BinnedDensityND constructor: "
622 "incompatible argument dimensions");
637 const double* shift, unsigned i_dim,
640 shift_(shift, shift+i_dim), buf_(2U*i_dim), S_(S)
654 void unitMap( const double* rnd, unsigned bufLen, double* x) const;
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_;}
663 inline virtual gs::ClassId classId() const { return gs::ClassId(* this);}
664 virtual bool write(std::ostream& os) const;
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&);
671 virtual bool isEqual( const AbsDistributionND&) const;
676 AbsDistributionND* distro_;
677 std::vector<double> shift_;
678 mutable std::vector<double> buf_;
680 Matrix<double> invS_;
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)
699 #include "npstat/stat/DistributionsND.icc"
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.
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: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: 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
|