<div dir="ltr">Hi everyone, <div>I was thinking it would be nice to put forward my ideas regarding the implementation of the package.</div><div><br><div>Thanks to Per Brodtkorb for the feedback.<br><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Mar 19, 2015 at 7:29 PM, <span dir="ltr"><<a href="mailto:Per.Brodtkorb@ffi.no" target="_blank">Per.Brodtkorb@ffi.no</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div lang="EN-US" link="blue" vlink="purple">
<div>
<p class="MsoNormal">Hi,<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><span style="color:black">For your information I have reimplemented the approx._fprime and approx._hess code found in statsmodels and added the epsilon extrapolation<u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:black">method of Wynn. The result you can see here:<u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:black"><a href="https://github.com/pbrod/numdifftools/blob/master/numdifftools/nd_cstep.py" target="_blank"><span style="color:black">https://github.com/pbrod/numdifftools/blob/master/numdifftools/nd_cstep.py</span></a><u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:black"><u></u> </span></p></div></div></blockquote><div>This is wonderful, The main aim now is to find a way to determine whether the function is analytic, which is the necessity for the complex step to work. Though differentiability is one of the main necessities for analyticity, it would be really great if any new suggestions are there ?</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div lang="EN-US" link="blue" vlink="purple"><div><p class="MsoNormal"><span style="color:black"><u></u></span></p>
<p class="MsoNormal"><span style="color:black">I have also compared the accuracy and runtimes for the different alternatives here:<u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:black"><a href="https://github.com/pbrod/numdifftools/blob/master/numdifftools/run_benchmark.py" target="_blank"><span style="color:black">https://github.com/pbrod/numdifftools/blob/master/numdifftools/run_benchmark.py</span></a></span><span style="color:rgb(31,73,125)"><u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:black"><u></u> </span></p></div></div></blockquote><div>Thanks for the information. This would help me better in understanding the pros and cons for various methods.</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div lang="EN-US" link="blue" vlink="purple"><div><p class="MsoNormal"><span style="color:black"><u></u></span></p>
<p class="MsoNormal"><span style="color:black"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="color:black">Personally I like the class interface better than the functional one because you can pass the resulting object as function to other methods/functions and these functions/methods do not need to know what it does
behind the scenes or what options are used. This simple use case is exemplified here:
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:black"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="color:black">>>> g = lambda x: 1./x<u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:black">>>> dg = Derivative(g, **options)<u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:black">>>> my_plot(dg)<u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:black">>>> my_plot(g)<u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:black"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="color:black">In order to do this with a functional interface one could wrap it like this:<u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:black"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="color:black">>>> dg2 = lambda x: fprime(g, x, **options)<u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:black">>>> my_plot(dg2)<u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:black"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="color:black">If you like the one-liner that the function gives, you could call the Derivate class like this
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:black"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="color:black">>>> Derivate(g, **options)(x)<u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:black"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="color:black">Which is very similar to the functional way:<u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:black">>>> fprime(g, x, **options)</span></p></div></div></blockquote><div><br></div><div>This is a really sound example for using classes. I agree that classes are better than functions with multiple arguments, and also the Object would e reusable for other evaluations.</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div lang="EN-US" link="blue" vlink="purple"><div><p class="MsoNormal"><span style="color:black"><u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:black"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="color:black">Another argument for having it as a class is that a function will be large and
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:10.5pt;font-family:Georgia,serif;color:rgb(32,32,32)">“<a href="http://mikeebert.tumblr.com/post/25998669005/large-functions-are-where-classes-go-to-hide" target="_blank"><span style="color:rgb(32,32,32);text-decoration:none">large functions
are where classes go to hide</span></a>”. This is a quote of Uncle Bob’s that we hear frequently in the third and fourth <a href="http://www.cleancoders.com/" target="_blank"><span style="color:rgb(15,111,159);text-decoration:none">Clean Coders</span></a> episodes. He states that
when a function starts to get big it’s most likely doing too much— a function should do one thing only and do that one thing well. Those extra responsibilities that we try to cram into a long function (aka method) can be extracted out into separate classes
or functions.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:black"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="color:black">The implementation in <a href="https://github.com/pbrod/numdifftools/blob/master/numdifftools/nd_cstep.py" target="_blank">
<span style="color:black">https://github.com/pbrod/numdifftools/blob/master/numdifftools/nd_cstep.py</span></a></span> is an attempt to do this.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">For the use case where n>=1 and the Richardson/Romberg extrapolation method, I propose to factor this out in a separate class e.g. :<u></u><u></u></p>
<p class="MsoNormal">>>> class NDerivative(object):<u></u><u></u></p>
<p class="MsoNormal">…. def __init__(self, f, n=1, method=’central’, order=2, …**options):<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">It is very difficult to guarantee a certain accuracy for derivatives from finite differences. In order to get error-estimates for the derivatives one must do several functions evaluations. In my experience with numdifftools it is very difficult
to know exactly which step-size is best. Setting it too large or too small are equally bad and difficult to know in advance. Usually there is a very limited window of useful step-sizes which can be used for extrapolating the evaluated differences to a better
final result. The best step-size can often be found around (10*eps)**(1./s)*maximum(log1p(abs(x)), 0.1) where s depends on the method and derivative order. Thus one cannot improve the results indefinitely by adding more terms. With finite differences you
can hope the chosen sampling scheme gives you reasonable values and error-estimates, but many times, you just have to accept what you get. <u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Regarding the proposed API I wonder how useful the input arguments epsabs, epsrel will be?</p></div></div></blockquote><div>I was just then tinkering about controlling the absolute and relative errors of the derivative, but now it seems like we should just let the methods to take care of it.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div lang="EN-US" link="blue" vlink="purple"><div><p class="MsoNormal">
<u></u><u></u></p>
<p class="MsoNormal">I also wonder how one can compute the outputs abserr_round, abserr_truncate accurately?</p></div></div></blockquote><div>This idea was from the implementation in <a href="https://github.com/ampl/gsl/blob/master/deriv/deriv.c#L59">this</a> function. I am not sure of how accurate the errors would be, but I suppose this is possible to implement.</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div lang="EN-US" link="blue" vlink="purple"><div><p class="MsoNormal">
<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Best regards<u></u><u></u></p>
<p class="MsoNormal" style="line-height:12pt"><b><span style="font-size:9pt;font-family:Verdana,sans-serif;color:rgb(31,73,125)">Per A. Brodtkorb<u></u><u></u></span></b></p>
<p class="MsoNormal"><u></u><br></p></div></div></blockquote><div>Regarding the API, after some discussion, the class implementation would be something like</div><div><br></div><div><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:12pt;font-family:'Times New Roman',serif"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)">Derivative()<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:12pt;font-family:'Times New Roman',serif"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)"> Def __init__(f, h=None, method=’central’, full_output=False)<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:12pt;font-family:'Times New Roman',serif"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)"> Def __call__(self, x, *args, **kwds)<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:12pt;font-family:'Times New Roman',serif"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)"><u></u> <u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:12pt;font-family:'Times New Roman',serif"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)">Gradient():<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:12pt;font-family:'Times New Roman',serif"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)"> Def __init__(f, h=None, method=’central’, full_output=False)<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:12pt;font-family:'Times New Roman',serif"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)"> Def __call__(self, x, *args, **kwds)<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:12pt;font-family:'Times New Roman',serif"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)"><u></u> <u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:12pt;font-family:'Times New Roman',serif"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)">Jacobian():<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:12pt;font-family:'Times New Roman',serif"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)"> Def __init__(f, h=None, method=’central’, full_output=False)<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:12pt;font-family:'Times New Roman',serif"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)"> Def __call__(self, x, *args, **kwds)<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:12pt;font-family:'Times New Roman',serif"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)"><u></u> <u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:12pt;font-family:'Times New Roman',serif"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)">Hessian():<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:12pt;font-family:'Times New Roman',serif"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)"> Def __init__(f, h=None, method=’central’, full_output=False)<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:12pt;font-family:'Times New Roman',serif"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)"> Def __call__(self, x, *args, **kwds)</span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:12pt;font-family:'Times New Roman',serif"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)"><br></span></p><p class="MsoNormal" style="color:rgb(80,0,80);font-size:12.8000001907349px"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)">NDerivative():<u></u><u></u></span></p><p class="MsoNormal" style="color:rgb(80,0,80);font-size:12.8000001907349px"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)"> Def __init__(f, n=1, h=None, method=’central’, full_output=False, **options)<u></u><u></u></span></p><p class="MsoNormal" style="color:rgb(80,0,80);font-size:12.8000001907349px"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)"> Def __call__(self, x, *args, **kwds)<u></u><u></u></span></p><p class="MsoNormal" style="color:rgb(80,0,80);font-size:12.8000001907349px"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)"><u></u> <u></u></span></p><p class="MsoNormal" style="color:rgb(80,0,80);font-size:12.8000001907349px"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)">Where options could be<u></u><u></u></span></p><p class="MsoNormal" style="color:rgb(80,0,80);font-size:12.8000001907349px"><span style="font-size:11pt;font-family:Calibri,sans-serif;color:rgb(31,73,125)">Options = dict(order=2, Romberg_terms=2</span><span style="font-size:10pt;font-family:Consolas;color:black">)</span></p><p class="MsoNormal" style="color:rgb(80,0,80);font-size:12.8000001907349px"><span style="font-size:10pt;font-family:Consolas;color:black"><br></span></p><p class="MsoNormal" style="color:rgb(80,0,80);font-size:12.8000001907349px"><span style="color:rgb(34,34,34);font-size:small">I would like to hear opinion on this implementation, where the main issues are</span><br></p><p class="MsoNormal" style></p><ol style><li style>whether the h=None default would mean best step-size found using by around <b>(10*eps)**(1./s)*maximum(log1p(abs(x)), 0.1)</b> where s depends on the method and derivative order or <b>StepGenerator</b>, based on epsilon algorithm by wynn.</li><li style>Whether the *args and **kwds should be in __init__ or __call__, the preference by Perk was for it being in __call__ makes these object compatible with<font color="#1f497d"><span style="font-size:14.6666669845581px"> </span></font><font face="arial, helvetica, sans-serif"><b style="font-size:12.8000001907349px"><span style="font-size:10pt;color:rgb(51,51,51);background-image:initial;background-repeat:initial">scipy.optimize.</span></b><b style="font-size:12.8000001907349px"><span style="color:rgb(51,51,51);background-image:initial;background-repeat:initial">minimize</span></b><b style="font-size:12.8000001907349px"><span style="font-size:13.5pt;color:rgb(51,51,51);background-image:initial;background-repeat:initial">(</span></b><i style="font-size:12.8000001907349px"><span style="font-size:10pt;color:rgb(51,51,51);background-image:initial;background-repeat:initial">fun</span></i><b style="font-size:12.8000001907349px"><span style="font-size:10pt;color:rgb(51,51,51);background-image:initial;background-repeat:initial">, </span></b><i style="font-size:12.8000001907349px"><span style="font-size:10pt;color:rgb(51,51,51);background-image:initial;background-repeat:initial">x0</span></i><b style="font-size:12.8000001907349px"><span style="font-size:10pt;color:rgb(51,51,51);background-image:initial;background-repeat:initial">, </span></b><i style="font-size:12.8000001907349px"><span style="font-size:10pt;color:rgb(51,51,51);background-image:initial;background-repeat:initial">args=()</span></i><b style="font-size:12.8000001907349px"><span style="font-size:10pt;color:rgb(51,51,51);background-image:initial;background-repeat:initial">, </span></b><i style="font-size:12.8000001907349px"><span style="font-size:10pt;color:rgb(51,51,51);background-image:initial;background-repeat:initial">method=None</span></i><b style="font-size:12.8000001907349px"><span style="font-size:10pt;color:rgb(51,51,51);background-image:initial;background-repeat:initial">, </span></b><i style="font-size:12.8000001907349px"><span style="font-size:10pt;color:rgb(51,51,51);background-image:initial;background-repeat:initial">jac=None</span></i><b style="font-size:12.8000001907349px"><span style="font-size:10pt;color:rgb(51,51,51);background-image:initial;background-repeat:initial">, </span></b><i style="font-size:12.8000001907349px"><span style="font-size:10pt;color:rgb(51,51,51);background-image:initial;background-repeat:initial">hess=None</span></i><span style="font-size:12.8000001907349px"><span style="font-size:10pt;color:rgb(51,51,51);background-image:initial;background-repeat:initial"><b>,…..) </b>where the args are passed both to the function and jac/hess if they are supplied.</span></span></font></li><li style><font face="arial, helvetica, sans-serif"><span style="font-size:12.8000001907349px"><span style="font-size:10pt;color:rgb(51,51,51);background-image:initial;background-repeat:initial">Are the input arguments for the __init__ sufficient ?</span></span></font></li><li style><font color="#333333" face="arial, helvetica, sans-serif"><span style="font-size:13.3333330154419px">What should we compute and return for full_output=True, I was thinking of the following options :</span></font></li></ol><p></p><p style="margin-right:0cm;margin-bottom:7.5pt;margin-left:0cm;line-height:19.2pt"><em><span style="font-size:9pt;font-family:Arial,sans-serif;color:rgb(31,73,125)">x</span></em><span style="font-size:9pt;font-family:Arial,sans-serif;color:rgb(31,73,125)">: <u>ndarray</u> solution array,</span></p><p style="margin-right:0cm;margin-bottom:7.5pt;margin-left:0cm;line-height:19.2pt"><em style="line-height:19.2pt;color:rgb(31,73,125);font-family:Arial,sans-serif;font-size:9pt">success :</em><span style="line-height:19.2pt;color:rgb(31,73,125);font-family:Arial,sans-serif;font-size:9pt"> </span><u style="line-height:19.2pt;color:rgb(31,73,125);font-family:Arial,sans-serif;font-size:9pt">bool</u><span style="line-height:19.2pt;color:rgb(31,73,125);font-family:Arial,sans-serif;font-size:9pt"> a flag indicating if the derivative was calculated successfully</span><span style="line-height:19.2pt;color:rgb(31,73,125);font-family:Arial,sans-serif;font-size:9pt"> </span><em style="line-height:19.2pt;color:rgb(31,73,125);font-family:Arial,sans-serif;font-size:9pt">message</em><span style="line-height:19.2pt;color:rgb(31,73,125);font-family:Arial,sans-serif;font-size:9pt"> : </span><u style="line-height:19.2pt;color:rgb(31,73,125);font-family:Arial,sans-serif;font-size:9pt">str</u><span style="line-height:19.2pt;color:rgb(31,73,125);font-family:Arial,sans-serif;font-size:9pt"> which describes the cause of the error, if occurred</span><span style="line-height:19.2pt;color:rgb(31,73,125);font-family:Arial,sans-serif;font-size:9pt"> </span><em style="line-height:19.2pt;color:rgb(31,73,125);font-family:Arial,sans-serif;font-size:9pt">nfev </em><span style="line-height:19.2pt;color:rgb(31,73,125);font-family:Arial,sans-serif;font-size:9pt">: </span><u style="line-height:19.2pt;color:rgb(31,73,125);font-family:Arial,sans-serif;font-size:9pt">int</u><span style="line-height:19.2pt;color:rgb(31,73,125);font-family:Arial,sans-serif;font-size:9pt"> number of function evaluations</span><span style="line-height:19.2pt;color:rgb(31,73,125);font-family:Arial,sans-serif;font-size:9pt"> </span></p><p style="margin-right:0cm;margin-bottom:7.5pt;margin-left:0cm;line-height:19.2pt"><em style="line-height:19.2pt;color:rgb(31,73,125);font-family:Arial,sans-serif;font-size:9pt">abserr_round </em><span style="line-height:19.2pt;color:rgb(31,73,125);font-family:Arial,sans-serif;font-size:9pt"> : </span><u style="line-height:19.2pt;color:rgb(31,73,125);font-family:Arial,sans-serif;font-size:9pt">float</u><span style="line-height:19.2pt;color:rgb(31,73,125);font-family:Arial,sans-serif;font-size:9pt"> </span><span style="line-height:19.2pt;color:rgb(31,73,125);font-family:Arial,sans-serif;font-size:9pt">absolute value of the roundoff error, if applicable</span><em style="line-height:19.2pt"><span style="font-size:9pt;font-family:Arial,sans-serif;color:rgb(31,73,125)"> abserr_truncate </span></em><span style="line-height:19.2pt;font-size:9pt;font-family:Arial,sans-serif;color:rgb(31,73,125)">: <u>float</u> absolute value of the truncation error, if applicable</span></p></div><div>I<span style="color:rgb(51,51,51);font-family:arial,helvetica,sans-serif;font-size:13.3333330154419px">t would be great any other opinions and suggestions on this.</span></div><div><span style="color:rgb(51,51,51);font-family:arial,helvetica,sans-serif;font-size:13.3333330154419px"><br></span></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div lang="EN-US" link="blue" vlink="purple"><div><p class="MsoNormal"></p><div><div><div><span class="">
<div>
<p class="MsoNormal">_______________________________________________<br></p></div></span></div></div></div></div></div>
SciPy-Dev mailing list<br>
<a href="mailto:SciPy-Dev@scipy.org">SciPy-Dev@scipy.org</a><br>
<a href="http://mail.scipy.org/mailman/listinfo/scipy-dev" target="_blank">http://mail.scipy.org/mailman/listinfo/scipy-dev</a><br>
<br></blockquote><div lang="EN-US" link="blue" vlink="purple"><span class=""><p class="MsoNormal"><br></p><p class="MsoNormal">Cheers,</p><p class="MsoNormal">Maniteja.</p><p class="MsoNormal">_______________________________________________<br></p></span></div>SciPy-Dev mailing list<br><a href="mailto:SciPy-Dev@scipy.org">SciPy-Dev@scipy.org</a><br><a href="http://mail.scipy.org/mailman/listinfo/scipy-dev" target="_blank">http://mail.scipy.org/mailman/listinfo/scipy-dev</a><br><div> </div></div><br></div></div></div></div>