<div dir="ltr">Just to chime in: Numba would definitely appreciate C functions to access the random distribution implementations, and have a side-project (numba-scipy) that is making the Cython wrapped functions in SciPy visible to Numba.</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Sep 19, 2019 at 5:41 AM Kevin Sheppard <<a href="mailto:kevin.k.sheppard@gmail.com">kevin.k.sheppard@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Sep 19, 2019 at 10:23 AM Ralf Gommers <<a href="mailto:ralf.gommers@gmail.com" target="_blank">ralf.gommers@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Sep 19, 2019 at 10:28 AM Kevin Sheppard <<a href="mailto:kevin.k.sheppard@gmail.com" target="_blank">kevin.k.sheppard@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">There are some users of the NumPy C code in randomkit.  This was never officially supported.  There has been a long open issue to provide this officially. <div><br></div><div>When I wrote randomgen I supplied .pdx files that make it simpler to write Cython code that uses the components.  The lower-level API has not had much scrutiny and is in need of a clean-up.   I thought this would also encourage users to extend the random machinery themselves as part of their project or code so as to minimize the requests for new (exotic) distributions to be included in Generator. <br><br>Most of the generator functions follow a pattern random_DISTRIBUTION.  Some have a bit more name mangling which can easily be cleaned up (like ranomd_gauss_zig, which should become PREFIX_standard_normal). <br><br>Ralf Gommers suggested unprefixed names. </div></div></blockquote><div><br></div><div>I suggested that the names should match the Python API, which I think isn't quite the same. The Python API doesn't contain things like "gamma", "t" or "f".</div></div></div></blockquote><div><br></div><div>My gamma and f (I misspoke about t) I mean the names that appear as Generator methods:</div><div><br></div><div><a href="https://docs.scipy.org/doc/numpy/reference/random/generator.html#numpy.random.Generator" target="_blank">https://docs.scipy.org/doc/numpy/reference/random/generator.html#numpy.random.Generator</a> </div><div><br></div><div>If I understand your point (and with reference with page linked below), then there would be something like numpy.random.cython_random.gamma (which is currently called numpy.random.distributions.random_gamma). Maybe I'm not understanding your point about the Python API though.  <br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>I tried this in a local branch and it was a bit ugly since some of the distributions have common math names (e.g., gamma) and others are very short (e.g., t or f).  I think a prefix is needed, and after looking through the C API docs npy_random_ seemed like a reasonable choice (since these live in numpy.random).  <br><br>Any thoughts on the following questions are welcome (others too):<br><br>1. Should there be a prefix on the C functions?<br>2. If so, what should the prefix be?<br></div></div></blockquote><div><br></div><div>Before worrying about naming details, can we start with "what should be in the C/Cython API"? If I look through the current pxd files, there's a lot there that looks like it should be private, and what we expose as Python API is not all present as far as I can tell (which may be fine, if the only goal is to let people write new generators rather than use the existing ones from Cython without the Python overhead).</div></div></div></blockquote><div><br></div>From the ground up, for someone who want to write a new distribution:<br>1. The bit generators.  These currently have no pxd files. These are always going to be Python obects and so it isn't absolutely essential to expose them with a low-level API.  All that is needed is the capsule which has the bitgen struct, which is what is really needed<br>2. bitgen_t which is in common.pxd.  This is essential since it enables access to the callables to produce basic psueod random values.<br>3. The distributions, which are in distributions.pdx. The integer generators are in <a href="http://bounded_integers.pxd.in" target="_blank">bounded_integers.pxd.in</a>, which would need to be processed and then included after processing (same for <a href="http://bounded_integers.pxd.in" target="_blank">bounded_integers.pxd.in</a>). <br>    a. The legacy in legacy_distributions.pxd.   If the legacy is included, then aug_bitgen_t needs to also be included which is also in legacy_distributions.pxd<br>4. The "helpers" which are defined in common.pxd.  These simplify implementing complete distributions which support automatix broadcasting when needed. They are only provided to match the signatures for the functions in distributions.pxd. The highest level ones are cont() and disc(). Some of the lower-level ones could easily be marked as private.<br><br>1,2 and 3 are pretty important.  4 could be in or out. It could help if someone wanted to write a fully featured distribution w/ broadcasting, but I think this use case is less likely than someone say wanting to implement a custom rejection sampler.<br><br><br>For someone who wants to write a new BitGenerator<br><br>1. BitGenerator and SeedSequence in bit_generato.pxd are required. As is bitgen_t which is in common. bitgen_t should probably move to bit_generators.</div><div class="gmail_quote">2. aligned_malloc:  This has been requested on multiple occasions and is practically important when interfacing with SSE or AVX code. It is potentially more general than the random module. This lives in common.pxd.<div><br></div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><div><br></div><div>In the end we want to get to a doc section similar to <a href="http://scipy.github.io/devdocs/special.cython_special.html" target="_blank">http://scipy.github.io/devdocs/special.cython_special.html</a> I'd think.</div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>3. Should the legacy C functions be part of the API -- these are mostly the ones that produce or depend on polar transform normals (Box-Muller). I have a feeling no, but there may be reasons to prefer BM since they do not depend on rejection sampling. <br></div></div></blockquote><div><br></div><div>Even if there would be a couple of users interested, it would be odd starting to do this after deeming the code "legacy". So I agree with your "no".<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>4. Should low-level API be consumable like any other numpy C API by including the usual header locations and library locations?  Right now, the pxd simplifies writing Cython but users have sp specify the location of the headers and source manually  An alternative would be to provide a function like np.get_include() -> np.random.get_include() that would specialize in random.<br></div></div></blockquote><div><br></div><div>Good question. I'm not sure this is "like any other NumPy C API". We don't provide a C API for fft, linalg or other functionality further from core either. It's possible of course, but does it really help library authors or end users?</div></div></div></blockquote><div><br></div><div>SciPy provides a very useful Cython API to low-level linalg. But there is little reason to provide C APIs to fft or linalg since they are all directly available. The code is random is AFAICT, one of the more complete C implementations of functions needed to produce variates from many distributions (mostly due to its ancestor randomkit, which AFAICT isn't maintained). </div><div><br></div><div>An ideal API would allow projects like <a href="https://github.com/deepmind/torch-randomkit/tree/master/randomkit" target="_blank">https://github.com/deepmind/torch-randomkit/tree/master/randomkit</a> or numba to consume the code in NumPy without vendoring it.</div><div><br></div><div>Best wishes,</div><div>Kevin </div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><div><br></div><div>Cheers,<br></div><div>Ralf</div><div><br></div><div><br></div></div></div>
_______________________________________________<br>
NumPy-Discussion mailing list<br>
<a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/numpy-discussion</a><br>
</blockquote></div></div>
_______________________________________________<br>
NumPy-Discussion mailing list<br>
<a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/numpy-discussion</a><br>
</blockquote></div>