def add(self, X, Y=None): # check input T = X.shape[0] if Y is not None: assert Y.shape[0] == T, 'X and Y must have equal length' # estimate and add to storage if self.compute_XX and not self.compute_XY: w, s_X, C_XX = moments_XX(X, remove_mean=self.remove_mean, sparse_mode=self.sparse_mode, modify_data=self.modify_data) self.storage_XX.store(Moments(w, s_X, s_X, C_XX)) elif self.compute_XX and self.compute_XY: assert Y is not None w, s_X, s_Y, C_XX, C_XY = moments_XXXY(X, Y, remove_mean=self.remove_mean, symmetrize=self.symmetrize, sparse_mode=self.sparse_mode, modify_data=self.modify_data) # make copy in order to get independently mergeable moments self.storage_XX.store(Moments(w, s_X, s_X, C_XX)) self.storage_XY.store(Moments(w, s_X, s_Y, C_XY)) else: # compute block assert Y is not None assert not self.symmetrize w, s, C = moments_block(X, Y, remove_mean=self.remove_mean, sparse_mode=self.sparse_mode, modify_data=self.modify_data) # make copy in order to get independently mergeable moments self.storage_XX.store(Moments(w, s[0], s[0], C[0, 0])) self.storage_XY.store(Moments(w, s[0], s[1], C[0, 1])) self.storage_YY.store(Moments(w, s[1], s[1], C[1, 1]))
def _test_moments_XY(self, X, Y, symmetrize=False, remove_mean=False, sparse_mode='auto'): w, s_X, s_Y, C_XX, C_XY = moments.moments_XXXY(X, Y, remove_mean=remove_mean, modify_data=False, symmetrize=symmetrize, sparse_mode=sparse_mode) # reference s_X_ref = X.sum(axis=0) s_Y_ref = Y.sum(axis=0) if symmetrize: s_X_ref = s_X_ref + s_Y_ref s_Y_ref = s_X_ref w = 2 * X.shape[0] else: w = X.shape[0] if remove_mean: X = X - s_X_ref/float(w) Y = Y - s_Y_ref/float(w) if symmetrize: C_XX_ref = np.dot(X.T, X) + np.dot(Y.T, Y) C_XY_ref = np.dot(X.T, Y) + np.dot(Y.T, X) else: C_XX_ref = np.dot(X.T, X) C_XY_ref = np.dot(X.T, Y) # test assert np.allclose(s_X, s_X_ref) assert np.allclose(s_Y, s_Y_ref) assert np.allclose(C_XX, C_XX_ref) assert np.allclose(C_XY, C_XY_ref)
def mytime_momentsXXXY(X, Y, remove_mean=False, symmetrize=False, nrep=3): # time for reference calculation t1 = time.time() for r in range(nrep): w, sx, sy, C_XX, C_XY = moments.moments_XXXY(X, Y, remove_mean=remove_mean, symmetrize=symmetrize) t2 = time.time() # return mean time return (t2-t1)/float(nrep)