def grad_stability(X): (dim, _) = np.shape(X) G = np.zeros(np.shape(X)) A_1 = get_entries(X, A_1_cds) diff1 = 2 * np.dot(A_1, mu) grad1 = np.tile(mu.T, (block_dim, 1)) # (block_dim,1) * (block_dim,block_dim) across rows grad1 = diff1 * grad1 set_entries(G, A_1_cds, grad1) A_T_1 = get_entries(X, A_T_1_cds) diffT1 = 2 * np.dot(A_T_1.T, mu) gradT1 = np.tile(mu.T, (block_dim, 1)) gradT1 = diffT1 * gradT1 set_entries(G, A_T_1_cds, gradT1.T) A_2 = get_entries(X, A_2_cds) diff2 = 2 * np.dot(A_2, mu) grad2 = np.tile(mu.T, (block_dim, 1)) grad2 = diff2 * grad2 set_entries(G, A_2_cds, grad2) A_T_2 = get_entries(X, A_T_2_cds) diffT2 = 2 * np.dot(A_T_2.T, mu) gradT2 = np.tile(mu.T, (block_dim, 1)) gradT2 = diffT2 * gradT2 set_entries(G, A_T_2_cds, gradT2.T) return (1./dim**2) * G
def grad_l2_batch_equals(X, A, coord): # Upper right grad_piece = 2*(get_entries(X,coord) - A) grad = np.zeros(np.shape(X)) set_entries(grad, coord, grad_piece) return grad