From 21340742f0b2b651347abf628e88e7e3ffa75afa Mon Sep 17 00:00:00 2001 From: Ludvig Ericson Date: Thu, 24 Nov 2016 13:44:09 +0100 Subject: [PATCH 1/3] Add ndtri --- setup.py | 3 ++- src/_cffi_src/build_ndtri.py | 20 ++++++++++++++++++++ src/pycephes/ndtri.py | 14 ++++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 src/_cffi_src/build_ndtri.py create mode 100644 src/pycephes/ndtri.py diff --git a/setup.py b/setup.py index eb552e7..e2afe1c 100644 --- a/setup.py +++ b/setup.py @@ -20,5 +20,6 @@ "pytest", "scipy", ], - cffi_modules=["src/_cffi_src/build_hyper.py:ffi"], + cffi_modules=["src/_cffi_src/build_hyper.py:ffi", + "src/_cffi_src/build_ndtri.py:ffi"], ) diff --git a/src/_cffi_src/build_ndtri.py b/src/_cffi_src/build_ndtri.py new file mode 100644 index 0000000..c0669a9 --- /dev/null +++ b/src/_cffi_src/build_ndtri.py @@ -0,0 +1,20 @@ +# Inspired by pyca/cryptography (Apache/BSD) + +from cffi import FFI + + +ffi = FFI() +ffi.cdef(""" +double ndtri(double y0); +""") +ffi.set_source( + "_ndtri", + """ +double ndtri(double y0); +""", + libraries=["md"], +) + + +if __name__ == '__main__': + ffi.compile() diff --git a/src/pycephes/ndtri.py b/src/pycephes/ndtri.py new file mode 100644 index 0000000..7fe01d2 --- /dev/null +++ b/src/pycephes/ndtri.py @@ -0,0 +1,14 @@ +import numpy as np +from numba import njit, cffi_support + +import _ndtri +from _ndtri import lib, ffi + +cffi_support.register_module(_ndtri) + +_ndtri = lib.ndtri + + +@njit +def ndtri(q): + return _ndtri(q) From 7af0209c7e3028dc86e9aa965de5e7c43ef13d86 Mon Sep 17 00:00:00 2001 From: Ludvig Ericson Date: Tue, 29 Nov 2016 11:41:23 +0100 Subject: [PATCH 2/3] add igam --- setup.py | 3 ++- src/_cffi_src/build_igam.py | 22 ++++++++++++++++++++++ src/pycephes/igam.py | 10 ++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 src/_cffi_src/build_igam.py create mode 100644 src/pycephes/igam.py diff --git a/setup.py b/setup.py index e2afe1c..b555b9e 100644 --- a/setup.py +++ b/setup.py @@ -21,5 +21,6 @@ "scipy", ], cffi_modules=["src/_cffi_src/build_hyper.py:ffi", - "src/_cffi_src/build_ndtri.py:ffi"], + "src/_cffi_src/build_ndtri.py:ffi", + "src/_cffi_src/build_igam.py:ffi"], ) diff --git a/src/_cffi_src/build_igam.py b/src/_cffi_src/build_igam.py new file mode 100644 index 0000000..5f0a5e5 --- /dev/null +++ b/src/_cffi_src/build_igam.py @@ -0,0 +1,22 @@ +# Inspired by pyca/cryptography (Apache/BSD) + +from cffi import FFI + + +ffi = FFI() +ffi.cdef(""" +double igam(double s, double x); +double igamc(double s, double x); +""") +ffi.set_source( + "_igam", + """ +double igam(double s, double x); +double igamc(double s, double x); +""", + libraries=["md"], +) + + +if __name__ == '__main__': + ffi.compile() diff --git a/src/pycephes/igam.py b/src/pycephes/igam.py new file mode 100644 index 0000000..a225fc5 --- /dev/null +++ b/src/pycephes/igam.py @@ -0,0 +1,10 @@ +import numpy as np +from numba import njit, cffi_support + +import _igam +from _igam import lib, ffi + +cffi_support.register_module(_igam) + +lower = lib.igam +upper = lib.igamc From c05d58404d6fc9df82bea0bb5a461e657add06f4 Mon Sep 17 00:00:00 2001 From: Ludvig Ericson Date: Tue, 29 Nov 2016 14:08:27 +0100 Subject: [PATCH 3/3] add chi2 --- setup.py | 3 ++- src/_cffi_src/build_chi2.py | 24 ++++++++++++++++++++++++ src/pycephes/chi2.py | 30 ++++++++++++++++++++++++++++++ src/pycephes/igam.py | 15 ++++++++++++--- 4 files changed, 68 insertions(+), 4 deletions(-) create mode 100644 src/_cffi_src/build_chi2.py create mode 100644 src/pycephes/chi2.py diff --git a/setup.py b/setup.py index b555b9e..19985bc 100644 --- a/setup.py +++ b/setup.py @@ -22,5 +22,6 @@ ], cffi_modules=["src/_cffi_src/build_hyper.py:ffi", "src/_cffi_src/build_ndtri.py:ffi", - "src/_cffi_src/build_igam.py:ffi"], + "src/_cffi_src/build_igam.py:ffi", + "src/_cffi_src/build_chi2.py:ffi"], ) diff --git a/src/_cffi_src/build_chi2.py b/src/_cffi_src/build_chi2.py new file mode 100644 index 0000000..a2b80d3 --- /dev/null +++ b/src/_cffi_src/build_chi2.py @@ -0,0 +1,24 @@ +# Inspired by pyca/cryptography (Apache/BSD) + +from cffi import FFI + + +ffi = FFI() +ffi.cdef(""" +double chdtr( double df, double x ); +double chdtri( double df, double y ); +double chdtrc( double df, double x ); +""") +ffi.set_source( + "_chi2", + """ +double chdtr( double df, double x ); +double chdtri( double df, double y ); +double chdtrc( double df, double x ); +""", + libraries=["md"], +) + + +if __name__ == '__main__': + ffi.compile() diff --git a/src/pycephes/chi2.py b/src/pycephes/chi2.py new file mode 100644 index 0000000..63c6ff6 --- /dev/null +++ b/src/pycephes/chi2.py @@ -0,0 +1,30 @@ +import numpy as np +from numba import cffi_support, float32, float64, vectorize + +import _chi2 +from _chi2 import lib, ffi + +cffi_support.register_module(_chi2) +_chdtr = lib.chdtr +_chdtrc = lib.chdtrc +_chdtri = lib.chdtri + +@vectorize([float64(float64, float64), + float32(float32, float32)]) +def cdf(x, df): + return _chdtr(df, x) + +@vectorize([float64(float64, float64), + float32(float32, float32)]) +def ppf(p, df): + return _chdtri(df, 1.0-p) + +@vectorize([float64(float64, float64), + float32(float32, float32)]) +def sf(p, df): + return _chdtrc(df, p) + +@vectorize([float64(float64, float64), + float32(float32, float32)]) +def isf(p, df): + return _chdtri(df, p) diff --git a/src/pycephes/igam.py b/src/pycephes/igam.py index a225fc5..37cf846 100644 --- a/src/pycephes/igam.py +++ b/src/pycephes/igam.py @@ -1,10 +1,19 @@ import numpy as np -from numba import njit, cffi_support +from numba import cffi_support, float32, float64, vectorize import _igam from _igam import lib, ffi cffi_support.register_module(_igam) +_igam = lib.igam +_igamc = lib.igamc -lower = lib.igam -upper = lib.igamc +@vectorize([float64(float64, float64), + float32(float32, float32)]) +def lower(s, x): + return _igam(s, x) + +@vectorize([float64(float64, float64), + float32(float32, float32)]) +def upper(s, x): + return _igamc(s, x)