import cvxpy as cvx
def getW(betas, signal, P):
(m, n) = betas.shape
x = cvx.Variable(4 * m)
objective = cvx.Maximize(signal.T * x[2*m:-m])
y = cvx.Int(2*m)
constraints = [x[:m] >= 0, x[m:2*m] <= 0, P.T * x[2*m:-m] == 0, y <= 1, y >= 0]
for i in range(0, n):
constraints.append(betas[:, i].T * x[2*m:-m] == 0)
for i in range(0, m):
constraints.append(x[i] - x[m+i] - x[2*m+i] == 0)
constraints.append(x[i] + x[m+i] - x[3*m+i] == 0)
constraints.append(x[i] <= y[i])
constraints.append(-x[m+i] <= y[m+i])
constraints.append(y[i] + y[m+i] == 1)
#constraints.append(P[i] * x[3*m+i] < 0.1 * P.T * x[-m:])
prob = cvx.Problem(objective, constraints)
prob.solve()
print prob.status
return np.squeeze(np.asarray(x.value[2*m:-m]))