|
Go to the documentation of this file. 1 #ifndef NPSTAT_ABSCLASSICALORTHOPOLY1D_HH_
2 #define NPSTAT_ABSCLASSICALORTHOPOLY1D_HH_
20 #include "geners/CPP11_auto_ptr.hh"
27 class StorablePolySeries1D;
29 class OrthoPoly1DWeight;
43 virtual long double weight( long double x) const = 0;
47 virtual double xmin() const = 0;
48 virtual double xmax() const = 0;
52 inline virtual unsigned maxDegree() const { return UINT_MAX - 1U;}
61 long double poly( unsigned deg, long double x) const;
64 long double monic( unsigned deg, long double x) const;
70 std::pair<long double,long double> twopoly(
71 unsigned deg1, unsigned deg2, long double x) const;
78 void allpoly( long double x, long double* values, unsigned maxdeg) const;
84 void allmonic( long double x, long double* values, unsigned maxdeg) const;
87 double series( const double* coeffs, unsigned maxdeg, double x) const;
99 template < class Functor, class Quadrature>
101 double* coeffs, unsigned maxdeg) const;
110 template < class Numeric>
112 double* coeffs, unsigned maxdeg) const;
122 template < class Numeric>
124 const double* coeffs, unsigned maxdeg,
125 double* variances) const;
134 template < class Numeric>
137 const double* coeffs, unsigned maxdeg) const;
149 template < class Numeric>
151 Numeric location, Numeric scale,
152 double* coeffs, unsigned maxdeg) const;
162 template < class Numeric>
164 Numeric location, Numeric scale,
165 const double* coeffs, unsigned maxdeg,
166 double* variances) const;
176 template < class Numeric>
179 Numeric location, Numeric scale,
180 const double* coeffs, unsigned maxdeg) const;
192 template < class Pair>
194 double* coeffs, unsigned maxdeg) const;
206 template < class Pair>
208 const double* coeffs, unsigned maxdeg,
209 double* variances) const;
220 template < class Pair>
223 const double* coeffs, unsigned maxdeg) const;
238 template < class Pair>
240 typename Pair::first_type location,
241 typename Pair::first_type scale,
242 double* coeffs, unsigned maxdeg) const;
254 template < class Pair>
256 typename Pair::first_type location,
257 typename Pair::first_type scale,
258 const double* coeffs, unsigned maxdeg,
259 double* variances) const;
270 template < class Pair>
273 typename Pair::first_type location,
274 typename Pair::first_type scale,
275 const double* coeffs, unsigned maxdeg) const;
282 template < class Quadrature>
284 unsigned deg1, unsigned deg2) const;
296 unsigned maxdeg) const;
302 template < class Quadrature>
304 unsigned deg3, unsigned deg4) const;
312 template < class Quadrature>
314 const unsigned* degrees, unsigned nDegrees,
315 bool checkedForZeros = false) const;
323 template < class Quadrature>
325 unsigned deg3, unsigned deg4) const;
334 template < class Quadrature>
336 const unsigned* degrees, unsigned nDegrees,
337 bool checkedForZeros = false) const;
361 template < typename Numeric, typename Real>
363 Real* averages, unsigned maxdeg) const;
373 template < class Pair, typename Real>
375 Real* averages, unsigned maxdeg) const;
382 template < class Functor, typename Real>
385 Real* averages, unsigned maxdeg) const;
392 template < class Numeric>
394 unsigned long lenCoords,
395 unsigned maxdeg) const;
402 template < class Functor>
411 template < class Numeric>
413 unsigned long lenCoords,
414 const unsigned* degrees,
415 unsigned lenDegrees) const;
419 template < class Numeric>
420 std::pair<double, double> twoJointSampleAverages(
421 const Numeric* coords, unsigned long lenCoords,
422 const unsigned* degrees1, unsigned lenDegrees1,
423 const unsigned* degrees2, unsigned lenDegrees2) const;
425 CPP11_auto_ptr<StorablePolySeries1D> makeStorablePolySeries(
427 const double *coeffs=0, unsigned maxdeg=0, double shift=0.0) const;
430 inline long double location() const { return 0.0;}
431 inline long double scale() const { return 1.0;}
435 virtual std::pair<long double,long double>
436 monicRecurrenceCoeffs( unsigned deg) const = 0;
441 virtual std::pair<long double,long double>
442 recurrenceCoeffs( unsigned deg) const = 0;
445 inline static int kdelta( const unsigned i, const unsigned j)
446 { return i == j ? 1 : 0;}
455 : poly(p), deg1(d1), deg2(d2) {}
459 inline long double operator()( const long double& x) const
461 const std::pair<long double,long double>& p =
463 return p.first*p.second*poly. weight(x);
479 const unsigned* degrees, unsigned lenDegrees,
480 const bool includeWeight= true)
482 degs(degrees, degrees+lenDegrees),
484 weighted(includeWeight)
487 maxdeg = *std::max_element(degrees, degrees+lenDegrees);
492 inline long double operator()( const long double& x) const
494 long double w = 1.0L, p = 1.0L;
498 p = poly.normpolyprod(°s[0], degs.size(), maxdeg, x);
504 std::vector<unsigned> degs;
512 long double normpolyprod( const unsigned* degrees, unsigned nDegrees,
513 unsigned maxdeg, long double x) const;
516 inline double weight2( const double x) const
519 inline double poly2( const unsigned deg, const double x) const
520 { return poly(deg, x);}
522 inline double monic2( const unsigned deg, const double x) const
523 { return monic(deg, x);}
525 inline std::pair<double,double> twopoly2( const unsigned deg1,
527 const double x) const
529 const std::pair<long double,long double>& p = twopoly(deg1, deg2, x);
530 return std::pair<double,double>(p.first, p.second);
533 inline std::pair<double,double> monicRecurrenceCoeffs2( const unsigned deg) const
535 const std::pair<long double,long double>& p = monicRecurrenceCoeffs(deg);
536 return std::pair<double,double>(p.first, p.second);
539 inline std::pair<double,double> recurrenceCoeffs2( const unsigned deg) const
541 const std::pair<long double,long double>& p = recurrenceCoeffs(deg);
542 return std::pair<double,double>(p.first, p.second);
545 inline std::vector<double> allpoly2( const unsigned maxdeg, const double x) const
547 std::vector<long double> p(maxdeg+1);
549 return std::vector<double>(p.begin(), p.end());
552 inline std::vector<double> allmonic2( const unsigned maxdeg, const double x) const
554 std::vector<long double> p(maxdeg+1);
556 return std::vector<double>(p.begin(), p.end());
559 inline StorablePolySeries1D* makeStorablePolySeries_2(
560 unsigned maxPolyDeg, const std::vector<double>& coeffs, double shift=0.0) const
562 CPP11_auto_ptr<StorablePolySeries1D> ptr;
564 ptr = this->makeStorablePolySeries(maxPolyDeg, 0, 0, shift);
566 ptr = this->makeStorablePolySeries(maxPolyDeg, &coeffs[0],
567 coeffs.size() - 1, shift);
568 return ptr.release();
571 inline Matrix<double> jacobiMatrix_2( const unsigned n) const
574 inline double location2() const { return location();}
576 inline double scale2() const { return scale();}
590 const long double normfactor)
591 : fcn_(fcn), norm_(normfactor) {}
596 : fcn_(fcn), norm_(1.0L) {}
600 inline virtual long double operator()( const long double& a) const
601 { return norm_*fcn_. weight(a);}
620 const unsigned degree,
621 const long double normfactor)
622 : fcn_(fcn), norm_(normfactor), deg_(degree)
624 if (deg_ > fcn_. maxDegree()) throw std::invalid_argument(
625 "In npstat::OrthoPoly1DDeg::constructor: "
626 "degree argument is out of range");
632 const unsigned degree)
633 : fcn_(fcn), norm_(1.0L), deg_(degree)
635 if (deg_ > fcn_. maxDegree()) throw std::invalid_argument(
636 "In npstat::OrthoPoly1DDeg::constructor: "
637 "degree argument is out of range");
642 inline virtual long double operator()( const long double& a) const
643 { return norm_*fcn_. poly(deg_, a);}
657 const unsigned deg1, const unsigned deg2)
658 : fcn_(fcn), degree1_(deg1), degree2_(deg2) {}
662 inline virtual long double operator()( const long double& a) const
664 std::pair<long double,long double> p = fcn_. twopoly(
665 degree1_, degree2_, a);
666 return p.first * p.second;
676 #include "npstat/nm/AbsClassicalOrthoPoly1D.icc"
Base class for quadratures on the [-1, 1] interval.
Interface definitions and concrete simple functors for a variety of functor-based calculations.
Definition: AbsClassicalOrthoPoly1D.hh:476
Definition: AbsClassicalOrthoPoly1D.hh:450
Definition: AbsClassicalOrthoPoly1D.hh:32
double directQuadrature(const Quadrature &q, const unsigned *degrees, unsigned nDegrees, bool checkedForZeros=false) const
Matrix< double > sampleProductAverages(const Numeric *coords, unsigned long lenCoords, unsigned maxdeg) const
double jointIntegral(const unsigned *degrees, unsigned nDegrees) const
Matrix< long double > jacobiMatrix(unsigned n) const
void sampleAverages(const Numeric *coords, unsigned long lenCoords, Real *averages, unsigned maxdeg) const
virtual double xmin() const =0
void allmonic(long double x, long double *values, unsigned maxdeg) const
void weightedPointsAverages(const Pair *points, unsigned long numPoints, Real *averages, unsigned maxdeg) const
void sampleCoeffs(const Numeric *coords, unsigned long lenCoords, double *coeffs, unsigned maxdeg) const
void weightedSampleCoeffs(const Pair *points, unsigned long numPoints, double *coeffs, unsigned maxdeg) const
Matrix< double > sampleCoeffCovariance(const Numeric *coords, unsigned long lenCoords, const double *coeffs, unsigned maxdeg) const
virtual AbsClassicalOrthoPoly1D * clone() const =0
double jointAverage(const Quadrature &q, unsigned deg1, unsigned deg2, unsigned deg3, unsigned deg4) const
Matrix< double > empiricalKroneckerMatrix(const AbsIntervalQuadrature1D &quad, unsigned maxdeg) const
double integrateSeries(const double *coeffs, unsigned maxdeg) const
long double monic(unsigned deg, long double x) const
Matrix< double > sampleCoeffCovariance(const Numeric *coords, unsigned long lenCoords, Numeric location, Numeric scale, const double *coeffs, unsigned maxdeg) const
void weightedSampleCoeffs(const Pair *points, unsigned long numPoints, typename Pair::first_type location, typename Pair::first_type scale, double *coeffs, unsigned maxdeg) const
Matrix< double > weightedSampleCoeffCovariance(const Pair *points, unsigned long nPoints, const double *coeffs, unsigned maxdeg) const
double jointSampleAverage(const Numeric *coords, unsigned long lenCoords, const unsigned *degrees, unsigned lenDegrees) const
void sampleCoeffs(const Numeric *coords, unsigned long lenCoords, Numeric location, Numeric scale, double *coeffs, unsigned maxdeg) const
double directQuadrature(const Quadrature &q, unsigned deg1, unsigned deg2, unsigned deg3, unsigned deg4) const
void weightedSampleCoeffVars(const Pair *points, unsigned long nPoints, const double *coeffs, unsigned maxdeg, double *variances) const
Matrix< double > extWeightProductAverages(const Functor &extWeight, const AbsIntervalQuadrature1D &quad, unsigned maxdeg) const
void sampleCoeffVars(const Numeric *coords, unsigned long lenCoords, Numeric location, Numeric scale, const double *coeffs, unsigned maxdeg, double *variances) const
double empiricalKroneckerDelta(const Quadrature &quad, unsigned deg1, unsigned deg2) const
void calculateCoeffs(const Functor &fcn, const Quadrature &quad, double *coeffs, unsigned maxdeg) const
void allpoly(long double x, long double *values, unsigned maxdeg) const
virtual long double weight(long double x) const =0
std::pair< long double, long double > twopoly(unsigned deg1, unsigned deg2, long double x) const
double series(const double *coeffs, unsigned maxdeg, double x) const
Matrix< double > weightedSampleCoeffCovariance(const Pair *points, unsigned long nPoints, typename Pair::first_type location, typename Pair::first_type scale, const double *coeffs, unsigned maxdeg) const
virtual unsigned maxDegree() const Definition: AbsClassicalOrthoPoly1D.hh:52
long double poly(unsigned deg, long double x) const
void sampleCoeffVars(const Numeric *coords, unsigned long lenCoords, const double *coeffs, unsigned maxdeg, double *variances) const
void extWeightAverages(const Functor &extWeight, const AbsIntervalQuadrature1D &quad, Real *averages, unsigned maxdeg) const
double integratePoly(unsigned degree, unsigned power) const
void weightedSampleCoeffVars(const Pair *points, unsigned long nPoints, typename Pair::first_type location, typename Pair::first_type scale, const double *coeffs, unsigned maxdeg, double *variances) const
double jointAverage(const Quadrature &q, const unsigned *degrees, unsigned nDegrees, bool checkedForZeros=false) const
Definition: AbsIntervalQuadrature1D.hh:19
Definition: AbsClassicalOrthoPoly1D.hh:617
Definition: AbsClassicalOrthoPoly1D.hh:587
Definition: AbsClassicalOrthoPoly1D.hh:654
Definition: AbsArrayProjector.hh:14
Definition: SimpleFunctors.hh:58
|