def dc_split(self, use_eigen_split=False):
n = self.P.shape[0]
if self.P.nnz == 0: # P is zero
P1, P2 = sp.csr_matrix((n, n)), sp.csr_matrix((n, n))
if use_eigen_split:
lmb, Q = LA.eigh(self.P.todense())
P1 = sum([Q[:, i]*lmb[i]*Q[:, i].T for i in range(n) if lmb[i] > 0])
P2 = sum([-Q[:, i]*lmb[i]*Q[:, i].T for i in range(n) if lmb[i] < 0])
assert abs(np.sum(P1 - P2 - self.P)) < 1e-8
else:
lmb_min = np.min(LA.eigh(self.P.todense())[0])
if lmb_min < 0:
P1 = self.P + (1-lmb_min)*sp.identity(n)
P2 = (1-lmb_min)*sp.identity(n)
else:
P1 = self.P
P2 = sp.csr_matrix((n, n))
f1 = QuadraticFunction(P1, self.q, self.r)
f2 = QuadraticFunction(P2, sp.csc_matrix((n, 1)), 0)
return (f1, f2)
# Returns the one-variable function when regarding f(x)
# as a quadratic expression in x[k].
# f is an instance of QuadraticFunction
# return value is an instance of OneVarQuadraticFunction
# TODO: speedup
评论列表
文章目录