2
0
mirror of https://github.com/boostorg/math.git synced 2026-01-25 06:22:09 +00:00
Commit Graph

1922 Commits

Author SHA1 Message Date
Christopher Kormanyos
1e61cea5df Improve fix, no pch, test spec fun locally 2020-12-14 07:21:52 +01:00
Christopher Kormanyos
90ee0013e7 Fix the fix of 396 and expand its test case 2020-12-13 20:33:25 +01:00
Christopher Kormanyos
b29157c7e1 Fixes #396 tests tgamma fix and original report 2020-12-13 15:00:40 +01:00
pulver
a0a97b768a Fix derivative of pow(x,y) when x=0 (#456)
* Fix pow(x,y) for variable x=0 and constant y #445

* Add pow0 test.

Co-authored-by: Matt Pulver <mpulver@unitytechgroup.com>
2020-11-16 11:52:28 -05:00
jzmaddock
6cbd225994 Merge pull request #454 from boostorg/issue453
Fix up legendre_p(n, n-1, x) as special case.
2020-11-11 19:20:57 +00:00
jzmaddock
c25cae2067 Correct testing mistake in test_legendre.hpp. 2020-11-09 12:44:50 +00:00
jzmaddock
889620031a Fix up legendre_p(n, n-1, x) as special case.
Add tests.
Fixes https://github.com/boostorg/math/issues/453.
2020-11-08 20:47:25 +00:00
jzmaddock
56c4c890d1 Fix spurious overflow in gamma_p/q calculation.
Add tests.
Fixes: https://github.com/boostorg/math/issues/451
2020-11-05 19:43:52 +00:00
jzmaddock
6b8c2691d3 Correct expected error rate - epsilon should be as a percentage for BOOST_CHECK_CLOSE. 2020-10-30 11:36:17 +00:00
jzmaddock
f59b67ee9c Fix some CI test failures. 2020-10-13 18:34:11 +01:00
Evan Miller
18ed616376 Kolmogorov-Smirnov distribution (#422)
* Kolmogorov-Smirnov distribution #421

Add a new distribution, kolmogorov_smirnov_distribution, which takes a
parameter that represents the number of observations used in a
Kolmogorov-Smirnov test. (The K-S test is a popular test for comparing
two CDFs, but the test statistic is not implemented here.)

This implementation includes Kolmogorov's original 1st order Taylor
expansion. There is a literature on the distribution's other
mathematical properties (higher order terms and exact version); this
literature is summarized in the main header file for anyone who may
want to expand the implementation later.

The CDF is implemented using a Jacobi theta function, and the PDF is a
hand-rolled derivative of that function. Quantiles plug the CDF and PDF
into a Newton-Raphson iteration. The mean and variance have nice
closed-form expressions, and the mode uses a dumb run-time maximizer.

This commit includes graphs, a ULP plotter for the PDF, and the usual
compilation and numerical tests. The test file is on the small side, but
it integrates the distribution from zero to infinity, and covers the
quantiles pretty well. As of now the numerical tests only verify
self-consistency (e.g. distribution moments and CDF-quantile relations),
so there's room to add some external checks.

* Implement skewness for K-S distribution [CI SKIP]

The third moment integrates nicely with the help of Apery's constant
(zeta_three). Verify the result via quadrature.

* Implement kurtosis for the K-S distribution

Verify the result via quadrature.
2020-09-04 08:48:51 -04:00
jzmaddock
526fc6eef4 Update test_jacobi_theta compiler requirements in Jamfile.v2. 2020-08-27 18:36:18 +01:00
jzmaddock
b1c03c841a Jamfile.v2: Tidy up mpfr/gmp use so tests pass on mingw64 2020-08-18 11:19:48 +01:00
Evan Miller
d7141cd353 Jacobi Theta functions (#394)
* Jacobi Theta functions

Implementations, tests, and ULP plotting programs are provided for the
four Jacobi Theta functions per #373. Twenty-four public C++ functions
are provided in all, covering various precision-preserving scenarios.

Documentation for collaborators is provided in the code comments. Proper
documentation for end users will be provided when the implementation and
APIs are finalized.

Some tests are failing; this implementation is meant to start a
conversation. The core dilemma faced by the author was that large values
of |q| resulted in slow convergence, and sometimes wildly inaccurate
results. Following the implementation note in DLMF 20.14, I added code
to switch over to the imaginary versions of the theta functions when |q|
> 0.85.  This restored accuracy such that all of the identity tests
passed for a loose-enough epsilon, but then lost precision to the point
that the Wolfram Alpha spot checks failed. It is the author's hope that
someone with floating-point experience can tame the exponential dragons
and squeeze the ULPs back down to a reasonable range when |q| is large.

When #392 is merged I will add more thorough value tests, although I
fully expect them to fail until the underlying precision issues are
resolved.

As a final note, the precision issues do not affect the z=0 case - the
ULP plots indicate these return values within 2 ULP across all valid
|q|. So that's a start.

* [CI SKIP] Jacobi theta: Add special-value tests and more

* Add tests covering z=0 special values from MathWorld

* Add missing real_concept header

* Replace M_PI and friends with constants::pi etc

* Use BOOST_MATH_STD_USING in more places

* Jacobi theta: Test two more of Watson's identities [CI SKIP]

See https://mathworld.wolfram.com/JacobiThetaFunctions.html

(Equations 48 and 49)

* Improve precision of Jacobi theta functions [CI SKIP]

Rewrite the private imaginary versions to use double-sided summations
following DLMF 20.13.4 and 20.13.5. This cuts down the worst of the
precision issues by a factor of 10, and gets more of the tests to pass.

I am confident enough in the code path to eliminate the compile-time
__JACOBI_THETA_USE_IMAGINARY flag. In fact the imaginary-z code paths
are now enabled for all |q| > 0.04, i.e. most legal values of q.

More extensive tests will be needed to illuminate any remaining
precision issues.

* Jacobi theta: Make changes suggested in #394 [CI SKIP]

* Add LICENSE notice to main file

* Document convergence criteria

* Eliminate eps*eps = 0 logic. This causes some disagreement with the
zero returned by Wolfram Alpha for z=0, q > 0.99 in the fourth function.
Mathematically, the fourth function is never exactly zero, so I don't
trust Wolfram here.

* Per code-review comments, remove multiplications by floating-point 2.

* Tweak the plotting programs to display their titles, and to uniformly
use `float` as their CoarseType and `long double` as their
`PreciseType`.

* Add quadrature tests to Jacobi theta functions [CI SKIP]

The quadrature tests revealed a problem in the m1 functions: they too
should switch to the _IMAGINARY logic for q > exp(-pi), or will suffer
from slow convergence. Fix them.

Also tighten tolerances for many tests from sqrt(eps) to 100 * eps.

* Test Jacobi thetas against elliptic functions and elliptic integrals [CI SKIP]

See:

* https://dlmf.nist.gov/22.2
* https://dlmf.nist.gov/20.9#i

* Test Jacobi Thetas against their Laplace transforms [CI SKIP]

See:

* https://dlmf.nist.gov/20.10#ii

I did find some disagreement, and dropped the negative sign from the
theta1 equation. DLMF's theta2 and theta3 Laplace transform equations do
not agree at all with the computed values - will need to investigate.

In the meantime, the two implemented equations agree to 4 EPS so I am
keeping them.

* Add a note on using log1p with Jacobi theta functions [CI SKIP]

See discussion:

* https://github.com/boostorg/math/pull/394#issuecomment-655871762

* Add random data tests to Jacobi Theta functions [CI SKIP]

Add a test data generator program for the Jacobi theta functions.
This program will produce data for the tau parameterization, so that
precision isn't lost during the log-transformation. This distinguishes
it from the Wolfram Alpha data, which is parameterized by q.

A few of these new random-data tests are failing, but not by obscene
margins (< 100 EPS). These failures will be addressed when the test
tolerances are finalized.

* Add small-tau tests and simplify Jacobi Theta code [CI SKIP]

Add tests for small tau (i.e. large q). The tests are failing with mean
~ 200 EPS and max ~ 800 EPS. These look like worst-case input, and
should be the focus of future accuracy improvements.

This commit also simplifies the _IMAGINARY code by abstracting all of
the loops into a single svelte function.

* Add user documentation for Jacobi Theta functions [CI SKIP]

* Add function graphs to Jacobi Theta docs [CI SKIP]

* Define Jacobi Theta test tolerances [CI SKIP]

* Add implementation note on Jacobi theta functions [CI SKIP]

* Consolidate Jacobi Theta ULPs plotting programs [CI SKIP]

* Fix q domain checking of jacobi_theta4 [CI SKIP]

* Add ULPs plots to Jacobi Theta docs [CI SKIP]

Also add the built HTML files for easy evaluation. A full rebuild is
needed for the new docs to appear in the indexes.

* Add missing Jacobi Theta ULPs plots [CI SKIP]

* Add LaTeX source for Jacobi Theta equations [CI SKIP]

* Remove unused Jacobi Theta PNG equations [CI SKIP]

* Add Jacobi Theta performance script [CI SKIP]

Provided by @NAThompson.

* Remove vestigial eps*eps check from jacobi_theta3 [CI SKIP]

* Update Jacobi Theta docs per code review comments [CI SKIP]

* Enable arg promotion for Jacobi Theta functions [CI SKIP]

Add Jacobi theta functions to the instantiation tests and fix up
everything needed to make them pass. This changes the function
signatures to use promote_args.

* Fix Jacobi Theta plotting script [CI SKIP]

This script broke when the promote_args API was added.

* Change Jacobi Theta convergence criterion [CI SKIP]

Compare the non-oscillating part of the delta to the previous one.
This avoids some headaches comparing the delta to the partial sum,
because the partial sum can be a small number due to the oscillating
component alternating signs.

Because successive terms involve either q^n^2 or exp(-(pi*n)^2),
convergence should still happen pretty quickly. Graphs have been updated
and tests still passs with no noticeable difference.
2020-08-15 18:51:47 -04:00
Nick
cbd2af2890 Cohen acceleration (#415)
* Cohen acceleration

Accelerates convergence of an alternating series by a method designed by Cohen, Villegas, and Zagier.
2020-08-09 09:55:56 -04:00
John Maddock
01f495015c Merge branch 'no_long_double_fixes' into develop 2020-07-31 18:14:09 +01:00
jzmaddock
801eff2504 Correct test case for C++03, add missing copyright. 2020-07-28 08:39:16 +01:00
Nick
fa23c83bb1 Laplace limit. (#409) 2020-07-27 21:26:24 -04:00
jzmaddock
c4972b0214 Merge pull request #408 from boostorg/issue406
Fix bug in student's T quantile for denormalized degrees_of_freedom.
2020-07-27 19:34:54 +01:00
jzmaddock
a316c72bb6 Correct lgamma workaround for very small arguments.
This allows simplification of the student's T quantile code.
Added some more lgamma tests.
2020-07-25 18:30:03 +01:00
Nick
326faa4c28 Reciprocal Fibonacci constant and Dottie number. (#407) 2020-07-25 09:26:38 -04:00
jzmaddock
fa8f763df9 Fix bug in student's T quantile for denormalized degrees_of_freedom. 2020-07-24 20:11:48 +01:00
Nick
8792935679 Engel expansions (#404) 2020-07-20 09:51:17 -04:00
jzmaddock
a9bfd214cb No Long Double Policies: Correct Owen's T. 2020-07-20 14:34:02 +01:00
jzmaddock
0aa86c3076 No Long double policies: add test case to Jamfile.v2. 2020-07-20 11:43:42 +01:00
jzmaddock
ef37b70953 Disabled long double: Add test case, fix forward header. 2020-07-20 09:23:29 +01:00
Nick
ee2cd5d5e5 Luroth expansions (#401) 2020-07-18 09:28:39 -04:00
jzmaddock
e9b93b1587 Instantiate.hpp: fix for using TEST_GROUP_5/6 alone. 2020-07-09 19:06:09 +01:00
Matt Borland
699d326f64 Implemented mode and associated tests (#390)
* Implemented mode and associated tests

* Clarity and complexity changes

* Added google benchmark

* Small changes to mode. More tests.

* Seperated into sorted and non-sorted functions

* Fixed data types and removed copying

* Fixed bounds checking

* Additional tests and cleanup.

* Added tests for std::list and std::forward_list

* Small testing changes and documentation

* Added modes memory allocation and faster insertion

* Changed return type, and modified tests

* Removed copied iterator and edge cases.

* Documentation fixes
2020-07-09 13:28:29 -04:00
jzmaddock
b5d925de98 Minor update for pow<N>():
Add a few more constexpr tests for the corner cases.
Document the constexpr-ness.
See https://github.com/boostorg/math/issues/354.
2020-07-06 19:29:28 +01:00
Matt Borland
ceea26d144 boost::math::pow is not constexpr #354 (#388)
* Made pow constexpr

* Added static_assert to test

* Changed constexpr to BOOST_CXX14_CONSTEXPR
2020-07-05 13:33:37 -04:00
Nick
5a7e64a426 Tanh-sinh with MPFR test. (#389) 2020-07-04 13:09:20 -04:00
Nick
fbb62f01c5 Centered continued fractions (#379)
* Centered continued fraction [CI SKIP]

* Document centered cfrac. [CI SKIP]

* Unit tests for centered continued fraction [CI SKIP]

* Kick off build.

* Fix syntax error in docs [CI SKIP]

* Fix ADL.
2020-06-28 14:20:52 -04:00
Nick
1ac89b2b02 Simple continued fraction (#377)
* Simple continued fraction [CI SKIP]

* Comments on error analysis [CI SKIP]

* Simple continued fraction [CI SKIP]

* Clarify comment and kick off build.
2020-06-26 14:50:04 -04:00
Nick
4facb20ff9 Gauss's constant G:=1/agm(1,sqrt(2)) (#363) 2020-06-05 20:25:04 -04:00
Nick
4e0e8eb005 Add Feigenbaum constant. (#351)
* Add Feigenbaum constant.

* Add isnan to real_concept. Convert test_constants.cpp to math_unit_test.cpp.

* Reduce ULP tolerance to 2, which is the minimum that passes on my machine.

* Improvements to Feigenbaum.

* Ok this is pretty complicated . . . [CI SKIP]

* Take jzmaddock's suggestion to remove additions to real_concept.

* Remove test the demonstrates throw.

* Use BOOST_STATIC_ASSERT_MSG to retain C++03 compatibility.

* More precise conversion from binary to decimal.

* Plastic constant.

* Fix typos.

* New tests [CI SKIP]

* bugfix in test [CI SKIP]

* Update docs for new constants [CI SKIP]

* Fix outdated instructions [CI SKIP]

* Do C++11 check for new constants.

* Update constants.qbk [CI SKIP]

* Hopefully green up build

* Constants still *work* in C++03, but now they must be tested in C++11 mode.

* Remove boost::math::isnan.

* Test file requires C++17.
2020-06-04 21:57:38 -04:00
Nick
0a4551bf15 Add CHECK_EQUAL and CHECK_NAN to math_unit_test.hpp [CI SKIP] 2020-05-31 13:27:43 -04:00
NAThompson
646005eaca Take care of overflow. [CI SKIP] 2020-05-31 11:35:46 -04:00
Nick
1186f1a7ff rsqrt (#361)
* rsqrt

* Link docs into math.qbk. [CI SKIP]

* Demo performance with a compiler that generates good instructions [CI SKIP]
2020-05-30 22:34:56 -04:00
Nick
9a45e6a358 AGM 2020-05-29 21:50:25 -04:00
Nick
3c3217d2cd Remove some internal dependencies for Daubechies wavelets. (#356) 2020-05-20 14:07:19 -04:00
jzmaddock
bfbd6a93ee Change char->signed char to reflect nature of the test.
Fixes https://github.com/boostorg/math/issues/353.
2020-05-19 08:27:15 +01:00
Edward Diener
6d678efbf7 Change __BORLANDC__ to BOOST_BORLANDC and __CODEGEARC__ to BOOST_CODEGEARC, which is defined in Boost config for the Embarcadero non-clang-based compilers. (#345) 2020-05-06 11:46:51 -04:00
jzmaddock
0fffd9a6e0 test_ellint_2 has one set of tests which don't work correctly with variable precision types. 2020-04-29 19:47:46 +01:00
jzmaddock
c242a19426 handle_test_result should call set_output_precision so that variable precision types are correctly handled. 2020-04-29 19:47:06 +01:00
Nick
c59659f4ed Reinch's modification to Clenshaw recurrence (#339)
* Reinch's modification to Clenshaw recurrence. [CI SKIP]

* Convert Chebyshev tests to math_unit_test.hpp

* Performance of translated Chebyshev Clenshaw recurrence. [CI SKIP]

* Prepare to use modified Clenshaw recurrence in Chebyshev transform.

* Remove unused headers from Chebyshev transform test [CI SKIP]

* Update Chebyshev transform tests to use math_unit_test.hpp
2020-04-25 09:01:05 -04:00
Nick
d71fba9875 Improvements for math_unit_test (#331)
* CHECK_LE for math_unit_test.hpp

* CHECK_CONDITIONED_ERROR

* Always accept 1ULP accurate evaluation

* Use new features of math_unit_test to test wavelet_transform.
2020-04-25 08:56:59 -04:00
jzmaddock
46574c7320 ellint 2 tests: fix float constant. 2020-04-11 19:28:59 +01:00
jzmaddock
6a3abaabed Ellint 2: Correct numeric literals in test case. 2020-04-10 12:05:10 +01:00
jzmaddock
1ba3c0110e Correct behaviour of ellint_2 when k = 1.
Fixes https://github.com/boostorg/math/issues/321.
2020-04-08 09:20:38 +01:00