def create_kernels( adata: AnnData, velocity_variances: Optional[str] = None, connectivity_variances: Optional[str] = None, ) -> Tuple[VelocityKernel, ConnectivityKernel]: vk = VelocityKernel(adata) vk._mat_scaler = adata.uns.get( velocity_variances, np.random.normal(size=(adata.n_obs, adata.n_obs)) ) ck = ConnectivityKernel(adata) ck._mat_scaler = adata.uns.get( connectivity_variances, np.random.normal(size=(adata.n_obs, adata.n_obs)) ) vk._transition_matrix = csr_matrix(np.eye(adata.n_obs)) ck._transition_matrix = np.eye(adata.n_obs, k=1) / 2 + np.eye(adata.n_obs) / 2 ck._transition_matrix[-1, -1] = 1 ck._transition_matrix = csr_matrix(ck._transition_matrix) np.testing.assert_allclose( np.sum(ck._transition_matrix.A, axis=1), 1 ) # sanity check return vk, ck
def test_addition_3_kernels(self, adata: AnnData): vk, ck = create_kernels(adata) # diagonal + upper diag vk1 = VelocityKernel(adata) vk1._transition_matrix = np.eye(adata.n_obs, k=-1) / 2 + np.eye( adata.n_obs) / 2 vk1._transition_matrix[0, 0] = 1 np.testing.assert_allclose(np.sum(ck._transition_matrix, axis=1), 1) # sanity check k = (vk + ck + vk1).compute_transition_matrix() expected = (np.eye(adata.n_obs) * (1 / 3 + 1 / 6 + 1 / 6) + np.eye(adata._n_obs, k=1) * 1 / 6 + np.eye(adata.n_obs, k=-1) * 1 / 6) expected[0, 0] = expected[-1, -1] = 2 / 3 + 1 / 3 * 0.5 expected[0, 1] = expected[-1, -2] = 1 - expected[0, 0] np.testing.assert_allclose(k.transition_matrix.A, expected)