From 26e1d9bfdb478e17a729346247cbd5f91d3ba4bd Mon Sep 17 00:00:00 2001 From: jorenham Date: Tue, 24 Dec 2024 05:29:40 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20`special`:=20complete=20`airy[e]`?= =?UTF-8?q?=20and=20`itairy`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .mypyignore | 1 + scipy-stubs/special/_ufuncs.pyi | 309 +++++++++++++++++++++----------- 2 files changed, 210 insertions(+), 100 deletions(-) diff --git a/.mypyignore b/.mypyignore index 6272ae3b..ecb8f4f6 100644 --- a/.mypyignore +++ b/.mypyignore @@ -93,6 +93,7 @@ scipy\.special\.(_ufuncs\.)?lpmv scipy\.special\.(_ufuncs\.)?mathieu_(a|b) scipy\.special\.(_ufuncs\.)?hankel(1|2)e? scipy\.special\.(_ufuncs\.)?(obl|pro)_(cv|ang1(_cv)?|rad(1|2)(_cv)?) +scipy\.special\.(_ufuncs\.)?(it)?airye? scipy\.special\.(_ufuncs\.)?owens_t scipy\.special\.(_ufuncs\.)?pb(dv|vv|wa) scipy\.special\.(_ufuncs\.)?psi diff --git a/scipy-stubs/special/_ufuncs.pyi b/scipy-stubs/special/_ufuncs.pyi index 2b1d7484..744b026c 100644 --- a/scipy-stubs/special/_ufuncs.pyi +++ b/scipy-stubs/special/_ufuncs.pyi @@ -267,6 +267,8 @@ _IdentityT_co = TypeVar("_IdentityT_co", bound=L[0] | None, default=None, covari _OutT = TypeVar("_OutT", bound=onp.ArrayND[np.number[Any]]) _OutT1 = TypeVar("_OutT1", bound=onp.ArrayND[np.number[Any]]) _OutT2 = TypeVar("_OutT2", bound=onp.ArrayND[np.number[Any]]) +_OutT3 = TypeVar("_OutT3", bound=onp.ArrayND[np.number[Any]]) +_OutT4 = TypeVar("_OutT4", bound=onp.ArrayND[np.number[Any]]) _MaybeOutT = TypeVar("_MaybeOutT", bound=onp.ArrayND[np.number[Any]] | None, default=None) _MaybeOutT1 = TypeVar("_MaybeOutT1", bound=onp.ArrayND[np.number[Any]] | None, default=None) _MaybeOutT2 = TypeVar("_MaybeOutT2", bound=onp.ArrayND[np.number[Any]] | None, default=_MaybeOutT1) @@ -276,6 +278,7 @@ _Truthy: TypeAlias = L[True, 1] _Out1: TypeAlias = tuple[_MaybeOutT] | _MaybeOutT _Out2: TypeAlias = tuple[_MaybeOutT1, _MaybeOutT2] +_Out4: TypeAlias = tuple[None, None, None, None] _ToBool_D: TypeAlias = onp.ToBool | onp.ToBoolND _ToInt_D: TypeAlias = onp.ToInt | onp.ToIntND @@ -350,6 +353,10 @@ _ToDType_fdFD: TypeAlias = _ToDType_fd | _ToDType_FD # NOTE: The `TypeAliasType` prevents error messages from becoming too unreadable (especially those of mypy) _Tuple2: TypeAlias = tuple[_T, _T] +_Tuple4: TypeAlias = tuple[_T, _T, _T, _T] +_Tuple6: TypeAlias = tuple[_T, _T, _T, _T, _T, _T] +_Tuple7: TypeAlias = tuple[_T, _T, _T, _T, _T, _T, _T] + _ToDTypes_ff = TypeAliasType("_ToDTypes_ff", _Tuple2[_ToDType_f]) _ToDTypes_dd = TypeAliasType("_ToDTypes_dd", _Tuple2[_ToDType_d]) _ToDTypes_gg = TypeAliasType("_ToDTypes_gg", _Tuple2[_ToDType_g]) @@ -386,11 +393,9 @@ _ToDTypes_ddddD = TypeAliasType("_ToDTypes_ddddD", tuple[_ToDType_d, _ToDType_d, _ToDTypes_dddDD = TypeAliasType("_ToDTypes_dddDD", tuple[_ToDType_d, _ToDType_d, _ToDType_d, _ToDType_D, _ToDType_D]) _ToDTypes_DDDDD = TypeAliasType("_ToDTypes_DDDDD", tuple[_ToDType_D, _ToDType_D, _ToDType_D, _ToDType_D, _ToDType_D]) -_Tuple6: TypeAlias = tuple[_T, _T, _T, _T, _T, _T] _ToDTypes_f6 = TypeAliasType("_ToDTypes_f6", _Tuple6[_ToDType_f]) _ToDTypes_d6 = TypeAliasType("_ToDTypes_d6", _Tuple6[_ToDType_d]) -_Tuple7: TypeAlias = tuple[_T, _T, _T, _T, _T, _T, _T] _ToDTypes_f7 = TypeAliasType("_ToDTypes_f7", _Tuple7[_ToDType_f]) _ToDTypes_d7 = TypeAliasType("_ToDTypes_d7", _Tuple7[_ToDType_d]) @@ -438,6 +443,22 @@ class _Kw12fc(_KwBase, TypedDict, total=False): dtype: _ToDType_fdFD signature: L["f->ff", "d->dd", "F->FF", "D->DD"] | _ToDTypes_fff | _ToDTypes_ddd | _ToDTypes_FFF | _ToDTypes_DDD +@type_check_only +class _Kw14f(_KwBase, TypedDict, total=False): + dtype: _ToDType_fd + signature: L["f->ffff", "d->dddd"] | _ToDTypes_fffff | _ToDTypes_ddddd + +@type_check_only +class _Kw14fc(_KwBase, TypedDict, total=False): + dtype: _ToDType_fd + signature: ( + L["f->ffff", "d->dddd", "F->FFFF", "D->DDDD"] + | _ToDTypes_fffff + | _ToDTypes_ddddd + | _ToDTypes_FFFFF + | _ToDTypes_DDDDD + ) # fmt: skip + @type_check_only class _Kw21ld(_KwBase, TypedDict, total=False): dtype: _ToDType_d | None @@ -614,6 +635,18 @@ class _UFunc12(_UFuncWithout2in, _UFunc[_NameT_co, _IdentityT_co], Generic[_Name @override def nargs(self, /) -> L[3]: ... +@type_check_only +class _UFunc14(_UFuncWithout2in1out, _UFunc[_NameT_co, _IdentityT_co], Generic[_NameT_co, _IdentityT_co]): + @property + @override + def nin(self, /) -> L[1]: ... + @property + @override + def nout(self, /) -> L[4]: ... + @property + @override + def nargs(self, /) -> L[5]: ... + @type_check_only class _UFunc21(_UFunc[_NameT_co, _IdentityT_co], Generic[_NameT_co, _IdentityT_co]): @property @@ -797,6 +830,48 @@ class _UFunc12f(_UFunc12[_NameT_co, _IdentityT_co], Generic[_NameT_co, _Identity # for `it[2]i0k0` and `it[2]j0y0` @property @override + def ntypes(self, /) -> L[4]: ... + @property + @override + def types(self, /) -> list[L["f->ff", "d->dd", "F->FF", "D->DD"]]: ... + # + @overload + def __call__(self, x: _ToSubFloat, /, out: _Out2 = ..., **kw: Unpack[_Kw12f]) -> _Tuple2[_Float]: ... + @overload + def __call__(self, x: _Float_DT, /, out: _Out2 = ..., **kw: Unpack[_Kw12f]) -> _Tuple2[_Float_DT]: ... + @overload + def __call__(self, x: _ToFloat64ND, /, out: _Out2 = ..., **kw: Unpack[_Kw12f]) -> _Tuple2[_FloatND]: ... + @overload + def __call__(self, x: _ToFloat64_D, /, out: tuple[_OutT1, _OutT2], **kw: Unpack[_Kw12f]) -> tuple[_OutT1, _OutT2]: ... + @overload + def __call__(self, x: _ToFloat64_D, out1: _OutT1, out2: _OutT2, /, **kw: Unpack[_Kw12f]) -> tuple[_OutT1, _OutT2]: ... + +@final +@type_check_only +class _UFunc12c(_UFunc12[_NameT_co, _IdentityT_co], Generic[_NameT_co, _IdentityT_co]): + # `modfresnel{m,p}` + @property + @override + def ntypes(self, /) -> L[2]: ... + @property + @override + def types(self, /) -> list[L["f->FF", "d->DD"]]: ... + # + @overload + def __call__(self, x: _ToFloat64, /, out: _Out2 = ..., **kw: Unpack[_Kw12c]) -> _Tuple2[_Complex]: ... + @overload + def __call__(self, x: _ToFloat64ND, /, out: _Out2 = ..., **kw: Unpack[_Kw12c]) -> _Tuple2[_ComplexND]: ... + @overload + def __call__(self, x: _ToFloat64_D, /, out: tuple[_OutT1, _OutT2], **kw: Unpack[_Kw12c]) -> tuple[_OutT1, _OutT2]: ... + @overload + def __call__(self, x: _ToFloat64_D, out1: _OutT1, out2: _OutT2, /, **kw: Unpack[_Kw12c]) -> tuple[_OutT1, _OutT2]: ... + +@final +@type_check_only +class _UFunc12fc(_UFunc12[_NameT_co, _IdentityT_co], Generic[_NameT_co, _IdentityT_co]): + # `fresnel`, `sici`, `shichi` + @property + @override def ntypes(self, /) -> L[2]: ... @property @override @@ -807,7 +882,7 @@ class _UFunc12f(_UFunc12[_NameT_co, _IdentityT_co], Generic[_NameT_co, _Identity @overload def __call__(self, x: _ToSubComplex, /, out: _Out2 = ..., **kw: Unpack[_Kw12fc]) -> _Tuple2[_Inexact]: ... @overload - def __call__(self, x: _Inexact_DT, /, out: _Out2 = ..., **kw: Unpack[_Kw12fc]) -> _Tuple2[_Inexact_DT]: ... + def __call__(self, x: _Inexact_DT, /, out: _Out2 = ...) -> _Tuple2[_Inexact_DT]: ... @overload def __call__(self, x: _ToFloat64ND, /, out: _Out2 = ..., **kw: Unpack[_Kw12fc]) -> _Tuple2[_FloatND]: ... @overload @@ -819,45 +894,81 @@ class _UFunc12f(_UFunc12[_NameT_co, _IdentityT_co], Generic[_NameT_co, _Identity @final @type_check_only -class _UFunc12c(_UFunc12[_NameT_co, _IdentityT_co], Generic[_NameT_co, _IdentityT_co]): - # for the `modfresnel{m,p}` +class _UFunc14f(_UFunc14[_NameT_co, _IdentityT_co], Generic[_NameT_co, _IdentityT_co]): + # `itairy` @property @override def ntypes(self, /) -> L[2]: ... @property @override - def types(self, /) -> list[L["f->FF", "d->DD"]]: ... + def types(self, /) -> list[L["f->ffff", "d->dddd"]]: ... # @overload - def __call__(self, x: _ToFloat64, /, out: _Out2 = ..., **kw: Unpack[_Kw12c]) -> _Tuple2[_Complex]: ... + def __call__(self, x: _ToSubFloat, /, out: _Out4 = ..., **kw: Unpack[_Kw14f]) -> _Tuple4[_Float]: ... @overload - def __call__(self, x: _ToFloat64ND, /, out: _Out2 = ..., **kw: Unpack[_Kw12c]) -> _Tuple2[_ComplexND]: ... + def __call__(self, x: _Float_DT, /, out: _Out4 = ...) -> _Tuple4[_Float_DT]: ... @overload - def __call__(self, x: _ToFloat64_D, /, out: tuple[_OutT1, _OutT2], **kw: Unpack[_Kw12c]) -> tuple[_OutT1, _OutT2]: ... + def __call__(self, x: _ToFloat64ND, /, out: _Out4 = ..., **kw: Unpack[_Kw14f]) -> _Tuple4[_FloatND]: ... @overload - def __call__(self, x: _ToFloat64_D, out1: _OutT1, out2: _OutT2, /, **kw: Unpack[_Kw12c]) -> tuple[_OutT1, _OutT2]: ... + def __call__( + self, + x: _ToFloat64_D, + /, + out: tuple[_OutT1, _OutT2, _OutT3, _OutT4], + **kw: Unpack[_Kw14f], + ) -> tuple[_OutT1, _OutT2, _OutT3, _OutT4]: ... + @overload + def __call__( + self, + x: _ToFloat64_D, + out1: _OutT1, + out2: _OutT2, + out3: _OutT3, + out4: _OutT4, + /, + **kw: Unpack[_Kw14f], + ) -> tuple[_OutT1, _OutT2, _OutT3, _OutT4]: ... @final @type_check_only -class _UFunc12fc(_UFunc12[_NameT_co, _IdentityT_co], Generic[_NameT_co, _IdentityT_co]): - # for `fresnel`, `sici`, and `shichi` +class _UFunc14fc(_UFunc14[_NameT_co, _IdentityT_co], Generic[_NameT_co, _IdentityT_co]): + # `airy[e]` @property @override - def ntypes(self, /) -> L[4]: ... + def ntypes(self, /) -> L[2]: ... @property @override - def types(self, /) -> list[L["f->ff", "d->dd", "F->FF", "D->DD"]]: ... + def types(self, /) -> list[L["f->ffff", "d->dddd", "F->FFFF", "D->DDDD"]]: ... # @overload - def __call__(self, x: _ToSubFloat, /, out: _Out2 = ..., **kw: Unpack[_Kw12f]) -> _Tuple2[_Float]: ... + def __call__(self, x: _ToSubFloat, /, out: _Out4 = ..., **kw: Unpack[_Kw14fc]) -> _Tuple4[_Float]: ... @overload - def __call__(self, x: _Float_DT, /, out: _Out2 = ..., **kw: Unpack[_Kw12f]) -> _Tuple2[_Float_DT]: ... + def __call__(self, x: _ToSubComplex, /, out: _Out4 = ..., **kw: Unpack[_Kw14fc]) -> _Tuple4[_Inexact]: ... @overload - def __call__(self, x: _ToFloat64ND, /, out: _Out2 = ..., **kw: Unpack[_Kw12f]) -> _Tuple2[_FloatND]: ... + def __call__(self, x: _Inexact_DT, /, out: _Out4 = ...) -> _Tuple4[_Inexact_DT]: ... @overload - def __call__(self, x: _ToFloat64_D, /, out: tuple[_OutT1, _OutT2], **kw: Unpack[_Kw12f]) -> tuple[_OutT1, _OutT2]: ... + def __call__(self, x: _ToFloat64ND, /, out: _Out4 = ..., **kw: Unpack[_Kw14fc]) -> _Tuple4[_FloatND]: ... @overload - def __call__(self, x: _ToFloat64_D, out1: _OutT1, out2: _OutT2, /, **kw: Unpack[_Kw12f]) -> tuple[_OutT1, _OutT2]: ... + def __call__(self, x: _ToComplex128ND, /, out: _Out4 = ..., **kw: Unpack[_Kw14fc]) -> _Tuple4[_InexactND]: ... + @overload + def __call__( + self, + x: _ToComplex128_D, + /, + out: tuple[_OutT1, _OutT2, _OutT3, _OutT4], + **kw: Unpack[_Kw14fc], + ) -> tuple[_OutT1, _OutT2, _OutT3, _OutT4]: ... + @overload + def __call__( + self, + x: _ToComplex128_D, + out1: _OutT1, + out2: _OutT2, + out3: _OutT3, + out4: _OutT4, + /, + **kw: Unpack[_Kw14fc], + ) -> tuple[_OutT1, _OutT2, _OutT3, _OutT4]: ... @final @type_check_only @@ -2790,9 +2901,9 @@ y1: _UFunc11f[L["y1"], L[0]] = ... zetac: _UFunc11f[L["zetac"], L[0]] = ... # f->f; d->d; g->g +logit: _UFunc11g[L["logit"]] = ... expit: _UFunc11g[L["expit"]] = ... log_expit: _UFunc11g[L["log_expit"]] = ... -logit: _UFunc11g[L["logit"]] = ... # F->F; D->D wofz: _UFunc11c[L["wofz"], L[0]] = ... @@ -2819,6 +2930,32 @@ rgamma: _UFunc11fc[L["rgamma"]] = ... spence: _UFunc11fc[L["spence"], L[0]] = ... wrightomega: _UFunc11fc[L["wrightomega"], L[0]] = ... +# f->ff; d->dd +iti0k0: _UFunc12f[L["iti0k0"]] = ... +it2i0k0: _UFunc12f[L["it2i0k0"]] = ... +itj0y0: _UFunc12f[L["itj0y0"]] = ... +it2j0y0: _UFunc12f[L["it2j0y0"]] = ... + +# f->ff; d->dd; f->FF; D->DD +fresnel: _UFunc12fc[L["fresnel"]] = ... +sici: _UFunc12fc[L["sici"], L[0]] = ... +shichi: _UFunc12fc[L["shichi"], L[0]] = ... + +# f->FF; d->DD +modfresnelm: _UFunc12c[L["modfresnelm"]] = ... +modfresnelp: _UFunc12c[L["modfresnelp"]] = ... + +# f->ffff; d->dddd +itairy: _UFunc14f[L["itairy"]] = ... + +# f->ffff; d->dddd; F->FFFF; D->DDDD +airy: _UFunc14fc[L["airy"]] = ... +airye: _UFunc14fc[L["airye"]] = ... + +# f->FFFF; d->DDDD +# TODO +kelvin: np.ufunc = ... + # ld->d eval_hermite: _UFunc21ld[L["eval_hermite"], L[0]] = ... eval_hermitenorm: _UFunc21ld[L["eval_hermitenorm"], L[0]] = ... @@ -2927,51 +3064,19 @@ xlogy: _UFunc21fc2[L["xlogy"], L[0]] = ... # ff->f; dd->d; Ff->F; Dd->D _zeta: np.ufunc = ... -# Flf->F; Dld->D -_lambertw: np.ufunc = ... - -# fff->f; (l|d)dd->d; ffF->F; ddD->D -eval_gegenbauer: _UFunc31fc1[L["eval_gegenbauer"], L[0]] = ... -eval_genlaguerre: _UFunc31fc1[L["eval_genlaguerre"], L[0]] = ... -hyp1f1: _UFunc31fc1[L["hyp1f1"], L[0]] = ... - -# fff->f; ddd->d; FFF->F; DDD->D -elliprd: _UFunc31fc3[L["elliprd"], L[0]] = ... -elliprf: _UFunc31fc3[L["elliprf"], L[0]] = ... -elliprg: _UFunc31fc3[L["elliprg"], L[0]] = ... - -# ffff->f; dddd->d -_hypergeom_pmf: _UFunc41f[L["_hypergeom_pmf"], L[0]] = ... -_hypergeom_cdf: _UFunc41f[L["_hypergeom_cdf"], L[0]] = ... -_hypergeom_sf: _UFunc41f[L["_hypergeom_sf"], L[0]] = ... -_ncf_pdf: _UFunc41f[L["_ncf_pdf"], L[0]] = ... -_ncf_cdf: _UFunc41f[L["_ncf_cdf"], L[0]] = ... -_ncf_ppf: _UFunc41f[L["_ncf_ppf"], L[0]] = ... -_ncf_sf: _UFunc41f[L["_ncf_sf"], L[0]] = ... -_ncf_isf: _UFunc41f[L["_ncf_isf"], L[0]] = ... -_skewnorm_cdf: _UFunc41f[L["_skewnorm_cdf"], L[0]] = ... -_skewnorm_ppf: _UFunc41f[L["_skewnorm_ppf"], L[0]] = ... -_skewnorm_isf: _UFunc41f[L["_skewnorm_isf"], L[0]] = ... -ncfdtr: _UFunc41f[L["ncfdtr"], L[0]] = ... -ncfdtri: _UFunc41f[L["ncfdtri"], L[0]] = ... -ncfdtridfd: _UFunc41f[L["ncfdtridfd"], L[0]] = ... -ncfdtridfn: _UFunc41f[L["ncfdtridfn"], L[0]] = ... -ncfdtrinc: _UFunc41f[L["ncfdtrinc"], L[0]] = ... - -# (qq|ff)ff->F; (qq|dd)dd->D -# NOTE: Deprecated in SciPy 1.15.0 -sph_harm: _UFuncSphHarm = ... - -# ffff->f; (l|d)ddd->d; fffF->F; dddD->D -eval_jacobi: _UFunc41fc1[L["eval_jacobi"], L[0]] = ... -eval_sh_jacobi: _UFunc41fc1[L["eval_sh_jacobi"], L[0]] = ... -hyp2f1: _UFunc41fc1[L["hyp2f1"]] = ... +# ff->ff; dd->dd +pbdv: _UFunc22f[L["pbdv"]] = ... +pbvv: _UFunc22f[L["pbvv"]] = ... +pbwa: _UFunc22f[L["pbwa"]] = ... -# ffff->f; dddd->d; FFFF->F; DDDD->D -elliprj: _UFunc41fc4[L["elliprj"], L[0]] = ... +# ff->ffff; dd->dddd +# TODO +ellipj: np.ufunc = ... -# fffffff->f; dd(ll|dd)ddd->d -_ellip_harm: np.ufunc = ... +# ddl->dd +_struve_asymp_large_z: np.ufunc = ... +_struve_bessel_series: np.ufunc = ... +_struve_power_series: np.ufunc = ... # fff->f; (ll|dl|dd)d->d _beta_pdf: _UFunc31f[L["_beta_pdf"], L[0]] = ... @@ -3056,25 +3161,18 @@ radian: _UFunc31f[L["radian"], L[0]] = ... voigt_profile: _UFunc31f[L["voigt_profile"], L[0]] = ... wright_bessel: _UFunc31f[L["wright_bessel"]] = ... -# f->ff; d->dd -iti0k0: _UFunc12f[L["iti0k0"]] = ... -it2i0k0: _UFunc12f[L["it2i0k0"]] = ... -itj0y0: _UFunc12f[L["itj0y0"]] = ... -it2j0y0: _UFunc12f[L["it2j0y0"]] = ... - -# f->FF; d->DD -modfresnelm: _UFunc12c[L["modfresnelm"]] = ... -modfresnelp: _UFunc12c[L["modfresnelp"]] = ... +# fff->f; (l|d)dd->d; ffF->F; ddD->D +eval_gegenbauer: _UFunc31fc1[L["eval_gegenbauer"], L[0]] = ... +eval_genlaguerre: _UFunc31fc1[L["eval_genlaguerre"], L[0]] = ... +hyp1f1: _UFunc31fc1[L["hyp1f1"], L[0]] = ... -# f->ff; d->dd; f->FF; D->DD -fresnel: _UFunc12fc[L["fresnel"]] = ... -shichi: _UFunc12fc[L["shichi"], L[0]] = ... -sici: _UFunc12fc[L["sici"], L[0]] = ... +# fff->f; ddd->d; FFF->F; DDD->D +elliprd: _UFunc31fc3[L["elliprd"], L[0]] = ... +elliprf: _UFunc31fc3[L["elliprf"], L[0]] = ... +elliprg: _UFunc31fc3[L["elliprg"], L[0]] = ... -# ff->ff; dd->dd -pbdv: _UFunc22f[L["pbdv"]] = ... -pbvv: _UFunc22f[L["pbvv"]] = ... -pbwa: _UFunc22f[L["pbwa"]] = ... +# Flf->F; Dld->D +_lambertw: np.ufunc = ... # fff->ff; ddd->dd mathieu_cem: _UFunc32f[L["mathieu_cem"]] = ... @@ -3084,10 +3182,35 @@ mathieu_sem: _UFunc32f[L["mathieu_sem"]] = ... mathieu_modsem1: _UFunc32f[L["mathieu_modsem1"]] = ... mathieu_modsem2: _UFunc32f[L["mathieu_modsem2"]] = ... -# ddl->dd -_struve_asymp_large_z: np.ufunc = ... -_struve_bessel_series: np.ufunc = ... -_struve_power_series: np.ufunc = ... +# ffff->f; dddd->d +_hypergeom_pmf: _UFunc41f[L["_hypergeom_pmf"], L[0]] = ... +_hypergeom_cdf: _UFunc41f[L["_hypergeom_cdf"], L[0]] = ... +_hypergeom_sf: _UFunc41f[L["_hypergeom_sf"], L[0]] = ... +_ncf_pdf: _UFunc41f[L["_ncf_pdf"], L[0]] = ... +_ncf_cdf: _UFunc41f[L["_ncf_cdf"], L[0]] = ... +_ncf_ppf: _UFunc41f[L["_ncf_ppf"], L[0]] = ... +_ncf_sf: _UFunc41f[L["_ncf_sf"], L[0]] = ... +_ncf_isf: _UFunc41f[L["_ncf_isf"], L[0]] = ... +_skewnorm_cdf: _UFunc41f[L["_skewnorm_cdf"], L[0]] = ... +_skewnorm_ppf: _UFunc41f[L["_skewnorm_ppf"], L[0]] = ... +_skewnorm_isf: _UFunc41f[L["_skewnorm_isf"], L[0]] = ... +ncfdtr: _UFunc41f[L["ncfdtr"], L[0]] = ... +ncfdtri: _UFunc41f[L["ncfdtri"], L[0]] = ... +ncfdtridfd: _UFunc41f[L["ncfdtridfd"], L[0]] = ... +ncfdtridfn: _UFunc41f[L["ncfdtridfn"], L[0]] = ... +ncfdtrinc: _UFunc41f[L["ncfdtrinc"], L[0]] = ... + +# (qq|ff)ff->F; (qq|dd)dd->D +# NOTE: Deprecated in SciPy 1.15.0 +sph_harm: _UFuncSphHarm = ... + +# ffff->f; (l|d)ddd->d; fffF->F; dddD->D +eval_jacobi: _UFunc41fc1[L["eval_jacobi"], L[0]] = ... +eval_sh_jacobi: _UFunc41fc1[L["eval_sh_jacobi"], L[0]] = ... +hyp2f1: _UFunc41fc1[L["hyp2f1"]] = ... + +# ffff->f; dddd->d; FFFF->F; DDDD->D +elliprj: _UFunc41fc4[L["elliprj"], L[0]] = ... # ffff->ff; dddd->dd obl_ang1: _UFunc42f[L["obl_ang1"]] = ... @@ -3105,19 +3228,5 @@ pro_ang1_cv: _UFunc52f[L["pro_ang1_cv"]] = ... pro_rad1_cv: _UFunc52f[L["pro_rad1_cv"]] = ... pro_rad2_cv: _UFunc52f[L["pro_rad2_cv"]] = ... -# f->ffff; d->dddd -# TODO -itairy: np.ufunc = ... - -# f->FFFF; d->DDDD -# TODO -kelvin: np.ufunc = ... - -# f->ffff; d->dddd; F->FFFF; D->DDDD -# TODO -airy: np.ufunc = ... -airye: np.ufunc = ... - -# ff->ffff; dd->dddd -# TODO -ellipj: np.ufunc = ... +# fffffff->f; dd(ll|dd)ddd->d +_ellip_harm: np.ufunc = ...