@filtered_optimizable

filtered_optimizable(filter, diff_filter)

A decorator for an Optimizable class for filtering optimization variables.

python
def filter(x): 
     # Perform some operation on x   

def diff_filter(x,v):    
    # returns v @ dfilter(x) where dfilter(x) is the Jacobian function   
    # of the filter

@filtered_optimizable(filter, diff_filter)
class problem(Optimizable):  
     def J(self, x): 
         #return something   

     def G(self, x): 
         # return something  

     #...

Then, a problem of the form

\[\begin{aligned} \min_{x\in \R^n}& \quad J(x)\\ \textrm{s.t.} & \left\{\begin{aligned} g_i(x)&=0, \text{ for all } 1\leqslant i\leqslant p,\\ h_j(x) &\leqslant 0, \text{ for all }1\leqslant j \leqslant q,\\ \end{aligned}\right. \end{aligned}\]

is converted into

\[\begin{aligned} \min_{x\in \R^n}& \quad J(\texttt{filter}(x))\\ \textrm{s.t.} & \left\{\begin{aligned} g_i(\texttt{filter}(x))&=0, \text{ for all } 1\leqslant i\leqslant p,\\ h_j(\texttt{filter}(x)) &\leqslant 0, \text{ for all }1\leqslant j \leqslant q,\\ \end{aligned}\right. \end{aligned}\]

Several decorators can be appended to implement successive composition of filters.

python
@filtered_optimizable(filter_2, diff_filter_2)
@filtered_optimizable(filter_1, diff_filter_1)
class problem(Optimizable):  
#...

In that case, J(x), G(x) will be replaced by J(filter_1(filter_2(x))), G(filter_1(filter_2(x))), etc…

Parameters:
  • filter – the filtering function.

  • diff_filter

    the transpose derivative operator of the filtering function. diff_filter(x,v) sould be equal to v @ dfilter(x) where dfilter is the Jacobian matrix of filter at x, in order to match the chain rule

    console
    d[J(filter(x))] @ dx =dJ(filter(x)) @ dfilter(x) @ dx