4

When I run the following simple NLOPT example in python :

import numpy as np
import nlopt 

n = 2
localopt_feval_max = 10
lb = np.array([-1, -1])
ub = np.array([1, 1])


def myfunc(x, grad):
    return -1

opt = nlopt.opt(nlopt.LN_NELDERMEAD, n)

opt.set_lower_bounds(lb)
opt.set_upper_bounds(ub)
opt.set_maxeval(localopt_feval_max)

opt.set_min_objective(myfunc)
opt.set_xtol_rel(1e-8)
x0 = np.array([0,0])

x = opt.optimize(x0)

I get an error:

"ValueError: nlopt invalid argument"

The only suggestion given by the reference here:

http://ab-initio.mit.edu/wiki/index.php/NLopt_Python_Reference

is that the lower bounds might be bigger than the upper bounds, or there is an unknown algorithm (neither of which is the case here). I am running the following versions of Python, NLOPT, and NumPy

>>> sys.version
'3.4.0 (default, Apr 11 2014, 13:05:11) \n[GCC 4.8.2]'
>>> nlopt.__version__
'2.4.2'
>>> np.__version__
'1.8.2'
Warren Weckesser
  • 110,654
  • 19
  • 194
  • 214
jmlarson
  • 837
  • 8
  • 31

2 Answers2

5

By changing the function declaration to

def myfunc(x, grad):
    return -1.0

everything works. So NLopt can not handle objectives that return python integer instead of float

I feel like NLopt should be able to cast integer objective function values as float. If not this, then at least a TypeError should be raised instead of a ValueError: nlopt invalid argument.

jmlarson
  • 837
  • 8
  • 31
1

I got this error because of my objective function return type was numpy.float128 so I fixed the error by changing the return type to numpy.float64

Elmira Birang
  • 71
  • 1
  • 6