[SciPy-dev] Python interface to COBYLA
Jean-Sebastien Roy
js at jeannot.org
Thu Apr 15 14:52:49 EDT 2004
Pearu Peterson wrote:
> Please, let us know what are these problems with FreeBSD. I am sure there
> is a easy fix.
I had installed the version in the FreeBSD ports ("2.37.233.1545").
Running: python setup.py build_ext --inplace
Returned:
running build_ext
error: Fortran compiler not available: None
I have now installed the latest version (no port is available for it on
FreeBSD), an it worked fine besides apparently harmful errors such as:
Could not locate executable
/usr/home/js/devel/optimisation/cobyla2_f/cobyla-0.1/g77
or:
invalid command 'build_src' (no module named 'distutils.command.build_src')
(on a side note, is it possible to get f2py messages in black instead of
yellow (the color I'm seeing on my machine) which is very difficult to
read on white background ?)
> The example wrapper to Fortran COBYLA2 code is attached (feel free to
> suggest changes to the interface).
Many thanks ! It's obviously much simpler than writting a custom C wrapper.
About changes to the interface, only a few things may be missing :
maxfun is also a value to be returned (it's the number of iterations
effectively done). Also, the reason for exiting COBYLA should be
returned, as else optimization may fail without warning the caller
(beside a printed message). This may require modifications to the
Fortran source.
Is it normal that the Fortran Wrapper does not complain when None is
returned by the python function instead of a float ?
> Bugs: when setting maxfun value higher than 10, the fortran code seem end
> up into an infinite loop. Not sure what is going wrong.
FWIW, I cannot reproduce this bug, neither in my nor in your wrapper,
which seems to run fine on my machine.
Nevertheless, when trying a nested optimization problem, I encountered
an error I cannot explain. Please find below a simple example:
import cobyla
def f1(x, con):
global a
f = (x[0]-a)**2
return f
def f2(x, con):
global a
a = x[0]
z = cobyla.minimize(f1, m=0, x=[0], iprint =
1,rhobeg=0.5,rhoend=1e-6,maxfun=100)
f = z[0]**2+abs(x[1])**3
return f
print cobyla.minimize(f2, m=0, x=[1,1], iprint =
1,rhobeg=0.5,rhoend=1e-4,maxfun=1000)
Returns:
Normal return from subroutine COBYLA
NFVALS = 23 F = 1.000000E-12 MAXCV = 0.000000E+00
X = 1.000001E+00
capi_return is NULL
Call-back cb_calcfc_in_cobyla__user__routines failed.
Traceback (most recent call last):
File "tst5.py", line 18, in ?
print cobyla.minimize(f2, m=0, x=[1,1], iprint =
1,rhobeg=0.5,rhoend=1e-4,maxfun=1000)
File "tst5.py", line 10, in f2
z = cobyla.minimize(f1, m=0, x=[0], iprint =
1,rhobeg=0.5,rhoend=1e-6,maxfun=100)
TypeError: minimize argument calcfc must be callable
This doesn't seem to happen with the C wrapper.
Regards,
js
More information about the SciPy-Dev
mailing list