<div dir="ltr"><div dir="ltr"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, Sep 7, 2019 at 10:57 PM Andrew Nelson <<a href="mailto:andyfaff@gmail.com" target="_blank">andyfaff@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">I'd like to gauge the support for adding the global minimizers (dual_annealing, shgo, differential_evolution, basinhopping) as new `minimize` methods.<div><br></div><div>The problems the the 'local' and 'global' optimizers are trying to solve are very similar and both are specified in the same way, so my thought is that it would be nice to access them via the same unified interface that `minimize` offers (but not deprecating the `shgo` function, etc).<br clear="all"><div><br></div><div>It's important that the users are able to understand the distinction between local and global optimisation and how they go about finding a minimum. I'm hoping that this could be made plain in the documentation.</div><div><br></div><div>The change would allow the following:</div><div><br></div><div>```</div><div># global minimizer</div><div><div>minimize(func, x0, bounds=bounds, method='differential-evolution', constraints=constraints)</div></div><div><div># local minimizers</div><div>minimize(func, x0,  bounds=bounds, method='SLSQP', constraints=constraints)</div></div><div><div><div>minimize(func, x0, bounds=bounds, method='trust-constr', constraints=constraints)</div></div></div><div>minimize(func, x0, bounds=bounds, method='L-BFGS-B')</div><div>```</div><div><br></div><div>Please chip in with what your thoughts are, is it a bad idea, good idea, etc.</div><div><br></div>-- </div></div></blockquote><div> </div></div><div><br></div><div><div class="gmail_default"><span style="font-family:arial,helvetica,sans-serif">Personally, I find `minimize()` to be a bit unwieldy  I do understand the desire to make things simple and uniform, but I'm not sure `minimize()` is really doing that. </span><span style="font-family:arial,helvetica,sans-serif">Correct me if any of this is wrong, </span><span style="font-family:arial,helvetica,sans-serif">but the interface for the current `minimize()` has the following features:</span></div><div class="gmail_default"><br></div></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">  1. `minimize` takes 2 required arguments:  func, x0.  So far, so good. <br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><div class="gmail_default">  2. There are 14 named "methods" and a "custom object" method (which, arguably means that the "global" methods are already supported).<br></div></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">  3. There are 3 optional arguments used for all methods with sensible defaults: "args" , "tol" , and "callback". </div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">  4. The "method" argument is actually optional with the default used being a slightly complicated combination of other optional arguments. </div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">  5. There are 6 optional arguments that each depends on which "method" is used.  <br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">  6. Most but not all of the 14 methods support "jac". 4 of 6 options ("hess", "hessp", "bounds", "constraints") are supported by fewer than half the methods.<br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">  7. One of the 6 optional arguments is called "options" and holds keyword options specific to each method and not explicitly listed.</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><div class="gmail_default">  8. Some of the options in "options" (say, "eps", "ftol") are supported by more methods than some of the explicitly named optional arguments (say, "constraints").<br></div></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">  9. "constraints" is supported for 3 methods. It has 2 incompatible forms.<br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">  10. "bounds" can either be a tuple of (called "min", "max" in the docs) values or a "Bounds" object that has attributes "lb" and "ub".  Are "lower" and "upper" are too verbose?</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">  11. As if to stick a finger in your eye, "callback" requires a different signature for exactly one of the 14 methods.</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">It is all very well documented. But it is also extremely complicated.   And, honestly, not very good.</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">It seems to me that there are really 14 (or 15) different minimization methods.  The `minimize()` function smashes these all into one function with a jumble of options.  I think the idea was to emphasize the commonality of the interfaces, but the result sort of emphasizes what is not common among the methods.  Instead of creating a common way to say "Bounds", "Constraints", "Hessian", "Tolerance", "Max Number of Function Calls", or "Step Size" for all methods, it allows multiple variations and then works extra hard to document the differences.   <br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">How does this help the user (or person writing a wrapping library)?  Can the user just change the name of the method argument?  In a simple case that might work. But, in general, No, definitely not. Too many of the arguments change validity when the `method` is changed.  To the extent that the user could change "minimize(...., method='foo', ...)" to "minimize(...., method='bar', ...)", they could just as easily change "_minimize_foo(....)" to "_minimize_bar(...)".   That actually is less typing.</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><span style="font-family:Arial,Helvetica,sans-serif">I guess in a fatalistic sense, I would say "Sure, why not add more methods?  You aren't going to make it any worse".  Except that you will want to add more options that are not common to the other methods.  Differential evolution itself has a dozen or so "strategy" options ("strategy" being obviously different from "method", I guess).  There are "seeds" and "nworkers"  and "max number of iterations" (whatever "iteration" means for each method).  I do not know if any of these have uniform meaning; I guess not.  It looks to me like "callback" would have yet another variation.  </span><span style="font-family:Arial,Helvetica,sans-serif">And, eventually, you will want to deprecate the current working functions, breaking downstream code for the sake of a uniform API that really is not uniform. </span></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><span style="font-family:Arial,Helvetica,sans-serif"><br></span></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><span style="font-family:Arial,Helvetica,sans-serif">The minimization methods really are different.  They have different options.  IMO, it would be better to have one function per method and avoid the a sprawling mess of a dispatch function. </span><span style="font-family:Arial,Helvetica,sans-serif">It would be nice if the interfaces were as similar as possible, with similar concepts using consistent names and values.   </span></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><span style="font-family:Arial,Helvetica,sans-serif"><br></span></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><span style="font-family:Arial,Helvetica,sans-serif">I would definitely encourage a class-based Minimizer, but mostly in the sense of being able to use inheritance to make it easier to have a common interface across the different solvers:  so not one Minimizer, but a BaseMinizer and then PowellMinizer, BFGSMinimizer, KrylovMinimizer, etc.  I would suggest looking at the stats module and scikit-learn for inspiration.   And *then* make powell_minimize(), etc functions that create and use these.  Oh, and a Parameters class would be nice ;).  </span></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><span style="font-family:Arial,Helvetica,sans-serif"><br></span></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><span style="font-family:Arial,Helvetica,sans-serif">I have no expectation of being listened too. We'll all be able to work around the added complexity, just like we can sort of handle the similarly infuriating complexity of `least_squares` (by basically treating it as 3 separate functions).   </span></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><span style="font-family:Arial,Helvetica,sans-serif"><br></span></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><span style="font-family:Arial,Helvetica,sans-serif">Finally, I will say that I</span><span style="font-family:Arial,Helvetica,sans-serif"> am very glad to have `numpy.sin(x)`, `numpy.cos(x)`, etc instead of `</span><span style="font-family:Arial,Helvetica,sans-serif">numpy.ufunc(x, method='sin')`.</span></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><div class="gmail_default"></div></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">Sorry if that seems like a rant.</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">Cheers,</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><span style="font-family:Arial,Helvetica,sans-serif">--Matt</span></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><span style="font-family:Arial,Helvetica,sans-serif"><br></span></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><span style="font-family:Arial,Helvetica,sans-serif"><br></span></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><span style="font-family:Arial,Helvetica,sans-serif"><br></span></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><span style="font-family:Arial,Helvetica,sans-serif"><br></span></div></div>