python中的多参数优化

python中的多参数优化,python,optimization,constraints,Python,Optimization,Constraints,我将优化三个变量x,alpha和R。 X是一维向量,alpha是二维向量,R是标量值。如何最大化此功能? 我写了以下代码: #from scipy.optimize import least_squares from scipy.optimize import minimize import numpy as np sentences_lengths =[6, 3] length_constraint=5 sentences_idx=[0, 1] sentences_scores=[.1,.2]

我将优化三个变量
x
alpha
R
X
是一维向量,
alpha
是二维向量,
R
是标量值。如何最大化此功能? 我写了以下代码:

#from scipy.optimize import least_squares
from scipy.optimize import minimize
import numpy as np
sentences_lengths =[6, 3]
length_constraint=5
sentences_idx=[0, 1]
sentences_scores=[.1,.2]
damping=1
pairwise_idx=[(0,0),(0,1),(1,0),(1,1)]
overlap_matrix=[[0,.01],[.02,0]]
def func(x, R, alpha, sign=1.0):
    """ Objective function """
    return sign*(sum(x[i] * sentences_scores[i] for i in sentences_idx) - damping * R * sum(alpha[i][j] * overlap_matrix[i][j] for i,j in pairwise_idx))
x0=np.array([1,0])
R0=.1
alpha0=np.array([1,0,0,0])
def func_deriv(x, R, alpha, sign=1.0):
    """ Derivative of objective function """
    #Partial derivative to x
    dfdX = sign*(sum(sentences_scores[i] for i in sentences_idx))
    #Partial derivative to R
    dfdR= sign*(- damping * sum(alpha[i][j] * overlap_matrix[i][j] for i,j in pairwise_idx))
    #Partial derivative to alpha
    dfdAlpha= sign*(- damping * R * sum(alpha[i][j] * overlap_matrix[i][j] for i,j in pairwise_idx))
    return [ dfdX, dfdR,  dfdAlpha]

cons = ({'type': 'ineq',
         ## Constraints: one constraint for the size + consistency constraints
         #sum(x[i] * sentences_lengths[i] for i in sentences_idx) <= length_constraint
          'fun' : lambda x: length_constraint - sum(x[i] * sentences_lengths[i] for i in sentences_idx) ,
          'jac' : lambda x: [-sum(sentences_lengths[i] for i in sentences_idx), 0, 0]}
         ,{'type': 'ineq',
           #alpha[i][j] - x[i] <= 0
          'fun' : lambda x: [x[i]-alpha[i][j] for i,j in pairwise_idx],
          'jac' : lambda x: [1.0, 0.0, -1.0]}
         ,{'type': 'ineq',
           #alpha[i][j] - x[j] <= 0
          'fun' : lambda x: [x[j]-alpha[i][j] for i,j in pairwise_idx],
          'jac' : lambda x: [1.0, 0.0, -1.0]}
         ,{'type': 'ineq',
           #x[i] + x[j] - alpha[i][j] <= 1
          'fun' : lambda x: [1+alpha[i][j]-x[i]-x[j] for i,j in pairwise_idx],
          'jac' : lambda x: [-1.0-1.0, 0.0, 1.0]})


res = minimize(func, (x0,R0,alpha0)
               , args=(sentences_lengths
                        ,length_constraint
                       ,sentences_idx
                      ,sentences_scores
                      ,damping
                      ,pairwise_idx
                      ,overlap_matrix,)
               , jac=func_deriv
               , constraints=cons
               , method='SLSQP'
               , options={'disp': True})
