Question

I'm trying to add some equality and inequality constraints to my minimization problem. I am using nlopt Python API.

In particular I would like to add some vector-valued constraints. My code looks like this example:

def eqconstr(result,x,grad):
    if grad.size > 0:
            print "gradient to be implemented"
    for i in range(len(x)):
            if condition: result[i] = 0.

initvect = # some initial guess of the parameters
opt = nlopt.opt(nlopt.LN_PRAXIS,len(initvect))
opt.set_min_objective(function)

tol = np.asarray([0.1]*len(initvect))
opt.add_equality_mconstraint(eqconstr, tol)    # this is the call of the constraints (!!!)

opt.set_lower_bounds(-1.) # other parameters to set. not important for this question
opt.set_upper_bounds(1.)
opt.set_initial_step([0.1]*len(initvect))
opt.set_xtol_abs(10e-6)
opt.set_ftol_abs(10e-6)
res = opt.optimize(initvect)

This follows precisely the instructions in the nlopt wiki. Now if I run this I get:

Traceback (most recent call last):
  File "main.py", line 158, in <module>
    opt.add_equality_mconstraint(eqconstr, tol) 
  File "/usr/local/lib/python2.7/dist-packages/nlopt.py", line 269, in add_equality_mconstraint
    def add_equality_mconstraint(self, *args): return _nlopt.opt_add_equality_mconstraint(self, *args)
ValueError: nlopt invalid argument
Was it helpful?

Solution

Make sure that your function eqcontr has the same form as your objective function function. Maybe post it as well, so it'll be easy to understand. Also, I cannot see where condition is defined.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top