numericalalgorithmsgroup / pybobyqa

Python-based Derivative-Free Optimization with Bound Constraints
https://numericalalgorithmsgroup.github.io/pybobyqa/
GNU General Public License v3.0
77 stars 18 forks source link

Use of correlation information #3

Open cmbant opened 5 years ago

cmbant commented 5 years ago

This it not really a bug - the code seems to work well (thank you, it looks useful)- but it feels as though there ought to be a way to use information about the local correlation structure of the variables. e.g. I usually run minimization after also running an MCMC, at which point I can make a guess at the local covariance. In some cases one or more parameters are very tightly correlated for physical reasons, and BOBYQA is rather inefficient/unstable if you don't use this information. If the problem is unbounded you can of course just rotate the parameter space, but with bounds, BOBYQA does not support bounds on linear parameter combinations, only on individual parameters, so you can't then impose the bounds consistently. So a) could the function return value support a None value to indicate "out of bounds" very generally, or b) could it be generalized to support bounds on a rotated parameter basis rather than the original parameters? or c) if not, could it at least support an input guess at the local covariance/Hessian which could be used instead of random directions to exploit known degeneracy structure. More generally is there something like LINCOA that could also be added to support more general constraint bounds?

[

lindonroberts commented 5 years ago

Hi, thanks for the suggestion. I agree it would be a good idea to be able to support bound constraints on rotated coordinates. I've started looking into incorporating the methods from LINCOA to handle general linear constraints, as this is the best long-term solution, but this won't be ready for a little while.

For now, my suggestion would be similar to your (a) option - if a value is out of bounds in the rotated basis, return a very large value. You could either use a fixed value (simple) or something like a quadratic penalty function.

cmbant commented 5 years ago

Thanks, great you are looking at it. I've found that in practice just returning a fixed large number for out of bounds doesn't really work reliably; I guess the algorithm would need to internally set the large number based on the recent properties of the quadratic model for it to do something sensible in general.