Index: trunk/npstat/stat/PolynomialDistro1D.cc =================================================================== --- trunk/npstat/stat/PolynomialDistro1D.cc (revision 887) +++ trunk/npstat/stat/PolynomialDistro1D.cc (revision 888) @@ -1,187 +1,209 @@ #include #include #include #include #include -#include #include "npstat/nm/findRootUsingBisections.hh" #include "npstat/nm/MathUtils.hh" #include "npstat/stat/PolynomialDistro1D.hh" #include "npstat/stat/distributionReadError.hh" namespace npstat { PolynomialDistro1D::PolynomialDistro1D( const double location, const double scale, const double* coeffs, const unsigned maxdeg, const unsigned nCheck) : AbsScalableDistribution1D(location, scale) { setupCoeffs(coeffs, maxdeg); checkPositive(nCheck); } PolynomialDistro1D::PolynomialDistro1D( const double location, const double scale, const std::vector& coeffs, const unsigned nCheck) : AbsScalableDistribution1D(location, scale) { setupCoeffs(coeffs.empty() ? (const double*)0 : &coeffs[0], coeffs.size()); checkPositive(nCheck); } void PolynomialDistro1D::setupCoeffs(const double* coeffs, const unsigned maxdeg) { if (maxdeg) assert(coeffs); allCoeffs_.resize(maxdeg + 1U); allCoeffs_[0] = 1.0; for (unsigned i=0; i 1U) { - double x = step*i; - if (i == nM1) - x = 1.0; - const double d = unscaledDensity(x); - if (d < dmin) + if (nCheck < 2U) throw std::invalid_argument( + "In npstat::PolynomialDistro1D::checkPositive: " + "insufficient number of density check points"); + const unsigned nM1 = nCheck - 1U; + const double step = 1.0/nM1; + unsigned imin = 0; + double dmin = DBL_MAX; + for (unsigned i=0; i= 1.0) return 0.0; else return 1.0 - unscaledCdf(x); } bool PolynomialDistro1D::isEqual(const AbsDistribution1D& other) const { const PolynomialDistro1D& r = static_cast(other); return AbsScalableDistribution1D::isEqual(r) && allCoeffs_ == r.allCoeffs_; } bool PolynomialDistro1D::write(std::ostream& os) const { AbsScalableDistribution1D::write(os); gs::write_pod_vector(os, allCoeffs_); return !os.fail(); } PolynomialDistro1D* PolynomialDistro1D::read(const gs::ClassId& id, std::istream& in) { static const gs::ClassId current(gs::ClassId::makeId()); current.ensureSameId(id); double location, scale; if (AbsScalableDistribution1D::read(in, &location, &scale)) { std::vector table; gs::read_pod_vector(in, &table); if (!in.fail() && table.size()) return new PolynomialDistro1D(location, scale, &table[1], table.size()-1, 2U); } distributionReadError(in, classname()); return 0; } }