def test_one_state(self): # create random data that sums to one row-wise a_fuzzy = np.random.standard_normal((100, 1)) a_fuzzy = np.exp(a_fuzzy) / np.sum(np.exp(a_fuzzy), 1)[:, None] # check with both overlap handlings _fuzzy_to_discrete(a_fuzzy=a_fuzzy)
def test_normal_output(self): a_fuzzy = np.array([ [0.3, 0.7, 0], [0.2, 0.5, 0.3], [0.1, 0.8, 0.1], [0.4, 0.4, 0.2], [0.5, 0.3, 0.2], [0.6, 0.3, 0.1], [0.3, 0.3, 0.4], [0.2, 0.2, 0.6], ]) # note: removing the overlap should have no effect in this case since there is none. # there should also be no critical clusters in this case a_actual_1, c_1 = _fuzzy_to_discrete(a_fuzzy, n_most_likely=2, remove_overlap=True) a_actual_2, c_2 = _fuzzy_to_discrete(a_fuzzy, n_most_likely=2, remove_overlap=False) a_expected = np.array([ [False, True, False], [False, False, False], [False, True, False], [False, False, False], [True, False, False], [True, False, False], [False, False, True], [False, False, True], ]) np.testing.assert_array_equal(a_actual_1, a_expected) np.testing.assert_array_equal(a_actual_2, a_expected) assert len(c_1) == 0 assert len(c_2) == 0
def _create_states( self, probs: Union[np.ndarray, Lineage], n_cells: int, check_row_sums: bool = False, return_not_enough_cells: bool = False, ) -> pd.Series: if n_cells <= 0: raise ValueError( f"Expected `n_cells` to be positive, found `{n_cells}`.") a_discrete, not_enough_cells = _fuzzy_to_discrete( a_fuzzy=probs, n_most_likely=n_cells, remove_overlap=False, raise_threshold=0.2, check_row_sums=check_row_sums, ) states = _series_from_one_hot_matrix( membership=a_discrete, index=self.adata.obs_names, names=probs.names if isinstance(probs, Lineage) else None, ) return (states, not_enough_cells) if return_not_enough_cells else states
def test_passing_lineage_object(self): a_fuzzy = np.array([ [0.3, 0.7, 0], [0.2, 0.5, 0.3], [0.1, 0.8, 0.1], [0.4, 0.4, 0.2], [0.5, 0.3, 0.2], [0.6, 0.3, 0.1], [0.3, 0.3, 0.4], [0.2, 0.2, 0.6], ]) a_fuzzy_lin = Lineage(a_fuzzy, names=["0", "1", "2"]) b_np, c_np = _fuzzy_to_discrete(a_fuzzy=a_fuzzy, n_most_likely=2) b_l, c_l = _fuzzy_to_discrete(a_fuzzy=a_fuzzy_lin, n_most_likely=2) np.testing.assert_array_equal(b_np, b_l) assert len(c_np) == 0 assert len(c_l) == 0
def test_critical_samples(self): a_fuzzy = np.array( [ [0.3, 0.7, 0], [0.3, 0.6, 0.1], [0.0, 0.7, 0.3], [0.1, 0.9, 0], [0.4, 0.4, 0.2], [0.5, 0.3, 0.2], [0.6, 0.3, 0.1], [0.3, 0.3, 0.4], [0.2, 0.2, 0.6], ] ) _, c_1 = _fuzzy_to_discrete(a_fuzzy, n_most_likely=3, remove_overlap=False) _, c_2 = _fuzzy_to_discrete(a_fuzzy, n_most_likely=3, remove_overlap=True) assert c_1 == np.array(2) np.testing.assert_array_equal(c_2, np.array([1, 2]))
def test_normal_run(self): # create random data that sums to one row-wise a_fuzzy = np.random.standard_normal((100, 3)) a_fuzzy = np.exp(a_fuzzy) / np.sum(np.exp(a_fuzzy), 1)[:, None] # check with both overlap handlings _fuzzy_to_discrete(a_fuzzy=a_fuzzy) _fuzzy_to_discrete(a_fuzzy=a_fuzzy, n_most_likely=30, remove_overlap=True) _fuzzy_to_discrete(a_fuzzy=a_fuzzy, n_most_likely=30, remove_overlap=False)
def test_raise_threshold(self): a_fuzzy = np.repeat(np.array([0.9, 0.1])[None, :], 10, 0) with pytest.raises(ValueError): _fuzzy_to_discrete(a_fuzzy, n_most_likely=3, remove_overlap=True) with pytest.raises(ValueError): _fuzzy_to_discrete(a_fuzzy, n_most_likely=3, remove_overlap=False)
def test_too_many_cells(self): a_fuzzy = np.random.standard_normal((100, 3)) a_fuzzy = np.exp(a_fuzzy) / np.sum(np.exp(a_fuzzy), 1)[:, None] with pytest.raises(ValueError): _fuzzy_to_discrete(a_fuzzy=a_fuzzy, n_most_likely=50)
def test_normalization(self): a_fuzzy = np.random.standard_normal((100, 3)) with pytest.raises(ValueError): _fuzzy_to_discrete(a_fuzzy=a_fuzzy)