
March 23, 2000
9:14 p.m.
I really, really, really like the Cephes module and a lot of the work Travis Oliphant has been doing on Numeric Python. Nice to see Numeric getting more and more powerful all the time. However, as more and more functions get added to the libraries, their names become more and more obscure, and it sure would be nice to have doc-strings for them. For the stock Numeric ufuncs like "add", the meanings are self-evident, but things like "pdtri" and "incbet" are a bit less obvious. (One of my pet peeves with Python is that there are so many functions and classes with empty doc-strings. Bit by bit, I'm trying to add them in). However, one little problem with the current Numeric implementation is that ufunc objects don't have support for a doc string, the doc string is hardwired in the type object, and comes up as: "Optimizied FUNCtions make it possible to implement arithmetic with matrices efficiently" This is not only non-helpful, it's misspelled ("Optimizied"?) Well, according to the charter, a well-behaved Nummie will "Fix bugs at will, without prior consultation." But a well-behaved Nummie wil also "Add new features only after consultation with other Nummies" So, I hereby declare doing something about the useless doc-strings to be fixing a bug and not adding a feature ;-) The patch below adds doc strings to all the ufuncs in the Cephes module. They are automatically extracted from the HTML documentation for the Cephes module. (In the process of doing this, I also added some missing items to said HTML documentation). This patch depends on another patch, which I am submitting via the SourceForge, which allows ufunc objects to have doc strings. With these patches, you get this: >>> import cephes >>> print cephes.incbet.__doc__ incbet(a,b,x) returns the incomplete beta integral of the arguments, evaluated from zero to x: gamma(a+b) / (gamma(a)*gamma(b)) * integral(t**(a-1) (1-t)**(b-1), t=0..x). instead of this: >>> print cephes.incbet.__doc__ Optimizied FUNCtions make it possible to implement arithmetic with matrices efficiently Isn't that nicer? "Ni-Ni-Numpy!" Here's the "gendoc.py" script to pull the docstrings out of included_functions.h: #!/usr/bin/env python """generate cephes_doc.h from included_functions.html""" import string def parse(infile): d={} key=None val='' for line in infile.readlines(): if not string.strip(line): continue if line[0]=='<': if key and val: d[key]=string.strip(val) key,val=None,None if line[:4]=='<DT>': tok=string.split(line) tok=string.split(tok[-1],'(') key=tok[0] elif line[:4]=='<DD>' and key: val=line[4:] else: if val: val=val+line return d if __name__=="__main__": d = parse(open("docs/included_functions.html",'r')) keys = d.keys() keys.sort() ofile=open("cephes_doc.h",'w') for key in keys: ofile.write('#define %s_doc "%s"\n'%(key,repr(d[key])[1:-1])) ofile.close() And here are the patches to cephes: --- cephes-1.2/Makefile Tue Dec 28 15:53:11 1999 +++ cephes-1.2.cgw/Makefile Thu Mar 23 14:40:02 2000 @@ -15,8 +15,11 @@ $(FC) -shared $(FFLAGS) -o cephesmodule.so $(OBJS) \ -L./cephes -lcephes -L./amos -lamos -L./toms -ltoms -cephesmodule.o: cephesmodule.c +cephesmodule.o: cephesmodule.c cephes_doc.h $(CC) -c $(CFLAGS) -fPIC cephesmodule.c + +cephes_doc.h: docs/included_functions.html + python gendoc.py amos/libamos.a: cd amos && make CC=$(CC) CFLAGS="$(CFLAGS)" FC=$(FC) FFLAGS="$(FFLAGS)" --- cephes-1.2/docs/included_functions.html Sat Mar 27 00:27:18 1999 +++ cephes-1.2.cgw/docs/included_functions.html Thu Mar 23 14:39:03 2000 @@ -7,7 +7,7 @@ <DT>(Ai,Aip,Bi,Bip) = airy(z) <DD>airy(z) calculates the Airy functions and their derivatives evaluated at real or complex number z. The Airy functions Ai and Bi -are two independent solutions of y"(x)=xy. Aip and Bip are the first derivatives +are two independent solutions of y''(x)=xy. Aip and Bip are the first derivatives evaluated at x of Ai and Bi respectively. <DT>(Aie,Aipe,Bie,Bipe) = airye(z) @@ -19,7 +19,7 @@ <h1> Elliptic Functions and Integrals </h1> <DL> -<DT>(sn,cn,dn,ph) = ellpj_sn(u,m) +<DT>(sn,cn,dn,ph) = ellpj(u,m) <DD>ellpj calculates the Jacobian elliptic functions of parameter m between 0 and 1, and real u. The returned functions are often written sn(u|m), cn(u|m), and dn(u|m). The value of ph is such @@ -430,11 +430,12 @@ <DT>y = cosm1(x) <DD>calculates cos(x) - 1 for use when x is near zero. -</DL> - - - +<DT>y = round(x) +<DD>Returns the nearest integer to x as a double precision +floating point result. If x ends in 0.5 exactly, the +nearest even integer is chosen. +</DL> --- cephes-1.2/cephesmodule.c Tue Dec 28 15:32:26 1999 +++ cephes-1.2.cgw/cephesmodule.c Thu Mar 23 14:24:37 2000 @@ -23,6 +23,8 @@ #include <math.h> #endif +#include "cephes_doc.h" + static PyUFuncGenericFunction cephes1_functions[] = { NULL, NULL, }; static PyUFuncGenericFunction cephes1_2_functions[] = { NULL, NULL, }; static PyUFuncGenericFunction cephes1c_4_functions[] = { NULL, NULL, NULL, NULL }; @@ -220,335 +222,435 @@ /* Create function objects for each function call and insert them in the dictionary */ - f = PyUFunc_FromFuncAndData(cephes3a_functions, bdtrc_data, cephes_4_types, 2, 3, 1, PyUFunc_None, "bdtrc", 1); + f = PyUFunc_FromFuncAndData(cephes3a_functions, bdtrc_data, cephes_4_types, + 2, 3, 1, PyUFunc_None, "bdtrc", bdtrc_doc, 1); PyDict_SetItemString(dictionary, "bdtrc", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes3a_functions, bdtr_data, cephes_4_types, 2, 3, 1, PyUFunc_None, "bdtr", 1); + f = PyUFunc_FromFuncAndData(cephes3a_functions, bdtr_data, cephes_4_types, + 2, 3, 1, PyUFunc_None, "bdtr", bdtr_doc, 1); PyDict_SetItemString(dictionary, "bdtr", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes3a_functions, bdtri_data, cephes_4_types, 2, 3, 1, PyUFunc_None, "bdtri", 1); + f = PyUFunc_FromFuncAndData(cephes3a_functions, bdtri_data, cephes_4_types, + 2, 3, 1, PyUFunc_None, "bdtri", bdtri_doc, 1); PyDict_SetItemString(dictionary, "bdtri", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes3_functions, btdtr_data, cephes_4_types, 2, 3, 1, PyUFunc_None, "btdtr", 1); + f = PyUFunc_FromFuncAndData(cephes3_functions, btdtr_data, cephes_4_types, + 2, 3, 1, PyUFunc_None, "btdtr", btdtr_doc, 1); PyDict_SetItemString(dictionary, "btdtr", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes3a_functions, fdtrc_data, cephes_4_types, 2, 3, 1, PyUFunc_None, "fdtrc", 1); + f = PyUFunc_FromFuncAndData(cephes3a_functions, fdtrc_data, cephes_4_types, + 2, 3, 1, PyUFunc_None, "fdtrc", fdtrc_doc, 1); PyDict_SetItemString(dictionary, "fdtrc", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes3a_functions, fdtr_data, cephes_4_types, 2, 3, 1, PyUFunc_None, "fdtr", 1); + f = PyUFunc_FromFuncAndData(cephes3a_functions, fdtr_data, cephes_4_types, + 2, 3, 1, PyUFunc_None, "fdtr", fdtr_doc, 1); PyDict_SetItemString(dictionary, "fdtr", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes3a_functions, fdtri_data, cephes_4_types, 2, 3, 1, PyUFunc_None, "fdtri", 1); + f = PyUFunc_FromFuncAndData(cephes3a_functions, fdtri_data, cephes_4_types, + 2, 3, 1, PyUFunc_None, "fdtri", fdtri_doc, 1); PyDict_SetItemString(dictionary, "fdtri", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes3_functions, gdtrc_data, cephes_4_types, 2, 3, 1, PyUFunc_None, "gdtrc", 1); + f = PyUFunc_FromFuncAndData(cephes3_functions, gdtrc_data, cephes_4_types, + 2, 3, 1, PyUFunc_None, "gdtrc", gdtrc_doc, 1); PyDict_SetItemString(dictionary, "gdtrc", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes3_functions, gdtr_data, cephes_4_types, 2, 3, 1, PyUFunc_None, "gdtr", 1); + f = PyUFunc_FromFuncAndData(cephes3_functions, gdtr_data, cephes_4_types, + 2, 3, 1, PyUFunc_None, "gdtr", gdtr_doc, 1); PyDict_SetItemString(dictionary, "gdtr", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes4_functions, hyp2f1_data, cephes_5_types, 2, 4, 1, PyUFunc_None, "hyp2f1", 1); + f = PyUFunc_FromFuncAndData(cephes4_functions, hyp2f1_data, cephes_5_types, + 2, 4, 1, PyUFunc_None, "hyp2f1", hyp2f1_doc, 1); PyDict_SetItemString(dictionary, "hyp2f1", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes3_functions, hyperg_data, cephes_4_types, 2, 3, 1, PyUFunc_None, "hyperg", 1); + f = PyUFunc_FromFuncAndData(cephes3_functions, hyperg_data, cephes_4_types, + 2, 3, 1, PyUFunc_None, "hyperg", hyperg_doc, 1); PyDict_SetItemString(dictionary, "hyperg", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes4a_2_functions, hyp2f0_data, cephes_6_types, 2, 4, 2, PyUFunc_None, "hyp2f0", 1); + f = PyUFunc_FromFuncAndData(cephes4a_2_functions, hyp2f0_data, cephes_6_types, + 2, 4, 2, PyUFunc_None, "hyp2f0", hyp2f0_doc, 1); PyDict_SetItemString(dictionary, "hyp2f0", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes4_2_functions, onef2_data, cephes_6_types, 2, 4, 2, PyUFunc_None, "onef2", 1); + f = PyUFunc_FromFuncAndData(cephes4_2_functions, onef2_data, cephes_6_types, + 2, 4, 2, PyUFunc_None, "onef2", onef2_doc, 1); PyDict_SetItemString(dictionary, "onef2", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes4_2_functions, threef0_data, cephes_6_types, 2, 4, 2, PyUFunc_None, "threef0", 1); + f = PyUFunc_FromFuncAndData(cephes4_2_functions, threef0_data, cephes_6_types, + 2, 4, 2, PyUFunc_None, "threef0", threef0_doc, 1); PyDict_SetItemString(dictionary, "threef0", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes3_functions, incbet_data, cephes_4_types, 2, 3, 1, PyUFunc_None, "incbet", 1); + f = PyUFunc_FromFuncAndData(cephes3_functions, incbet_data, cephes_4_types, + 2, 3, 1, PyUFunc_None, "incbet", incbet_doc, 1); PyDict_SetItemString(dictionary, "incbet", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes3_functions, incbi_data, cephes_4_types, 2, 3, 1, PyUFunc_None, "incbi", 1); + f = PyUFunc_FromFuncAndData(cephes3_functions, incbi_data, cephes_4_types, + 2, 3, 1, PyUFunc_None, "incbi", incbi_doc, 1); PyDict_SetItemString(dictionary, "incbi", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes3a_functions, nbdtrc_data, cephes_4_types, 2, 3, 1, PyUFunc_None, "nbdtrc", 1); + f = PyUFunc_FromFuncAndData(cephes3a_functions, nbdtrc_data, cephes_4_types, + 2, 3, 1, PyUFunc_None, "nbdtrc", nbdtrc_doc, 1); PyDict_SetItemString(dictionary, "nbdtrc", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes3a_functions, nbdtr_data, cephes_4_types, 2, 3, 1, PyUFunc_None, "nbdtr", 1); + f = PyUFunc_FromFuncAndData(cephes3a_functions, nbdtr_data, cephes_4_types, + 2, 3, 1, PyUFunc_None, "nbdtr", nbdtr_doc, 1); PyDict_SetItemString(dictionary, "nbdtr", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes3a_functions, nbdtri_data, cephes_4_types, 2, 3, 1, PyUFunc_None, "nbdtri", 1); + f = PyUFunc_FromFuncAndData(cephes3a_functions, nbdtri_data, cephes_4_types, + 2, 3, 1, PyUFunc_None, "nbdtri", nbdtri_doc, 1); PyDict_SetItemString(dictionary, "nbdtri", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2_functions, beta_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "beta", 1); + f = PyUFunc_FromFuncAndData(cephes2_functions, beta_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "beta", beta_doc, 1); PyDict_SetItemString(dictionary, "beta", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2_functions, lbeta_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "lbeta", 1); + f = PyUFunc_FromFuncAndData(cephes2_functions, lbeta_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "lbeta", lbeta_doc, 1); PyDict_SetItemString(dictionary, "lbeta", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, cbrt_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "cbrt", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, cbrt_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "cbrt", cbrt_doc, 1); PyDict_SetItemString(dictionary, "cbrt", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2_functions, chdtrc_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "chdtrc", 1); + f = PyUFunc_FromFuncAndData(cephes2_functions, chdtrc_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "chdtrc", chdtrc_doc, 1); PyDict_SetItemString(dictionary, "chdtrc", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2_functions, chdtr_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "chdtr", 1); + f = PyUFunc_FromFuncAndData(cephes2_functions, chdtr_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "chdtr", chdtr_doc, 1); PyDict_SetItemString(dictionary, "chdtr", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2_functions, chdtri_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "chdtri", 1); + f = PyUFunc_FromFuncAndData(cephes2_functions, chdtri_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "chdtri", chdtri_doc, 1); PyDict_SetItemString(dictionary, "chdtri", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, dawsn_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "dawsn", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, dawsn_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "dawsn", dawsn_doc, 1); PyDict_SetItemString(dictionary, "dawsn", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2_functions, ellie_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "ellie", 1); + f = PyUFunc_FromFuncAndData(cephes2_functions, ellie_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "ellie", ellie_doc, 1); PyDict_SetItemString(dictionary, "ellie", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2_functions, ellik_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "ellik", 1); + f = PyUFunc_FromFuncAndData(cephes2_functions, ellik_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "ellik", ellik_doc, 1); PyDict_SetItemString(dictionary, "ellik", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, ellpe_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "ellpe", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, ellpe_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "ellpe", ellpe_doc, 1); PyDict_SetItemString(dictionary, "ellpe", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, ellpk_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "ellpk", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, ellpk_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "ellpk", ellpk_doc, 1); PyDict_SetItemString(dictionary, "ellpk", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, exp10_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "exp10", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, exp10_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "exp10", exp10_doc, 1); PyDict_SetItemString(dictionary, "exp10", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, exp2_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "exp2", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, exp2_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "exp2", exp2_doc, 1); PyDict_SetItemString(dictionary, "exp2", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, Gamma_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "gamma", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, Gamma_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "gamma", gamma_doc, 1); PyDict_SetItemString(dictionary, "gamma", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, lgam_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "lgam", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, lgam_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "lgam", lgam_doc, 1); PyDict_SetItemString(dictionary, "lgam", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, i0_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "i0", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, i0_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "i0", i0_doc, 1); PyDict_SetItemString(dictionary, "i0", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, i0e_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "i0e", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, i0e_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "i0e", i0e_doc, 1); PyDict_SetItemString(dictionary, "i0e", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, i1_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "i1", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, i1_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "i1", i1_doc, 1); PyDict_SetItemString(dictionary, "i1", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, i1e_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "i1e", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, i1e_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "i1e", i1e_doc, 1); PyDict_SetItemString(dictionary, "i1e", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2_functions, igamc_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "igamc", 1); + f = PyUFunc_FromFuncAndData(cephes2_functions, igamc_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "igamc", igamc_doc, 1); PyDict_SetItemString(dictionary, "igamc", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2_functions, igam_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "igam", 1); + f = PyUFunc_FromFuncAndData(cephes2_functions, igam_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "igam", igam_doc, 1); PyDict_SetItemString(dictionary, "igam", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2_functions, igami_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "igami", 1); + f = PyUFunc_FromFuncAndData(cephes2_functions, igami_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "igami", igami_doc, 1); PyDict_SetItemString(dictionary, "igami", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2c_functions, iv_data, cephes_3c_types, 4, 2, 1, PyUFunc_None, "iv", 1); + f = PyUFunc_FromFuncAndData(cephes2c_functions, iv_data, cephes_3c_types, + 4, 2, 1, PyUFunc_None, "iv", iv_doc, 1); PyDict_SetItemString(dictionary, "iv", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2cp_functions, ive_data, cephes_3c_types, 4, 2, 1, PyUFunc_None, "ive", 1); + f = PyUFunc_FromFuncAndData(cephes2cp_functions, ive_data, cephes_3c_types, + 4, 2, 1, PyUFunc_None, "ive", ive_doc, 1); PyDict_SetItemString(dictionary, "ive", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2_4_functions, ellpj_data, cephes_6_types, 2, 2, 4, PyUFunc_None, "ellpj", 1); + f = PyUFunc_FromFuncAndData(cephes2_4_functions, ellpj_data, cephes_6_types, + 2, 2, 4, PyUFunc_None, "ellpj", ellpj_doc, 1); PyDict_SetItemString(dictionary, "ellpj", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2a_functions, expn_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "expn", 1); + f = PyUFunc_FromFuncAndData(cephes2a_functions, expn_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "expn", expn_doc, 1); PyDict_SetItemString(dictionary, "expn", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2a_functions, jn_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "jn", 1); + f = PyUFunc_FromFuncAndData(cephes2a_functions, jn_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "jn", jn_doc, 1); PyDict_SetItemString(dictionary, "jn", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2a_functions, kn_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "kn", 1); + f = PyUFunc_FromFuncAndData(cephes2a_functions, kn_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "kn", kn_doc, 1); PyDict_SetItemString(dictionary, "kn", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2a_functions, pdtrc_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "pdtrc", 1); + f = PyUFunc_FromFuncAndData(cephes2a_functions, pdtrc_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "pdtrc", pdtrc_doc, 1); PyDict_SetItemString(dictionary, "pdtrc", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2a_functions, pdtr_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "pdtr", 1); + f = PyUFunc_FromFuncAndData(cephes2a_functions, pdtr_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "pdtr", pdtr_doc, 1); PyDict_SetItemString(dictionary, "pdtr", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2a_functions, pdtri_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "pdtri", 1); + f = PyUFunc_FromFuncAndData(cephes2a_functions, pdtri_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "pdtri", pdtri_doc, 1); PyDict_SetItemString(dictionary, "pdtri", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2a_functions, stdtr_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "stdtr", 1); + f = PyUFunc_FromFuncAndData(cephes2a_functions, stdtr_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "stdtr", stdtr_doc, 1); PyDict_SetItemString(dictionary, "stdtr", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2a_functions, stdtri_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "stdtri", 1); + f = PyUFunc_FromFuncAndData(cephes2a_functions, stdtri_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "stdtri", stdtri_doc, 1); PyDict_SetItemString(dictionary, "stdtri", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2a_functions, yn_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "yn", 1); + f = PyUFunc_FromFuncAndData(cephes2a_functions, yn_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "yn", yn_doc, 1); PyDict_SetItemString(dictionary, "yn", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2a_functions, smirnov_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "smirnov", 1); + f = PyUFunc_FromFuncAndData(cephes2a_functions, smirnov_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "smirnov", smirnov_doc, 1); PyDict_SetItemString(dictionary, "smirnov", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2a_functions, smirnovi_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "smirnovi", 1); + f = PyUFunc_FromFuncAndData(cephes2a_functions, smirnovi_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "smirnovi", smirnovi_doc, 1); PyDict_SetItemString(dictionary, "smirnovi", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1c_4_functions, airy_data, cephes_5c_types, 4, 1, 4, PyUFunc_None, "airy", 1); + f = PyUFunc_FromFuncAndData(cephes1c_4_functions, airy_data, cephes_5c_types, + 4, 1, 4, PyUFunc_None, "airy", airy_doc, 1); PyDict_SetItemString(dictionary, "airy", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1cp_4_functions, airye_data, cephes_5c_types, 4, 1, 4, PyUFunc_None, "airye", 1); + f = PyUFunc_FromFuncAndData(cephes1cp_4_functions, airye_data, cephes_5c_types, + 4, 1, 4, PyUFunc_None, "airye", airye_doc, 1); PyDict_SetItemString(dictionary, "airye", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_2_functions, fresnl_data, cephes_3_types, 2, 1, 2, PyUFunc_None, "fresnl", 1); + f = PyUFunc_FromFuncAndData(cephes1_2_functions, fresnl_data, cephes_3_types, + 2, 1, 2, PyUFunc_None, "fresnl", fresnl_doc, 1); PyDict_SetItemString(dictionary, "fresnl", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_2_functions, shichi_data, cephes_3_types, 2, 1, 2, PyUFunc_None, "shichi", 1); + f = PyUFunc_FromFuncAndData(cephes1_2_functions, shichi_data, cephes_3_types, + 2, 1, 2, PyUFunc_None, "shichi", shichi_doc, 1); PyDict_SetItemString(dictionary, "shichi", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_2_functions, sici_data, cephes_3_types, 2, 1, 2, PyUFunc_None, "sici", 1); + f = PyUFunc_FromFuncAndData(cephes1_2_functions, sici_data, cephes_3_types, + 2, 1, 2, PyUFunc_None, "sici", sici_doc, 1); PyDict_SetItemString(dictionary, "sici", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, j0_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "j0", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, j0_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "j0", j0_doc, 1); PyDict_SetItemString(dictionary, "j0", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, y0_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "y0", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, y0_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "y0", y0_doc, 1); PyDict_SetItemString(dictionary, "y0", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, j1_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "j1", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, j1_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "j1", j1_doc, 1); PyDict_SetItemString(dictionary, "j1", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, y1_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "y1", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, y1_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "y1", y1_doc, 1); PyDict_SetItemString(dictionary, "y1", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2c_functions, jv_data, cephes_3c_types, 4, 2, 1, PyUFunc_None, "jv", 1); + f = PyUFunc_FromFuncAndData(cephes2c_functions, jv_data, cephes_3c_types, + 4, 2, 1, PyUFunc_None, "jv", jv_doc, 1); PyDict_SetItemString(dictionary, "jv", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2cp_functions, jve_data, cephes_3c_types, 4, 2, 1, PyUFunc_None, "jve", 1); + f = PyUFunc_FromFuncAndData(cephes2cp_functions, jve_data, cephes_3c_types, + 4, 2, 1, PyUFunc_None, "jve", jve_doc, 1); PyDict_SetItemString(dictionary, "jve", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2c_functions, yv_data, cephes_3c_types, 4, 2, 1, PyUFunc_None, "yv", 1); + f = PyUFunc_FromFuncAndData(cephes2c_functions, yv_data, cephes_3c_types, + 4, 2, 1, PyUFunc_None, "yv", yv_doc, 1); PyDict_SetItemString(dictionary, "yv", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2cp_functions, yve_data, cephes_3c_types, 4, 2, 1, PyUFunc_None, "yve", 1); + f = PyUFunc_FromFuncAndData(cephes2cp_functions, yve_data, cephes_3c_types, + 4, 2, 1, PyUFunc_None, "yve", yve_doc, 1); PyDict_SetItemString(dictionary, "yve", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, k0_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "k0", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, k0_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "k0", k0_doc, 1); PyDict_SetItemString(dictionary, "k0", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, k0e_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "k0e", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, k0e_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "k0e", k0e_doc, 1); PyDict_SetItemString(dictionary, "k0e", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, k1_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "k1", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, k1_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "k1", k1_doc, 1); PyDict_SetItemString(dictionary, "k1", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, k1e_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "k1e", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, k1e_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "k1e", k1e_doc, 1); PyDict_SetItemString(dictionary, "k1e", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2cp_functions, kv_data, cephes_3c_types, 4, 2, 1, PyUFunc_None, "kv", 1); + f = PyUFunc_FromFuncAndData(cephes2cp_functions, kv_data, cephes_3c_types, + 4, 2, 1, PyUFunc_None, "kv", kv_doc, 1); PyDict_SetItemString(dictionary, "kv", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2cp_functions, kve_data, cephes_3c_types, 4, 2, 1, PyUFunc_None, "kve", 1); + f = PyUFunc_FromFuncAndData(cephes2cp_functions, kve_data, cephes_3c_types, + 4, 2, 1, PyUFunc_None, "kve", kve_doc, 1); PyDict_SetItemString(dictionary, "kve", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2cpp_functions, hankel1_data, cephes_3cp_types, 2, 2, 1, PyUFunc_None, "hankel1", 1); + f = PyUFunc_FromFuncAndData(cephes2cpp_functions, hankel1_data, cephes_3cp_types, + 2, 2, 1, PyUFunc_None, "hankel1", hankel1_doc, 1); PyDict_SetItemString(dictionary, "hankel1", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2cpp_functions, hankel1e_data, cephes_3cp_types, 2, 2, 1, PyUFunc_None, "hankel1e", 1); + f = PyUFunc_FromFuncAndData(cephes2cpp_functions, hankel1e_data, cephes_3cp_types, + 2, 2, 1, PyUFunc_None, "hankel1e", hankel1e_doc, 1); PyDict_SetItemString(dictionary, "hankel1e", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2cpp_functions, hankel2_data, cephes_3cp_types, 2, 2, 1, PyUFunc_None, "hankel2", 1); + f = PyUFunc_FromFuncAndData(cephes2cpp_functions, hankel2_data, cephes_3cp_types, + 2, 2, 1, PyUFunc_None, "hankel2", hankel2_doc, 1); PyDict_SetItemString(dictionary, "hankel2", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2cpp_functions, hankel2e_data, cephes_3cp_types, 2, 2, 1, PyUFunc_None, "hankel2e", 1); + f = PyUFunc_FromFuncAndData(cephes2cpp_functions, hankel2e_data, cephes_3cp_types, + 2, 2, 1, PyUFunc_None, "hankel2e", hankel2e_doc, 1); PyDict_SetItemString(dictionary, "hankel2e", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, ndtr_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "ndtr", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, ndtr_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "ndtr", ndtr_doc, 1); PyDict_SetItemString(dictionary, "ndtr", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, erfc_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "erfc", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, erfc_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "erfc", erfc_doc, 1); PyDict_SetItemString(dictionary, "erfc", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, erf_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "erf", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, erf_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "erf", erf_doc, 1); PyDict_SetItemString(dictionary, "erf", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, ndtri_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "ndtri", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, ndtri_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "ndtri", ndtri_doc, 1); PyDict_SetItemString(dictionary, "ndtri", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, psi_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "psi", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, psi_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "psi", psi_doc, 1); PyDict_SetItemString(dictionary, "psi", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, rgamma_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "rgamma", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, rgamma_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "rgamma", rgamma_doc, 1); PyDict_SetItemString(dictionary, "rgamma", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, round_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "round", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, round_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "round", round_doc, 1); PyDict_SetItemString(dictionary, "round", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, sindg_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "sindg", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, sindg_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "sindg", sindg_doc, 1); PyDict_SetItemString(dictionary, "sindg", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, cosdg_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "cosdg", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, cosdg_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "cosdg", cosdg_doc, 1); PyDict_SetItemString(dictionary, "cosdg", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes3_functions, radian_data, cephes_4_types, 2, 3, 1, PyUFunc_None, "radian", 1); + f = PyUFunc_FromFuncAndData(cephes3_functions, radian_data, cephes_4_types, + 2, 3, 1, PyUFunc_None, "radian", radian_doc, 1); PyDict_SetItemString(dictionary, "radian", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, tandg_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "tandg", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, tandg_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "tandg", tandg_doc, 1); PyDict_SetItemString(dictionary, "tandg", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, cotdg_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "cotdg", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, cotdg_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "cotdg", cotdg_doc, 1); PyDict_SetItemString(dictionary, "cotdg", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, log1p_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "log1p", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, log1p_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "log1p", log1p_doc, 1); PyDict_SetItemString(dictionary, "log1p", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, expm1_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "expm1", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, expm1_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "expm1", expm1_doc, 1); PyDict_SetItemString(dictionary, "expm1", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, cosm1_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "cosm1", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, cosm1_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "cosm1", cosm1_doc, 1); PyDict_SetItemString(dictionary, "cosm1", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, spence_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "spence", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, spence_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "spence", spence_doc, 1); PyDict_SetItemString(dictionary, "spence", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, zetac_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "zetac", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, zetac_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "zetac", zetac_doc, 1); PyDict_SetItemString(dictionary, "zetac", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2_functions, struve_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "struve", 1); + f = PyUFunc_FromFuncAndData(cephes2_functions, struve_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "struve", struve_doc, 1); PyDict_SetItemString(dictionary, "struve", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes2_functions, zeta_data, cephes_3_types, 2, 2, 1, PyUFunc_None, "zeta", 1); + f = PyUFunc_FromFuncAndData(cephes2_functions, zeta_data, cephes_3_types, + 2, 2, 1, PyUFunc_None, "zeta", zeta_doc, 1); PyDict_SetItemString(dictionary, "zeta", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, kolmogorov_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "kolmogorov", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, kolmogorov_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "kolmogorov", kolmogorov_doc, 1); PyDict_SetItemString(dictionary, "kolmogorov", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1_functions, kolmogi_data, cephes_2_types, 2, 1, 1, PyUFunc_None, "kolmogorovi", 1); + f = PyUFunc_FromFuncAndData(cephes1_functions, kolmogi_data, cephes_2_types, + 2, 1, 1, PyUFunc_None, "kolmogorovi", kolmogorovi_doc, 1); PyDict_SetItemString(dictionary, "kolmogorovi", f); Py_DECREF(f); - f = PyUFunc_FromFuncAndData(cephes1c_functions, wofz_data, cephes_1c_types, 2, 1, 1, PyUFunc_None, "wofz", 1); + f = PyUFunc_FromFuncAndData(cephes1c_functions, wofz_data, cephes_1c_types, + 2, 1, 1, PyUFunc_None, "wofz", wofz_doc, 1); PyDict_SetItemString(dictionary, "wofz", f); Py_DECREF(f); } NB: This stuff won't work at all without the corresponding patches to the Numeric core, to be posted shortly to the sourceforge site.