[SciPy-dev] Removing globals from minpack wrapper

Travis E. Oliphant oliphant at enthought.com
Thu Jun 26 04:15:41 EDT 2008


Yosef Meller wrote:
>
> I was having my fun with optimize.fsolve() at work, when I realized 
> that both the Python side and the C/FORTRAN side allocate work spaces, 
> and then copy between them, which seemed wasteful. I started playing 
> around with the code to try and create a version that allows the same 
> buffer to move around between Python and minpack.
>
> I couldn't do that (and I doubt now that it's possible), but on the 
> way I found a method to remove the global variables that are used to 
> store the data needed by the multipack functions but not passed in by 
> the FORTRAN code which doesn't even know about it.
>
> The trick was to allocate extra space on the work buffers and use it 
> as a pointer to a structure that contains the information. This may 
> seem just as ugly, but it has all the advantages of not using globals, 
> including the prospects of someday making it thread-safe.
>
> The attached patch implements the trick in minpack_hybrj, and the 
> Python code tests that it works.
>
> Do you think it's worth doing to the rest of the minpack functions?

That is pretty clever.   Amy I correct that the only time cost is an 
extra array allocation (for ap_fvec) per complete calla?

I think it is worth it.    Using globals requires a bit of rigging to 
support re-entrance of the optimizers (so you could have a python 
function that itself calls optimize).  

Thanks for looking at the code.

-Travis




More information about the SciPy-Dev mailing list