Skip to content

Commit

Permalink
Add overloads for signatures involving C longs
Browse files Browse the repository at this point in the history
  • Loading branch information
person142 committed Jul 8, 2019
1 parent b902e34 commit 7e88a50
Show file tree
Hide file tree
Showing 7 changed files with 404 additions and 6 deletions.
6 changes: 4 additions & 2 deletions generate_signatures_json.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,13 @@
SIGNATURE_REGEX = ' *([a-z \*]+) ([a-zA-Z0-9_]+)\((.*)\)'

SPECIAL_DOC_TO_CTYPES = {
'double': 'c_double'
'double': 'c_double',
'long': 'c_long'
}

SPECIAL_DOC_TO_CYTHON_SPECIALIZATION = {
'double': 'double'
'double': 'double',
'long': 'long'
}


Expand Down
45 changes: 44 additions & 1 deletion numba_special/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,15 @@
===================
The following variants of SciPy's special functions can be used inside
Numba jitted code.
Numba jitted code. Arguments are specified by their Numba types except
for the C ``long`` type, where an equivalent Numba type does not
exist. To determine what Numba integer type ``long`` is on your
system, run::
>>> import ctypes
>>> 8 * ctypes.sizeof(ctypes.c_long)
Common values are ``int32`` and ``int64``.
- :data:`scipy.special.agm`::
Expand All @@ -12,14 +20,17 @@
- :data:`scipy.special.bdtr`::
float64 bdtr(float64, float64, float64)
float64 bdtr(long, long, float64)
- :data:`scipy.special.bdtrc`::
float64 bdtrc(float64, float64, float64)
float64 bdtrc(long, long, float64)
- :data:`scipy.special.bdtri`::
float64 bdtri(float64, float64, float64)
float64 bdtri(long, long, float64)
- :data:`scipy.special.bdtrik`::
Expand Down Expand Up @@ -184,54 +195,75 @@
- :data:`scipy.special.eval_chebyc`::
float64 eval_chebyc(float64, float64)
float64 eval_chebyc(long, float64)
- :data:`scipy.special.eval_chebys`::
float64 eval_chebys(float64, float64)
float64 eval_chebys(long, float64)
- :data:`scipy.special.eval_chebyt`::
float64 eval_chebyt(float64, float64)
float64 eval_chebyt(long, float64)
- :data:`scipy.special.eval_chebyu`::
float64 eval_chebyu(float64, float64)
float64 eval_chebyu(long, float64)
- :data:`scipy.special.eval_gegenbauer`::
float64 eval_gegenbauer(float64, float64, float64)
float64 eval_gegenbauer(long, float64, float64)
- :data:`scipy.special.eval_genlaguerre`::
float64 eval_genlaguerre(float64, float64, float64)
float64 eval_genlaguerre(long, float64, float64)
- :data:`scipy.special.eval_hermite`::
float64 eval_hermite(long, float64)
- :data:`scipy.special.eval_hermitenorm`::
float64 eval_hermitenorm(long, float64)
- :data:`scipy.special.eval_jacobi`::
float64 eval_jacobi(float64, float64, float64, float64)
float64 eval_jacobi(long, float64, float64, float64)
- :data:`scipy.special.eval_laguerre`::
float64 eval_laguerre(float64, float64)
float64 eval_laguerre(long, float64)
- :data:`scipy.special.eval_legendre`::
float64 eval_legendre(float64, float64)
float64 eval_legendre(long, float64)
- :data:`scipy.special.eval_sh_chebyt`::
float64 eval_sh_chebyt(float64, float64)
float64 eval_sh_chebyt(long, float64)
- :data:`scipy.special.eval_sh_chebyu`::
float64 eval_sh_chebyu(float64, float64)
float64 eval_sh_chebyu(long, float64)
- :data:`scipy.special.eval_sh_jacobi`::
float64 eval_sh_jacobi(float64, float64, float64, float64)
float64 eval_sh_jacobi(long, float64, float64, float64)
- :data:`scipy.special.eval_sh_legendre`::
float64 eval_sh_legendre(float64, float64)
float64 eval_sh_legendre(long, float64)
- :data:`scipy.special.exp1`::
Expand Down Expand Up @@ -260,6 +292,7 @@
- :data:`scipy.special.expn`::
float64 expn(float64, float64)
float64 expn(long, float64)
- :data:`scipy.special.exprel`::
Expand Down Expand Up @@ -448,6 +481,7 @@
- :data:`scipy.special.kn`::
float64 kn(float64, float64)
float64 kn(long, float64)
- :data:`scipy.special.kolmogi`::
Expand Down Expand Up @@ -500,14 +534,17 @@
- :data:`scipy.special.nbdtr`::
float64 nbdtr(float64, float64, float64)
float64 nbdtr(long, long, float64)
- :data:`scipy.special.nbdtrc`::
float64 nbdtrc(float64, float64, float64)
float64 nbdtrc(long, long, float64)
- :data:`scipy.special.nbdtri`::
float64 nbdtri(float64, float64, float64)
float64 nbdtri(long, long, float64)
- :data:`scipy.special.nbdtrik`::
Expand Down Expand Up @@ -580,14 +617,17 @@
- :data:`scipy.special.pdtr`::
float64 pdtr(float64, float64)
float64 pdtr(long, float64)
- :data:`scipy.special.pdtrc`::
float64 pdtrc(float64, float64)
float64 pdtrc(long, float64)
- :data:`scipy.special.pdtri`::
float64 pdtri(float64, float64)
float64 pdtri(long, float64)
- :data:`scipy.special.pdtrik`::
Expand Down Expand Up @@ -632,10 +672,12 @@
- :data:`scipy.special.smirnov`::
float64 smirnov(float64, float64)
float64 smirnov(long, float64)
- :data:`scipy.special.smirnovi`::
float64 smirnovi(float64, float64)
float64 smirnovi(long, float64)
- :data:`scipy.special.spence`::
Expand Down Expand Up @@ -684,6 +726,7 @@
- :data:`scipy.special.yn`::
float64 yn(float64, float64)
float64 yn(long, float64)
- :data:`scipy.special.yv`::
Expand Down
29 changes: 29 additions & 0 deletions numba_special/function_pointers.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,11 @@ cimport scipy.special.cython_special as sc
functions = {
'agm': PyLong_FromVoidPtr(<void *>sc.agm),
'bdtr[double]': PyLong_FromVoidPtr(<void *>sc.bdtr[double]),
'bdtr[long]': PyLong_FromVoidPtr(<void *>sc.bdtr[long]),
'bdtrc[double]': PyLong_FromVoidPtr(<void *>sc.bdtrc[double]),
'bdtrc[long]': PyLong_FromVoidPtr(<void *>sc.bdtrc[long]),
'bdtri[double]': PyLong_FromVoidPtr(<void *>sc.bdtri[double]),
'bdtri[long]': PyLong_FromVoidPtr(<void *>sc.bdtri[long]),
'bdtrik': PyLong_FromVoidPtr(<void *>sc.bdtrik),
'bdtrin': PyLong_FromVoidPtr(<void *>sc.bdtrin),
'bei': PyLong_FromVoidPtr(<void *>sc.bei),
Expand Down Expand Up @@ -51,25 +54,41 @@ functions = {
'erfcx[double]': PyLong_FromVoidPtr(<void *>sc.erfcx[double]),
'erfi[double]': PyLong_FromVoidPtr(<void *>sc.erfi[double]),
'eval_chebyc[double, double]': PyLong_FromVoidPtr(<void *>sc.eval_chebyc[double, double]),
'eval_chebyc[long, double]': PyLong_FromVoidPtr(<void *>sc.eval_chebyc[long, double]),
'eval_chebys[double, double]': PyLong_FromVoidPtr(<void *>sc.eval_chebys[double, double]),
'eval_chebys[long, double]': PyLong_FromVoidPtr(<void *>sc.eval_chebys[long, double]),
'eval_chebyt[double, double]': PyLong_FromVoidPtr(<void *>sc.eval_chebyt[double, double]),
'eval_chebyt[long, double]': PyLong_FromVoidPtr(<void *>sc.eval_chebyt[long, double]),
'eval_chebyu[double, double]': PyLong_FromVoidPtr(<void *>sc.eval_chebyu[double, double]),
'eval_chebyu[long, double]': PyLong_FromVoidPtr(<void *>sc.eval_chebyu[long, double]),
'eval_gegenbauer[double, double]': PyLong_FromVoidPtr(<void *>sc.eval_gegenbauer[double, double]),
'eval_gegenbauer[long, double]': PyLong_FromVoidPtr(<void *>sc.eval_gegenbauer[long, double]),
'eval_genlaguerre[double, double]': PyLong_FromVoidPtr(<void *>sc.eval_genlaguerre[double, double]),
'eval_genlaguerre[long, double]': PyLong_FromVoidPtr(<void *>sc.eval_genlaguerre[long, double]),
'eval_hermite': PyLong_FromVoidPtr(<void *>sc.eval_hermite),
'eval_hermitenorm': PyLong_FromVoidPtr(<void *>sc.eval_hermitenorm),
'eval_jacobi[double, double]': PyLong_FromVoidPtr(<void *>sc.eval_jacobi[double, double]),
'eval_jacobi[long, double]': PyLong_FromVoidPtr(<void *>sc.eval_jacobi[long, double]),
'eval_laguerre[double, double]': PyLong_FromVoidPtr(<void *>sc.eval_laguerre[double, double]),
'eval_laguerre[long, double]': PyLong_FromVoidPtr(<void *>sc.eval_laguerre[long, double]),
'eval_legendre[double, double]': PyLong_FromVoidPtr(<void *>sc.eval_legendre[double, double]),
'eval_legendre[long, double]': PyLong_FromVoidPtr(<void *>sc.eval_legendre[long, double]),
'eval_sh_chebyt[double, double]': PyLong_FromVoidPtr(<void *>sc.eval_sh_chebyt[double, double]),
'eval_sh_chebyt[long, double]': PyLong_FromVoidPtr(<void *>sc.eval_sh_chebyt[long, double]),
'eval_sh_chebyu[double, double]': PyLong_FromVoidPtr(<void *>sc.eval_sh_chebyu[double, double]),
'eval_sh_chebyu[long, double]': PyLong_FromVoidPtr(<void *>sc.eval_sh_chebyu[long, double]),
'eval_sh_jacobi[double, double]': PyLong_FromVoidPtr(<void *>sc.eval_sh_jacobi[double, double]),
'eval_sh_jacobi[long, double]': PyLong_FromVoidPtr(<void *>sc.eval_sh_jacobi[long, double]),
'eval_sh_legendre[double, double]': PyLong_FromVoidPtr(<void *>sc.eval_sh_legendre[double, double]),
'eval_sh_legendre[long, double]': PyLong_FromVoidPtr(<void *>sc.eval_sh_legendre[long, double]),
'exp1[double]': PyLong_FromVoidPtr(<void *>sc.exp1[double]),
'exp10': PyLong_FromVoidPtr(<void *>sc.exp10),
'exp2': PyLong_FromVoidPtr(<void *>sc.exp2),
'expi[double]': PyLong_FromVoidPtr(<void *>sc.expi[double]),
'expit[double]': PyLong_FromVoidPtr(<void *>sc.expit[double]),
'expm1[double]': PyLong_FromVoidPtr(<void *>sc.expm1[double]),
'expn[double]': PyLong_FromVoidPtr(<void *>sc.expn[double]),
'expn[long]': PyLong_FromVoidPtr(<void *>sc.expn[long]),
'exprel': PyLong_FromVoidPtr(<void *>sc.exprel),
'fdtr': PyLong_FromVoidPtr(<void *>sc.fdtr),
'fdtrc': PyLong_FromVoidPtr(<void *>sc.fdtrc),
Expand Down Expand Up @@ -117,6 +136,7 @@ functions = {
'kerp': PyLong_FromVoidPtr(<void *>sc.kerp),
'kl_div': PyLong_FromVoidPtr(<void *>sc.kl_div),
'kn[double]': PyLong_FromVoidPtr(<void *>sc.kn[double]),
'kn[long]': PyLong_FromVoidPtr(<void *>sc.kn[long]),
'kolmogi': PyLong_FromVoidPtr(<void *>sc.kolmogi),
'kolmogorov': PyLong_FromVoidPtr(<void *>sc.kolmogorov),
'kv[double]': PyLong_FromVoidPtr(<void *>sc.kv[double]),
Expand All @@ -130,8 +150,11 @@ functions = {
'mathieu_b': PyLong_FromVoidPtr(<void *>sc.mathieu_b),
'modstruve': PyLong_FromVoidPtr(<void *>sc.modstruve),
'nbdtr[double]': PyLong_FromVoidPtr(<void *>sc.nbdtr[double]),
'nbdtr[long]': PyLong_FromVoidPtr(<void *>sc.nbdtr[long]),
'nbdtrc[double]': PyLong_FromVoidPtr(<void *>sc.nbdtrc[double]),
'nbdtrc[long]': PyLong_FromVoidPtr(<void *>sc.nbdtrc[long]),
'nbdtri[double]': PyLong_FromVoidPtr(<void *>sc.nbdtri[double]),
'nbdtri[long]': PyLong_FromVoidPtr(<void *>sc.nbdtri[long]),
'nbdtrik': PyLong_FromVoidPtr(<void *>sc.nbdtrik),
'nbdtrin': PyLong_FromVoidPtr(<void *>sc.nbdtrin),
'ncfdtr': PyLong_FromVoidPtr(<void *>sc.ncfdtr),
Expand All @@ -150,8 +173,11 @@ functions = {
'obl_cv': PyLong_FromVoidPtr(<void *>sc.obl_cv),
'owens_t': PyLong_FromVoidPtr(<void *>sc.owens_t),
'pdtr[double]': PyLong_FromVoidPtr(<void *>sc.pdtr[double]),
'pdtr[long]': PyLong_FromVoidPtr(<void *>sc.pdtr[long]),
'pdtrc[double]': PyLong_FromVoidPtr(<void *>sc.pdtrc[double]),
'pdtrc[long]': PyLong_FromVoidPtr(<void *>sc.pdtrc[long]),
'pdtri[double]': PyLong_FromVoidPtr(<void *>sc.pdtri[double]),
'pdtri[long]': PyLong_FromVoidPtr(<void *>sc.pdtri[long]),
'pdtrik': PyLong_FromVoidPtr(<void *>sc.pdtrik),
'poch': PyLong_FromVoidPtr(<void *>sc.poch),
'pro_cv': PyLong_FromVoidPtr(<void *>sc.pro_cv),
Expand All @@ -163,7 +189,9 @@ functions = {
'round': PyLong_FromVoidPtr(<void *>sc.round),
'sindg': PyLong_FromVoidPtr(<void *>sc.sindg),
'smirnov[double]': PyLong_FromVoidPtr(<void *>sc.smirnov[double]),
'smirnov[long]': PyLong_FromVoidPtr(<void *>sc.smirnov[long]),
'smirnovi[double]': PyLong_FromVoidPtr(<void *>sc.smirnovi[double]),
'smirnovi[long]': PyLong_FromVoidPtr(<void *>sc.smirnovi[long]),
'spence[double]': PyLong_FromVoidPtr(<void *>sc.spence[double]),
'stdtr': PyLong_FromVoidPtr(<void *>sc.stdtr),
'stdtridf': PyLong_FromVoidPtr(<void *>sc.stdtridf),
Expand All @@ -176,6 +204,7 @@ functions = {
'y0': PyLong_FromVoidPtr(<void *>sc.y0),
'y1': PyLong_FromVoidPtr(<void *>sc.y1),
'yn[double]': PyLong_FromVoidPtr(<void *>sc.yn[double]),
'yn[long]': PyLong_FromVoidPtr(<void *>sc.yn[long]),
'yv[double]': PyLong_FromVoidPtr(<void *>sc.yv[double]),
'yve[double]': PyLong_FromVoidPtr(<void *>sc.yve[double]),
'zetac': PyLong_FromVoidPtr(<void *>sc.zetac)
Expand Down
17 changes: 14 additions & 3 deletions numba_special/generate_overloads.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import os
import json
import ctypes

PWD = os.path.abspath(os.path.dirname(__file__))

Expand Down Expand Up @@ -53,19 +54,29 @@ def {FUNCTION}(*args):"""
===================
The following variants of SciPy's special functions can be used inside
Numba jitted code.
Numba jitted code. Arguments are specified by their Numba types except
for the C ``long`` type, where an equivalent Numba type does not
exist. To determine what Numba integer type ``long`` is on your
system, run::
>>> import ctypes
>>> 8 * ctypes.sizeof(ctypes.c_long)
Common values are ``int32`` and ``int64``.
{FUNCTIONS}
"""
from . import numba_overloads
'''


CTYPES_TO_NUMBA_TYPES = {
'c_double': 'numba.types.float64'
'c_double': 'numba.types.float64',
'c_long': 'numba.types.int{}'.format(8 * ctypes.sizeof(ctypes.c_long))
}

CTYPES_TO_SHORT_NUMBA_TYPES = {
'c_double': 'float64'
'c_double': 'float64',
'c_long': 'long'
}


Expand Down

0 comments on commit 7e88a50

Please sign in to comment.