#来自scipy.optimize导入最小二乘法
从scipy.optimize导入最小化
将numpy作为np导入
句子长度=[6,3]
长度约束=5
句子_idx=[0,1]
句子得分=[1,2]
阻尼=1
成对_idx=[(0,0)、(0,1)、(1,0)、(1,1)]
重叠矩阵=[[0.01],.02,0]]
def func(x,R,alpha,符号=1.0):
“目标函数”
返回符号*(求和(x[i]*句子中i的句子分数[i])-阻尼*R*求和(α[i][j]*重叠矩阵[i][j]中i,j成对)
x0=np.数组([1,0])
R0=.1
alpha0=np.数组([1,0,0,0])
def func_deriv(x,R,alpha,符号=1.0):
“目标函数的导数”
#对x的偏导数
dfdX=符号*(总和(句子中i的分数[i])
#对R的偏导数
dfdR=符号*(-阻尼*和(α[i][j]*重叠矩阵[i][j]用于成对的i,j_idx))
#α偏导数
dfdAlpha=符号*(-damping*R*和(α[i][j]*重叠矩阵[i][j]表示成对的i,j)
返回[dfdX、dfdR、dfdAlpha]
cons=({'type':'ineq',
##约束:大小+一致性约束的一个约束
#sum(x[i]*句子长度[i]表示句子中的i)104返回数组(a,dtype=dtype)
105
106
/asarray中的usr/local/lib/python3.5/dist-packages/numpy/core/numeric.py(a,数据类型,顺序)
529
530     """
-->531返回数组(a,数据类型,copy=False,order=order)
532
533
ValueError:使用序列设置数组元素。
我能完成这项任务

    from scipy.optimize import least_squares
from scipy.optimize import minimize
import numpy as np

def func(x_f, *args, sign=1.0):
    """ Objective function """
    sentences_lengths, length_constraint, sentences_idx, sentences_scores, damping, pairwise_idx, overlap_matrix\
                        , x_ini_size, R0_size, alpha0_shape = args
    x=x_f[:x_ini_size]
    R=x_f[x_ini_size:x_ini_size+R0_size]
    alpha=x_f[x_ini_size+R0_size:].reshape(alpha0_shape)
    return sign*(sum(x[i] * sentences_scores[i] for i in sentences_idx) - damping * R * sum(alpha[i][j] * overlap_matrix[i][j] for i,j in pairwise_idx))


def func_deriv(x, R, alpha, sign=1.0):
    """ Derivative of objective function """
    #Partial derivative to x
    dfdX = sign*(sum(sentences_scores[i] for i in sentences_idx))
    #Partial derivative to R
    dfdR= sign*(- damping * sum(alpha[i][j] * overlap_matrix[i][j] for i,j in pairwise_idx))
    #Partial derivative to alpha
    dfdAlpha= sign*(- damping * R * sum(alpha[i][j] * overlap_matrix[i][j] for i,j in pairwise_idx))
    return [ dfdX, dfdR,  dfdAlpha]


"""print(list(x_ini))
a = np.array([list(x_ini),list(R0),list(alpha0)])
print(a)


ccc=[x_ini,R0,alpha0]
print(x_ini)
print(list(ccc))
x0=np.concatenate([x_ini,R0,alpha0])
print(x0.flatten())"""


"""
pairwise_idx-------->>>
array([[0, 0],
       [0, 1],
       [1, 0],
       [1, 1]])

overlap_matrix----------->>
array([[ 0.  ,  0.01],
       [ 0.02,  0.  ]])

alpha0--->>>
array([[1, 0],
       [0, 0]])
"""
sentences_lengths =[6, 3]
length_constraint=5
sentences_idx=[0, 1]
sentences_scores=[.1,.2]
damping=1.0

pairwise_idx=np.array([[0, 0],[0, 1],[1, 0],[1, 1]])
overlap_matrix=np.array([[0,.01],[.02,0]])

x_ini=np.array([1,0])


R0=np.array([.1])
alpha0=np.array([[1,0],[0,0]])

x_ini_size = x_ini.size
R0_size = R0.size
alpha0_shape = alpha0.shape

x0 = np.concatenate([x_ini, R0, alpha0.flatten()])

#x1bnds = [int(s) for s in range(0,2)]
#x1bnds=np.array([0,1])
#x1bnds=np.array([0,2], dtype=int)
#x1bnds = ((0,0),(1,1))
x1bnds =np.arange(0,2, 1)
x2bnds = (0, 1)
Rbnds = (0, 1)
alpha1bnds= [0, 1]
alpha2bnds= [0, 1]
alpha3bnds= [0, 1]
alpha4bnds= np.array([0,2], dtype=int)
bnds = (x1bnds, x2bnds, Rbnds, alpha1bnds, alpha2bnds, alpha3bnds, alpha4bnds)


#x=x_f[:x_ini_size]
#alpha=x_f[x_ini_size+R0_size:].reshape(alpha0_shape)



"""cons = ({'type': 'ineq',
         ## Constraints: one constraint for the size + consistency constraints
         #sum(x[i] * sentences_lengths[i] for i in sentences_idx) <= length_constraint
          'fun' : lambda x_f: np.array([length_constraint - sum(x_f[:x_ini_size][i] * sentences_lengths[i] for i in sentences_idx)])
          , 'jac' : lambda x_f: np.array([-sum(sentences_lengths[i] for i in sentences_idx), 0, 0])}
         ,{'type': 'ineq',
           #alpha[i][j] - x[i] <= 0
          'fun' : lambda x_f: np.array([x_f[:x_ini_size][i]-x_f[x_ini_size+R0_size:].reshape(alpha0_shape)[i][j] for i,j in pairwise_idx])
          , 'jac' : lambda x_f: np.array([1.0, 0.0, -1.0])}
         ,{'type': 'ineq',
           #alpha[i][j] - x[j] <= 0
          'fun' : lambda x_f: np.array([x_f[:x_ini_size][j]-x_f[x_ini_size+R0_size:].reshape(alpha0_shape)[i][j] for i,j in pairwise_idx])
          , 'jac' : lambda x_f: np.array([1.0, 0.0, -1.0])}
         ,{'type': 'ineq',
           #x[i] + x[j] - alpha[i][j] <= 1
          'fun' : lambda x_f: np.array([1+x_f[x_ini_size+R0_size:].reshape(alpha0_shape)[i][j]-x_f[:x_ini_size][i]-x_f[:x_ini_size][j] for i,j in pairwise_idx])
          , 'jac' : lambda x_f: np.array([-1.0-1.0, 0.0, 1.0])})
"""
cons = ({'type': 'ineq',
         ## Constraints: one constraint for the size + consistency constraints
         #sum(x[i] * sentences_lengths[i] for i in sentences_idx) <= length_constraint
          'fun' : lambda x_f: np.array([length_constraint - sum(x_f[:x_ini_size][i] * sentences_lengths[i] for i in sentences_idx)])
          }
         ,{'type': 'ineq',
           #alpha[i][j] - x[i] <= 0
          'fun' : lambda x_f: np.array([x_f[:x_ini_size][i]-x_f[x_ini_size+R0_size:].reshape(alpha0_shape)[i][j] for i,j in pairwise_idx])
          }
         ,{'type': 'ineq',
           #alpha[i][j] - x[j] <= 0
          'fun' : lambda x_f: np.array([x_f[:x_ini_size][j]-x_f[x_ini_size+R0_size:].reshape(alpha0_shape)[i][j] for i,j in pairwise_idx])
          }
         ,{'type': 'ineq',
           #x[i] + x[j] - alpha[i][j] <= 1
          'fun' : lambda x_f: np.array([1+x_f[x_ini_size+R0_size:].reshape(alpha0_shape)[i][j]-x_f[:x_ini_size][i]-x_f[:x_ini_size][j] for i,j in pairwise_idx])
          })


res = minimize(func
                , x0
                , args=(sentences_lengths
                        , length_constraint
                        , sentences_idx
                        , sentences_scores
                        , damping, pairwise_idx
                        , overlap_matrix
                        , x_ini_size
                        , R0_size
                        , alpha0_shape)
                , method='SLSQP'
                #, jac=func_deriv
                , constraints=cons
                , bounds=bnds
                , options={'disp': True})

#res = least_squares(fun, (x,R,alpha), jac=jac, bounds=bounds, args=(sentences_scores, damping,overlap_matrix), verbose=1)
print(res)
从scipy.optimize导入最小二乘法
从scipy.optimize导入最小化
将numpy作为np导入
def func(x_f,*args,符号=1.0):
“目标函数”
句子长度、长度约束、句子idx、句子分数、阻尼、成对idx、重叠矩阵\
,x_ini_size,R0_size,alpha0_shape=args
x=x_f[:x_ini_大小]
R=x_f[x_ini_size:x_ini_size+R0_size]
alpha=x_f[x_ini_size+R0_size:]重塑(alpha0_形状)
返回符号*(求和(x[i]*句子中i的句子分数[i])-阻尼*R*求和(α[i][j]*重叠矩阵[i][j]中i,j成对)
def func_deriv(x,R,alpha,符号=1.0):
“目标函数的导数”
#对x的偏导数
dfdX=符号*(总和(句子中i的分数[i])
#对R的偏导数
dfdR=符号*(-阻尼*和(α[i][j]*重叠矩阵[i][j]用于成对的i,j_idx))
#α偏导数
dfdAlpha=符号*(-damping*R*和(α[i][j]*重叠矩阵[i][j]表示成对的i,j)
返回[dfdX、dfdR、dfdAlpha]
“”“打印(列表(x_ini))
a=np.array([list(x_ini)、list(R0)、list(alpha0)])
印刷品(a)
ccc=[x_ini,R0,alpha0]
打印(x_ini)
打印(列表(ccc))
x0=np.连接([x_ini,R0,alpha0])
打印(x0.flatte())“”“
"""
成对\u idx------>>
数组([[0,0],
[0, 1],
[1, 0],
[1, 1]])
重叠矩阵----------------->>
数组([[0,0.01],
[ 0.02,  0.  ]])
alpha0-->>>
数组([[1,0],
[0, 0]])
"""
句子长度=[6,3]
长度约束=5
句子_idx=[0,1]
句子得分=[1,2]
阻尼=1.0
成对数组([[0,0],[0,1],[1,0],[1,1])
重叠矩阵=np.数组([[0.01],.02,0]]
x_ini=np.array([1,0])
R0=np.array([.1])
alpha0=np.数组([[1,0],[0,0]])
x_ini_size=x_ini.size
R0_大小=R0.0大小
alpha0_形状=alpha0.shape
x0=np.连接([x_ini,R0,alpha0.flatte()]))
#x1bnds=[int(s)表示范围(0,2)内的s]
#x1bnds=np.array([0,1])
#x1bnds=np.array([0,2],dtype=int)
#x1bnds=((0,0),(1,1))
x1bnds=np.arange(0,2,1)
x2bnds=(0,1)
Rbnds=(0,1)
alpha1bnds=[0,1]
alpha2bnds=[0,1]
alpha3bnds=[0,1]
alpha4bnds=np.array([0,2],dtype=int)
bnds=(x1bnds、x2bnds、Rbnds、alpha1bnds、alpha2bnds、alpha3bnds、alpha4bnds)
#x=x_f[:x_ini_大小]
#alpha=x_f[x_ini_size+R0_size:]重塑(alpha0_形状)
“”“cons=({'type':'ineq',
##约束:大小+一致性约束的一个约束
#求和(x[i]*句子长度[i]表示句子中的i)我找到了答案

from scipy.optimize import least_squares
from scipy.optimize import minimize
import numpy as np

def func(x_f, *args, sign=1.0):
    """ Objective function """
    sentences_lengths, length_constraint, sentences_idx, sentences_scores, damping, pairwise_idx, overlap_matrix\
                        , x_ini_size, R0_size, alpha0_shape = args
    x=(x_f[:x_ini_size])
    R=x_f[x_ini_size:x_ini_size+R0_size]
    alpha=(x_f[x_ini_size+R0_size:].reshape(alpha0_shape))
    return sign*(sum((x[i]) * sentences_scores[i] for i in sentences_idx) - damping * R * sum((alpha[i][j]) * overlap_matrix[i][j] for i,j in pairwise_idx))


def func_deriv(x, R, alpha, sign=1.0):
    """ Derivative of objective function """
    #Partial derivative to x
    dfdX = sign*(sum(sentences_scores[i] for i in sentences_idx))
    #Partial derivative to R
    dfdR= sign*(- damping * sum(alpha[i][j] * overlap_matrix[i][j] for i,j in pairwise_idx))
    #Partial derivative to alpha
    dfdAlpha= sign*(- damping * R * sum(alpha[i][j] * overlap_matrix[i][j] for i,j in pairwise_idx))
    return [ dfdX, dfdR,  dfdAlpha]


"""print(list(x_ini))
a = np.array([list(x_ini),list(R0),list(alpha0)])
print(a)


ccc=[x_ini,R0,alpha0]
print(x_ini)
print(list(ccc))
x0=np.concatenate([x_ini,R0,alpha0])
print(x0.flatten())"""


"""
pairwise_idx-------->>>
array([[0, 0],
       [0, 1],
       [1, 0],
       [1, 1]])

overlap_matrix----------->>
array([[ 0.  ,  0.01],
       [ 0.02,  0.  ]])

alpha0--->>>
array([[1, 0],
       [0, 0]])
"""
sentences_lengths =[6, 3]
length_constraint=5
sentences_idx=[0, 1]
sentences_scores=[.1,.2]
damping=1.0

pairwise_idx=np.array([[0, 0],[0, 1],[1, 0],[1, 1]])
overlap_matrix=np.array([[0,.01],[.02,0]])

x_ini=np.array([0,0])


R0=np.array([.1])
alpha0=np.array([[0,0],[0,0]])

x_ini_size = x_ini.size
R0_size = R0.size
alpha0_shape = alpha0.shape

x0 = np.concatenate([x_ini, R0, alpha0.flatten()])

#x1bnds = [int(s) for s in range(0,2)]
#x1bnds=np.array([0,1])
#x1bnds=np.array([0,2], dtype=int)
#x1bnds = ((0,0),(1,1))
#x1bnds =np.arange(0,2, 1)
x1bnds = (0, 1)
x2bnds = (0, 1)
Rbnds = (0, 1)
alpha1bnds= (0, 1)
alpha2bnds= (0, 1)
alpha3bnds= (0, 1)
alpha4bnds= (0, 1)
bnds = (x1bnds, x2bnds, Rbnds, alpha1bnds, alpha2bnds, alpha3bnds, alpha4bnds)


#x=x_f[:x_ini_size]
#alpha=x_f[x_ini_size+R0_size:].reshape(alpha0_shape)



"""cons = ({'type': 'ineq',
         ## Constraints: one constraint for the size + consistency constraints
         #sum(x[i] * sentences_lengths[i] for i in sentences_idx) <= length_constraint
          'fun' : lambda x_f: np.array([length_constraint - sum(x_f[:x_ini_size][i] * sentences_lengths[i] for i in sentences_idx)])
          , 'jac' : lambda x_f: np.array([-sum(sentences_lengths[i] for i in sentences_idx), 0, 0])}
         ,{'type': 'ineq',
           #alpha[i][j] - x[i] <= 0
          'fun' : lambda x_f: np.array([x_f[:x_ini_size][i]-x_f[x_ini_size+R0_size:].reshape(alpha0_shape)[i][j] for i,j in pairwise_idx])
          , 'jac' : lambda x_f: np.array([1.0, 0.0, -1.0])}
         ,{'type': 'ineq',
           #alpha[i][j] - x[j] <= 0
          'fun' : lambda x_f: np.array([x_f[:x_ini_size][j]-x_f[x_ini_size+R0_size:].reshape(alpha0_shape)[i][j] for i,j in pairwise_idx])
          , 'jac' : lambda x_f: np.array([1.0, 0.0, -1.0])}
         ,{'type': 'ineq',
           #x[i] + x[j] - alpha[i][j] <= 1
          'fun' : lambda x_f: np.array([1+x_f[x_ini_size+R0_size:].reshape(alpha0_shape)[i][j]-x_f[:x_ini_size][i]-x_f[:x_ini_size][j] for i,j in pairwise_idx])
          , 'jac' : lambda x_f: np.array([-1.0-1.0, 0.0, 1.0])})
"""

cons = ({'type': 'ineq',
         ## Constraints: one constraint for the size + consistency constraints
         #sum(x[i] * sentences_lengths[i] for i in sentences_idx) <= length_constraint
          'fun' : lambda x_f: np.array([length_constraint - sum(x_f[:x_ini_size][i] * sentences_lengths[i] for i in sentences_idx)])
          }
         ,{'type': 'ineq',
           #alpha[i][j] - x[i] <= 0
          'fun' : lambda x_f: np.array([(x_f[:x_ini_size][i])-(x_f[x_ini_size+R0_size:].reshape(alpha0_shape)[i][j]) for i,j in pairwise_idx])
          }
         ,{'type': 'ineq',
           #alpha[i][j] - x[j] <= 0
          'fun' : lambda x_f: np.array([(x_f[:x_ini_size][j])-(x_f[x_ini_size+R0_size:].reshape(alpha0_shape)[i][j]) for i,j in pairwise_idx])
          }
         ,{'type': 'ineq',
           #x[i] + x[j] - alpha[i][j] <= 1
          'fun' : lambda x_f: np.array([1+(x_f[x_ini_size+R0_size:].reshape(alpha0_shape)[i][j])-(x_f[:x_ini_size][i])-(x_f[:x_ini_size][j]) for i,j in pairwise_idx])
          }
          ,{'type':'eq'
          ,'fun': lambda x_f : np.array([(x_f[:x_ini_size][i]-int(x_f[:x_ini_size][i]))
                                    for i in sentences_idx])})


res = minimize(func
                , x0
                , args=(sentences_lengths
                        , length_constraint
                        , sentences_idx
                        , sentences_scores
                        , damping, pairwise_idx
                        , overlap_matrix
                        , x_ini_size
                        , R0_size
                        , alpha0_shape)
                , method='SLSQP'
                #, jac=func_deriv
                , constraints=cons
                , bounds=bnds
                , options={'disp': True})

#res = least_squares(fun, (x,R,alpha), jac=jac, bounds=bounds, args=(sentences_scores, damping,overlap_matrix), verbose=1)
print(res)
结果是相同的初始值。这不是很好吗?

请在提出问题时尝试使用。
from scipy.optimize import least_squares
from scipy.optimize import minimize
import numpy as np

def func(x_f, *args, sign=1.0):
    """ Objective function """
    sentences_lengths, length_constraint, sentences_idx, sentences_scores, damping, pairwise_idx, overlap_matrix\
                        , x_ini_size, R0_size, alpha0_shape = args
    x=(x_f[:x_ini_size])
    R=x_f[x_ini_size:x_ini_size+R0_size]
    alpha=(x_f[x_ini_size+R0_size:].reshape(alpha0_shape))
    return sign*(sum((x[i]) * sentences_scores[i] for i in sentences_idx) - damping * R * sum((alpha[i][j]) * overlap_matrix[i][j] for i,j in pairwise_idx))


def func_deriv(x, R, alpha, sign=1.0):
    """ Derivative of objective function """
    #Partial derivative to x
    dfdX = sign*(sum(sentences_scores[i] for i in sentences_idx))
    #Partial derivative to R
    dfdR= sign*(- damping * sum(alpha[i][j] * overlap_matrix[i][j] for i,j in pairwise_idx))
    #Partial derivative to alpha
    dfdAlpha= sign*(- damping * R * sum(alpha[i][j] * overlap_matrix[i][j] for i,j in pairwise_idx))
    return [ dfdX, dfdR,  dfdAlpha]


"""print(list(x_ini))
a = np.array([list(x_ini),list(R0),list(alpha0)])
print(a)


ccc=[x_ini,R0,alpha0]
print(x_ini)
print(list(ccc))
x0=np.concatenate([x_ini,R0,alpha0])
print(x0.flatten())"""


"""
pairwise_idx-------->>>
array([[0, 0],
       [0, 1],
       [1, 0],
       [1, 1]])

overlap_matrix----------->>
array([[ 0.  ,  0.01],
       [ 0.02,  0.  ]])

alpha0--->>>
array([[1, 0],
       [0, 0]])
"""
sentences_lengths =[6, 3]
length_constraint=5
sentences_idx=[0, 1]
sentences_scores=[.1,.2]
damping=1.0

pairwise_idx=np.array([[0, 0],[0, 1],[1, 0],[1, 1]])
overlap_matrix=np.array([[0,.01],[.02,0]])

x_ini=np.array([0,0])


R0=np.array([.1])
alpha0=np.array([[0,0],[0,0]])

x_ini_size = x_ini.size
R0_size = R0.size
alpha0_shape = alpha0.shape

x0 = np.concatenate([x_ini, R0, alpha0.flatten()])

#x1bnds = [int(s) for s in range(0,2)]
#x1bnds=np.array([0,1])
#x1bnds=np.array([0,2], dtype=int)
#x1bnds = ((0,0),(1,1))
#x1bnds =np.arange(0,2, 1)
x1bnds = (0, 1)
x2bnds = (0, 1)
Rbnds = (0, 1)
alpha1bnds= (0, 1)
alpha2bnds= (0, 1)
alpha3bnds= (0, 1)
alpha4bnds= (0, 1)
bnds = (x1bnds, x2bnds, Rbnds, alpha1bnds, alpha2bnds, alpha3bnds, alpha4bnds)


#x=x_f[:x_ini_size]
#alpha=x_f[x_ini_size+R0_size:].reshape(alpha0_shape)



"""cons = ({'type': 'ineq',
         ## Constraints: one constraint for the size + consistency constraints
         #sum(x[i] * sentences_lengths[i] for i in sentences_idx) <= length_constraint
          'fun' : lambda x_f: np.array([length_constraint - sum(x_f[:x_ini_size][i] * sentences_lengths[i] for i in sentences_idx)])
          , 'jac' : lambda x_f: np.array([-sum(sentences_lengths[i] for i in sentences_idx), 0, 0])}
         ,{'type': 'ineq',
           #alpha[i][j] - x[i] <= 0
          'fun' : lambda x_f: np.array([x_f[:x_ini_size][i]-x_f[x_ini_size+R0_size:].reshape(alpha0_shape)[i][j] for i,j in pairwise_idx])
          , 'jac' : lambda x_f: np.array([1.0, 0.0, -1.0])}
         ,{'type': 'ineq',
           #alpha[i][j] - x[j] <= 0
          'fun' : lambda x_f: np.array([x_f[:x_ini_size][j]-x_f[x_ini_size+R0_size:].reshape(alpha0_shape)[i][j] for i,j in pairwise_idx])
          , 'jac' : lambda x_f: np.array([1.0, 0.0, -1.0])}
         ,{'type': 'ineq',
           #x[i] + x[j] - alpha[i][j] <= 1
          'fun' : lambda x_f: np.array([1+x_f[x_ini_size+R0_size:].reshape(alpha0_shape)[i][j]-x_f[:x_ini_size][i]-x_f[:x_ini_size][j] for i,j in pairwise_idx])
          , 'jac' : lambda x_f: np.array([-1.0-1.0, 0.0, 1.0])})
"""

cons = ({'type': 'ineq',
         ## Constraints: one constraint for the size + consistency constraints
         #sum(x[i] * sentences_lengths[i] for i in sentences_idx) <= length_constraint
          'fun' : lambda x_f: np.array([length_constraint - sum(x_f[:x_ini_size][i] * sentences_lengths[i] for i in sentences_idx)])
          }
         ,{'type': 'ineq',
           #alpha[i][j] - x[i] <= 0
          'fun' : lambda x_f: np.array([(x_f[:x_ini_size][i])-(x_f[x_ini_size+R0_size:].reshape(alpha0_shape)[i][j]) for i,j in pairwise_idx])
          }
         ,{'type': 'ineq',
           #alpha[i][j] - x[j] <= 0
          'fun' : lambda x_f: np.array([(x_f[:x_ini_size][j])-(x_f[x_ini_size+R0_size:].reshape(alpha0_shape)[i][j]) for i,j in pairwise_idx])
          }
         ,{'type': 'ineq',
           #x[i] + x[j] - alpha[i][j] <= 1
          'fun' : lambda x_f: np.array([1+(x_f[x_ini_size+R0_size:].reshape(alpha0_shape)[i][j])-(x_f[:x_ini_size][i])-(x_f[:x_ini_size][j]) for i,j in pairwise_idx])
          }
          ,{'type':'eq'
          ,'fun': lambda x_f : np.array([(x_f[:x_ini_size][i]-int(x_f[:x_ini_size][i]))
                                    for i in sentences_idx])})


res = minimize(func
                , x0
                , args=(sentences_lengths
                        , length_constraint
                        , sentences_idx
                        , sentences_scores
                        , damping, pairwise_idx
                        , overlap_matrix
                        , x_ini_size
                        , R0_size
                        , alpha0_shape)
                , method='SLSQP'
                #, jac=func_deriv
                , constraints=cons
                , bounds=bnds
                , options={'disp': True})

#res = least_squares(fun, (x,R,alpha), jac=jac, bounds=bounds, args=(sentences_scores, damping,overlap_matrix), verbose=1)
print(res)
Optimization terminated successfully.    (Exit mode 0)
            Current function value: 0.0
            Iterations: 1
            Function evaluations: 9
            Gradient evaluations: 1
     fun: 0.0
     jac: array([ 0.1  ,  0.2  ,  0.   ,  0.   , -0.001, -0.002,  0.   ])
 message: 'Optimization terminated successfully.'
    nfev: 9
     nit: 1
    njev: 1
  status: 0
 success: True
       x: array([ 0. ,  0. ,  0.1,  0. ,  0. ,  0. ,  0. ])