<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Mar 14, 2015 at 4:53 PM, Maniteja Nandana <span dir="ltr"><<a href="mailto:maniteja.modesty067@gmail.com" target="_blank">maniteja.modesty067@gmail.com</a>></span> wrote:<br><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">Hi everyone,<div><br></div><div>I was hoping if I could get some suggestions regarding the API for <b>scipy.diff</b> package. </div><div><ol><li>Type of input to be given - callable function objects or a set of points as in scipy.integrate.</li></ol></div></div></blockquote><div>I would expect functions. <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><ol><li>Parameters to be given to derivative methods, like <b>method </b>(as in scipy.optimize) to accommodate options like <i>central, forward, backward, complex or richardson.</i></li></ol></div></div></blockquote><div>There may be a lot of parameters that make sense, depending on the exact differentiation method(s) used. I think it's important to think about which ones will be used regularly, and which are only for niche usecases or power users that really understand the methods. Limit the number of parameters, and provide some kind of configuration object to tweak detailed behavior.<br><br></div><div>This is the constructor of numdifftools.Derivative, as an example of too many params:<br><br>    def __init__(self, fun, n=1, order=2, method='central', romberg_terms=2,<br>                 step_max=2.0, step_nom=None, step_ratio=2.0, step_num=26,<br>                 delta=None, vectorized=False, verbose=False,<br>                 use_dea=True):<br><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><ol><li>The maximum order of derivative needed ? Also the values of order <b>k</b> used in the basic method to determine the truncation error O(h^k) ?</li><li>API defined in terms of functions(as in statsmodels) or classes(as in numdifftools) ?</li></ol></div></div></blockquote><div>No strong preference, as long as it's a coherent API. The scipy.optimize API (minimize, root) is nice, something similar but as classes is also fine.<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><ol><li>Return type of the methods should contain the details of the result, like <i>error </i>?( on lines of OptimizeResult, as in scipy.optimize )</li></ol></div></div></blockquote><div>I do have a strong preference for a Results object where the number of return values can be changed later on without breaking backwards compatibility. <br><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><div>I would really appreciate some feedback and suggestions on these issues. The whole draft of the proposal can be seen <a href="https://github.com/maniteja123/GSoC/wiki/Proposal%3A-add-finite-difference-numerical-derivatives-as-%60%60scipy.diff%60%60" target="_blank">here</a>.</div></div></div></blockquote><div><br></div><div>Regarding your "to be discussed" list:<br></div><div>- Don't worry about the module name (diff/derivative/...), this can be changed easily later on.<br></div><div>- Broadcasting: I'm not sure what needs to be broadcasted. If you provide a function and the derivative order as int, that seems OK to me.<br></div><div>- Parallel evaluation should be out of scope imho.<br></div><div><br></div><div>Cheers,<br></div><div>Ralf<br><br><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><br></div><div>Thanks for reading along and giving your valuable inputs.</div><div><br></div><div>Cheers,</div><div>Maniteja.</div></div><div class=""><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Mar 11, 2015 at 11:44 PM, Maniteja Nandana <span dir="ltr"><<a href="mailto:maniteja.modesty067@gmail.com" target="_blank">maniteja.modesty067@gmail.com</a>></span> wrote:<br><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">Hi everyone, <div><br></div><div>I have created a <a href="https://github.com/maniteja123/GSoC/wiki/" target="_blank">Wiki</a> page and <a href="https://github.com/maniteja123/GSoC/wiki/Proposal:-add-finite-difference-numerical-derivatives-as-%60%60scipy.diff%60%60" target="_blank">draft proposal</a> regarding some approaches for API implementation for scipy.diff package after discussing with Christoph Deil. I would really appreciate some feedback and suggestions to incorporate more sound and concrete ideas into the proposal. I also wanted to ask if it would be better to start a wiki page regarding this on scipy repository. I thought it would be better to do so once the proposal is more concrete.</div><div><br></div><div>Thanks again for reading along my proposal and waiting in anticipation for your suggestions.<br></div><div><br></div><div>Cheers,</div><div>Maniteja</div><span><div>_______________________________________________<br>SciPy-Dev mailing list<br><a href="mailto:SciPy-Dev@scipy.org" target="_blank">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></span><div><div><div><br><div class="gmail_extra"><div class="gmail_quote">On Mon, Mar 9, 2015 at 12:23 PM, Ralf Gommers <span dir="ltr"><<a href="mailto:ralf.gommers@gmail.com" target="_blank">ralf.gommers@gmail.com</a>></span> wrote:<br><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>Hi Maniteja,<br><br></div><div><div><div class="gmail_extra"><br><div class="gmail_quote"><span>On Fri, Mar 6, 2015 at 1:12 PM, Maniteja Nandana <span dir="ltr"><<a href="mailto:maniteja.modesty067@gmail.com" target="_blank">maniteja.modesty067@gmail.com</a>></span> wrote:<br><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_extra"><div style="font-size:12.8px"><span style="font-size:12.8px">Hello everyone,</span></div><div style="font-size:12.8px"><span style="font-size:12.8px"><br></span></div><div style="font-size:12.8px">I am writing this mail to enquire about implementing numerical differentiation package in scipy.</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">There have been discussions before (Issue <a href="https://github.com/scipy/scipy/issues/2035" target="_blank">#2035</a>) and some PRs (PR <a href="https://github.com/scipy/scipy/pull/2835" target="_blank">#2835</a>) to include tools to compute derivatives in scipy.</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">According to the comments made in them, as far as I can understand, I see that there are some ways to do derivatives on the computer with varying  generality and accuracy ( by <a href="https://github.com/scipy/scipy/issues/2035#issuecomment-23628615" target="_blank">Alex Griffing</a> ) :</div><div><ol><li><span style="font-size:12.8px">1st order derivatives of special functions</span></li><li><span style="font-size:12.8px">derivatives of univariate functions</span></li><li><span style="font-size:12.8px">symbolic differentiation</span></li><li><span style="font-size:12.8px">numerical derivatives - finite differences</span></li><li><span style="font-size:12.8px">automatic or algorithmic differentiation</span></li></ol></div><div style="font-size:12.8px"><span style="font-size:12.8px">Clearly, as suggested in the thread, the 1st option is already done in functions like <i>jv</i> and <i>jvp</i> in <b>scipy.special. </b></span></div><div style="font-size:12.8px"><span style="font-size:12.8px"><br></span></div><div style="font-size:12.8px"><span style="font-size:12.8px">I think everyone agreed that symbolic derivatives is out of scope of scipy. </span></div></div></div></blockquote><div><br></div></span><div>Definitely, symbolic anything is out of scipy for scipy:)<br> <br></div><span><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_extra"><div style="font-size:12.8px"><span style="font-size:12.8px"></span></div><div style="font-size:12.8px"><span style="font-size:12.8px">Though I would like to hear more about the univariate functions.</span></div><div style="font-size:12.8px"><span style="font-size:12.8px"><br></span></div><div style="font-size:12.8px"><span style="font-size:12.8px">Coming to finite differences, the modules described there, <b>statsmodels </b>and <b>numdifftools, </b>they vary in aspects of speed and accuracy, in terms of approaches followed as mentioned in <a href="https://github.com/scipy/scipy/pull/2835#issuecomment-52372036" target="_blank">Joseph Perktold comment</a></span></div><div><ul><li><span style="font-size:12.8px"><b>Statsmodels </b>used complex step derivatives, which are for first order derivatives and have only truncation error, </span><span style="font-size:12.8px">no roundoff error since there is no subtraction.</span></li><li><span style="font-size:12.8px"><b>Numdifftools </b>uses adaptive step-size to calculate finite differences, but will suffer from dilemma to choose small step-size to reduce truncation error but at the same time avoid subtractive cancellation at too small values</span></li></ul><div><span style="font-size:12.8px">I have read the papers used by both the implementations:</span></div><div><span style="font-size:12.8px"> <b>Statsmodels </b><a href="https://drive.google.com/file/d/0BwUeCS0FJLRucXdCc1JOTEY0cGc/view?usp=sharing" target="_blank">Statistical applications of the complex-step method of numerical differentiation, Ridout, M.S.</a></span></div><div><span style="font-size:12.8px"> <b>Numdifftools </b>The pdf attached in the github repository <a href="https://drive.google.com/file/d/0BwUeCS0FJLRuYW1MNlp2enJCaHM/view?usp=sharing" target="_blank">DERIVEST.pdf</a></span></div><div><br></div><div><span style="font-size:12.8px">Just pointing out in this platform, I think there is an error in equation 13 in DERIVEST, It should be </span></div><div><span style="color:rgb(80,0,80);font-size:12.8px"><br></span></div><div><span style="color:rgb(80,0,80);font-size:12.8px">f'-0() = 2f'-delta/2() - f'-delta(),  instead of </span><span style="color:rgb(80,0,80);font-size:12.8px">f'-0() = 2f'-delta() - f'-delta/2()</span></div><span style="color:rgb(80,0,80);font-size:12.8px"><div><span style="color:rgb(80,0,80);font-size:12.8px"><br></span></div>as also correctly mentioned in the matlab code that followed the equation</span></div></div></div></blockquote><div><br></div></span><div>You may want to let the author know, he'll probably appreciate it.<br> <br></div><span><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_extra"><div><font color="#500050"><span style="font-size:12.8px"></span></font><div><span style="font-size:12.8px">As much as my understanding from the discussions goes, the statsmodels implementation uses elegant broadcasting. Though I get the idea seeing the code, I would really appreciate some examples that clearly explain this.</span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">Also the complex-step method is only for first order derivatives and that function is analytic, so that Cauchy-Riemann equations are valid. So, is it possible to differentiate any function with this ?</span><br><br></div><div><span style="font-size:12.8px">Also as I was discussing with Christoph Deil, the API implementation issue of whether to use classes, as in numdifftools or as functions, as in statsmodels came to the fore. Though I am not an expert in it, I would love to hear some suggestions on it.</span></div></div></div></div></blockquote><div><br></div></span><div>It will be important to settle on a clean API. There's no general preference for classes or functions in Scipy, the pros/cons have to be looked at in detail for this functionality. The scope of the scipy.diff project is quite large, so starting a document (as I think you've already discussed with Christoph?) outlining the API that can be reviewed will be a lot more efficient than trying to do it by email alone.<br> <br></div><span><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_extra"><div style="font-size:12.8px"><span style="font-size:12.8px"></span></div><div style="font-size:12.8px"><span style="font-size:12.8px">Though at this point AD seems ahead of time, it is powerful in forward and reverse methods, moreover complex-step is somewhat similar to it. The packages <b>ad </b>and <b>algopy </b>use AD. Also, there were concerns with interfacing these methods with C/ Fortran functions. </span><span style="font-size:12.8px">It would also be great if there could be suggestions regarding whether to implement these methods.</span><span style="font-size:12.8px"> </span></div></div></div></blockquote><div><br></div></span><div>It's been around for a while so not sure about "ahead of its time", but yes it can be powerful. It's a large topic though, should be out of scope for this GSoC project. Good finite difference methods will be challenging enough:) That doesn't mean that AD is out of scope for Scipy necessarily, but that's for another time to discuss.<br><br></div><span><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_extra"><div style="font-size:12.8px"></div><div style="font-size:12.8px">At the same time, it would be really helpful if any new methods or packages to be looked into could be suggested.</div></div></div></blockquote><div><br></div></span><div>I think what's in numdifftools and statsmodels is a good base to build on. What could be very useful in addition though is an indepent reference implementation of the methods you're working on. This could be Matlab/R/Julia functions or some package written by the author of a paper you're using. I don't have concrete suggestions now - you have a large collection of papers - but you could already check the papers you're using.<br><br></div><div>Cheers,<br></div><div>Ralf<br></div><span><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_extra"><div style="font-size:12.8px"></div><div style="font-size:12.8px">Waiting in anticipation for your feedback and response. Happy to learn :)</div><div><span style="font-size:12.8px">Thanks for reading along my lengthy mail. Please do correct if I did some mistake.</span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">I have attached the documents I have related to these issues, most importantly <b>The Complex-Step Derivative Approximation by </b></span><span style="font-size:12.8px"><b>JOAQUIM R. R. A. MARTINS</b></span></div><div><span style="font-size:12.8px"><b><br></b></span></div><div><span style="font-size:12.8px"><b><a href="https://drive.google.com/folderview?id=0BwUeCS0FJLRufnJaVko3MGpJX0Nud3R0dHgyc2JBYUgxVkhBTkNvbkhFQWZucmhWSzlaVVk&usp=sharing" target="_blank">Numerical differentiation</a></b></span></div><div><span style="font-size:12.8px"><br></span></div><div style="font-size:12.8px"><span style="font-size:12.8px">Cheers,</span></div><div style="font-size:12.8px"><span style="font-size:12.8px">Maniteja.</span></div><span><div style="font-size:12.8px"><span style="font-size:12.8px">______________________________</span><span style="font-size:12.8px">_________________</span><br style="font-size:12.8px"><span style="font-size:12.8px">SciPy-Dev mailing list</span><br></div><div style="font-size:12.8px"><a href="mailto:SciPy-Dev@scipy.org" style="font-size:12.8px" target="_blank">SciPy-Dev@scipy.org</a><br style="font-size:12.8px"><a href="http://mail.scipy.org/mailman/listinfo/scipy-dev" style="font-size:12.8px" target="_blank">http://mail.scipy.org/mailman/listinfo/scipy-dev</a></div></span></div></div>
</blockquote></span></div><br></div></div></div></div>
<br>_______________________________________________<br>
SciPy-Dev mailing list<br>
<a href="mailto:SciPy-Dev@scipy.org" target="_blank">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><br></div></div></div></div></div>
</blockquote></div><br></div>
</div></div><br>_______________________________________________<br>
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><br></div></div>