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 mytime_momentsXX(X, remove_mean=False, nrep=3): # time for reference calculation t1 = time.time() for r in range(nrep): w, s, C_XX = moments.moments_XX(X, remove_mean=remove_mean) t2 = time.time() # return mean time return (t2-t1)/float(nrep)
def _test_moments_X(self, X, remove_mean=False, sparse_mode='auto'): # proposed solution w, s_X, C_XX = moments.moments_XX(X, remove_mean=remove_mean, modify_data=False, sparse_mode=sparse_mode) # reference X = X.astype(np.float64) s_X_ref = X.sum(axis=0) if remove_mean: X = X - X.mean(axis=0) C_XX_ref = np.dot(X.T, X) # test assert np.allclose(s_X, s_X_ref) assert np.allclose(C_XX, C_XX_ref)
def test_boolean_moments(self): # standard tests self._test_moments_X(self.Xb_10, remove_mean=False, sparse_mode='dense') self._test_moments_X(self.Xb_10, remove_mean=True, sparse_mode='dense') self._test_moments_X(self.Xb_10_sparsezero, remove_mean=False, sparse_mode='sparse') self._test_moments_X(self.Xb_10_sparsezero, remove_mean=True, sparse_mode='sparse') # test integer recovery Cxx_ref = np.dot(self.Xb_10.astype(np.int64).T, self.Xb_10.astype(np.int64)) # integer s_X_ref = np.sum(self.Xb_10, axis=0) w, s_X, Cxx = moments.moments_XX(self.Xb_10, remove_mean=False, modify_data=False, sparse_mode='dense') s_X = np.round(s_X).astype(np.int64) Cxx = np.round(Cxx).astype(np.int64) assert np.array_equal(s_X, s_X_ref) assert np.array_equal(Cxx, Cxx_ref)