# [SciPy-dev] Multiple constraints in fmin_cobyla

David M. Cooke cookedm at physics.mcmaster.ca
Tue Nov 8 11:10:26 CST 2005

Nils Wagner <nwagner at mecha.uni-stuttgart.de> writes:

> Robert Kern wrote:
>>Nils Wagner wrote:
>>
>>>Robert Kern wrote:
>>>
>>>
>>>>Nils Wagner wrote:
>>>>
>>>>
>>>>
>>>>>Hi all,
>>>>>
>>>>>How can I apply multiple constraints (e.g. all design variables x \in
>>>>>\mathds{R}^n should be positive) in fmin_cobyla ?
>>>>>
>>>>>x_opt=optimize.fmin_cobyla(func, x, cons, args=(), consargs=(),maxfun=1200)
>>>>>
>>>>>def cons(x):
>>>>>
>>>>>  ?????
>>>>>
>>>>>
>>>>The documentation is pretty clear:
>>>>
>>>>  cons     -- a list of functions that all must be >=0 (a single function
>>>>              if only 1 constraint)
>>>>
>>>I am aware of the help function :-)
>>>Anyway, how do I define a l i s t of functions ?
>>>
>>
>>It's a regular Python list which contains functions. I can't make it any
>>clearer than that. This is pretty fundamental stuff.
>>
>>def cons0(x):
>>  return x[0]
>>
>>def cons1(x):
>>  return x[1]
>>
>>x_opt = optimize.fmin_cobyla(func, x, [cons0, cons1])
>>
>>
> Thank you for the note.
> Now assume that we have 10^3 constraints. Is there any better way than
> typing
> def cons0(x):
>    return x[0]
> .
> .
> .
> def cons999(x):
>      return x[999]

I've gone and redone the code (revision 1426 in the newscipy branch)
so that it requires a generic sequence instead: something that you can
do len() of, and that you can iterate over [*]. So you could pass an
instance of a class like this (untested):

class Contraint:
def __init__(self, constraintList):
self.constraintList = constraintList
def __len__(self):
return len(self.constraintList)
def __getitem__(self, i):
def c(x):
# some parameterized constraint
return self.constraintList[i] * x[i]**2
return c

[*] yes, that means dictionaries can be passed. Don't do that: the
sequence of contraints has to remain in the same order.

--
|>|\/|<
/--------------------------------------------------------------------------\
|David M. Cooke                      http://arbutus.physics.mcmaster.ca/dmc/
|cookedm at physics.mcmaster.ca