From 987d07f864b3b09606edf028aeb200d72b749a91 Mon Sep 17 00:00:00 2001 From: colganwi Date: Wed, 29 May 2024 09:25:57 -0400 Subject: [PATCH 01/25] pl.annotation bug fix --- src/pycea/pl/plot_tree.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pycea/pl/plot_tree.py b/src/pycea/pl/plot_tree.py index 95d627e..832f44b 100644 --- a/src/pycea/pl/plot_tree.py +++ b/src/pycea/pl/plot_tree.py @@ -448,7 +448,7 @@ def annotation( end_lat = start_lat + attrs["depth"] + 2 * np.pi lats = np.linspace(start_lat, end_lat, data.shape[1] + 1) for col in data.columns: - rgb_array.append(_series_to_rgb_array(data.loc[col], cmap, vmin=vmin, vmax=vmax, na_color=na_color)) + rgb_array.append(_series_to_rgb_array(data.loc[leaves,col], cmap, vmin=vmin, vmax=vmax, na_color=na_color)) else: for key in keys: if data[key].dtype == "category": From 30831f8db6517bbed6f65c92ad96aac52570aa06 Mon Sep 17 00:00:00 2001 From: colganwi Date: Wed, 29 May 2024 10:57:30 -0400 Subject: [PATCH 02/25] sankoff speedup --- src/pycea/tl/ancestral_states.py | 51 +++++++++++++++++--------------- tests/test_ancestral_states.py | 6 ++-- 2 files changed, 30 insertions(+), 27 deletions(-) diff --git a/src/pycea/tl/ancestral_states.py b/src/pycea/tl/ancestral_states.py index bb5fc2d..6919805 100755 --- a/src/pycea/tl/ancestral_states.py +++ b/src/pycea/tl/ancestral_states.py @@ -92,6 +92,11 @@ def uppass(node, parent_state=None): def _reconstruct_sankoff(tree, key, costs, missing="-1", index=None): """Reconstructs ancestral states using the Sankoff algorithm.""" + # Set up + alphabet = list(costs.index) + num_states = len(alphabet) + cost_matrix = costs.to_numpy() + value_to_index = {value: i for i, value in enumerate(alphabet)} # Recursive function to calculate the Sankoff scores def sankoff_scores(node): @@ -99,41 +104,39 @@ def sankoff_scores(node): if tree.out_degree(node) == 0: leaf_value = _get_node_value(tree, node, key, index) if leaf_value == missing: - return {value: 0 for value in alphabet} + return np.zeros(num_states) else: - return {value: 0 if value == leaf_value else float("inf") for value in alphabet} + scores = np.full(num_states, float("inf")) + scores[value_to_index[leaf_value]] = 0 + return scores # Recursive case: internal node else: - scores = {value: 0 for value in alphabet} - pointers = {value: {} for value in alphabet} - for child in tree.successors(node): + scores = np.zeros(num_states) + pointers = np.zeros((num_states, len(list(tree.successors(node)))), dtype=int) + for i, child in enumerate(tree.successors(node)): child_scores = sankoff_scores(child) - for value in alphabet: - min_cost, min_value = float("inf"), None - for child_value in alphabet: - cost = child_scores[child_value] + costs.loc[value, child_value] - if cost < min_cost: - min_cost, min_value = cost, child_value - scores[value] += min_cost - pointers[value][child] = min_value + for j in range(num_states): + costs_with_child = child_scores + cost_matrix[j, :] + min_cost_index = np.argmin(costs_with_child) + scores[j] += costs_with_child[min_cost_index] + pointers[j, i] = min_cost_index tree.nodes[node]["_pointers"] = pointers return scores # Recursive function to traceback the Sankoff scores - def traceback(node, parent_value=None): - for child in tree.successors(node): - child_value = tree.nodes[node]["_pointers"][parent_value][child] - _set_node_value(tree, child, key, child_value, index) - traceback(child, child_value) + def traceback(node, parent_value_index): + for i, child in enumerate(tree.successors(node)): + child_value_index = tree.nodes[node]["_pointers"][parent_value_index, i] + _set_node_value(tree, child, key, alphabet[child_value_index], index) + traceback(child, child_value_index) # Get scores - root = get_root(tree) - alphabet = set(costs.index) + root = [n for n, d in tree.in_degree() if d == 0][0] root_scores = sankoff_scores(root) # Reconstruct ancestral states - root_value = min(root_scores, key=root_scores.get) - _set_node_value(tree, root, key, root_value, index) - traceback(root, root_value) + root_value_index = np.argmin(root_scores) + _set_node_value(tree, root, key, alphabet[root_value_index], index) + traceback(root, root_value_index) # Clean up for node in tree.nodes: if "_pointers" in tree.nodes[node]: @@ -235,7 +238,7 @@ def ancestral_states( data, is_array = get_keyed_obs_data(tdata, keys) dtypes = {dtype.kind for dtype in data.dtypes} # Check data type - if dtypes.intersection({"i", "f"}): + if dtypes.intersection({"f"}): if method in ["fitch_hartigan", "sankoff"]: raise ValueError(f"Method {method} requires categorical data.") if dtypes.intersection({"O", "S"}): diff --git a/tests/test_ancestral_states.py b/tests/test_ancestral_states.py index 085a3e4..475a6c2 100755 --- a/tests/test_ancestral_states.py +++ b/tests/test_ancestral_states.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import networkx as nx import numpy as np import pandas as pd @@ -88,13 +90,11 @@ def test_ancestral_states_sankoff(tdata): def test_ancestral_states_invalid(tdata): with pytest.raises(ValueError): ancestral_states(tdata, "characters", method="sankoff") - with pytest.raises(ValueError): + with pytest.raises((ValueError, KeyError)): ancestral_states(tdata, "characters", method="sankoff", costs=pd.DataFrame()) with pytest.raises(ValueError): ancestral_states(tdata, "bad", method="mean") with pytest.raises(ValueError): ancestral_states(tdata, "value", method="bad") - with pytest.raises(ValueError): - ancestral_states(tdata, "value", method="fitch_hartigan", copy=False) with pytest.raises(ValueError): ancestral_states(tdata, "str_value", method="mean", copy=False) From fe06a538d729c818e2777de0a397864a7220fe19 Mon Sep 17 00:00:00 2001 From: colganwi Date: Wed, 29 May 2024 11:41:13 -0400 Subject: [PATCH 03/25] nodes and edges as tuples --- src/pycea/pl/_utils.py | 12 +++++++----- src/pycea/pl/plot_tree.py | 24 ++++++++---------------- tests/test_plot_tree.py | 4 ++++ tests/test_plot_utils.py | 36 ++++++++++++++++++++---------------- 4 files changed, 39 insertions(+), 37 deletions(-) diff --git a/src/pycea/pl/_utils.py b/src/pycea/pl/_utils.py index 5b4daa8..23cefa2 100755 --- a/src/pycea/pl/_utils.py +++ b/src/pycea/pl/_utils.py @@ -1,4 +1,5 @@ """Plotting utilities""" + from __future__ import annotations import warnings @@ -115,7 +116,7 @@ def layout_trees( # Get leaf coordinates leaves = [] depths = [] - for _ , tree in trees.items(): + for _, tree in trees.items(): tree_leaves = get_leaves(tree) leaves.extend(tree_leaves) depths.extend(tree.nodes[leaf].get(depth_key) for leaf in tree_leaves) @@ -132,13 +133,14 @@ def layout_trees( node_coords = {} branch_coords = {} for key, tree in trees.items(): - tree_node_coords,tree_branch_coords = layout_nodes_and_branches(tree, leaf_coords, depth_key, polar, angled_branches) - node_coords.update({f"{key}-{node}": coords for node, coords in tree_node_coords.items()}) - branch_coords.update({(f"{key}-{parent}", f"{key}-{child}"): coords for (parent, child), coords in tree_branch_coords.items()}) + tree_node_coords, tree_branch_coords = layout_nodes_and_branches( + tree, leaf_coords, depth_key, polar, angled_branches + ) + node_coords.update({(key, node): coords for node, coords in tree_node_coords.items()}) + branch_coords.update({(key, edge): coords for edge, coords in tree_branch_coords.items()}) return node_coords, branch_coords, leaves, max_depth - def _get_default_categorical_colors(length): """Get default categorical colors for plotting.""" # check if default matplotlib palette has enough colors diff --git a/src/pycea/pl/plot_tree.py b/src/pycea/pl/plot_tree.py index 832f44b..18e07e9 100644 --- a/src/pycea/pl/plot_tree.py +++ b/src/pycea/pl/plot_tree.py @@ -102,10 +102,8 @@ def branches( kwargs.update({"color": color}) elif isinstance(color, str): color_data = get_keyed_edge_data(tdata, color, tree_keys)[color] - print(color_data) if len(color_data) == 0: raise ValueError(f"Key {color!r} is not present in any edge.") - color_data.index = color_data.index.map(lambda x: f"{x[0]}-{x[1][0]}-{x[1][1]}") if color_data.dtype.kind in ["i", "f"]: norm = plt.Normalize(vmin=color_data.min(), vmax=color_data.max()) cmap = plt.get_cmap(cmap) @@ -132,7 +130,6 @@ def branches( linewidth_data = get_keyed_edge_data(tdata, linewidth, tree_keys)[linewidth] if len(linewidth_data) == 0: raise ValueError(f"Key {linewidth!r} is not present in any edge.") - linewidth_data.index = linewidth_data.index.map(lambda x: f"{x[0]}-{x[1][0]}-{x[1][1]}") if linewidth_data.dtype.kind in ["i", "f"]: linewidths = [linewidth_data[edge] if edge in linewidth_data.index else na_linewidth for edge in edges] kwargs.update({"linewidth": linewidths}) @@ -244,23 +241,21 @@ def nodes( tree_keys = [tree_keys] if not set(tree_keys).issubset(attrs["tree_keys"]): raise ValueError("Invalid tree key. Must be one of the keys used to plot the branches.") - trees = get_trees(tdata, attrs["tree_keys"]) # Get nodes - all_nodes = set() + all_nodes = [] for node in list(attrs["node_coords"].keys()): - if any(node.startswith(key) for key in tree_keys): - all_nodes.add(node) - leaves = set(attrs["leaves"]) + if node[0] in tree_keys: + all_nodes.append(node) if nodes == "all": - nodes = list(all_nodes) + nodes = all_nodes elif nodes == "leaves": - nodes = list(all_nodes.intersection(leaves)) + nodes = [node for node in all_nodes if node[1] in attrs["leaves"]] elif nodes == "internal": - nodes = list(all_nodes.difference(leaves)) + nodes = [node for node in all_nodes if node[1] not in attrs["leaves"]] elif isinstance(nodes, Sequence): if len(attrs["tree_keys"]) > 1 and len(tree_keys) > 1: raise ValueError("Multiple trees are present. To plot a list of nodes, you must specify the tree.") - nodes = [f"{tree_keys[0]}-{node}" for node in nodes] + nodes = [(tree_keys[0], node) for node in nodes] if set(nodes).issubset(all_nodes): nodes = list(nodes) else: @@ -281,7 +276,6 @@ def nodes( color_data = get_keyed_node_data(tdata, color, tree_keys)[color] if len(color_data) == 0: raise ValueError(f"Key {color!r} is not present in any node.") - color_data.index = color_data.index.map("-".join) if color_data.dtype.kind in ["i", "f"]: if not vmin: vmin = color_data.min() @@ -311,7 +305,6 @@ def nodes( size_data = get_keyed_node_data(tdata, size, tree_keys)[size] if len(size_data) == 0: raise ValueError(f"Key {size!r} is not present in any node.") - size_data.index = size_data.index.map("-".join) sizes = [size_data[node] if node in size_data.index else na_size for node in nodes] kwargs.update({"s": sizes}) else: @@ -323,7 +316,6 @@ def nodes( style_data = get_keyed_node_data(tdata, style, tree_keys)[style] if len(style_data) == 0: raise ValueError(f"Key {style!r} is not present in any node.") - style_data.index = style_data.index.map("-".join) mmap = _get_categorical_markers(tdata, style, style_data, markers) styles = [mmap[style_data[node]] if node in style_data.index else na_style for node in nodes] for style in set(styles): @@ -448,7 +440,7 @@ def annotation( end_lat = start_lat + attrs["depth"] + 2 * np.pi lats = np.linspace(start_lat, end_lat, data.shape[1] + 1) for col in data.columns: - rgb_array.append(_series_to_rgb_array(data.loc[leaves,col], cmap, vmin=vmin, vmax=vmax, na_color=na_color)) + rgb_array.append(_series_to_rgb_array(data.loc[leaves, col], cmap, vmin=vmin, vmax=vmax, na_color=na_color)) else: for key in keys: if data[key].dtype == "category": diff --git a/tests/test_plot_tree.py b/tests/test_plot_tree.py index 371f5cd..783e90a 100755 --- a/tests/test_plot_tree.py +++ b/tests/test_plot_tree.py @@ -85,3 +85,7 @@ def test_annotation_bad_input(tdata): with pytest.raises(ValueError): pycea.pl.annotation(tdata, keys="clade", label={}, ax=ax) plt.close() + + +if __name__ == "__main__": + pytest.main(["-v", __file__]) diff --git a/tests/test_plot_utils.py b/tests/test_plot_utils.py index a2a272a..1867ea6 100755 --- a/tests/test_plot_utils.py +++ b/tests/test_plot_utils.py @@ -18,7 +18,7 @@ def test_layout_empty_tree(): tree = nx.DiGraph() with pytest.raises(ValueError): - layout_trees({"tree":tree}) + layout_trees({"tree": tree}) def test_layout_tree(): @@ -27,29 +27,33 @@ def test_layout_tree(): [("A", {"depth": 0}), ("B", {"depth": 1}), ("C", {"depth": 2}), ("D", {"depth": 2}), ("E", {"depth": 2})] ) edges = [("A", "B"), ("B", "C"), ("B", "D"), ("A", "E")] - expected_edges = [("tree-A", "tree-B"), ("tree-B", "tree-C"), ("tree-B", "tree-D"), ("tree-A", "tree-E")] + expected_edges = [(("tree"), ("A", "B")), (("tree"), ("B", "C")), (("tree"), ("B", "D")), (("tree"), ("A", "E"))] tree.add_edges_from(edges) - node_coords, branch_coords, leaves, max_depth = layout_trees({"tree":tree}, extend_branches=True) + node_coords, branch_coords, leaves, max_depth = layout_trees({"tree": tree}, extend_branches=True) assert sorted(leaves) == ["C", "D", "E"] assert max_depth == 2 assert set(branch_coords.keys()) == set(expected_edges) - assert branch_coords[("tree-B", "tree-C")][0] == [1, 1, 2] - assert branch_coords[("tree-B", "tree-C")][1] == [node_coords["tree-B"][1], node_coords["tree-C"][1], node_coords["tree-C"][1]] + assert branch_coords[("tree", ("B", "C"))][0] == [1, 1, 2] + assert branch_coords[("tree", ("B", "C"))][1] == [ + node_coords[("tree", "B")][1], + node_coords[("tree", "C")][1], + node_coords[("tree", "C")][1], + ] def test_layout_multiple_trees(): - tree1 = nx.DiGraph([("root","A")]) + tree1 = nx.DiGraph([("root", "A")]) tree1.nodes["root"]["depth"] = 0 tree1.nodes["A"]["depth"] = 1 - tree2 = nx.DiGraph([("root","B")]) + tree2 = nx.DiGraph([("root", "B")]) tree2.nodes["root"]["depth"] = 0 tree2.nodes["B"]["depth"] = 2 - expected_edges = [("1-root", "1-A"), ("2-root", "2-B")] - node_coords, branch_coords, leaves, max_depth = layout_trees({1:tree1,2:tree2}, extend_branches=False) - assert leaves == ["A","B"] + expected_edges = [(1, ("root", "A")), (2, ("root", "B"))] + node_coords, branch_coords, leaves, max_depth = layout_trees({1: tree1, 2: tree2}, extend_branches=False) + assert leaves == ["A", "B"] assert max_depth == 2 assert set(branch_coords.keys()) == set(expected_edges) - assert branch_coords[("1-root", "1-A")][0] == [0, 0, 1] + assert branch_coords[(1, ("root", "A"))][0] == [0, 0, 1] def test_layout_polar_coordinates(): @@ -63,17 +67,17 @@ def test_layout_polar_coordinates(): ] ) tree.add_edges_from([("A", "B"), ("B", "C"), ("B", "D")]) - node_coords, branch_coords, _, _ = layout_trees({"tree":tree}, polar=True) - assert len(branch_coords[("tree-B", "tree-C")][1]) > 2 - assert np.mean(branch_coords[("tree-B", "tree-C")][0][:-2]) == 1 + node_coords, branch_coords, _, _ = layout_trees({"tree": tree}, polar=True) + assert len(branch_coords[("tree", ("B", "C"))][1]) > 2 + assert np.mean(branch_coords[("tree", ("B", "C"))][0][:-2]) == 1 def test_layout_angled_branches(): tree = nx.DiGraph() tree.add_nodes_from([("A", {"time": 0}), ("B", {"time": 1})]) tree.add_edge("A", "B") - _, branch_coords, _, _ = layout_trees({"tree":tree}, angled_branches=True,depth_key="time") - assert len(branch_coords[("tree-A", "tree-B")][1]) == 2 + _, branch_coords, _, _ = layout_trees({"tree": tree}, angled_branches=True, depth_key="time") + assert len(branch_coords[("tree", ("A", "B"))][1]) == 2 # Test _get_default_categorical_colors From fb72628bbbccc6a1c53f940b68fa7f7a54ef0ecc Mon Sep 17 00:00:00 2001 From: colganwi Date: Sat, 1 Jun 2024 18:38:02 -0400 Subject: [PATCH 04/25] fixed obsp annotation bug --- src/pycea/pl/plot_tree.py | 1 - tests/test_plot_tree.py | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pycea/pl/plot_tree.py b/src/pycea/pl/plot_tree.py index 18e07e9..ef0b7b4 100644 --- a/src/pycea/pl/plot_tree.py +++ b/src/pycea/pl/plot_tree.py @@ -409,7 +409,6 @@ def annotation( leaves = attrs["leaves"] # Get data data, is_array = get_keyed_obs_data(tdata, keys) - data = data.loc[leaves] numeric_data = data.select_dtypes(exclude="category") if len(numeric_data) > 0 and not vmin: vmin = numeric_data.min().min() diff --git a/tests/test_plot_tree.py b/tests/test_plot_tree.py index 783e90a..79a8c8b 100755 --- a/tests/test_plot_tree.py +++ b/tests/test_plot_tree.py @@ -39,11 +39,12 @@ def test_matrix_annotation(tdata): node_color="clade", node_size="time", depth_key="time", - annotation_keys=["spatial_distance"], + keys=["spatial_distance"], ax=ax, ) plt.savefig(plot_path / "matrix_annotation.png") plt.close() + assert False def test_branches_bad_input(tdata): From e4c38ca265b9cf9e94d49e786efea9f764c90e66 Mon Sep 17 00:00:00 2001 From: colganwi Date: Thu, 6 Jun 2024 14:21:16 -0400 Subject: [PATCH 05/25] add depth to obs --- src/pycea/pp/setup_tree.py | 27 ++++++++++++------ src/pycea/utils.py | 34 ++++++++++++++++------ tests/test_plot_tree.py | 1 - tests/test_setup_tree.py | 3 +- tests/test_utils.py | 58 +++++++++++++++++++++++++++++--------- 5 files changed, 92 insertions(+), 31 deletions(-) diff --git a/src/pycea/pp/setup_tree.py b/src/pycea/pp/setup_tree.py index 6f72cae..5f47fa5 100755 --- a/src/pycea/pp/setup_tree.py +++ b/src/pycea/pp/setup_tree.py @@ -5,7 +5,7 @@ import networkx as nx import treedata as td -from pycea.utils import get_keyed_node_data, get_root, get_trees +from pycea.utils import get_keyed_leaf_data, get_keyed_node_data, get_root, get_trees def _add_depth(tree, depth_key): @@ -16,24 +16,35 @@ def _add_depth(tree, depth_key): def add_depth( - tdata: td.TreeData, depth_key: str = "depth", tree: str | Sequence[str] | None = None, copy: bool = False + tdata: td.TreeData, key_added: str = "depth", tree: str | Sequence[str] | None = None, copy: bool = False ): - """Adds a depth attribute to the nodes of a tree. + """Adds a depth attribute to the tree. Parameters ---------- tdata TreeData object. - depth_key - Node attribute key to store the depth. + key_added + Key to store node depths. tree The `obst` key or keys of the trees to use. If `None`, all trees are used. copy - If True, returns a pd.DataFrame node depths. + If True, returns a :class:`pandas.DataFrame` with node depths. + + Returns + ------- + Returns `None` if `copy=False`, else returns a :class:`pandas.DataFrame`. Sets the following fields: + + `tdata.obs[key_added]` : :class:`pandas.Series` (dtype `float`) + Distance from the root node. + `tdata.obst[tree].nodes[key_added]` : `float` + Distance from the root node. + """ tree_keys = tree trees = get_trees(tdata, tree_keys) for _, tree in trees.items(): - _add_depth(tree, depth_key) + _add_depth(tree, key_added) + tdata.obs[key_added] = get_keyed_leaf_data(tdata, key_added)[key_added] if copy: - return get_keyed_node_data(tdata, depth_key) + return get_keyed_node_data(tdata, key_added, tree_keys) diff --git a/src/pycea/utils.py b/src/pycea/utils.py index 7648411..e767a49 100755 --- a/src/pycea/utils.py +++ b/src/pycea/utils.py @@ -48,7 +48,7 @@ def get_keyed_edge_data( def get_keyed_node_data( tdata: td.TreeData, keys: str | Sequence[str], tree_keys: str | Sequence[str] = None ) -> pd.DataFrame: - """Gets node data for a given key a tree or set of trees.""" + """Gets node data for a given key from a tree or set of trees.""" if isinstance(tree_keys, str): tree_keys = [tree_keys] if isinstance(keys, str): @@ -66,8 +66,29 @@ def get_keyed_node_data( return data -def get_keyed_obs_data(tdata: td.TreeData, keys: Sequence[str], layer: str = None) -> pd.DataFrame: +def get_keyed_leaf_data( + tdata: td.TreeData, keys: str | Sequence[str], tree_keys: str | Sequence[str] = None +) -> pd.DataFrame: + """Gets node data for a given key from a tree or set of trees.""" + if isinstance(tree_keys, str): + tree_keys = [tree_keys] + if isinstance(keys, str): + keys = [keys] + trees = get_trees(tdata, tree_keys) + data = [] + for _, tree in trees.items(): + tree_data = {key: nx.get_node_attributes(tree, key) for key in keys} + tree_data = pd.DataFrame(tree_data) + tree_data = tree_data.loc[get_leaves(tree)] + data.append(tree_data) + data = pd.concat(data) + return data + + +def get_keyed_obs_data(tdata: td.TreeData, keys: str | Sequence[str], layer: str = None) -> pd.DataFrame: """Gets observation data for a given key from a tree.""" + if isinstance(keys, str): + keys = [keys] data = [] column_keys = False array_keys = False @@ -81,10 +102,10 @@ def get_keyed_obs_data(tdata: td.TreeData, keys: Sequence[str], layer: str = Non data.append(pd.Series(tdata.obs_vector(key, layer=layer), index=tdata.obs_names)) column_keys = True elif "obsm" in dir(tdata) and key in tdata.obsm.keys(): - data.append(tdata.obsm[key]) + data.append(pd.DataFrame(tdata.obsm[key], index=tdata.obs_names)) array_keys = True elif "obsp" in dir(tdata) and key in tdata.obsp.keys(): - data.append(tdata.obsp[key]) + data.append(pd.DataFrame(tdata.obsp[key], index=tdata.obs_names, columns=tdata.obs_names)) array_keys = True else: raise ValueError( @@ -97,14 +118,11 @@ def get_keyed_obs_data(tdata: td.TreeData, keys: Sequence[str], layer: str = Non raise ValueError("Cannot request multiple matrix keys.") if not column_keys and not array_keys: raise ValueError("No valid keys found.") - # Convert to DataFrame if column_keys: data = pd.concat(data, axis=1) data.columns = keys elif array_keys: - data = pd.DataFrame(data[0], index=tdata.obs_names) - if data.shape[0] == data.shape[1]: - data.columns = tdata.obs_names + data = data[0] return data, array_keys diff --git a/tests/test_plot_tree.py b/tests/test_plot_tree.py index 79a8c8b..37211cb 100755 --- a/tests/test_plot_tree.py +++ b/tests/test_plot_tree.py @@ -44,7 +44,6 @@ def test_matrix_annotation(tdata): ) plt.savefig(plot_path / "matrix_annotation.png") plt.close() - assert False def test_branches_bad_input(tdata): diff --git a/tests/test_setup_tree.py b/tests/test_setup_tree.py index 1b0b732..1ac497b 100755 --- a/tests/test_setup_tree.py +++ b/tests/test_setup_tree.py @@ -15,11 +15,12 @@ def tdata(): def test_add_depth(tdata): - depths = add_depth(tdata, depth_key="depth", copy=True) + depths = add_depth(tdata, key_added="depth", copy=True) assert depths.loc[("tree1", "root"), "depth"] == 0 assert depths.loc[("tree1", "C"), "depth"] == 2 assert tdata.obst["tree1"].nodes["root"]["depth"] == 0 assert tdata.obst["tree1"].nodes["C"]["depth"] == 2 + assert tdata.obs.loc["C", "depth"] == 2 if __name__ == "__main__": diff --git a/tests/test_utils.py b/tests/test_utils.py index 22f8491..1071597 100755 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -1,8 +1,17 @@ import networkx as nx +import numpy as np import pandas as pd import pytest +import treedata as td -from pycea.utils import get_keyed_edge_data, get_keyed_node_data, get_keyed_obs_data, get_leaves, get_root +from pycea.utils import ( + get_keyed_edge_data, + get_keyed_leaf_data, + get_keyed_node_data, + get_keyed_obs_data, + get_leaves, + get_root, +) @pytest.fixture @@ -10,10 +19,22 @@ def tree(): t = nx.DiGraph() t.add_edges_from([("A", "B"), ("A", "C"), ("B", "D"), ("C", "E")]) nx.set_node_attributes(t, {"A": 1, "B": 2, "C": None, "D": 4, "E": 5}, "value") + nx.set_node_attributes(t, {"A": "red", "B": "red", "C": None, "D": "blue", "E": "blue"}, "color") nx.set_edge_attributes(t, {("A", "B"): 5, ("A", "C"): None, ("B", "D"): 3, ("C", "E"): 4}, "weight") + nx.set_edge_attributes(t, {("A", "B"): "red", ("A", "C"): None, ("B", "D"): "red", ("C", "E"): "blue"}, "color") yield t +@pytest.fixture +def tdata(tree): + tdata = td.TreeData( + obs=pd.DataFrame({"value": ["1", "2"]}, index=["D", "E"]), + obst={"tree": tree}, + obsm={"spatial": pd.DataFrame([[0, 0], [1, 1]], index=["D", "E"])}, + ) + yield tdata + + def test_get_root(tree): # Test with an empty graph assert get_root(nx.DiGraph()) is None @@ -32,38 +53,49 @@ def test_get_leaves(tree): def test_get_keyed_edge_data(tdata): - data = get_keyed_edge_data(tdata, ["length", "clade"]) - assert data.columns.tolist() == ["length", "clade"] + data = get_keyed_edge_data(tdata, ["weight", "color"]) + assert data.columns.tolist() == ["weight", "color"] + assert data.index.names == ["tree", "edge"] + assert np.allclose(data["weight"].values, [5, np.nan, 3, 4], equal_nan=True) def test_get_keyed_node_data(tdata): - data = get_keyed_node_data(tdata, ["x", "y", "clade"]) - assert data.columns.tolist() == ["x", "y", "clade"] + data = get_keyed_node_data(tdata, ["value", "color"]) + assert data.columns.tolist() == ["value", "color"] + assert data.index.names == ["tree", "node"] + assert np.allclose(data["value"].values, [1, 2, np.nan, 4, 5], equal_nan=True) + + +def test_get_keyed_leaf_data(tdata): + data = get_keyed_leaf_data(tdata, ["value", "color"]) + assert data.columns.tolist() == ["value", "color"] + assert data["value"].tolist() == [4, 5] + assert data["color"].tolist() == ["blue", "blue"] def test_get_keyed_obs_data_valid_keys(tdata): - data, is_array = get_keyed_obs_data(tdata, ["clade", "x", "0"]) + data, is_array = get_keyed_obs_data(tdata, "value") assert not is_array - assert data.columns.tolist() == ["clade", "x", "0"] + assert data["value"].tolist() == ["1", "2"] # Automatically converts object columns to category - assert data["clade"].dtype == "category" - assert tdata.obs["clade"].dtype == "category" + assert data["value"].dtype == "category" + assert tdata.obs["value"].dtype == "category" def test_get_keyed_obs_data_array(tdata): data, is_array = get_keyed_obs_data(tdata, ["spatial"]) + assert data.columns.tolist() == [0, 1] + assert data[0].tolist() == [0, 1] assert is_array assert isinstance(data, pd.DataFrame) assert data.shape[1] == 2 - data, is_array = get_keyed_obs_data(tdata, ["spatial_distance"]) - assert data.shape == (tdata.n_obs, tdata.n_obs) def test_get_keyed_obs_data_invalid_keys(tdata): with pytest.raises(ValueError): - get_keyed_obs_data(tdata, ["clade", "x", "0", "invalid_key"]) + get_keyed_obs_data(tdata, ["bad"]) with pytest.raises(ValueError): - get_keyed_obs_data(tdata, ["clade", "spatial_distance"]) + get_keyed_obs_data(tdata, ["value", "spatial"]) if __name__ == "__main__": From 7b3e9be944dfa67c14d9aab6911237a6b4a1fa91 Mon Sep 17 00:00:00 2001 From: colganwi Date: Thu, 6 Jun 2024 14:40:29 -0400 Subject: [PATCH 06/25] clades key_added --- src/pycea/tl/clades.py | 29 ++++++++++++++++++++--------- tests/test_clades.py | 6 +++--- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/pycea/tl/clades.py b/src/pycea/tl/clades.py index 0a61c04..590189d 100755 --- a/src/pycea/tl/clades.py +++ b/src/pycea/tl/clades.py @@ -29,8 +29,14 @@ def _clade_name_generator(): def _clades(tree, depth, depth_key, clades, clade_key, name_generator): """Marks clades in a tree.""" + # Check that root has depth key + root = get_root(tree) + if depth_key not in tree.nodes[root]: + raise ValueError( + f"Tree does not have {depth_key} attribute. You can run `pycea.pp.add_depth` to add depth attribute." + ) if (depth is not None) and (clades is None): - nodes = _nodes_at_depth(tree, get_root(tree), [], depth, depth_key) + nodes = _nodes_at_depth(tree, root, [], depth, depth_key) clades = dict(zip(nodes, name_generator)) elif (clades is not None) and (depth is None): pass @@ -57,7 +63,7 @@ def clades( depth: int | float = None, depth_key: str = "depth", clades: str | Sequence[str] = None, - clade_key: str = "clade", + key_added: str = "clade", tree: str | Sequence[str] | None = None, copy: bool = False, ) -> None | Mapping: @@ -73,17 +79,22 @@ def clades( Key where depth is stored. clades A dictionary mapping nodes to clades. - clade_key + key_added Key to store clades in. tree The `obst` key or keys of the trees to use. If `None`, all trees are used. copy - If True, returns a pd.DataFrame with clade nodes. + If True, returns a :class:`pandas.DataFrame` with clades. Returns ------- - None or Mapping - If copy is True, returns pd.DataFrame with clade nodes. + Returns `None` if `copy=False`, else returns a :class:`pandas.DataFrame`. Sets the following fields: + + `tdata.obs[key_added]` : :class:`pandas.Series` (dtype `Object`) + Clade. + `tdata.obst[tree].nodes[key_added]` : `Object` + Clade. + """ # Setup tree_keys = tree @@ -95,13 +106,13 @@ def clades( leaf_to_clade = {} clade_nodes = [] for key, tree in trees.items(): - tree_nodes, tree_leaves = _clades(tree, depth, depth_key, clades, clade_key, name_generator) - tree_nodes = pd.DataFrame(tree_nodes.items(), columns=["node", clade_key]) + tree_nodes, tree_leaves = _clades(tree, depth, depth_key, clades, key_added, name_generator) + tree_nodes = pd.DataFrame(tree_nodes.items(), columns=["node", key_added]) tree_nodes["tree"] = key clade_nodes.append(tree_nodes) leaf_to_clade.update(tree_leaves) # Update TreeData and return - tdata.obs[clade_key] = tdata.obs.index.map(leaf_to_clade) + tdata.obs[key_added] = tdata.obs.index.map(leaf_to_clade) clade_nodes = pd.concat(clade_nodes) if copy: return clade_nodes diff --git a/tests/test_clades.py b/tests/test_clades.py index b1af2d6..455a872 100755 --- a/tests/test_clades.py +++ b/tests/test_clades.py @@ -31,7 +31,7 @@ def test_clades_given_dict(tdata, tree): assert tdata.obs["clade"].tolist() == [0, 1, 1] assert tdata.obst["tree"].nodes["C"]["clade"] == 1 assert tdata.obst["tree"].edges[("C", "D")]["clade"] == 1 - clades(tdata, clades={"A": "0"}, clade_key="all") + clades(tdata, clades={"A": "0"}, key_added="all") assert tdata.obs["all"].tolist() == ["0", "0", "0"] assert tdata.obst["tree"].nodes["A"]["all"] == "0" assert tdata.obst["tree"].edges[("C", "D")]["all"] == "0" @@ -59,7 +59,7 @@ def test_clades_multiple_trees(): # need to specify tree with clade input with pytest.raises(ValueError): clades(tdata, clades={"root": 0}) - clades(tdata, clades={"root": "0"}, tree="tree1", clade_key="test") + clades(tdata, clades={"root": "0"}, tree="tree1", key_added="test") assert tdata.obs.loc["A", "test"] == "0" assert pd.isna(tdata.obs.loc["B", "test"]) @@ -70,4 +70,4 @@ def test_clades_invalid(tdata): with pytest.raises(ValueError): clades(tdata, clades={"A": 0}, depth=0) with pytest.raises((KeyError, nx.NetworkXError)): - clades(tdata, clades={"bad": 0}, clade_key="clade") + clades(tdata, clades={"bad": 0}, key_added="clade") From a6a2406e6515ed2937243f8fe69b0ae7c9afdec0 Mon Sep 17 00:00:00 2001 From: colganwi Date: Thu, 6 Jun 2024 14:58:26 -0400 Subject: [PATCH 07/25] ancestral state keys_added --- src/pycea/tl/ancestral_states.py | 21 +++++++++++++++------ tests/test_ancestral_states.py | 14 ++++++++++++-- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/src/pycea/tl/ancestral_states.py b/src/pycea/tl/ancestral_states.py index 6919805..52f2dca 100755 --- a/src/pycea/tl/ancestral_states.py +++ b/src/pycea/tl/ancestral_states.py @@ -205,6 +205,7 @@ def ancestral_states( missing_state: str = "-1", default_state: str = "0", costs: pd.DataFrame = None, + keys_added: str | Sequence[str] = None, tree: str | Sequence[str] | None = None, copy: bool = False, ) -> None: @@ -225,6 +226,8 @@ def ancestral_states( The expected state for the root node. costs A pd.DataFrame with the costs of changing states (from rows to columns). + keys_added + The keys to store the ancestral states. If None, the same keys are used. tree The `obst` key or keys of the trees to use. If `None`, all trees are used. copy @@ -232,6 +235,12 @@ def ancestral_states( """ if isinstance(keys, str): keys = [keys] + if keys_added is None: + keys_added = keys + if isinstance(keys_added, str): + keys_added = [keys_added] + if len(keys) != len(keys_added): + raise ValueError("Length of keys must match length of keys_added.") tree_keys = tree trees = get_trees(tdata, tree_keys) for _, tree in trees.items(): @@ -251,13 +260,13 @@ def ancestral_states( for node in tree.nodes: if node not in node_attrs: node_attrs[node] = [None] * length - nx.set_node_attributes(tree, node_attrs, keys[0]) + nx.set_node_attributes(tree, node_attrs, keys_added[0]) for index in range(length): - _ancestral_states(tree, keys[0], method, costs, missing_state, default_state, index) + _ancestral_states(tree, keys_added[0], method, costs, missing_state, default_state, index) # If column add to tree as scalar else: - for key in keys: - nx.set_node_attributes(tree, data[key].to_dict(), key) - _ancestral_states(tree, key, method, missing_state, default_state) + for key, key_added in zip(keys, keys_added): + nx.set_node_attributes(tree, data[key].to_dict(), key_added) + _ancestral_states(tree, key_added, method, missing_state, default_state) if copy: - return get_keyed_node_data(tdata, keys, tree_keys) + return get_keyed_node_data(tdata, keys_added, tree_keys) diff --git a/tests/test_ancestral_states.py b/tests/test_ancestral_states.py index 475a6c2..512c6d1 100755 --- a/tests/test_ancestral_states.py +++ b/tests/test_ancestral_states.py @@ -36,10 +36,18 @@ def test_ancestral_states(tdata): states = ancestral_states(tdata, "value", method=np.median, copy=True) assert tdata.obst["tree1"].nodes["root"]["value"] == 0 # Mode - ancestral_states(tdata, "str_value", method="mode", copy=False, tree="tree1") + ancestral_states( + tdata, + ["value", "str_value"], + method="mode", + copy=False, + tree="tree1", + keys_added=["value_mode", "str_value_mode"], + ) for node in tdata.obst["tree1"].nodes: print(node, tdata.obst["tree1"].nodes[node]) - assert tdata.obst["tree1"].nodes["root"]["str_value"] == "0" + assert tdata.obst["tree1"].nodes["root"]["str_value_mode"] == "0" + assert tdata.obst["tree1"].nodes["root"]["value_mode"] == 0 def test_ancestral_states_array(tdata): @@ -98,3 +106,5 @@ def test_ancestral_states_invalid(tdata): ancestral_states(tdata, "value", method="bad") with pytest.raises(ValueError): ancestral_states(tdata, "str_value", method="mean", copy=False) + with pytest.raises(ValueError): + ancestral_states(tdata, "value", method="mean", keys_added=["bad", "bad"]) From 0f3bca6d0a1639c37614bfdd55bf5439ddde7e22 Mon Sep 17 00:00:00 2001 From: colganwi Date: Thu, 6 Jun 2024 15:03:49 -0400 Subject: [PATCH 08/25] sort doc update --- src/pycea/tl/ancestral_states.py | 9 ++++++++- src/pycea/tl/sort.py | 4 ++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/pycea/tl/ancestral_states.py b/src/pycea/tl/ancestral_states.py index 52f2dca..9c072d4 100755 --- a/src/pycea/tl/ancestral_states.py +++ b/src/pycea/tl/ancestral_states.py @@ -231,7 +231,14 @@ def ancestral_states( tree The `obst` key or keys of the trees to use. If `None`, all trees are used. copy - If True, returns a pd.DataFrame with ancestral states. + If True, returns a :class:`pandas.DataFrame` with ancestral states. + + Returns + ------- + Returns `None` if `copy=False`, else returns a :class:`pandas.DataFrame`. Sets the following fields for each key: + + `tdata.obst[tree].nodes[key_added]` : `float` | `Object` | `List[Object]` + Inferred ancestral states. List of states if data was an array. """ if isinstance(keys, str): keys = [keys] diff --git a/src/pycea/tl/sort.py b/src/pycea/tl/sort.py index cca7798..7662028 100755 --- a/src/pycea/tl/sort.py +++ b/src/pycea/tl/sort.py @@ -36,6 +36,10 @@ def sort(tdata: td.TreeData, key: str, reverse: bool = False, tree: str | Sequen If True, sort in descending order. tree The `obst` key or keys of the trees to use. If `None`, all trees are used. + + Returns + ------- + Returns `None` and does not set any fields. """ trees = get_trees(tdata, tree) for name, tree in trees.items(): From 3f41844d8a9d1912bf1e27f01f8dea9eb0f58c2e Mon Sep 17 00:00:00 2001 From: colganwi Date: Thu, 6 Jun 2024 15:17:32 -0400 Subject: [PATCH 09/25] works for empty tree --- src/pycea/utils.py | 4 +++- tests/test_ancestral_states.py | 2 +- tests/test_clades.py | 2 +- tests/test_plot_utils.py | 2 +- tests/test_setup_tree.py | 3 ++- 5 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/pycea/utils.py b/src/pycea/utils.py index e767a49..6aa640b 100755 --- a/src/pycea/utils.py +++ b/src/pycea/utils.py @@ -142,5 +142,7 @@ def get_trees(tdata: td.TreeData, tree_keys: str | Sequence[str] | None) -> Mapp for key in tree_keys: if key not in tdata.obst.keys(): raise ValueError(f"Key {key!r} is not present in obst.") - trees[key] = tdata.obst[key] + tree = tdata.obst[key] + if tree.number_of_nodes() != 0: + trees[key] = tdata.obst[key] return trees diff --git a/tests/test_ancestral_states.py b/tests/test_ancestral_states.py index 512c6d1..2682e17 100755 --- a/tests/test_ancestral_states.py +++ b/tests/test_ancestral_states.py @@ -20,7 +20,7 @@ def tdata(): {"value": [0, 0, 3, 2], "str_value": ["0", "0", "3", "2"], "with_missing": [0, np.nan, 3, 2]}, index=["B", "D", "E", "F"], ), - obst={"tree1": tree1, "tree2": tree2}, + obst={"tree1": tree1, "tree2": tree2, "empty": nx.DiGraph()}, obsm={"spatial": spatial, "characters": characters}, ) yield tdata diff --git a/tests/test_clades.py b/tests/test_clades.py index 455a872..5a88b5d 100755 --- a/tests/test_clades.py +++ b/tests/test_clades.py @@ -16,7 +16,7 @@ def tree(): @pytest.fixture def tdata(tree): - tdata = td.TreeData(obs=pd.DataFrame(index=["B", "D", "E"]), obst={"tree": tree}) + tdata = td.TreeData(obs=pd.DataFrame(index=["B", "D", "E"]), obst={"tree": tree,"empty": nx.DiGraph()}) yield tdata diff --git a/tests/test_plot_utils.py b/tests/test_plot_utils.py index 1867ea6..9a20621 100755 --- a/tests/test_plot_utils.py +++ b/tests/test_plot_utils.py @@ -49,7 +49,7 @@ def test_layout_multiple_trees(): tree2.nodes["root"]["depth"] = 0 tree2.nodes["B"]["depth"] = 2 expected_edges = [(1, ("root", "A")), (2, ("root", "B"))] - node_coords, branch_coords, leaves, max_depth = layout_trees({1: tree1, 2: tree2}, extend_branches=False) + node_coords, branch_coords, leaves, max_depth = layout_trees({1: tree1, 2: tree2, "empty":nx.DiGraph()}, extend_branches=False) assert leaves == ["A", "B"] assert max_depth == 2 assert set(branch_coords.keys()) == set(expected_edges) diff --git a/tests/test_setup_tree.py b/tests/test_setup_tree.py index 1ac497b..147b031 100755 --- a/tests/test_setup_tree.py +++ b/tests/test_setup_tree.py @@ -10,7 +10,8 @@ def tdata(): tree1 = nx.DiGraph([("root", "A"), ("root", "B"), ("B", "C"), ("B", "D")]) tree2 = nx.DiGraph([("root", "E"), ("root", "F")]) - tdata = td.TreeData(obs=pd.DataFrame(index=["A", "C", "D", "E", "F"]), obst={"tree1": tree1, "tree2": tree2}) + tdata = td.TreeData(obs=pd.DataFrame(index=["A", "C", "D", "E", "F"]), + obst={"tree1": tree1, "tree2": tree2,"empty": nx.DiGraph()}) yield tdata From c886a15373812ef202842a20ae728166fee14832 Mon Sep 17 00:00:00 2001 From: colganwi Date: Thu, 6 Jun 2024 15:17:53 -0400 Subject: [PATCH 10/25] works for empty tree --- tests/test_clades.py | 2 +- tests/test_plot_utils.py | 4 +++- tests/test_setup_tree.py | 5 +++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/tests/test_clades.py b/tests/test_clades.py index 5a88b5d..0fe2bc2 100755 --- a/tests/test_clades.py +++ b/tests/test_clades.py @@ -16,7 +16,7 @@ def tree(): @pytest.fixture def tdata(tree): - tdata = td.TreeData(obs=pd.DataFrame(index=["B", "D", "E"]), obst={"tree": tree,"empty": nx.DiGraph()}) + tdata = td.TreeData(obs=pd.DataFrame(index=["B", "D", "E"]), obst={"tree": tree, "empty": nx.DiGraph()}) yield tdata diff --git a/tests/test_plot_utils.py b/tests/test_plot_utils.py index 9a20621..a86602c 100755 --- a/tests/test_plot_utils.py +++ b/tests/test_plot_utils.py @@ -49,7 +49,9 @@ def test_layout_multiple_trees(): tree2.nodes["root"]["depth"] = 0 tree2.nodes["B"]["depth"] = 2 expected_edges = [(1, ("root", "A")), (2, ("root", "B"))] - node_coords, branch_coords, leaves, max_depth = layout_trees({1: tree1, 2: tree2, "empty":nx.DiGraph()}, extend_branches=False) + node_coords, branch_coords, leaves, max_depth = layout_trees( + {1: tree1, 2: tree2, "empty": nx.DiGraph()}, extend_branches=False + ) assert leaves == ["A", "B"] assert max_depth == 2 assert set(branch_coords.keys()) == set(expected_edges) diff --git a/tests/test_setup_tree.py b/tests/test_setup_tree.py index 147b031..b484c05 100755 --- a/tests/test_setup_tree.py +++ b/tests/test_setup_tree.py @@ -10,8 +10,9 @@ def tdata(): tree1 = nx.DiGraph([("root", "A"), ("root", "B"), ("B", "C"), ("B", "D")]) tree2 = nx.DiGraph([("root", "E"), ("root", "F")]) - tdata = td.TreeData(obs=pd.DataFrame(index=["A", "C", "D", "E", "F"]), - obst={"tree1": tree1, "tree2": tree2,"empty": nx.DiGraph()}) + tdata = td.TreeData( + obs=pd.DataFrame(index=["A", "C", "D", "E", "F"]), obst={"tree1": tree1, "tree2": tree2, "empty": nx.DiGraph()} + ) yield tdata From 35558badb6e91656a1ad5f6a892b90a95e643943 Mon Sep 17 00:00:00 2001 From: colganwi Date: Fri, 7 Jun 2024 12:48:53 -0400 Subject: [PATCH 11/25] distance --- src/pycea/tl/__init__.py | 3 +- src/pycea/tl/_metrics.py | 28 +++++++++++++ src/pycea/tl/distance.py | 89 ++++++++++++++++++++++++++++++++++++++++ tests/test_distance.py | 65 +++++++++++++++++++++++++++++ 4 files changed, 184 insertions(+), 1 deletion(-) create mode 100755 src/pycea/tl/_metrics.py create mode 100755 src/pycea/tl/distance.py create mode 100755 tests/test_distance.py diff --git a/src/pycea/tl/__init__.py b/src/pycea/tl/__init__.py index 7518780..15f6c8e 100644 --- a/src/pycea/tl/__init__.py +++ b/src/pycea/tl/__init__.py @@ -1,3 +1,4 @@ +from .ancestral_states import ancestral_states from .clades import clades +from .distance import distance from .sort import sort -from .ancestral_states import ancestral_states \ No newline at end of file diff --git a/src/pycea/tl/_metrics.py b/src/pycea/tl/_metrics.py new file mode 100755 index 0000000..67ec800 --- /dev/null +++ b/src/pycea/tl/_metrics.py @@ -0,0 +1,28 @@ +from collections.abc import Callable +from typing import Literal, Union + +import numpy as np + +_MetricFn = Callable[[np.ndarray, np.ndarray], float] +# from sklearn.metrics.pairwise_distances.__doc__: +_MetricSparseCapable = Literal["cityblock", "cosine", "euclidean", "l1", "l2", "manhattan"] +_MetricScipySpatial = Literal[ + "braycurtis", + "canberra", + "chebyshev", + "correlation", + "dice", + "hamming", + "jaccard", + "kulsinski", + "mahalanobis", + "minkowski", + "rogerstanimoto", + "russellrao", + "seuclidean", + "sokalmichener", + "sokalsneath", + "sqeuclidean", + "yule", +] +_Metric = Union[_MetricSparseCapable, _MetricScipySpatial] diff --git a/src/pycea/tl/distance.py b/src/pycea/tl/distance.py new file mode 100755 index 0000000..44ea6ba --- /dev/null +++ b/src/pycea/tl/distance.py @@ -0,0 +1,89 @@ +from __future__ import annotations + +from collections.abc import Mapping, Sequence + +import numpy as np +import scipy as sp +import treedata as td +from sklearn.metrics import DistanceMetric + +from ._metrics import _Metric, _MetricFn + + +def distance( + tdata: td.TreeData, + key: str, + obs: str | Sequence[str] | None = None, + metric: _MetricFn | _Metric = "euclidean", + metric_kwargs: Mapping | None = None, + key_added: str | None = None, + copy: bool = False, +): + """Computes distances between observations. + + Parameters + ---------- + tdata + The TreeData object. + key + Use the indicated key. `'X'` or any `tdata.obsm` key is valid. + obs + The observations to use: + - If `None`, pairwise distance for all observations is stored in `tdata.obsp[key_added]`. + - If a string, distance to all other observations are is `tdata.obs[key_added]`. + - If a sequence, pairwise distance is stored in `tdata.obsp[key_added]`. + - If a sequence of pairs, distance between pairs is stored in `tdata.obsp[key_added]`. + metric + A known metric’s name or a callable that returns a distance. + metric_kwds + Options for the metric. + key_added + Distances are stored in `key + '_distances'` unless `key_added` is specified. + copy + If True, returns a :class:`np.array` or :class:`scipy.sparse.csr_matrix` with distances. + + Returns + ------- + Returns `None` if `copy=False`, else returns a :class:`numpy.array` or :class:`scipy.sparse.csr_matrix`. + Sets the following fields: + + `tdata.obsp[key_added]` : :class:`numpy.array` or :class:`scipy.sparse.csr_matrix` (dtype `float`) + if `obs` is `None` or a sequence. + `tdata.obs[key_added]` : :class:`pandas.Series` (dtype `float`) if `obs` is a string. + + """ + # Setup + metric = DistanceMetric.get_metric(metric, **(metric_kwargs or {})) + key_added = key_added or key + "_distances" + if key == "X": + X = tdata.X + elif key in tdata.obsm: + X = tdata.obsm[key] + else: + raise ValueError(f"Key {key} not found in `tdata.obsm`.") + # Compute distances + if obs is None: + distances = metric.pairwise(X) + tdata.obsp[key_added] = distances + elif isinstance(obs, str): + idx = tdata.obs_names.get_loc(obs) + distances = metric.pairwise(X[idx].reshape(1, -1), X).flatten() + tdata.obs[key_added] = distances + elif isinstance(obs, Sequence): + if isinstance(obs[0], str): + idx = [tdata.obs_names.get_loc(o) for o in obs] + rows = np.repeat(idx, len(idx)) + cols = np.tile(idx, len(idx)) + select_distances = metric.pairwise(X[idx]).flatten() + elif isinstance(obs[0], tuple) and len(obs[0]): + rows = [tdata.obs_names.get_loc(i) for i, _ in obs] + cols = [tdata.obs_names.get_loc(j) for _, j in obs] + select_distances = [metric.pairwise(X[i : i + 1, :], X[j : j + 1, :])[0, 0] for i, j in zip(rows, cols)] + else: + raise ValueError("Invalid type for parameter `obs`.") + distances = sp.sparse.csr_matrix((select_distances, (rows, cols)), shape=(len(X), len(X))) + tdata.obsp[key_added] = distances + else: + raise ValueError("Invalid type for parameter `obs`.") + if copy: + return distances diff --git a/tests/test_distance.py b/tests/test_distance.py new file mode 100755 index 0000000..9ead911 --- /dev/null +++ b/tests/test_distance.py @@ -0,0 +1,65 @@ +import numpy as np +import pandas as pd +import pytest +import scipy as sp +import treedata as td + +from pycea.tl.distance import distance + + +@pytest.fixture +def tdata(): + tdata = td.TreeData( + obs=pd.DataFrame(index=["A", "B", "C"]), + obsm={"spatial": np.array([[0, 0], [1, 1], [2, 2]]), "characters": np.array([[0, 0], [1, 1], [0, 1]])}, + ) + yield tdata + + +def test_pairwise_distance(tdata): + dist = distance(tdata, "spatial", metric="euclidean", key_added="euclidean", copy=True) + np.testing.assert_array_equal(tdata.obsp["euclidean"], dist) + assert tdata.obsp["euclidean"].shape == (3, 3) + assert tdata.obsp["euclidean"][0, 1] == pytest.approx(np.sqrt(2)) + assert tdata.obsp["euclidean"][1, 2] == pytest.approx(np.sqrt(2)) + assert tdata.obsp["euclidean"][0, 2] == pytest.approx(np.sqrt(8)) + metric = lambda x, y: np.abs(x - y).sum() + distance(tdata, "characters", metric=metric, key_added="manhatten") + assert tdata.obsp["manhatten"][0, 1] == 2 + assert tdata.obsp["manhatten"][1, 2] == 1 + assert tdata.obsp["manhatten"][0, 2] == 1 + + +def test_obs_distance(tdata): + distance(tdata, "spatial", obs="A", metric="manhattan") + assert tdata.obs["spatial_distances"].tolist() == [0, 2, 4] + + +def test_select_obs_distance(tdata): + distance(tdata, "spatial", obs=["A", "C"], metric="cityblock") + assert isinstance(tdata.obsp["spatial_distances"], sp.sparse.csr_matrix) + assert tdata.obsp["spatial_distances"][0, 2] == 4 + assert tdata.obsp["spatial_distances"][0, 0] == 0 + dist = distance(tdata, "spatial", obs=[("A", "C")], metric="cityblock", copy=True) + assert isinstance(dist, sp.sparse.csr_matrix) + assert len(dist.data) == 1 + assert dist[0, 2] == 4 + + +def test_distance_invalid(tdata): + with pytest.raises(ValueError): + distance(tdata, "bad", metric="cityblock") + with pytest.raises(ValueError): + distance(tdata, "spatial", obs=1, metric="cityblock") + with pytest.raises(ValueError): + distance(tdata, "spatial", obs=[1], metric="cityblock") + with pytest.raises(ValueError): + distance(tdata, "spatial", obs=[("A",)], metric="cityblock") + with pytest.raises(ValueError): + distance(tdata, "spatial", obs=[("A", "B", "C")], metric="cityblock") + with pytest.raises(ValueError): + distance(tdata, "spatial", metric="bad") + + +if __name__ == "__main__": + pytest.main(["-v", __file__]) From a00b0e33ea723dac03a38ee01bb2751baa0be46e Mon Sep 17 00:00:00 2001 From: colganwi Date: Fri, 7 Jun 2024 15:33:22 -0400 Subject: [PATCH 12/25] tree distance --- pyproject.toml | 1 + src/pycea/tl/__init__.py | 1 + src/pycea/tl/distance.py | 12 +-- src/pycea/tl/tree_distance.py | 150 ++++++++++++++++++++++++++++++++++ tests/test_tree_distance.py | 71 ++++++++++++++++ 5 files changed, 229 insertions(+), 6 deletions(-) create mode 100755 src/pycea/tl/tree_distance.py create mode 100755 tests/test_tree_distance.py diff --git a/pyproject.toml b/pyproject.toml index e1b15b6..19817e5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,6 +28,7 @@ dependencies = [ "pandas", "session-info", "scipy", + "scikit-learn", ] [project.optional-dependencies] diff --git a/src/pycea/tl/__init__.py b/src/pycea/tl/__init__.py index 15f6c8e..5c33f77 100644 --- a/src/pycea/tl/__init__.py +++ b/src/pycea/tl/__init__.py @@ -2,3 +2,4 @@ from .clades import clades from .distance import distance from .sort import sort +from .tree_distance import tree_distance diff --git a/src/pycea/tl/distance.py b/src/pycea/tl/distance.py index 44ea6ba..4445fb6 100755 --- a/src/pycea/tl/distance.py +++ b/src/pycea/tl/distance.py @@ -30,7 +30,7 @@ def distance( obs The observations to use: - If `None`, pairwise distance for all observations is stored in `tdata.obsp[key_added]`. - - If a string, distance to all other observations are is `tdata.obs[key_added]`. + - If a string, distance to all other observations is `tdata.obs[key_added]`. - If a sequence, pairwise distance is stored in `tdata.obsp[key_added]`. - If a sequence of pairs, distance between pairs is stored in `tdata.obsp[key_added]`. metric @@ -53,7 +53,7 @@ def distance( """ # Setup - metric = DistanceMetric.get_metric(metric, **(metric_kwargs or {})) + metric_fn = DistanceMetric.get_metric(metric, **(metric_kwargs or {})) key_added = key_added or key + "_distances" if key == "X": X = tdata.X @@ -63,22 +63,22 @@ def distance( raise ValueError(f"Key {key} not found in `tdata.obsm`.") # Compute distances if obs is None: - distances = metric.pairwise(X) + distances = metric_fn.pairwise(X) tdata.obsp[key_added] = distances elif isinstance(obs, str): idx = tdata.obs_names.get_loc(obs) - distances = metric.pairwise(X[idx].reshape(1, -1), X).flatten() + distances = metric_fn.pairwise(X[idx].reshape(1, -1), X).flatten() tdata.obs[key_added] = distances elif isinstance(obs, Sequence): if isinstance(obs[0], str): idx = [tdata.obs_names.get_loc(o) for o in obs] rows = np.repeat(idx, len(idx)) cols = np.tile(idx, len(idx)) - select_distances = metric.pairwise(X[idx]).flatten() + select_distances = metric_fn.pairwise(X[idx]).flatten() elif isinstance(obs[0], tuple) and len(obs[0]): rows = [tdata.obs_names.get_loc(i) for i, _ in obs] cols = [tdata.obs_names.get_loc(j) for _, j in obs] - select_distances = [metric.pairwise(X[i : i + 1, :], X[j : j + 1, :])[0, 0] for i, j in zip(rows, cols)] + select_distances = [metric_fn.pairwise(X[i : i + 1, :], X[j : j + 1, :])[0, 0] for i, j in zip(rows, cols)] else: raise ValueError("Invalid type for parameter `obs`.") distances = sp.sparse.csr_matrix((select_distances, (rows, cols)), shape=(len(X), len(X))) diff --git a/src/pycea/tl/tree_distance.py b/src/pycea/tl/tree_distance.py new file mode 100755 index 0000000..1a20b63 --- /dev/null +++ b/src/pycea/tl/tree_distance.py @@ -0,0 +1,150 @@ +from __future__ import annotations + +from collections.abc import Sequence + +import networkx as nx +import numpy as np +import pandas as pd +import scipy as sp +import treedata as td + +from pycea.utils import get_leaves, get_root, get_trees + + +def _lca_distance(tree, depth_key, node1, node2, lca): + """Compute the lca distance between two nodes in a tree.""" + if node1 == node2: + return tree.nodes[node1][depth_key] + else: + return tree.nodes[lca][depth_key] + + +def _path_distance(tree, depth_key, node1, node2, lca): + """Compute the path distance between two nodes in a tree.""" + return abs(tree.nodes[node1][depth_key] + tree.nodes[node2][depth_key] - 2 * tree.nodes[lca][depth_key]) + + +def _tree_distance(tree, depth_key, metric, pairs=None): + """Compute distances between pairs of nodes in a tree.""" + rows, cols, data = [], [], [] + root = get_root(tree) + if depth_key not in tree.nodes[root]: + raise ValueError( + f"Tree does not have {depth_key} attribute. You can run `pycea.pp.add_depth` to add depth attribute." + ) + lcas = dict(nx.tree_all_pairs_lowest_common_ancestor(tree, root=root, pairs=pairs)) + for (node1, node2), lca in lcas.items(): + rows.append(node1) + cols.append(node2) + data.append(metric(tree, depth_key, node1, node2, lca)) + return rows, cols, data + + +def tree_distance( + tdata: td.TreeData, + depth_key: str = "depth", + obs: str | Sequence[str] | None = None, + metric: str = "path", + key_added: str | None = None, + tree: str | Sequence[str] | None = None, + copy: bool = False, +) -> None | np.array: + """Computes tree distances between observations. + + Parameters + ---------- + tdata + The TreeData object. + key + Key where depth is stored. + obs + The observations to use: + - If `None`, pairwise distance for tree leaves is stored in `tdata.obsp[key_added]`. + - If a string, distance to all other tree leaves is `tdata.obs[key_added]`. + - If a sequence, pairwise distance is stored in `tdata.obsp[key_added]`. + - If a sequence of pairs, distance between pairs is stored in `tdata.obsp[key_added]`. + metric + The type of tree distance to compute: + - `'lca'`: lowest common ancestor depth. + - `'path'`: abs(node1 depth + node2 depth - 2 * lca depth). + key_added + Distances are stored in `'tree_distances'` unless `key_added` is specified. + tree + The `obst` key or keys of the trees to use. If `None`, all trees are used. + copy + If True, returns a :class:`np.array` or :class:`scipy.sparse.csr_matrix` with distances. + + Returns + ------- + Returns `None` if `copy=False`, else returns a :class:`numpy.array` or :class:`scipy.sparse.csr_matrix`. + Sets the following fields: + + `tdata.obsp[key_added]` : :class:`numpy.array` or :class:`scipy.sparse.csr_matrix` (dtype `float`) + if `obs` is `None` or a sequence. + `tdata.obs[key_added]` : :class:`pandas.Series` (dtype `float`) if `obs` is a string. + """ + # Setup + key_added = key_added or "tree_distances" + tree_keys = tree + trees = get_trees(tdata, tree_keys) + if metric == "lca": + metric_fn = _lca_distance + elif metric == "path": + metric_fn = _path_distance + else: + raise ValueError(f"Unknown metric {metric}. Valid metrics are 'lca' and 'path'.") + if len(trees) > 1 and tdata.allow_overlap and len(tree_keys) != 1: + raise ValueError("Must specify a singe tree if tdata.allow_overlap is True.") + # Case 1: single obs + if isinstance(obs, str): + for _, tree in trees.items(): + leaves = get_leaves(tree) + if obs in leaves: + pairs = [(node, obs) for node in leaves] + rows, cols, data = _tree_distance(tree, depth_key, metric_fn, pairs) + distances = pd.DataFrame({key_added: data}, index=rows) + tdata.obs[key_added] = distances[key_added] + # Case 2: multiple obs + else: + tree_pairs = {} + if obs is None: + for key, tree in trees.items(): + leaves = get_leaves(tree) + pairs = [(node1, node2) for node1 in leaves for node2 in leaves] + tree_pairs[key] = pairs + elif isinstance(obs, Sequence): + if isinstance(obs[0], str): + for key, tree in trees.items(): + leaves = list(set(get_leaves(tree)).intersection(obs)) + pairs = [(node1, node2) for node1 in leaves for node2 in leaves] + tree_pairs[key] = pairs + elif isinstance(obs[0], tuple) and len(obs[0]): + for key, tree in trees.items(): + leaves = get_leaves(tree) + pairs = [] + for node1, node2 in obs: + if node1 in leaves and node2 in leaves: + pairs.append((node1, node2)) + tree_pairs[key] = pairs + else: + raise ValueError("Invalid type for parameter `obs`.") + else: + raise ValueError("Invalid type for parameter `obs`.") + # Compute distances + rows, cols, data = [], [], [] + for key, pairs in tree_pairs.items(): + tree_rows, tree_cols, tree_data = _tree_distance(trees[key], depth_key, metric_fn, pairs) + rows.extend(tree_rows) + cols.extend(tree_cols) + data.extend(tree_data) + # Convert to matrix + rows = [tdata.obs_names.get_loc(row) for row in rows] + cols = [tdata.obs_names.get_loc(col) for col in cols] + if len(data) == len(tdata.obs_names) ** 2: + distances = np.array(data).reshape(len(tdata.obs_names), len(tdata.obs_names)) + else: + distances = sp.sparse.csr_matrix((data, (rows, cols)), shape=(len(tdata.obs_names), len(tdata.obs_names))) + tdata.obsp[key_added] = distances + # Return + if copy: + return distances diff --git a/tests/test_tree_distance.py b/tests/test_tree_distance.py new file mode 100755 index 0000000..34c2a12 --- /dev/null +++ b/tests/test_tree_distance.py @@ -0,0 +1,71 @@ +import networkx as nx +import pandas as pd +import pytest +import scipy as sp +import treedata as td + +from pycea.tl.tree_distance import tree_distance + + +@pytest.fixture +def tdata(): + tree1 = nx.DiGraph([("root", "A"), ("root", "B"), ("B", "C"), ("B", "D")]) + nx.set_node_attributes(tree1, {"root": 0, "A": 3, "B": 1, "C": 2, "D": 3}, "depth") + tree2 = nx.DiGraph([("root", "E"), ("root", "F")]) + nx.set_node_attributes(tree2, {"root": 0, "E": 1, "F": 1}, "depth") + tdata = td.TreeData( + obs=pd.DataFrame(index=["A", "C", "D", "E", "F"]), obst={"tree1": tree1, "tree2": tree2, "empty": nx.DiGraph()} + ) + yield tdata + + +def test_tree_distance(tdata): + dist = tree_distance(tdata, "depth", metric="path", copy=True) + assert isinstance(dist, sp.sparse.csr_matrix) + assert dist.shape == (5, 5) + assert dist[0, 1] == 5 + assert dist[0, 2] == 6 + tree_distance(tdata, "depth", metric="lca", key_added="lca_depth") + assert isinstance(tdata.obsp["lca_depth"], sp.sparse.csr_matrix) + assert tdata.obsp["lca_depth"].shape == (5, 5) + assert tdata.obsp["lca_depth"][0, 1] == 0 + assert tdata.obsp["lca_depth"][0, 2] == 0 + assert tdata.obsp["lca_depth"][1, 2] == 1 + + +def test_obs_tree_distance(tdata): + tree_distance(tdata, "depth", obs="A", metric="path") + assert tdata.obs.loc["A", "tree_distances"] == 0 + assert tdata.obs.loc["C", "tree_distances"] == 5 + assert pd.isna(tdata.obs.loc["E", "tree_distances"]) + + +def test_select_obs_tree_distance(tdata): + tree_distance(tdata, "depth", obs=["A", "C"], metric="path") + assert isinstance(tdata.obsp["tree_distances"], sp.sparse.csr_matrix) + assert len(tdata.obsp["tree_distances"].data) == 4 + assert tdata.obsp["tree_distances"][0, 1] == 5 + assert tdata.obsp["tree_distances"][0, 0] == 0 + dist = tree_distance(tdata, "depth", obs=[("A", "C")], metric="path", copy=True) + assert len(tdata.obsp["tree_distances"].data) == 1 + assert isinstance(dist, sp.sparse.csr_matrix) + assert dist[0, 1] == 5 + + +def test_tree_distance_invalid(tdata): + with pytest.raises(ValueError): + tree_distance(tdata, "bad", metric="path") + with pytest.raises(ValueError): + tree_distance(tdata, "depth", obs=1, metric="path") + with pytest.raises(ValueError): + tree_distance(tdata, "depth", obs=[1], metric="path") + with pytest.raises(ValueError): + tree_distance(tdata, "depth", obs=[("A",)], metric="path") + with pytest.raises(ValueError): + tree_distance(tdata, "depth", obs=[("A", "B", "C")], metric="path") + with pytest.raises(ValueError): + tree_distance(tdata, "depth", metric="bad") + + +if __name__ == "__main__": + pytest.main(["-v", __file__]) From b1f3290b7b7e37e8710606c9567c29f1897e0dc0 Mon Sep 17 00:00:00 2001 From: colganwi Date: Sat, 22 Jun 2024 19:41:33 -0400 Subject: [PATCH 13/25] fixed na annotation plotting bug --- src/pycea/pl/_utils.py | 6 +++++- tests/data/tdata.h5ad | Bin 1607616 -> 423696 bytes tests/test_plot_tree.py | 6 +++--- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/pycea/pl/_utils.py b/src/pycea/pl/_utils.py index 23cefa2..5fd5a2b 100755 --- a/src/pycea/pl/_utils.py +++ b/src/pycea/pl/_utils.py @@ -120,6 +120,10 @@ def layout_trees( tree_leaves = get_leaves(tree) leaves.extend(tree_leaves) depths.extend(tree.nodes[leaf].get(depth_key) for leaf in tree_leaves) + if len(depths) != len(leaves): + raise ValueError( + f"Tree does not have {depth_key} attribute. You can run `pycea.pp.add_depth` to add depth attribute." + ) max_depth = max(depths) n_leaves = len(leaves) leaf_coords = {} @@ -259,7 +263,7 @@ def _series_to_rgb_array(series, colors, vmin=None, vmax=None, na_color="#808080 """Converts a pandas Series to an N x 3 numpy array based using a color map.""" if isinstance(colors, dict): # Map using the dictionary - color_series = series.map(colors) + color_series = series.map(colors).astype("object") color_series[series.isna()] = na_color rgb_array = np.array([mcolors.to_rgb(color) for color in color_series]) elif isinstance(colors, mcolors.ListedColormap): diff --git a/tests/data/tdata.h5ad b/tests/data/tdata.h5ad index dfbd5e7b3c37eac95e538580738fb83e94288460..482b99e981be2224feabf43868c7d7d97395e825 100755 GIT binary patch literal 423696 zcmeFYc{Ek=|NnbTk;u@bl%%A&NKw>F5lzZilFU;@G9=0n$q-Fch9pCZ6p>^oFUd@q z=joVd&N=4!o;rN*=koik`^UX^t-J2Jds*IlKlW?y{eHgQ^Kd*)%E+>_u45(qJy=)> zj0Dbqr}O`2=MK)>Oa7tx>-qcIb0>6jq5E7IK~FoOqrUO)J)SwvIrn~k1{z44<0?ug zP7nz6g!%W+hjX_HBu3g9{~Q<_VET6^K6m~92mjypz{wNG6#gpwJSS6oE<8Dx59Tia zZx6WU^6SEU%|{fraH&vm3Oh{?Fh0uT;#v_iquTqkiPy_vZ>I9bwzQ zSJBbafd1Tz|69mFExCU!x%go&x>5wuWdzaLx$?_2_kMbM+6!6cN;(7Ge38E=KKJQ= zU;4l5xBt}lHwyFhi8!r#BB;&j`FrPobts=ZFY~ufnsX6>IH%)(W&4*&&E2TFO*5R= zQq)DOe+V`-KL53+bMctByQe@qOPu5UbMN!>q49aUw7F~Ii+M6<`2W)2|B3wiw~C+7 zuM69Yeg6s!feJ5DZ8v=p)_wTTs3-wHN^#7JqD+`0a z0j-QsLt5$hOa9l#e0~d7qNS7eoEaOz{offKft^}@c?f!DCbvv)>^8H|H?a77V2IXH}rL^bf_&e?fCay>gm2c!h8Pue7^Y1a~%r{oxeVw*E7%e z?GgEBKYu+R&ZonCvdup?pDuIB{y*t6pMG;v|A)_~?^0Scsp@IReEQQmIRATmMfTBh z%(6MVc^xAAg#Qt?MO@?`VPC}e|0By6anXN-V-Y{_kIcFIfBYx1@8Cbqwa8xVAK_la z#s85Ni};~`WaUCGOw+q+5vS>0y@=EFu35xsdgt@i|M*Rqrg!Zkdz#*Li#Sa$?;=jq zyM7U;>D{o1)AaH!i(0{2u&!xah^Fi8B2LpK zzlhUxom<3d`SAQAPSdNfh|}~cF5)!3N{cv6uks>J)2p(G)AXt?7Z!1v{l$g+ zAk7bIi#W{>mlkoFAJi9dn%>KcI8Cp{B2LqLWf7;vQ*$8~qot$PB2J6H_99M;r_Mrt zfM&0|h|~1yE#kEI=r7{5bT?SUX?`$V#A$voTF6Cd_VfL>`Sw>>l;)qS3+?CXnQIIA zTzz|e5vS=gS;+U(;$ymy&$YAj1JwC`lckl#-_h`VcaUH<_uPEHZ@xcxa{-@!z7pDyHc z4tlnb&t)j@g?uhU`7Gpf8T|P|K9|8?EaY<;{N+MEm%)7(a$5CF@LRwS&Sgyhg?vtL zz(PK!_tio^r#EmRpVRw#A)nJ5w2;r~eY23y=?z}U=k$gw{+OTK#oUUUZ@XuTduPD;Wz+2MtOh|R*!b1R z*cUwe>!9fma}p4=SJ9U_(MzeF61=u|ZeuxHj(Qu;{IJviQ~)_vq} zAM8okbn=#d?Fb1Ti~p!LdP4-`&6<2qh`lJCZ19nMej2qsy3&8DjUivw{(}8GhOy)< zG3Azd4^HTq3)C@;L)EzE!3eD$V1DzEGgOZPM-JS4y7o>hYz-kYIV253oKw`pT~=eT zEuQq@&ol+~m8S%<3~KOGsT$wvClqX06=JhJvmb8Ux}de$>jxyL>eW9?E`a2V{5OJj z*P^57-j~TM`f+_=PhINiRusPcILFeaAJ?s5VLW5si9{D4@AP9mcu<#n;Qh7kltv5q=l z@qX}!-j;oR$Q-$y@txKX`o21vYVfBCE7elilFl_jOkzm65UCvfF1aC+IOIG+wPp}litC>BQiOsO%mfVs}s$&rIefDXn`v@rVyrOpy8QV|XOtZ9=Cu3N_m- zU2O)6;dJze3GMCS;JNfjJFjOCc$RGFOEwyX7Iqc)+`=;4(V)k>jI|k7h!_M+ug54QoqKikV$fHxeY#AExq1*Pn0;MFk7mIgx2k%J=|Yf^V-xsxa0Dt{ zZ$D+??LvkZ9V|)`bvSXO&%Ws3Ac&b{3n}{dVU1dA^~)E-aH~x*QpCL)ot?JW9aj4Z z%hKK4xKH&%U82vbq931NiOp5M<3mNTboLXUM&SD_p3pByDqp8mMN7dVJQZ06&{e z+HHP2i5tCLnFztJ(IWuQ9$Yz%vnNZQYjqA`M4@cf<`-=!W;Ol7)jAf}@iD5tl9~jH zypEkiZ5Qk|5My{k?!j7tQ_R~62azt*?Wu&t5VZFkDf`|_#uL+f9w%oFLqeeMiC2G$ z@JWD%Q6zI8+Wj`W>Ez#n*ZGSyrlfwsnh&7_&tp~KxXeS%g1HNriCiqUgUxWSV8hhi zwtkp?*MB{(ybcw`*1uk*ODFX*vs6?CMzAL0YKZ*CB)ri3Rko_R3zk(FOC7MA#yyk9 zpG97k;qcct`$V=>ppn^d$<_f&=j*^J@p=D76ruCs9Anz>SGODkF&6ZJgtei*Mj4H_Iz?#57R9d|Ca z0yS#rDQiAZFiYi)HxpeD*xYz{!3ZYs%{`8?d(mY$L6+thX%2x*r5-!x8#7pS`r%Ni zR2F(Iacqy?-GY-3Dkt@AD$%--g@MT4gYn|MxjxkPKz}q@orx(8j^uWy`d;e?jlf4D zWRoxWFlKb?p z$P4(`h;~Qst{U4q2$TCPHIzRF>%<6tP z!{#K+B}D|{b`!U*hfAae9B#5kK5NH!uj$)EKTM+T=x zKLz^?8#BtogE0I|kLTH%Fg$ilNv+W}1Irc9XXaiZquk&FN#~#mki8XOHLcl$66YHn zbsYz>E1S;#Orj~I1qh7FoEw6|wJ#6edYTSAcS{CslN(@l*HR`C(J^eaUp;B6@)3lW z^+@__RHMGF9REJu9vt6ES@z(_40^9MXH^NF-*VmGyBJGMZoaw1|6oz3r-6htOeF@OQ8ZW=^ z*9?B67fp(vZpV?sn~6pm6zDF`f3*8(2Ch-GZ5H9JqUQI(^-*`mQ8Yb4$7KH$!uq`M z7h)N>p|-c(A+QUGR|@yPud2k{@^`8~3Q6F9WJA`rBh8>UrN2S-@)&;Hw1&IUwhb@d z=zGB!+yNKI1TTzkWlZ~+9bp*l(hG+k*s=#f25NUNAwrR@=;vF?piO;)M%lMcOmDeOu6xGxCv%8e4ic}Z&y-+fbL}m=+6=7Yx|#dD zvJo^l{_?&2q8W>$3%xyJ$-pyy`dqHcG}xV|f5+R>h!Psj3fEaXkZdPW{HUY{c6)F> zGWID$Gh1!Lms#C7G$_X{dB7JZ-WZ3Aw02;Y%orH8Wn!*tkzs;n95QU*dvk5YXV}$S zC29Sr5)`FBm0Cp)!^Y=wUp`O&LV;R2r-a;CxEdnP?o!$YjeRjMvI(s~igd{=Oc_EI ziK_A63Vop{GCt7VP!lTt`AU(5SWd>B7$Y1zi`s0{d2GU7G2kHU`%iSjGKbZKV2l#MZz zX*?ktvp!O-6kPg@;-2<=L=Rc(Ki|LR!A4izfsfBRpm>*0bx77Ax{3_7+X#$eZj$xc zi*)_)qw86ZT}v%)=KfK+qv$4hX*{@_pwkU&b`2WJ$_ztrz_{$DBgNpYo4SI$rWmx^ z*6KQ1S7Th@7Jen5pl{m*n}uEzbnhODn)V&S$`!9(MLa45&p_!X&w@$F)5cvAc%~F( zown(`d)W?FYb%yB{ic)3SXuU5?@}W+Kan`H>R21{Fl4M$vx`6r)h@{#i)my#VEL}C}ci}zXT@MczD*q;F+>+Q~7Q@@+EGybYm;(3Z=ekw3|SM zFzuL!A+7l7Qq9Y1OA4^G?dLz*JOu1VvhzZY*WtMjie&+!DZpxV<(RT>C%kTXe&US7 zI9~tsMYnZrBd+dNY}Mgz#nj}1;IIQl_}o4=>d5PQP|@H$qqc1lo))i)uh8&VjZ!rnoQN{fdO`7m}2N>4wmc`Q|R+**;Kp8eitHiUjL1$j_^z8P%*W z$p6?nh4&;g(EfM_zB;YyFZg9q7DPFW5{cRdBA%-{#(v3HDm&M z9)t`ZE%*v|v)`%Hrw-yk?eOTX(?!@V(&nb0-Gi|!Wko#GtC2?{u<_+(dMQhPZU>%H zLRzX}*jha%Z>ajnkRUrVfalW(Yb3fl@V9)}nxlH1kbJcLakG0P{*dLkyrMh|&oVyX zGM^u5(69d6z9={|%#LIHIjQhl{zGtX@ZukxCsQ!pbGF%UC_mp)Wgq=$^Uys}02bU5UoS0USKvZIm{(MX3^*RRVeVNa>)^ z+B|uPJe9h{xrDvn$wAG zAmY9lwNMG$LX5OzO4-cU2~G#q#*PIL@xY!PmsyFOP{DIn05yg%Xr#n^*0CLRvrcoy z|E$83o3dJ4b~oZR4jaAXT}^0{y+82I^+bGX`g)768X>K{IPXY+PAl%#cp4NUF%1_+ zGd8EBwLxg&!>}OlIvl(CDcm9~8!WC$X0+;4usWr_hf|V*t^3TpZ4Y(gA;CMw#J*9G z@%?Gvp5g~WZ#xZwP1>+l^H6i4$2d^z?QcpJ4*~rTNlz_JBHECY2+I>Qv1j`C`Ie|s zT<&y0u5m{xoRH{PQPs&L<@Ms;(l0hmNU2hBj(@m~XK}5eO6bJH zZs4x9<>7wS2gC8?CCAyPo`X#_vYWo1tcOii>r~J0Yl3s)$!-ps6KL?|_PGs9DquD+ z;7r);A5fqaU8eutjI6g<4xFV>=QCJG%!2EG!lBOmj`oXW%oTQhP$XOrqStpO8j*&< z&UA^NI$I#RiDq2R4W`bY)Rvx8zg`OE&r4*#Eop)2BX_h0!#nVGwoMP0S}!ae+}adT z{0+~jH)vj5Gmh&Rbyi25EC)Ih$^%a>5_Sn&j5Ko&!5;Ux5rO4&Y5BGnvLEH-qvWAl zoCj$(+&=PPER6Ooj!kN>-#2{dP#DC$Pr+hw0ZG+x)PXuz4rI#PQn(4 z%TEU_+rZ1!=@Pe2KEySwY|V@-f+MTc@9 z(2;BV1-8*Ltld*K_BsVWo*O~VepYMW4jZn&D*g6} zUdl;w)8`T)3cj6)U41C015dx_c+YaF0$pZ=-G7RcP~q3vD{+1UAan882HVS-pt7lE zwxY5NzG$|e+96R3bmD3e`IE!&oh@|r;b_LR^#j#LPu$DUs_*`&4{;2=3JTX;}dor32laFTtAIG$z!SCt7Z4-^a7b;UPM9zk$Gd^ME+LLg+?wVvi zr4hHwJx{1U{S7-CP81ehoPupaTM9tE99%e7j54wH;3-x?$=kCC@4RlmCDNCm^V;YK zacoI=u*$0St~47y(oW8q6))Lk{(Vcgf84Uml|%UspC1a6-kIVK7aTk6hxF z1&6loe)a2P6EvAHz>554*k+Y|xni^nBBHMTRCqrOlI`@58q52U!AZ7iZy5wIE9O@$bZ@(S_^$qc-GGlAO%)G+6-nA%vRE6rP^{zhqwb(&S74|-1C)Na`YtL5g_349#F5Qee6Ka0DD<)(z<^$zSJiQ7` zBx?PZu*xZdA4icKKU=5r`S^Ew$8c!_@KzM|mDK!PXt#M-LB|LHN|9 z2%Y#xeD`R?UhOOq@;5|FS?nHxQVo|4|AD|^)M+bYP@q} zGqMG^-(k2~3`!5LmgLmaNySS)KmBGyH}EoevD_D-t}~QY-8!^`jP@p`34QM>Fk^ik zC&NH1EUmHSjk{P1%jksmsB*JPUAT8r_(EGXzBVvc)>;w|VUrFrFHZgeuHX$^+j`5O z^jWF@)3ZZpqo*)zcQhAo3uim8X&S`_7vp7gk|WTV!uG@rTe0L|_|I;}DQr2^DY@Ld z9hx?YRur%Q1|FN`Us%XjK*;$$#PiRp@yJ=GwRC&Pcx!baKYe@`7@Mk}V`?En6pup- zZ*Lpa1UQ==;Lm}#=ZFbsDzf2iY=7m8EyeJey|q$Qy&6(VV`goZmBS@B>7(m-njxL9 z%Q5`W5GptLq$_*xnJB;}rat}Q6T`6d@IzkrfHwG0maKk)X#g`B1H@0e z6#=tRsNw0CrGTBobl(Ch(2`%}$R$%A=jF;jVbbImo*CX6G$=e4(lXJF&TO@& zEv5xvU#@SaMrpuR#I@}^1e;-#=N8I#_9QHFUb#80z8+O#t4|!b&mj7dHjWo0dQ;CvSE8E4$AR~Uf8zV`+^)L&g~&Jac>9)}zq6}{A}S!vUC1uNl_@PwtInS!MTSi~vpv*XMsXuE zVc$~a3W%?Kx#s;v>O7_Q%(|4$F3{K>=PoEQ3FK6~S06Hk(bmqwDo-;ZRc47!hsX%- zoaxxY{pBLbi&Djk*}6YMBs8; z`F7Ng48e5-v;MqX+!12f5u5u73iY&Pk_xEx%}GLT;nFrFi(jn?{X_-}qWxIZ!5OG? ztT-)ny8`2+wU0kkw1n+Ddz6-xXM%uH@v3jc+%A*P>UvR__xrf0VbCqMR%AEqg`9${ zFI&R;adf{Ty~c?_u((j#)aFtGhdWOEKCj;g1#k2X71Eoa$`amo4v}!z);L)ApadSf zhZROIDaHDXq?oSP#YlM^PuFp82I4P;s55hnfMEI5gNi$JQjsEBDz!f-;LlpUkMY42 z99|up+F>}1@{^|mHHORKl;@6sRa=QDrFBeBC3g(fzur-_748KucSflPtAgG7+L zg98O^Ezdv6vMWMsiB-319*w|#i=?oGT^S&}b;FA4@NTF&L04wJwigRhh4zvHvtfIx zxhKo_X55t{L)ozJ8yKEHQUC2>8Q8A2c_r*dhP%r*#*{M*gYmv4bP`_O7(3kJFzD3- zK4Ll?YcJK}d1bTy3M(?+eRM0Qv7fq*E%s=VAv+tkd9F}ZFYQ7>*EIS^JBC5=bK6_F z`{T&Ux}@7~oQO`x`+hkRsq1$UTTJwxwL|`=+uIFyPQ$?z8;82GW=xx`wUp^?f&KA^ zZ9ISfL6H*n=r1vZwC&R)N#gRYa7Fiq?KYzf;7_=EneEVfH0Ds5T^2ct4x^OD2h@40 zCoP2n4lO}&l|4Bi=2Q+YbF!*U%1^^3p}YwUwk41dnJ@KW_Y8`kG0V{SN`#1W)s|e; zdG~eq-ncm0*Tct0Jckt4QP6j2$&fk)4Qsqa??^C6@%}hhb!)=}zMPs=@Vb)&+*!`u?;_fu_~r@Q z->&Vr+AO+&^D_n6;@ZgC&svdx-Rb3;4HPJ^VBea2e-gx{`&nF0Wulnz#Vbp)t1*gI zA*so-10rt+sV;G;f)XRyJ7-jDVEWX%>uuuQ;E?px+lTNL?w?OnDA69k)l>A}_-q>C z7bn{%j>`$?T$0R@sX|1>(L)~U`R!nFL@&Yrd>d#S-JZ>xRf1P#?!AA#n!5kut&qRg z{_iN7dg}M+yKd^d8|(hF0ZdY7{nULAtr-DH@|2WyDM2c;tg>&KSPzGmzB)RoSB|P; z6MTuCttcDjCb*75NLyKM$3Cjdl(y;1^eJDu8c^E$?LN7%6*!D~cfDntz++-94=*pR z2Cl6JI+fgAxR+0P&~Sehjs=S_ALpTtPX%3HcyO11P46R_OLQcpv*)qw+ffCqWJ5NU z!xX&wZQPB!stxKcdYE10pF*Xh1-I{2PJ*RF-u|_D#kk2qYQ3Tmz0}Fi@5$z;n{f@r zmMh6EAH~ht2ya8)p%3MDv0>%_{(iG()xq8fh}u)E%^i6TGh{7AU1(-(D5Nro(ymfXSzCM zN&($dm!35o?8cZ-5^?47CVYEv#6h=u0J&Hz^v)@^!_bRIZw*qOfL^hd_Lk!;QtQ9} zm@Pg$ik{0&v^$n9F$S_my59ckuH#!vl(L;ct3q~1*Y zWO}7G1Z$Pu*T;7M!rQNSm5J|rz;+qqeZ%{sxb?-SNv3Nv7;kP;e5SM&*3oU=DC$`Z zow=S*c5G_LKicW+$F&G)TlTFV+N9kJqzcvm5F4Oj-p?a-Bk#0qkdE$e^!s7 z8WG>O?JmNY-!D>94z-~AvyxY8+*45Wj8#lKd;(3zzD6X;_JM)i<82)?WUS}S4&M5B z1eZ8#PZVsVK!@jW`flGgj1ge9JO5%7zc*x;KmE`Jf{nqxes7r4-o`c_6@6I*Ta_QT zbubU3Ddjr9CLtTr4?0OytZ9W8*6d9mr$+GHo~`$o?vddk6Whf>1-i61fAX2K#A;A} z-;KKKuUhbUf?-7Fxl$BKH5L>~9>%sCzTjj{0iQOFWx;%<&>>Vv7pXY`QpSX-uHh;q z#!+M*NjBhx)RhaXeaNBaWzyWSF z_H|BxBVq#=byh5q%6Zji5UJAzFT?$qjJ$eb_hw4jG4WQo`L@355JMN(?%2t7!Lbct zr5nSRFBQO>AaG&JCqmj}?itZ!>iqwmho;{)y0+qVm%KAd_+6nwt7 zJ|vmBA3u0%Xn)3L>OO_43veO=Z)wsPlAko9{Fk<^zS0 ze^g$*6z$ktdUxfF!4G=X9XsJIs1i*}W!eW}+bXXjZ8j2o{j%owqmpKPmhZ*_u03EE z#BpGqk9 z(F8urEo^I6?1deDWg=f3JE44(Ztv)xVw`2RY3RdvJU?LTZ*Z&_CC9?=6U~03L-}?w|AjocSu47>blAc=`25c{ZBZT8a{QR*nB*GR|ci|5_ z`<%`Ri_*hN~zBT|RIl}*%tOI8)5;dCKCGH8)Iohuro=-Z`#fBm8Zr7Xj{o|#0oa>4DCW^USnxUU;UxhEDGAAK0Sx8+kiKq0Xj+a0Z@8L|$2T-W zb5alGM@cW9-kFj<5>$ht1tPwoe@38fVw*lQfmv#jNZ8w-OdW3=oX&0g(T|t5X59Cg zCF8VK)cc>*_2o|9J;LG*gZKrN?KWFmnc)zdA6pbRRmkQG(QRMSKl(4aJ^&Py`^@E5F||L zT&+UEpStL-y{QZ}G!sePa%5yL<6;z(?|>B7XkniXWUS-<{`L9YDP#x&F8f`xuu1!N z*}M0BILw|d+%zzS1}R*DlEN)GdudPehaGhonv!v8_qBFx$iK2$c-1&$j2g@D(`*L= zC0BQr{4P9N>tx5I)eSwbZ-nGI4&jehnIDdvgBZqgtKDXnkaj7z=k9vPLaaUy?n z1H(&~9G*2+;LopeJ(>ym)b-zpB+^X;);$+zxWh@%C#vT&@|qx(#vr`jhq?}=%eW&l zqHP*qGo5{`#5)XA;%4X5Hw}Qd0)vCO9|Z$j9kO~`>C^00?cg-b;fkV6F`=<3oLpwS`dB#$vg)EA4@)wq(YdD*CsPL@bNB5q zDQbOgsV9B4bX7CleeApbcaa?XiDc~FHF4|bV`{(li}y$Gq$+GK z+OMkFISdbz%f*9)(2-9<}>UgF{LY9J^8wUB%vl zA1!1z3rl3-%6k99jg~F&yz7rZLOBr=-G-#IZ!}^}qSbS5x^D2~y}Etk+z%}463^S~ zmIVQBB^Ragh>#)L@DjqBa96nZ(TfE^*nOV$tavRMP4su4^xRtyu53pbh1lwF_?sk& zR9gtz4CZ6SeckZIXLfYyY&JaYI4nHjRS7WGbc62R z)I*i$3Xt2Z>i%yA5=KbxN`91;i2Zq+i|Egi@mI3z_LiV72t61RKDeX`Uou=>^_aSk zg#G15-{a~`X^c;dB@Q^3m1!!`gE*A zb4L+%o#3l!A!{MH*cpzzeoTap6=(R0*A%1Joh%`**A#e}lONrZuEv>U zYX9`}kCX>Vmj|Kz{#ym!WyyH>*L|5X&OWHp`TbFoy9Ey^U5sKI>&J+xysN8RM_|ge zspfVy2{rX%9M62qh6Vu{hVyA8XdnA^i4Zh_M@#)nGAobJ0deK5mbW5 z%HtxXzxF`pv&%9=4MRwO@-er+xflNA=Asj7sz%$|r`$2kUHGVqasPGd{=oN=OVaf= zPomrN`p?ocEg0^>WMIXU1boT*pCqqPuX&Yr3g-60zKNU{#&0{Z$fM^AIrA6ZSjr>q zI!=VE0{i3NFKa{jsF_`!#!bMi$m_zdlaHtzFUUbGfza6Ri5%sX$Wk94Jy|~k9UPv^ zG#*c433HHAurm>yuX~lqylaJyT>-oAHcf)ZTB{?evt&?i{(aF4#D^krKLd~PRRxw51a zO;RgN9F9(bVGOU@uLDFJ^kLgR5Iqh73K%l@sT8D|WNk`kIt;&B4cy zU)A(O_lOj~z19@|5HVf%-IRoV*8K-|E81i5+hrPe*h*o!?|WZ?)^yz5+a0&9in<>r z_VddGodJ0CB~h`1+8=Y5hi%-PPH0%*^nlHO~s_} z`LzaQ-hJ5r`i&NhEz3 zHgS-0 zZ4oYYsP7&XyhSYyc>OlKNA?Do2{?BK&8hn=jylv^X;h%ZF7L$n(i)^Lgc^vCDMILl znR{iAt6wi+3mp>eU?q`NRsgg}7@FODoRdYXTIkQDvHX*@zM)qtiz9CF@7yIq;YXp}H@Vr*i zFUKlh!SLZOLK@L1qI2ca2Ds5#crV~6bD9%F!Bg>4B5t7fwH)D_fG(l;753{oArb@38G;kzl;0r9rZn_1bq22*w>8bK_J=nq%Zy_N( z3KG>1FY!22_meNVMRIg5f*x5`7L_9dC=s|qh|o>_J;sXt%DY*}5Tt(Um99z)cGh3E zo$yM7pVIHA12st~1Yel^4_AX%1n)`@lOEV?99XVTn#9X#QCz2Xj^L^@n!6uo5u^kP zj3w4EG(hl1;t95D5_R6QNz&1_436aZ^zJ8hJ}G|?GG1x! zwfxov_GX;V+jciWuXk{i7?QC>lw*43cm=*@c0IfQYdaaKlbho5Q(9kg?qfGss+s`olLLcoC*qf47wYjqn zze#Ig_HPodcimWO|EdX1>OwMhQuj@tyqBc))3Y1meO~o-XjB5*7sVsOn_97U+~3-# zv=0uE=Owrl?+L!}5uU2R_vKDpt+ z)v~7yc6Kh8UMV#M7aZ6X1uZ_oqg&Ve?lzO*gTVVsJ41%SedX#xiC<*ceUFkjnb8R= z&xk&}uh)(n)j5rR>>`6KSDdEBP!&A$@@ERnA%Tkk`~B-F!$3AYm$b^1kjAedVP@?| z!jSGTuFMt^dLEHl(l<)of8RX$_VNA+WS_D|myQZp5$LSu#7DuYJey83g^10ZcatKn zQ_zYs8vaP277bbO=O_0xFy4DPF!@$Hg0F1Ur;jZd>}{{1X55Wn6gPE%`ummjrkN(@ zD~I4IQ}o7Ii!6xzaccJNo}Wq>6B`yJSG*H9oh_Acw{&?AIrt0=YD^RVp~Ai zE8FMk@+oS2z@5L9y8iDvNG}k6XB5azPsX>e>IRRJyZx$L=m;i#Fjqp4CT3J?{Pj6SKYOVOeE+NA=c zBrJVUwMweF9WC~rnGV|X0q9sABa*0VUVlbbaF4yKg7_6jC7YfXfs?Gwktb&=QIxAT z^eAIHmfJho->S)mMq;hVh0|kr#{0>JhQzt#WflweejtjvAg;c85vXBmL6p!Vfc-iv$Jdos4X5HaK^YDGu<{9 z#j_Mpw+BBAEz@nr1AG!HtBa_=XA z8A4+h(@}e|UesnQLt4|B{ckO zM^YbJ_)ENWFl?jN-z0}yDJ0NkDalf6=*O)-7rn0x$3yl0p*MB9olx{qb>aiHJ>3wb zOLNsia&yAXqTp8OHodJC?%0iwC9C3=tZ#$bZB;h> zKSm&6S&ojuF6ug_O!6q7KYiM+HsX@~p}oMJJ>znXiCS;A$J~r~(Sm8g$-PZSn?OZ! z%%i4}4BxK@Eb09?45^NxlfhqmQPOPcf1~I;{HgxGIBsWzG?bLANJ&x1sB=pT8A&RV zqGYC!l#~=92`v$_vir&=oGW`}@4c^mt!wl9{Qd$DpZos2Kj)m+>-9YDD={nZPGRm! z%b?|C8KXeDTFNe6s#q|8B4ZL0W>Yj_|>($L?u8M^8^0Kia@88axGN zBzFg1he=41_p|X>>P3egb?&{}=t(lSJB0arXW?-;gOyM90@jW=pE@bEjyl`k%VbO1 z0w;yxvz**NWEbCiUGFXnNxYTR6u8=hv~_0biF^GJSmUqOl3s}Uf-Dhr_A^+K_WppF z^dIORTeoyz>;UIk&WN`mqe!EZ{=WZnFGThnGA-R!4YiR1nHAeRVcYP?Mn?D|{GB>_ zSTkt>4{tj_l3r#ZIZ0<2#2OI(T^H?FbWF?Oyymu`!#@Z*tLpTUax>Uq>MDK6V*vF+ z{g-8l{9G%WY=T`{8x$T5?7uHbh39h@mPb{YNDtnUwGa2NqJV`;yb-Mn(==m7c5GV0 zGK<MWqzy#;Jui$ee48aJ}1!#kVwv)2|MJRNWijs-AhYKfTLD`_cji@2Ty% zHPZ&RyHjQqH&5e1JHzV6gOgy*Ue2rXsR_k4T`E3&VHh8jgh~w_TEdP~V^(|v#gJsc zwL6pWZ-4(|uXcB27>2(|*Bv6h*Kcf|$~W;W0)xbR_p6&$(7GjDP9w1qL|)|`{vg$Uw$c7E10IeHSECGPQOsL?BVlO()n1#PeY{cxqe+iXZrxi3CR$d` zo2m3L&f9hj^~RO@X^h7hvR^ zp;CZYCXQ2M&Q6i%L0@(0-TJN`91z{C^(SlsE_GWdU(ct3*W-j5isK?kAK2|sjl*z7 z-ExuTd^a>pZiEDD_JDPlX&C=l8hU-ZH^Ca%fb>ondxviv3Tm9lF*CKey4A>ayCofI z=b2?qQ;u~EGSK$lxYC0=UwvQHVy=gMm)SIZJ%%98U_Ip1#vJAuMc$N-+eG%mrofF| z%w(m+t@qO3E@Obj{YyeQJzyd+7IaVhA8tGl)ipj=htb9{Z!35H16$R`(9k`Ee{k~0 z(~ZPI)R_|enwmX{4-I#l1ioLyXWlb&pI3k2sBRvk&p8^>N8V_pw$)+Cz`p9bziUuZ zop{j9bph9&4@muOpMc@GH*;QYYw(D1n{4a(VZ!&-bo%2Ldh*&3lhM^#B9}+;3@|0~ z@4JPXuh16hNLo2R8s7hC!{4iyl-ouZid7& zjOAkY8^CtB<3tWW4brtk^)If@;FzqOpj`L}B>7ybn$R17MT>hiWibQ5IdzSFe!LaW zm;KIv%r%J*_P>7nqp=oT?>^%`Q$pzSr*F?zp6SNx{>*P2*NN|)Jx8=s8BvFd`b+jm zcR_$(?ch!SK};ME4%vHm86p%XEc#D10AEtC?Y~r_zWq0mFSm(!AG$NR*6XG)ve3S< zg<}<}a?4-75*bGyTPA88-6~cezO4A3YY6hp#dE@CUC`wHXFIk3Dj>tc?vb+c3dS`Y zXi?y7C8uU-qI~LQ?al*K_DYIh`5&gptgBuwIUju@99rG)#MbE~0g~ZSC~lIl$zH=b3fC zg7AY)Y4lPpsJbuEq5kJP{A#71+qr}AeWuGy?Yh$sPxXHApMWmtwDkKJ8BW8?aj7g} z*~`#b(O#WJBzdD3EqCfvxNqx*EgoFY zNxvr0G~?cr<+dSc`OMDPPhA1-l(TG>Qr+;I{?9f(;$C{BIV&Na*$iC!PZ-bZR6|DG z(_NW2s93)J{c*{tZaj2k=Low6(bpQ>OzgWchSNPZ$64w}kpG-~QgP&8U~`Ui{b{$3 zMx+#Ny{JYUSu9`>TpWf^{7j;MDre!slV*K;)9*;tY`pM%YY*ntlxq!e_aasHb<##Q z6*O-}#XR}FM%-8h%3*gpF>-vzURp2}Du0=tZxLNZ;ejegagFA4G2Pg7Zun+*YB|1OxK#P>%{(rSeH<5=bwdu7?Il4wd!T!7TR_-xIrPKB*RjW)EdUD2^4&dWF$NOo06I3Ex?y&u1MH3 zcYyB+W-(W9!VkZ=6|-ZB{%K)y$ggV{Z~u(-XV&k-I(n5pZXPOxNuLiqlRS((%#N2D zKT`3^wH~ENsY3XpTkAtvn1Jf=(<&_6JD^nl@9u5)hQOr#+ue0tR+8hr*34bWM4p+I z+TU=Z3Ybhg_U^tv19goK{L=!pxW;vZsw=Vtu6gfUJ$4PigwT^B!Nhi8|4X}X5KsiG z2}OfSn+dMR_A0(riyjOx(LEw_go3SN-OiNz#i*n7B6O&R0&euv*FNtGL&wnb?k(X= z=HJ zgEQ*QAf~BMmvWH!JKo(b0#W^#weL#7zh=>%~{+@u?4QG&geY^rqsu2V?sV z9m{zznmCKnBodsp-=;yaLqn)M}JZv{(RUMAg4o&l$u zzjXuF2O-u*Qt#zJ1P+atp1+VVgwh>{@<)%RW7?huEAz*T7{Q)<(*9--G;7M2j{LU( zuwPHe^vMF2rYb77+$sW9mOYL+C#S)PMWk$#Q!Geb=Fb>O?u4mdhI6HHOUQV zGP-%&y5bC2j_hYl2+fC_m>)`(oue3iSokM6M#EV0-Xp2;v&i!F)$oH&MG%$k$N#x& z6(>)<-6ft;4=vkWOrOP8z&|s(l3t%03}*|A1EB#hwV0|sAyAK$M7sHp!po4KQwcvN$yBRssIwBsYnYDQG{$CTDb#f+k)^Os-=O&{BfU*mYa+g+a>m zEQ3`PYikos%&kNXF}lLClO6D;=c0z9Efo%C(%$6G6L~Vm>xXa1wqoeoiF(zbSv2m? z54G(Y1HsAU>l_=U*ce2rZ{O62YkL)*n>S6u-s85Il( ztJ{AJWUa{iLZiEBC^OboYC-4=!wkLGofT)%fh0NdwW18>MovH5M&wt#j`8#CJu!zY zuU-Fs)|`T-lJj(DzD&c}cGIw!zF9bKkobx;?hD%f>{kn5qpkDhyBpBdV%G4UR|b~+YT8$@G68q|*E6^)N8sXb z&WyfjU(EPaTG4)?AFCqiFGauZLu-kSO>gIx@vOPJeKau_oVgRYl|^X)Xq5-wl<8%l zql(i-qso4$V&`({J(2}l)(WV1ybn)(v6;|6REHJ0qU=@Nv8Z-3TjS{I0(h&W|3!~+ z4xA6QG`L&L0r`V0JZ{E_}*qVj!+Kr9& zh$q7XCi5kg*)dGJ*&}=6^#BSjT~k_?Y(=Yt?1&a{-D8b(t4|W@-97DljWl2;}<^0c)_CTTB(+XT%(bOK$7{F>H>m5(eHscKYwBfb4BUstV==8|15$7V4Lp|MQ zao%prl8y2>${eXPy*xJoyvRxw&vr+*abnv_1#kl=U)6Y8ySbuZ=tnQ+6`zWKW?RzFb56YpPOS#lZk#fW((VqN~qv> zUEDi61oT&&yJtVIpnI;_%Z*L_@QT6IC+J8aii~mS&vO++NJUxj73D5ync(()qBIYw zGcgZ^Ni;OLquwMWP={yI6!WsL5p}ItjZ|ylJ9wOZlz;3fJ!#)v5gV(OKG=}e)!O{0 z4XD?|ri*us;?RZLFcy?v0MWI>=k}ge6Hgyb&(B=g;Z?k4 z$M`fpy0>ZfvXT#e5{=ED4Q$3kA{7Dujt;>7%F?4>ESh2DUV|}Bgzy8mzZKRa&w|=5 z9(u_o;yXNAxJi9=0d8iTNlxRR#8(Zi22q>%aNxT5m0{~147prVQk_+c_n#jUeeF~M zTR*Ry4R$SoYou>>Ri+(SwUEG~@81sb?etZPL>~S2mOQh}z+uQg&F?E%+6ohY=A>(W zO~R+4#m&-LIr!PBae|e||5m>jESE29Md^2Sc1>>eME-P<<2S)AIlu8;RxD}*WGd|6 zMHCd_bQEoK&7M}=caS6ZN&O(6FTOoU(MZAbB-@h>kxb;%=0n;!?xXN3sj-YMX#{k* zId`Z?&f-R)o_4TCBZN12D^Y?9V3zjg!=JykxWkHHp)Yb6QE!i!VlOWqR_{kx^ z7nHo?dyjam;o5~;#nGvCXnKKTMyW3c1HP`f+vWU2(G-s+MTcqpnCjCPwA6xwXV1J1 z_Z~zW<;u|f+GGUtU!Ar`D1aIJ56T@KfuIvgXIuQ+@h&Mmpv7$+;C*Yw1Mg+P=4<}? zgN)>zj}57Vb-%D!g)hIJ@ChH>w4&7JIS=d)w#-@B&Vt=hp`O=wX5scOdPUAqI&w?Q zyyb{J70>p+TEFf!4GK>bGZ-qDK&L&9FXnhLKp_|3i{WwTXx^>Zk2SzukXN=}osn$6 zovro3ff)E+C7_$;IRIlTLf>Z?W!jRjl^@t9NjRs>-y;|@&GQH|5WXL(GP|n$GX~s@}cqEar$i!)|LA)9|4u3xL%&Z2-Hcxl| z&6xpJ>g-?Q%EO#%&cWJcbmU9b}#+QHn8rrU}MbT0c7)3}=`sNCik-1e+qeS)hD2yc9_)#pM_H z%Wv=}Hf*-vY5BMvUr4yJQ?^cl4ukYXfxUewwYo%AuV}z$J(rk<2WIj16{BPQjy-r^ z>4k^#^J%CR$!G{N3qy+xzEU|N2PPlb9Yd>G1slU14&8qVK2zJ6&4)WRgdT8ymG)yC z`GQKO_5`lMt(|7V@Tv^8pg>evbX9X$#W92+6BXUuFar@Ot%2H{sIh$>=WKf%wZ<%EWUZ%@5Pt9-ye@B zbR%tE+gAli)5M(e=AHE*8k{PYHRHY84`+*iE>>lZ=?rd_bH-%>CFEzjr)Mvc6fJ+=P8|k~cY+IPb`6k3Jnf~k)tIo} zSN%z(1fxtnOiI5;LKxFZ5B=mI(ke6B1pWJfC%~X>R;milu02reQO?E0!B2-|<%n~- z?-_F}an83@?2WOi?7<8L1FPfjhOsDA?&iE(8l=o@4=d_l2F*<0mv^0-(ean{r9*_z z-%UX6U|KD~zcd?<h+v4nMg1YU_nc2p>O{@#5heP7SP`j-4I>?J<-7)yfTs8}KqqsBXrLuJAj9X~SrE zhxPAT@)Stt1aoRd_QSM;Zotr`c@P*%b2oWa14n|-jQv<8_&S#5SA^95LU2O&zHycj z2q^LONi3ql4{CAw-=r3>3Z~?+Xm;SvpZeRyC74KGzD8VoBijlA{(jryiSra|D*1d< z%OYlqMZU7XQiz4#bQzy+Pvc~!*DXcuK{)A^l|}x(gz`T67i3gxK*9CPub7M75N4CJ z<2jY!U9v^&YcZI_rZ1K(vTCC^;rHFdB&i*i!z(3+?RsF{$$9l4PY1MgEbH8$tBj>#1`7CQnbYK2jud+F}+`x`iCh*{;A8@73bWTfI1+daR|qWELi(O68)~P$Dhb;u^kh|U77fCW-o2C@RR>C^Gt)*(dWrd+636!={Xj~&PaO}P1mceEJ(xNRIR?3Z z^@BUms8Fp{Qy~N7N|ndw?Z!Yn>!QKeu6|UE@5@oXPK7PZ-)X*$!>HnXx@_wO8jMZ& zN?&za#;=Yyp6=tXBL08H8~gglfXnLSX+3qqm$3C5!>mCa9z2!qk#}mI@aI1|5>e6w z-q%-l4u&jX^qaOm`us&a=|`8qn$iaezL9dz`zBz%ihtHIuMf}as+?7QzKCZkRy{fi z-dH{*O{4BiC)~7YI&jgT5{^{K(iVH?ahjEdiL5n;`SQk15$`A{B@qKbzgu85`k>V@ z$6^=@C~@F+Yl1Fa!6O3E<#2t+ij|=O@txl=o{tuphF^cyb2o8kftQ~!xP@duZ&%Dl zRz@uxI1-aT{(b|kuB|wn?4E=C`2u++wMML%bafe{AAnc4Gp@bb*$NwTI_&P(`>^#S zC7UjQ$Rl*HZ*EK;0qKYBg@0KG2u_CEfiJ1Pxcl}MgO|}gAQGnW%kK&mPB6bbP>|Y! z9Umhaf;87L(O)3?YfA@OK5%?_mXrs6HipLPcSlfpgqcOpl95EIYvC3%?1m|4$zS&f zzv?CX>@m@6ix67!SK`U1EU@|*f2)!3v(X-M%$!vvcx}(P^XyU>$=+F3hp!$cxVKwq zOS`@lLs6{1VEfMoU^3C@dfv7HOMd)U?;7<(^r5YE6}?or8(zt?OR*n}=2EYhbrXD_ zna}Pf1h4VZSNA_6-;3eUKG%V=+-TV3*&*dWGJ;RkevMQ&Ov9}&SJGA2Q^3B5N69IM zj(oAF_~FC?1?Jyqh1lfJfR}8*FR8L-V07WmEK422J0A)I1qt1XbjoYv9-)J4o1L@q z%WFW+EeD%Pk0+q%iZH)$b017_+W0;FLP6H(aGOrgHLMICb`Sd53(`tS_s(XHg5B4M zTs5}@crs@Yq8+q?FVb1p`ez4GCad$R<@sim>bpd#nHqx3;oH+|!sR%nPbdB5$^hCu zE5GtXU=r^C_OjktLq!IknU3#OtFWQaa_J?*Bu?)v>HRX&hZpn89t`CsgBb0VwIk~w zG*93CSs>U5DU$)~X7OEwPI0}cM!XLWeN(4fA>I>DF52yg@utziHRS zju{AFPl)=DRt5n(7JWN<$FNm+bBpLo7i5nfDwFhz26u~Y$5|mN96lXctv5nLqu)!6 zTgd-`gVUOzmt_gKc>Yip?(IWux(*Rdu?;+Gs^xQXtOdCzye|XDTyt+96CO@bSdHaa-t8jaE>v%jGAE&3 z$6?2ZkF%(8{=X~fM;o!$;In$TNH3(?hrE;NqJqQhp4Y#XJMgoV#f69B%Ru#YzGQoi zitWZ5DMBeDxFj>h%;hr-%T~dz)n}HWL1~vI-=SWp{l;P=x}CU}G+Z=(5&o^H$^~Q1 z<`R@2yJo_1Z~z=FN8(nw>Bx!>$%2C3G$;$%(sXMZ1&-DwrKRBz#y*gutZf~KO#N-& zD7B+_Yxi|tb?0j6nmG7_zo-Xy9EtGc{Wl1SCQm%v2wv9Pq7n5=J&dHQ&+o3c8xb5W z>N5kmLlh_)8)nc~q=2f+#+J+>I`X7zwu~3+1~~p$XFJP6h4$@L#!Fo-uzTKtB;MAG zzlXDL+R7}!R)W92)t}HoxUVnG{GT6|aBZRZLNB(kYwbS3I|%Ws%BR#1P@z@#Rlafm zAQtVo`fpgd3{ERQaku@ufErkpcQ|MPdPKDM^dD~qbEhjc-Hzq>RPufs!^8q!mKi!6 zPb!3BN&asR_Ja_-O4puust>(W*(?v^44zk?kLpWm1etdxS85fqKxvxQ%_DsociMj# z*|AXz`-h#3Y3v05m^-VHTf7ekRn7z;(I@j>-f`bJcnS8<+x?pQy8sh$q$Eq(Y0zwr z>FW7I_@+j-e>meoaMIeZ{-m6&!Oy>CB|^7NgD(G}`@t-;P$iej6}^1}!px7gAFJwu z#jh$`TYeUU&8KVBmkR43f2(J~tBZoN98blMj5gzfO8L2~+ojiBW-^TMkawrx&;#cNaWQr}Wsx~~D!O<(JI z8%(2Q;Lf(TOViNhlpph2a0CPWs4?|BRv~bV%9l&(L?QFcm=G!rcm6eWnD%MLi1&v` ztUdFfbhmoigz&YQzRi1ZW)r~~*vltySg{tE4tRY{{K-VV=t*}n-EI`pI`p(cdxo*@ zz8HOb1TmLCrhIu_XATUHzTDOGV;v6+yZVrul5t|nq1K$#f*!Xb1Lc={@O-Kw^Obw6 zAfzJ1d-gt2H{6qWncPZ)pOvaj)@;4VpBVRjPhk(X7(SBQ(&`4kGSeMhF4V)ZVfvAW zy??a8?_LaR$)PDYdD`c{9;Z${!UqcrXqA=Sr+HkIg{aF~g*di7-4q z#PiP+ktp8l`%lC) z!V+UvKn2vZ(fu8Ttp$#zvCHV^+ zzxW1$SE4xNw9zmKIiI`rnD8mkzBBO*>(AiDY0u3@+xlU*)8p{veRE)YaKWM?p%PW! z?~BQxYekn&|J84fS;5??GF835#qcnC`Rvbw-O#NW@bcbdFO=)O>6Nz`#Tzv*vX-K| zuz%{d%8u3?_*NS|Bk_TeWNrAMRxz5;yP~UVR{4qCP;67#rFb%yB;6@E^|2h^jpiq6 zZ7;-RqsLbm4eF6+Z|J=;v3A^|VAe9Q-V2;I!G~oIt|QgM?}1QjDde;)#Dd5I4i-}k zt;1#@S?%!e^#|?njzihfE2#vo9J3N_Fdig$brjaSOX(1CWOkY2-HCFxSJ$;ehOoY_ z`js=Rpvu@x)#$+{NU_muf6Kc8A)>Or>D&WwwaBEQ&3YAzXh@RV+L~ zrwL!zXI)lLPlH8qooVhsdQ#LmJx&(EI@lZRIfV{mSaa#4?^p492-xfwChyk^_;8+Z zi%o#U7j8*W&n`kA-_v{bCT%=DD9Ko@i0WoS}JboFsxG{gY5hT<8DHx25g2uAb zqwf6gkR@)4l2|o`N~XSXn1YvIPD);JZ3NudoqE1deV2r|C_=y5zG2xXU5@nk*@AR z)pd?9*!#fIjDj?(kp>obWp(I_;l}ZA(Yx zS^`#~aC74=>wz`w-|d@D@>>GGU*hbeO*FjNvMM(6X%_e%l?9jHAUGf)Ev!kU`LNyF z>|~@<7b-lGdZgn;sm{Z98om|um1?n@BJ_e$Bo0a-#wyX zNp@aGlutR*SqmI65u8IK-pa&=>x|?)&S|!6-vQ)}{>SV|{M}JW`{g?IMA*rDE9TME zZ!|9G;Em|a00)blGf_mpVE<}?H9wpRONSzh=DGUu&T-=+GU4O+RB@#kF3*6>kI<3V z24r|B{WeHMY#z<%gy(Nox8l-y6x}OGM_SR2Q@0nTBh~mP?bWy&10~*-CC-hkeCy7=%?)?SuJAdPfm&Mt{yzo7G_QB7{k!I zGMBe+2I1#gxvPa`6(l>yy}17NAC#Dg{QL2mfg}|6(J6u0-*8{h>yr5BGJGj3dMBv9 ziisa6NuFL5eBJ-+)sP|`X?jY*v^+5aBKdXRv*nC}R_hV=#PK!Axy>CYD@gDp)s%cv z37uzqdV{Rwp%t8azsctI>kd4;>+(sftsAIVw%B(+j|M_dL|k~UOksfp*+=NFUZE^C|-KEz=bUk#s!9S!b~ zYw*d*|6KC|YtZ^nvzkhIADmFT%%n=+0Tmxvr0Q0uP_geuuNRYljO?m{BLNJ<;I}J-uVI4*>)8&P+Aj0B%h%FXJ!=$&-S4S4(^27;{?GZ$J>8&F zy(C_h5|8BlPD###wXk54_@7Vm9GVLb2YwoELCIYo7?<`;<3_IWez%NH80GS?^J?mc zsLG|$JR(076jD4UmR|;j!_g{i1``mgopsIb@DRAzd~5vUREd|rXRi42Eko4NbdL*C zeQ@^x`PLPJZ{(s_D(csaHB+;z$eV;Ej>3ilE=}7x-9aO$U=s_;(ThHH0j)dX@e?IDRD~j1o=f1Ea ze70xqQXqKtf!-eemN#RJs<}WI8j1uRiMQ z#Yy#|wXNi7quK_nH?yRMG%VHO?7~npmF43hiM8+fK^p))uB9k(vMyH&!kYA!IQ^k>d2NVxcO#&Wy?oKQowQPA~{QXfl&hu&k z#wM{oyTe}(tp??mgC)bzch~h?PAj1+2mVwQF>M2HX*ViL72!U;0y_CXLU*fDkif_WKg|g4}fx<-TapS#Q4c z$8!{^g#mFahZmr*d-)Mt>ntR&XO`c;-T>e1>}!oji($e1YcIXu2)rO)O6OXh0ri#S z6dUtiR7Q>jZ*n!C_94Nze-9 zv53=I#q30hmb_JBPe;8Zd)hiZ+2a1lt`s6{d|IY!!}(|vdRNpAhBnZVXuNUm`)?M( z8fU%6cb*~W;@_|qd{Ybw`L?1Hd&i(D&*nxHe+^KX#k@vU>B%exBfq>(_Q0_Qr&nC& zeXz6CI{g3V*(Y@{%J1GXJk)O)PY_+he_IA@YR(cI{QW0tRYM65u5*0~$8ZfYULMqX z6*&!RyY|R(miMF8BZ*)6Y-3pVG32o>(f{Q(o1H)TV*;zH{+!$Sa0~-KGkhDo;|EWV z?`kCF48m0l>pQDbKcxt1tf^RZ6&Tk6rM-?GoCmx;#Xw>r6wK&iW%Ncqd+Aee? zzm#@P5$91{AfK}RIxvj2M+TqS1-+Ff{weSqK5Wg?vx&Tsv1)t1m&j3d^SuZW z?}Ze)+yIu>|L}pXibyKq_kO;7mj7`x9og>G)FqFmY%q}B6qZHIBg!lfO!KWyLdmPq z{S2uDXDMuYK*GHfw>4j$(`}kWkyl%M3qB3u$HM61hk=VRt9pflQ#aNVa7tdgG zCzH$funv$s^;t5O&_9z|-+GU8)u8j<1Bofq^~jl@QtWwk9NXB9nM;2ZV6HRmsbXO- zJU^$&YBEAbNug#F4%Sr={97%htS|=cW&A6tCd0`0pIPR#;R^n_8aShUx&q~2Za*Mb z-iFjvSBr^_GPuA0XO8oeKDc#c)sgW|3NVM=X(;?fK^~pUnzb!d)D@?-bXpC-zsK$_ z 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

S3zve_s; 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�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

0yf^&|K4Ey-F|pi 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

0yf^& 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≠3Y4T-$(eM@xzcRlUOrrZ#a{Gyfs7=8)k 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

8})5RJKU5S0w&(o@~(US9X`A(EzY|h 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

p>N;;b<-0$P@(8>f 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 YiT&^S3Hn|3)8PGw|58c#5C6sb|43S;iU0rr diff --git a/tests/test_plot_tree.py b/tests/test_plot_tree.py index 37211cb..4a328af 100755 --- a/tests/test_plot_tree.py +++ b/tests/test_plot_tree.py @@ -11,7 +11,7 @@ def test_polar_with_clades(tdata): fig, ax = plt.subplots(dpi=300, subplot_kw={"polar": True}) pycea.pl.branches( - tdata, tree="clone1", polar=True, color="clade", depth_key="time", palette="Set1", na_color="black", ax=ax + tdata, tree="2", polar=True, color="clade", depth_key="time", palette="Set1", na_color="black", ax=ax ) pycea.pl.nodes(tdata, color="clade", palette="Set1", style="clade", ax=ax) pycea.pl.annotation(tdata, keys="clade", ax=ax) @@ -24,7 +24,7 @@ def test_angled_numeric_annotations(tdata): tdata, polar=False, color="length", cmap="hsv", linewidth="length", depth_key="time", angled_branches=True ) pycea.pl.nodes(tdata, nodes="all", color="time", style="s", size=20) - pycea.pl.nodes(tdata, nodes=["5"], tree="clone2", color="black", style="*", size=200) + pycea.pl.nodes(tdata, nodes=["2"], tree="1", color="black", style="*", size=200) pycea.pl.annotation(tdata, keys=["x", "y"], cmap="magma", width=0.1, gap=0.05, border_width=2) pycea.pl.annotation(tdata, keys=["0", "1", "2", "3", "4", "5"], label="genes", border_width=2) plt.savefig(plot_path / "angled_numeric.png") @@ -39,7 +39,7 @@ def test_matrix_annotation(tdata): node_color="clade", node_size="time", depth_key="time", - keys=["spatial_distance"], + keys=["spatial_distances"], ax=ax, ) plt.savefig(plot_path / "matrix_annotation.png") From 8c49cf4562d803e4268757a1b37095b0781ab6c3 Mon Sep 17 00:00:00 2001 From: colganwi Date: Sat, 22 Jun 2024 19:42:06 -0400 Subject: [PATCH 14/25] added update option to clades --- src/pycea/tl/clades.py | 42 ++++++++++++++++++++++-------------------- tests/test_clades.py | 19 ++++++++++++++++++- 2 files changed, 40 insertions(+), 21 deletions(-) diff --git a/src/pycea/tl/clades.py b/src/pycea/tl/clades.py index 590189d..48f8d2c 100755 --- a/src/pycea/tl/clades.py +++ b/src/pycea/tl/clades.py @@ -6,7 +6,7 @@ import pandas as pd import treedata as td -from pycea.utils import get_root, get_trees +from pycea.utils import get_keyed_leaf_data, get_root, get_trees def _nodes_at_depth(tree, parent, nodes, depth, depth_key): @@ -27,35 +27,36 @@ def _clade_name_generator(): i += 1 -def _clades(tree, depth, depth_key, clades, clade_key, name_generator): +def _clades(tree, depth, depth_key, clades, clade_key, name_generator, update): """Marks clades in a tree.""" # Check that root has depth key root = get_root(tree) - if depth_key not in tree.nodes[root]: - raise ValueError( - f"Tree does not have {depth_key} attribute. You can run `pycea.pp.add_depth` to add depth attribute." - ) if (depth is not None) and (clades is None): + if depth_key not in tree.nodes[root]: + raise ValueError( + f"Tree does not have {depth_key} attribute. You can run `pycea.pp.add_depth` to add depth attribute." + ) nodes = _nodes_at_depth(tree, root, [], depth, depth_key) clades = dict(zip(nodes, name_generator)) elif (clades is not None) and (depth is None): pass else: raise ValueError("Must specify either clades or depth.") - leaf_to_clade = {} + if not update: + for node in tree.nodes: + if clade_key in tree.nodes[node]: + del tree.nodes[node][clade_key] for node, clade in clades.items(): # Leaf if tree.out_degree(node) == 0: - leaf_to_clade[node] = clade tree.nodes[node][clade_key] = clade # Internal node for u, v in nx.dfs_edges(tree, node): tree.nodes[u][clade_key] = clade tree.edges[u, v][clade_key] = clade if tree.out_degree(v) == 0: - leaf_to_clade[v] = clade tree.nodes[v][clade_key] = clade - return clades, leaf_to_clade + return clades def clades( @@ -64,6 +65,7 @@ def clades( depth_key: str = "depth", clades: str | Sequence[str] = None, key_added: str = "clade", + update: bool = False, tree: str | Sequence[str] | None = None, copy: bool = False, ) -> None | Mapping: @@ -81,6 +83,8 @@ def clades( A dictionary mapping nodes to clades. key_added Key to store clades in. + update + If True, updates existing clades instead of overwriting. tree The `obst` key or keys of the trees to use. If `None`, all trees are used. copy @@ -103,16 +107,14 @@ def clades( raise ValueError("Multiple trees are present. Must specify a single tree if clades are given.") # Identify clades name_generator = _clade_name_generator() - leaf_to_clade = {} - clade_nodes = [] + lcas = [] for key, tree in trees.items(): - tree_nodes, tree_leaves = _clades(tree, depth, depth_key, clades, key_added, name_generator) - tree_nodes = pd.DataFrame(tree_nodes.items(), columns=["node", key_added]) - tree_nodes["tree"] = key - clade_nodes.append(tree_nodes) - leaf_to_clade.update(tree_leaves) + tree_lcas = _clades(tree, depth, depth_key, clades, key_added, name_generator, update) + tree_lcas = pd.DataFrame(tree_lcas.items(), columns=["node", key_added]) + tree_lcas["tree"] = key + lcas.append(tree_lcas) # Update TreeData and return - tdata.obs[key_added] = tdata.obs.index.map(leaf_to_clade) - clade_nodes = pd.concat(clade_nodes) + leaf_to_clade = get_keyed_leaf_data(tdata, key_added, tree_keys) + tdata.obs[key_added] = tdata.obs.index.map(leaf_to_clade[key_added]) if copy: - return clade_nodes + return pd.concat(lcas) diff --git a/tests/test_clades.py b/tests/test_clades.py index 0fe2bc2..5cc14f7 100755 --- a/tests/test_clades.py +++ b/tests/test_clades.py @@ -26,7 +26,7 @@ def test_nodes_at_depth(tree): assert _nodes_at_depth(tree, "A", [], 2, "depth") == ["B", "D", "E"] -def test_clades_given_dict(tdata, tree): +def test_clades_given_dict(tdata): clades(tdata, clades={"B": 0, "C": 1}) assert tdata.obs["clade"].tolist() == [0, 1, 1] assert tdata.obst["tree"].nodes["C"]["clade"] == 1 @@ -48,6 +48,19 @@ def test_clades_given_depth(tdata): assert tdata.obs["clade"].tolist() == ["0", "1", "2"] +def test_clades_update(tdata): + clades(tdata, depth=0) + assert tdata.obs["clade"].tolist() == ["0", "0", "0"] + clades(tdata, depth=1, update=True) + assert tdata.obst["tree"].nodes["A"]["clade"] == "0" + assert tdata.obs["clade"].tolist() == ["0", "1", "1"] + clades(tdata, depth=1, update=False) + assert "clade" not in tdata.obst["tree"].nodes["A"] + assert tdata.obs["clade"].tolist() == ["0", "1", "1"] + clades(tdata, clades={"D": "2"}, update=True) + assert tdata.obs["clade"].tolist() == ["0", "2", "1"] + + def test_clades_multiple_trees(): tree1 = nx.DiGraph([("root", "A")]) nx.set_node_attributes(tree1, {"root": 0, "A": 1}, "depth") @@ -71,3 +84,7 @@ def test_clades_invalid(tdata): clades(tdata, clades={"A": 0}, depth=0) with pytest.raises((KeyError, nx.NetworkXError)): clades(tdata, clades={"bad": 0}, key_added="clade") + + +if __name__ == "__main__": + pytest.main(["-v", __file__]) From 2a7ff5204d3681efbdf49901a0b51af75f32c502 Mon Sep 17 00:00:00 2001 From: colganwi Date: Fri, 28 Jun 2024 16:31:38 -0400 Subject: [PATCH 15/25] fixed leaf data bug --- src/pycea/utils.py | 2 +- tests/test_utils.py | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/pycea/utils.py b/src/pycea/utils.py index 6aa640b..9f264c6 100755 --- a/src/pycea/utils.py +++ b/src/pycea/utils.py @@ -79,7 +79,7 @@ def get_keyed_leaf_data( for _, tree in trees.items(): tree_data = {key: nx.get_node_attributes(tree, key) for key in keys} tree_data = pd.DataFrame(tree_data) - tree_data = tree_data.loc[get_leaves(tree)] + tree_data = tree_data.loc[list(set(get_leaves(tree)).intersection(tree_data.index))] data.append(tree_data) data = pd.concat(data) return data diff --git a/tests/test_utils.py b/tests/test_utils.py index 1071597..4e8d658 100755 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -1,5 +1,4 @@ import networkx as nx -import numpy as np import pandas as pd import pytest import treedata as td @@ -18,10 +17,10 @@ def tree(): t = nx.DiGraph() t.add_edges_from([("A", "B"), ("A", "C"), ("B", "D"), ("C", "E")]) - nx.set_node_attributes(t, {"A": 1, "B": 2, "C": None, "D": 4, "E": 5}, "value") - nx.set_node_attributes(t, {"A": "red", "B": "red", "C": None, "D": "blue", "E": "blue"}, "color") - nx.set_edge_attributes(t, {("A", "B"): 5, ("A", "C"): None, ("B", "D"): 3, ("C", "E"): 4}, "weight") - nx.set_edge_attributes(t, {("A", "B"): "red", ("A", "C"): None, ("B", "D"): "red", ("C", "E"): "blue"}, "color") + nx.set_node_attributes(t, {"A": 1, "B": 2, "D": 4}, "value") + nx.set_node_attributes(t, {"A": "red", "B": "red", "D": "blue"}, "color") + nx.set_edge_attributes(t, {("A", "B"): 5, ("B", "D"): 3, ("C", "E"): 4}, "weight") + nx.set_edge_attributes(t, {("A", "B"): "red", ("B", "D"): "red", ("C", "E"): "blue"}, "color") yield t @@ -56,21 +55,22 @@ def test_get_keyed_edge_data(tdata): data = get_keyed_edge_data(tdata, ["weight", "color"]) assert data.columns.tolist() == ["weight", "color"] assert data.index.names == ["tree", "edge"] - assert np.allclose(data["weight"].values, [5, np.nan, 3, 4], equal_nan=True) + assert data["weight"].to_list() == [5, 3, 4] def test_get_keyed_node_data(tdata): data = get_keyed_node_data(tdata, ["value", "color"]) assert data.columns.tolist() == ["value", "color"] assert data.index.names == ["tree", "node"] - assert np.allclose(data["value"].values, [1, 2, np.nan, 4, 5], equal_nan=True) + assert data["value"].to_list() == [1, 2, 4] def test_get_keyed_leaf_data(tdata): data = get_keyed_leaf_data(tdata, ["value", "color"]) + print(data) assert data.columns.tolist() == ["value", "color"] - assert data["value"].tolist() == [4, 5] - assert data["color"].tolist() == ["blue", "blue"] + assert data["value"].tolist() == [4] + assert data["color"].tolist() == ["blue"] def test_get_keyed_obs_data_valid_keys(tdata): From 4f5b9e3c62caab1a91c256865799a68749e5339d Mon Sep 17 00:00:00 2001 From: colganwi Date: Fri, 19 Jul 2024 11:02:41 -0400 Subject: [PATCH 16/25] fixed tree distance numpy bug --- src/pycea/tl/tree_distance.py | 7 +++---- tests/test_tree_distance.py | 9 +++++++++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/pycea/tl/tree_distance.py b/src/pycea/tl/tree_distance.py index 1a20b63..cdf3c37 100755 --- a/src/pycea/tl/tree_distance.py +++ b/src/pycea/tl/tree_distance.py @@ -55,7 +55,7 @@ def tree_distance( ---------- tdata The TreeData object. - key + depth_key Key where depth is stored. obs The observations to use: @@ -140,10 +140,9 @@ def tree_distance( # Convert to matrix rows = [tdata.obs_names.get_loc(row) for row in rows] cols = [tdata.obs_names.get_loc(col) for col in cols] + distances = sp.sparse.csr_matrix((data, (rows, cols)), shape=(len(tdata.obs_names), len(tdata.obs_names))) if len(data) == len(tdata.obs_names) ** 2: - distances = np.array(data).reshape(len(tdata.obs_names), len(tdata.obs_names)) - else: - distances = sp.sparse.csr_matrix((data, (rows, cols)), shape=(len(tdata.obs_names), len(tdata.obs_names))) + distances = distances.toarray() tdata.obsp[key_added] = distances # Return if copy: diff --git a/tests/test_tree_distance.py b/tests/test_tree_distance.py index 34c2a12..0858001 100755 --- a/tests/test_tree_distance.py +++ b/tests/test_tree_distance.py @@ -2,6 +2,7 @@ import pandas as pd import pytest import scipy as sp +import numpy as np import treedata as td from pycea.tl.tree_distance import tree_distance @@ -33,6 +34,14 @@ def test_tree_distance(tdata): assert tdata.obsp["lca_depth"][1, 2] == 1 +def test_all_tree_distance(tdata): + tdata_subset = tdata[tdata.obs.tree == "tree1"].copy() + dist = tree_distance(tdata_subset, "depth", metric="path", copy=True) + expected = np.array([[0, 5, 6], [5, 0, 3], [6, 3, 0]]) + assert isinstance(dist, np.ndarray) + np.testing.assert_array_equal(dist, expected) + + def test_obs_tree_distance(tdata): tree_distance(tdata, "depth", obs="A", metric="path") assert tdata.obs.loc["A", "tree_distances"] == 0 From 87422578ed67fccbd14907872666f172dd08e950 Mon Sep 17 00:00:00 2001 From: colganwi Date: Mon, 22 Jul 2024 11:40:16 -0400 Subject: [PATCH 17/25] distance with connectivity and sampling --- src/pycea/tl/__init__.py | 2 +- src/pycea/tl/distance.py | 167 ++++++++++++++++++++++++++++++++------- tests/test_distance.py | 79 +++++++++++++++--- 3 files changed, 211 insertions(+), 37 deletions(-) diff --git a/src/pycea/tl/__init__.py b/src/pycea/tl/__init__.py index 5c33f77..8daadd7 100644 --- a/src/pycea/tl/__init__.py +++ b/src/pycea/tl/__init__.py @@ -1,5 +1,5 @@ from .ancestral_states import ancestral_states from .clades import clades -from .distance import distance +from .distance import compare_distance, distance from .sort import sort from .tree_distance import tree_distance diff --git a/src/pycea/tl/distance.py b/src/pycea/tl/distance.py index 4445fb6..ca476fd 100755 --- a/src/pycea/tl/distance.py +++ b/src/pycea/tl/distance.py @@ -1,9 +1,12 @@ from __future__ import annotations +import random +import warnings from collections.abc import Mapping, Sequence import numpy as np import scipy as sp +import pandas as pd import treedata as td from sklearn.metrics import DistanceMetric @@ -16,6 +19,9 @@ def distance( obs: str | Sequence[str] | None = None, metric: _MetricFn | _Metric = "euclidean", metric_kwargs: Mapping | None = None, + sample_n: int | None = None, + connect_key: str | None = None, + random_state: int | None = None, key_added: str | None = None, copy: bool = False, ): @@ -29,16 +35,24 @@ def distance( Use the indicated key. `'X'` or any `tdata.obsm` key is valid. obs The observations to use: - - If `None`, pairwise distance for all observations is stored in `tdata.obsp[key_added]`. - - If a string, distance to all other observations is `tdata.obs[key_added]`. - - If a sequence, pairwise distance is stored in `tdata.obsp[key_added]`. - - If a sequence of pairs, distance between pairs is stored in `tdata.obsp[key_added]`. + - If `None`, pairwise distance for all observations is stored in `tdata.obsp`. + - If a string, distance to all other observations is `tdata.obs`. + - If a sequence, pairwise distance is stored in `tdata.obsp`. + - If a sequence of pairs, distance between pairs is stored in `tdata.obsp`. metric A known metric’s name or a callable that returns a distance. metric_kwds Options for the metric. + sample_n + If specified, randomly sample `sample_n` pairs of observations. + connect_key + If specified, compute distances only between connected observations specified by + `tdata.obsp[{connect_key}_connectivities]`. + random_state + Random seed for sampling. key_added - Distances are stored in `key + '_distances'` unless `key_added` is specified. + Distances are stored in `tdata.obsp['{key_added}_distances']` and + connectivities in .obsp['{key_added}_connectivities']. Defaults to `key`. copy If True, returns a :class:`np.array` or :class:`scipy.sparse.csr_matrix` with distances. @@ -47,43 +61,142 @@ def distance( Returns `None` if `copy=False`, else returns a :class:`numpy.array` or :class:`scipy.sparse.csr_matrix`. Sets the following fields: - `tdata.obsp[key_added]` : :class:`numpy.array` or :class:`scipy.sparse.csr_matrix` (dtype `float`) + `tdata.obsp['{key_added}_distances']` : :class:`numpy.array` or :class:`scipy.sparse.csr_matrix` (dtype `float`) if `obs` is `None` or a sequence. - `tdata.obs[key_added]` : :class:`pandas.Series` (dtype `float`) if `obs` is a string. + `tdata.obsp['{key_added}_connectivities']` : ::class:`scipy.sparse.csr_matrix` (dtype `float`) + if distances is sparse. + `tdata.obs['{key_added}_distances']` : :class:`pandas.Series` (dtype `float`) if `obs` is a string. """ # Setup metric_fn = DistanceMetric.get_metric(metric, **(metric_kwargs or {})) - key_added = key_added or key + "_distances" + key_added = key_added or key + if connect_key is not None: + if "connectivities" not in connect_key: + connect_key = f"{connect_key}_connectivities" + connectivities = None if key == "X": X = tdata.X elif key in tdata.obsm: X = tdata.obsm[key] else: raise ValueError(f"Key {key} not found in `tdata.obsm`.") - # Compute distances - if obs is None: - distances = metric_fn.pairwise(X) - tdata.obsp[key_added] = distances + # Get pairs + pairs = None + if connect_key is not None: + if obs is not None: + warnings.warn("`obs` is ignored when connectivity is specified.") + if connect_key not in tdata.obsp.keys(): + raise ValueError(f"Connectivity key {connect_key} not found in `tdata.obsp`.") + pairs = list(zip(*tdata.obsp[connect_key].nonzero())) + else: + if isinstance(obs, Sequence) and isinstance(obs[0], tuple): + pairs = [(tdata.obs_names.get_loc(i), tdata.obs_names.get_loc(j)) for i, j in obs] + elif obs is None and sample_n is not None: + pairs = [(i, j) for i in range(len(X)) for j in range(len(X))] + # Compute distances from pairs + if pairs is not None: + if sample_n is not None: + if sample_n > len(pairs): + raise ValueError("Sample size is larger than the number of pairs.") + if random_state is not None: + random.seed(random_state) + pairs = random.sample(pairs, sample_n) + distances = [metric_fn.pairwise(X[i : i + 1, :], X[j : j + 1, :])[0, 0] for i, j in pairs] + distances = sp.sparse.csr_matrix((distances, zip(*pairs)), shape=(len(X), len(X))) + connectivities = sp.sparse.csr_matrix((np.ones(len(pairs)), zip(*pairs)), shape=(len(X), len(X))) + # Compute point distances elif isinstance(obs, str): idx = tdata.obs_names.get_loc(obs) distances = metric_fn.pairwise(X[idx].reshape(1, -1), X).flatten() - tdata.obs[key_added] = distances - elif isinstance(obs, Sequence): - if isinstance(obs[0], str): - idx = [tdata.obs_names.get_loc(o) for o in obs] - rows = np.repeat(idx, len(idx)) - cols = np.tile(idx, len(idx)) - select_distances = metric_fn.pairwise(X[idx]).flatten() - elif isinstance(obs[0], tuple) and len(obs[0]): - rows = [tdata.obs_names.get_loc(i) for i, _ in obs] - cols = [tdata.obs_names.get_loc(j) for _, j in obs] - select_distances = [metric_fn.pairwise(X[i : i + 1, :], X[j : j + 1, :])[0, 0] for i, j in zip(rows, cols)] - else: - raise ValueError("Invalid type for parameter `obs`.") - distances = sp.sparse.csr_matrix((select_distances, (rows, cols)), shape=(len(X), len(X))) - tdata.obsp[key_added] = distances + # Compute all pairwise distances + elif obs is None: + distances = metric_fn.pairwise(X) + # Compute subset pairwise distances + elif isinstance(obs, Sequence) and isinstance(obs[0], str): + idx = [tdata.obs_names.get_loc(o) for o in obs] + rows = np.repeat(idx, len(idx)) + cols = np.tile(idx, len(idx)) + distances = metric_fn.pairwise(X[idx]) + distances = sp.sparse.csr_matrix((distances.flatten(), (rows, cols)), shape=(len(X), len(X))) + connectivities = sp.sparse.csr_matrix((np.ones(len(idx) ** 2), (rows, cols)), shape=(len(X), len(X))) else: raise ValueError("Invalid type for parameter `obs`.") + # Store distances and connectivities + if distances.ndim == 2: + tdata.obsp[f"{key_added}_distances"] = distances + else: + tdata.obs[f"{key_added}_distances"] = distances + if connectivities is not None: + tdata.obsp[f"{key_added}_connectivities"] = connectivities if copy: return distances + +def compare_distance( + tdata: td.TreeData, + dist_keys: str | Sequence[str] | None = None, + sample_n: int | None = None, + random_state: int | None = None, +): + """Get pairwise observation distances. + + Parameters + ---------- + tdata + The TreeData object. + dist_key + One or more `tdata.obsp` distance keys to compare. Only pairs where all distances are + available are returned. + sample_n + If specified, randomly sample `sample_n` pairs of observations. + random_state + Random seed for sampling. + + Returns + ------- + Returns a :class:`pandas.DataFrame` with the following columns: + - `obs1` and `obs2` are the observation names. + - `{dist_key}_distances` are the distances between the observations. + + """ + # Setup + if random_state is not None: + random.seed(random_state) + if isinstance(dist_keys, str): + dist_keys = [dist_keys] + dist_keys = [key.replace("_distances", "") for key in dist_keys] + # Get shared pairs + shared = None + dense = False + sparse = False + for key in dist_keys: + if f"{key}_distances" not in tdata.obsp.keys(): + raise ValueError(f"Distance key {key} not found in `tdata.obsp`.") + if isinstance(tdata.obsp[f"{key}_distances"],sp.sparse.csr_matrix): + sparse = True + if shared is None: + shared = tdata.obsp[f"{key}_connectivities"].copy() + else: + shared = shared.multiply(tdata.obsp[f"{key}_connectivities"]) + else: + dense = True + if sparse: + row, col = shared.nonzero() + pairs = list(zip(row, col)) + if sample_n is not None: + pairs = random.sample(pairs, sample_n) + elif dense: + if sample_n is not None: + if sample_n > tdata.n_obs ** 2: + raise ValueError("Sample size is larger than the number of pairs.") + pairs = set() + while len(pairs) < sample_n: + pairs.add((random.randint(0, tdata.n_obs - 1), random.randint(0, tdata.n_obs - 1))) + else: + pairs = [(i, j) for i in range(tdata.n_obs) for j in range(tdata.n_obs)] + # Get distances + pair_names = [(tdata.obs_names[i], tdata.obs_names[j]) for i, j in pairs] + distances = pd.DataFrame(pair_names, columns=["obs1", "obs2"]) + for key in dist_keys: + distances[f"{key}_distances"] = [tdata.obsp[f"{key}_distances"][i, j] for i, j in pairs] + return distances \ No newline at end of file diff --git a/tests/test_distance.py b/tests/test_distance.py index 9ead911..6855b17 100755 --- a/tests/test_distance.py +++ b/tests/test_distance.py @@ -4,7 +4,7 @@ import scipy as sp import treedata as td -from pycea.tl.distance import distance +from pycea.tl.distance import distance, compare_distance @pytest.fixture @@ -12,22 +12,24 @@ def tdata(): tdata = td.TreeData( obs=pd.DataFrame(index=["A", "B", "C"]), obsm={"spatial": np.array([[0, 0], [1, 1], [2, 2]]), "characters": np.array([[0, 0], [1, 1], [0, 1]])}, + obsp={"connectivities": sp.sparse.csr_matrix(([1,1], ([0, 0], [1, 2])), shape=(3, 3))}, ) yield tdata def test_pairwise_distance(tdata): dist = distance(tdata, "spatial", metric="euclidean", key_added="euclidean", copy=True) - np.testing.assert_array_equal(tdata.obsp["euclidean"], dist) - assert tdata.obsp["euclidean"].shape == (3, 3) - assert tdata.obsp["euclidean"][0, 1] == pytest.approx(np.sqrt(2)) - assert tdata.obsp["euclidean"][1, 2] == pytest.approx(np.sqrt(2)) - assert tdata.obsp["euclidean"][0, 2] == pytest.approx(np.sqrt(8)) + np.testing.assert_array_equal(tdata.obsp["euclidean_distances"], dist) + assert tdata.obsp["euclidean_distances"].shape == (3, 3) + assert tdata.obsp["euclidean_distances"][0, 1] == pytest.approx(np.sqrt(2)) + assert tdata.obsp["euclidean_distances"][1, 2] == pytest.approx(np.sqrt(2)) + assert tdata.obsp["euclidean_distances"][0, 2] == pytest.approx(np.sqrt(8)) + assert "euclidean_connectivities" not in tdata.obsp.keys() metric = lambda x, y: np.abs(x - y).sum() distance(tdata, "characters", metric=metric, key_added="manhatten") - assert tdata.obsp["manhatten"][0, 1] == 2 - assert tdata.obsp["manhatten"][1, 2] == 1 - assert tdata.obsp["manhatten"][0, 2] == 1 + assert tdata.obsp["manhatten_distances"][0, 1] == 2 + assert tdata.obsp["manhatten_distances"][1, 2] == 1 + assert tdata.obsp["manhatten_distances"][0, 2] == 1 def test_obs_distance(tdata): @@ -40,10 +42,33 @@ def test_select_obs_distance(tdata): assert isinstance(tdata.obsp["spatial_distances"], sp.sparse.csr_matrix) assert tdata.obsp["spatial_distances"][0, 2] == 4 assert tdata.obsp["spatial_distances"][0, 0] == 0 + assert isinstance(tdata.obsp["spatial_connectivities"], sp.sparse.csr_matrix) + assert tdata.obsp["spatial_connectivities"][0, 2] == 1 + assert len(tdata.obsp["spatial_connectivities"].data) == 4 dist = distance(tdata, "spatial", obs=[("A", "C")], metric="cityblock", copy=True) assert isinstance(dist, sp.sparse.csr_matrix) assert len(dist.data) == 1 assert dist[0, 2] == 4 + assert isinstance(tdata.obsp["spatial_connectivities"], sp.sparse.csr_matrix) + assert tdata.obsp["spatial_connectivities"][0, 2] == 1 + assert len(tdata.obsp["spatial_connectivities"].data) == 1 + + +def test_sampled_distance(tdata): + distance(tdata, "spatial", sample_n=2, metric="cityblock",random_state=0) + assert tdata.obsp["spatial_distances"].shape == (3, 3) + assert len(tdata.obsp["spatial_distances"].data) == 2 + assert tdata.obsp["spatial_distances"].data.tolist() == [4, 0] + assert tdata.obsp["spatial_connectivities"].shape == (3, 3) + assert len(tdata.obsp["spatial_connectivities"].data) == 2 + + +def test_connected_distance(tdata): + dist = distance(tdata, "spatial", connect_key="connectivities", metric="cityblock", copy=True) + assert dist.shape == (3, 3) + assert len(dist.data) == 2 + assert dist.data.tolist() == [2, 4] + np.testing.assert_equal(tdata.obsp["spatial_connectivities"].data,tdata.obsp["connectivities"].data) def test_distance_invalid(tdata): @@ -59,7 +84,43 @@ def test_distance_invalid(tdata): distance(tdata, "spatial", obs=[("A", "B", "C")], metric="cityblock") with pytest.raises(ValueError): distance(tdata, "spatial", metric="bad") + with pytest.raises(ValueError): + distance(tdata, "spatial", connect_key="bad", metric="cityblock") + + +def test_compare_distance(tdata): + distance(tdata, "spatial", metric="euclidean", key_added="euclidean") + distance(tdata, "spatial", metric="cityblock", key_added="cityblock") + dist = compare_distance(tdata, dist_keys=["euclidean", "cityblock"]) + assert dist.shape == (9, 4) + assert dist.query("obs1 == obs2")["euclidean_distances"].to_list() == [0, 0, 0] + assert dist.query("obs1 == obs2")["cityblock_distances"].to_list() == [0, 0, 0] + # sampled + dist = compare_distance(tdata, dist_keys=["euclidean", "cityblock"], sample_n=2, random_state=0) + assert dist.shape == (2, 4) + assert dist["cityblock_distances"].to_list() == [2, 0] +def test_compare_sparse_distance(tdata): + distance(tdata, "spatial", metric="euclidean", key_added="euclidean", sample_n=4, random_state=1) + distance(tdata, "spatial", metric="cityblock", key_added="cityblock", connect_key="euclidean") + dist = compare_distance(tdata, dist_keys=["euclidean", "cityblock"]) + assert dist.shape == (4, 4) + assert dist["cityblock_distances"].to_list() == [0, 2, 4, 0] + # sampled + dist = compare_distance(tdata, dist_keys=["euclidean", "cityblock"], sample_n=2, random_state=0) + assert dist.shape == (2, 4) + assert dist["cityblock_distances"].to_list() == [0, 2] + + +def test_compare_distance_invalid(tdata): + distance(tdata, "spatial", metric="euclidean", key_added="euclidean") + with pytest.raises(ValueError): + compare_distance(tdata, dist_keys=["bad"]) + with pytest.raises(ValueError): + compare_distance(tdata, dist_keys=["euclidean", "bad"]) + with pytest.raises(ValueError): + compare_distance(tdata, dist_keys=["euclidean"], sample_n=100) + if __name__ == "__main__": pytest.main(["-v", __file__]) From 91d5bc9f5c79c5477383b01a67f3ce2b74c6eb67 Mon Sep 17 00:00:00 2001 From: colganwi Date: Mon, 22 Jul 2024 14:39:59 -0400 Subject: [PATCH 18/25] tree distance with connectivity and sampling --- src/pycea/tl/distance.py | 23 +++--- src/pycea/tl/tree_distance.py | 145 +++++++++++++++++++++++----------- tests/test_tree_distance.py | 45 ++++++++--- 3 files changed, 147 insertions(+), 66 deletions(-) diff --git a/src/pycea/tl/distance.py b/src/pycea/tl/distance.py index ca476fd..0559aae 100755 --- a/src/pycea/tl/distance.py +++ b/src/pycea/tl/distance.py @@ -5,8 +5,8 @@ from collections.abc import Mapping, Sequence import numpy as np -import scipy as sp import pandas as pd +import scipy as sp import treedata as td from sklearn.metrics import DistanceMetric @@ -85,7 +85,7 @@ def distance( pairs = None if connect_key is not None: if obs is not None: - warnings.warn("`obs` is ignored when connectivity is specified.") + warnings.warn("`obs` is ignored when connectivity is specified.", stacklevel=2) if connect_key not in tdata.obsp.keys(): raise ValueError(f"Connectivity key {connect_key} not found in `tdata.obsp`.") pairs = list(zip(*tdata.obsp[connect_key].nonzero())) @@ -93,7 +93,7 @@ def distance( if isinstance(obs, Sequence) and isinstance(obs[0], tuple): pairs = [(tdata.obs_names.get_loc(i), tdata.obs_names.get_loc(j)) for i, j in obs] elif obs is None and sample_n is not None: - pairs = [(i, j) for i in range(len(X)) for j in range(len(X))] + pairs = [(i, j) for i in range(tdata.n_obs) for j in range(tdata.n_obs)] # Compute distances from pairs if pairs is not None: if sample_n is not None: @@ -103,8 +103,8 @@ def distance( random.seed(random_state) pairs = random.sample(pairs, sample_n) distances = [metric_fn.pairwise(X[i : i + 1, :], X[j : j + 1, :])[0, 0] for i, j in pairs] - distances = sp.sparse.csr_matrix((distances, zip(*pairs)), shape=(len(X), len(X))) - connectivities = sp.sparse.csr_matrix((np.ones(len(pairs)), zip(*pairs)), shape=(len(X), len(X))) + distances = sp.sparse.csr_matrix((distances, zip(*pairs)), shape=(tdata.n_obs, tdata.n_obs)) + connectivities = sp.sparse.csr_matrix((np.ones(len(pairs)), zip(*pairs)), shape=(tdata.n_obs, tdata.n_obs)) # Compute point distances elif isinstance(obs, str): idx = tdata.obs_names.get_loc(obs) @@ -118,8 +118,8 @@ def distance( rows = np.repeat(idx, len(idx)) cols = np.tile(idx, len(idx)) distances = metric_fn.pairwise(X[idx]) - distances = sp.sparse.csr_matrix((distances.flatten(), (rows, cols)), shape=(len(X), len(X))) - connectivities = sp.sparse.csr_matrix((np.ones(len(idx) ** 2), (rows, cols)), shape=(len(X), len(X))) + distances = sp.sparse.csr_matrix((distances.flatten(), (rows, cols)), shape=(tdata.n_obs, tdata.n_obs)) + connectivities = sp.sparse.csr_matrix((np.ones(len(idx) ** 2), (rows, cols)), shape=(tdata.n_obs, tdata.n_obs)) else: raise ValueError("Invalid type for parameter `obs`.") # Store distances and connectivities @@ -132,6 +132,7 @@ def distance( if copy: return distances + def compare_distance( tdata: td.TreeData, dist_keys: str | Sequence[str] | None = None, @@ -172,7 +173,7 @@ def compare_distance( for key in dist_keys: if f"{key}_distances" not in tdata.obsp.keys(): raise ValueError(f"Distance key {key} not found in `tdata.obsp`.") - if isinstance(tdata.obsp[f"{key}_distances"],sp.sparse.csr_matrix): + if isinstance(tdata.obsp[f"{key}_distances"], sp.sparse.csr_matrix): sparse = True if shared is None: shared = tdata.obsp[f"{key}_connectivities"].copy() @@ -187,7 +188,7 @@ def compare_distance( pairs = random.sample(pairs, sample_n) elif dense: if sample_n is not None: - if sample_n > tdata.n_obs ** 2: + if sample_n > tdata.n_obs**2: raise ValueError("Sample size is larger than the number of pairs.") pairs = set() while len(pairs) < sample_n: @@ -198,5 +199,5 @@ def compare_distance( pair_names = [(tdata.obs_names[i], tdata.obs_names[j]) for i, j in pairs] distances = pd.DataFrame(pair_names, columns=["obs1", "obs2"]) for key in dist_keys: - distances[f"{key}_distances"] = [tdata.obsp[f"{key}_distances"][i, j] for i, j in pairs] - return distances \ No newline at end of file + distances[f"{key}_distances"] = [tdata.obsp[f"{key}_distances"][i, j] for i, j in pairs] + return distances diff --git a/src/pycea/tl/tree_distance.py b/src/pycea/tl/tree_distance.py index cdf3c37..7199484 100755 --- a/src/pycea/tl/tree_distance.py +++ b/src/pycea/tl/tree_distance.py @@ -1,5 +1,8 @@ from __future__ import annotations +import random +import warnings +from collections import defaultdict from collections.abc import Sequence import networkx as nx @@ -45,6 +48,9 @@ def tree_distance( depth_key: str = "depth", obs: str | Sequence[str] | None = None, metric: str = "path", + sample_n: int | None = None, + connect_key: str | None = None, + random_state: int | None = None, key_added: str | None = None, tree: str | Sequence[str] | None = None, copy: bool = False, @@ -67,8 +73,16 @@ def tree_distance( The type of tree distance to compute: - `'lca'`: lowest common ancestor depth. - `'path'`: abs(node1 depth + node2 depth - 2 * lca depth). + sample_n + If specified, randomly sample `sample_n` pairs of observations. + connect_key + If specified, compute distances only between connected observations specified by + `tdata.obsp['{connect_key}_connectivities']`. + random_state + Random seed for sampling. key_added - Distances are stored in `'tree_distances'` unless `key_added` is specified. + Distances are stored in `tdata.obsp['{key_added}_distances']` and + connectivities in .obsp['{key_added}_connectivities']. Defaults to 'tree'. tree The `obst` key or keys of the trees to use. If `None`, all trees are used. copy @@ -79,12 +93,19 @@ def tree_distance( Returns `None` if `copy=False`, else returns a :class:`numpy.array` or :class:`scipy.sparse.csr_matrix`. Sets the following fields: - `tdata.obsp[key_added]` : :class:`numpy.array` or :class:`scipy.sparse.csr_matrix` (dtype `float`) + `tdata.obsp['{key_added}_distances']` : :class:`numpy.array` or :class:`scipy.sparse.csr_matrix` (dtype `float`) if `obs` is `None` or a sequence. - `tdata.obs[key_added]` : :class:`pandas.Series` (dtype `float`) if `obs` is a string. + `tdata.obsp['{key_added}_connectivities']` : ::class:`scipy.sparse.csr_matrix` (dtype `float`) + if distances is sparse. + `tdata.obs['{key_added}_distances']` : :class:`pandas.Series` (dtype `float`) if `obs` is a string. """ # Setup - key_added = key_added or "tree_distances" + if random_state is not None: + random.seed(random_state) + key_added = key_added or "tree" + if connect_key is not None: + if "connectivities" not in connect_key: + connect_key = f"{connect_key}_connectivities" tree_keys = tree trees = get_trees(tdata, tree_keys) if metric == "lca": @@ -95,55 +116,91 @@ def tree_distance( raise ValueError(f"Unknown metric {metric}. Valid metrics are 'lca' and 'path'.") if len(trees) > 1 and tdata.allow_overlap and len(tree_keys) != 1: raise ValueError("Must specify a singe tree if tdata.allow_overlap is True.") - # Case 1: single obs - if isinstance(obs, str): - for _, tree in trees.items(): - leaves = get_leaves(tree) - if obs in leaves: - pairs = [(node, obs) for node in leaves] - rows, cols, data = _tree_distance(tree, depth_key, metric_fn, pairs) - distances = pd.DataFrame({key_added: data}, index=rows) - tdata.obs[key_added] = distances[key_added] - # Case 2: multiple obs - else: - tree_pairs = {} - if obs is None: + # All pairs + if obs is None and connect_key is None: + # Without sampling + if sample_n is None: + tree_pairs = {} for key, tree in trees.items(): leaves = get_leaves(tree) - pairs = [(node1, node2) for node1 in leaves for node2 in leaves] - tree_pairs[key] = pairs - elif isinstance(obs, Sequence): - if isinstance(obs[0], str): - for key, tree in trees.items(): - leaves = list(set(get_leaves(tree)).intersection(obs)) - pairs = [(node1, node2) for node1 in leaves for node2 in leaves] - tree_pairs[key] = pairs - elif isinstance(obs[0], tuple) and len(obs[0]): - for key, tree in trees.items(): - leaves = get_leaves(tree) - pairs = [] - for node1, node2 in obs: - if node1 in leaves and node2 in leaves: - pairs.append((node1, node2)) - tree_pairs[key] = pairs - else: - raise ValueError("Invalid type for parameter `obs`.") + tree_pairs[key] = [(i, j) for i in leaves for j in leaves] + # With sampling + else: + tree_to_leaf = {key: get_leaves(tree) for key, tree in trees.items()} + tree_keys = list(tree_to_leaf.keys()) + tree_n_pairs = np.array([len(leaves) ** 2 for leaves in tree_to_leaf.values()]) + tree_pairs = defaultdict(set) + n_pairs = 0 + if sample_n > tree_n_pairs.sum(): + raise ValueError("Sample size is larger than the number of pairs.") + k = 0 + while k < sample_n: + tree = random.choices(tree_keys, tree_n_pairs, k=1)[0] + i = random.choice(tree_to_leaf[tree]) + j = random.choice(tree_to_leaf[tree]) + if (i, j) not in tree_pairs[tree]: + tree_pairs[tree].add((i, j)) + n_pairs += 1 + k += 1 + tree_pairs = {key: list(pairs) for key, pairs in tree_pairs.items()} + # Selected pairs + else: + if connect_key is not None: + if obs is not None: + warnings.warn("`obs` is ignored when connectivity is specified.", stacklevel=2) + if connect_key not in tdata.obsp.keys(): + raise ValueError(f"Connectivity key {connect_key} not found in `tdata.obsp`.") + pairs = list(zip(*tdata.obsp[connect_key].nonzero())) + pairs = [(tdata.obs_names[i], tdata.obs_names[j]) for i, j in pairs] + elif isinstance(obs, str): + pairs = [(i, obs) for i in tdata.obs_names] + elif isinstance(obs, Sequence) and isinstance(obs[0], str): + pairs = [(i, j) for i in obs for j in obs] + elif isinstance(obs, Sequence) and isinstance(obs[0], tuple): + pairs = obs else: raise ValueError("Invalid type for parameter `obs`.") - # Compute distances + # Assign pairs to trees + leaf_to_tree = {leaf: key for key, tree in trees.items() for leaf in get_leaves(tree)} + has_tree = set(leaf_to_tree.keys()) + tree_pairs = defaultdict(list) + for i, j in pairs: + if i in has_tree and j in has_tree and leaf_to_tree[i] == leaf_to_tree[j]: + tree_pairs[leaf_to_tree[i]].append((i, j)) + # Sample pairs + if sample_n is not None: + pairs_to_tree = {pair: key for key, pairs in tree_pairs.items() for pair in pairs} + if sample_n > len(pairs_to_tree): + raise ValueError("Sample size is larger than the number of pairs.") + sampled_pairs = random.sample(pairs_to_tree.keys(), sample_n) + tree_pairs = {key: [pair for pair in pairs if pair in sampled_pairs] for key, pairs in tree_pairs.items()} + # Compute distances + if tree_pairs is not None: rows, cols, data = [], [], [] for key, pairs in tree_pairs.items(): tree_rows, tree_cols, tree_data = _tree_distance(trees[key], depth_key, metric_fn, pairs) rows.extend(tree_rows) cols.extend(tree_cols) data.extend(tree_data) - # Convert to matrix - rows = [tdata.obs_names.get_loc(row) for row in rows] - cols = [tdata.obs_names.get_loc(col) for col in cols] - distances = sp.sparse.csr_matrix((data, (rows, cols)), shape=(len(tdata.obs_names), len(tdata.obs_names))) - if len(data) == len(tdata.obs_names) ** 2: - distances = distances.toarray() - tdata.obsp[key_added] = distances - # Return + # Point distances + if isinstance(obs, str): + key = list(tree_pairs.keys())[0] + pairs = tree_pairs[key] + rows, cols, data = _tree_distance(trees[key], depth_key, metric_fn, pairs) + distances = pd.DataFrame({key_added: data}, index=rows) + tdata.obs[f"{key_added}_distances"] = distances + # Pairwise distances + else: + rows = [tdata.obs_names.get_loc(row) for row in rows] + cols = [tdata.obs_names.get_loc(col) for col in cols] + distances = sp.sparse.csr_matrix((data, (rows, cols)), shape=(tdata.n_obs, tdata.n_obs)) + if len(data) == tdata.n_obs**2: + distances = distances.toarray() + else: + connectivities = sp.sparse.csr_matrix( + (np.ones(len(data)), (rows, cols)), shape=(tdata.n_obs, tdata.n_obs) + ) + tdata.obsp[f"{key_added}_connectivities"] = connectivities + tdata.obsp[f"{key_added}_distances"] = distances if copy: return distances diff --git a/tests/test_tree_distance.py b/tests/test_tree_distance.py index 0858001..d53ba3b 100755 --- a/tests/test_tree_distance.py +++ b/tests/test_tree_distance.py @@ -1,8 +1,8 @@ import networkx as nx +import numpy as np import pandas as pd import pytest import scipy as sp -import numpy as np import treedata as td from pycea.tl.tree_distance import tree_distance @@ -15,27 +15,31 @@ def tdata(): tree2 = nx.DiGraph([("root", "E"), ("root", "F")]) nx.set_node_attributes(tree2, {"root": 0, "E": 1, "F": 1}, "depth") tdata = td.TreeData( - obs=pd.DataFrame(index=["A", "C", "D", "E", "F"]), obst={"tree1": tree1, "tree2": tree2, "empty": nx.DiGraph()} + obs=pd.DataFrame(index=["A", "C", "D", "E", "F"]), + obst={"tree1": tree1, "tree2": tree2, "empty": nx.DiGraph()}, + obsp={"connectivities": sp.sparse.csr_matrix(([1, 1, 1], ([0, 0, 3], [0, 4, 4])), shape=(5, 5))}, ) yield tdata -def test_tree_distance(tdata): +def test_sparse_distance(tdata): dist = tree_distance(tdata, "depth", metric="path", copy=True) assert isinstance(dist, sp.sparse.csr_matrix) assert dist.shape == (5, 5) + print(dist.toarray()) assert dist[0, 1] == 5 assert dist[0, 2] == 6 - tree_distance(tdata, "depth", metric="lca", key_added="lca_depth") - assert isinstance(tdata.obsp["lca_depth"], sp.sparse.csr_matrix) - assert tdata.obsp["lca_depth"].shape == (5, 5) - assert tdata.obsp["lca_depth"][0, 1] == 0 - assert tdata.obsp["lca_depth"][0, 2] == 0 - assert tdata.obsp["lca_depth"][1, 2] == 1 + tree_distance(tdata, "depth", metric="lca", key_added="lca") + assert isinstance(tdata.obsp["lca_distances"], sp.sparse.csr_matrix) + assert isinstance(tdata.obsp["lca_connectivities"], sp.sparse.csr_matrix) + assert tdata.obsp["lca_distances"].shape == (5, 5) + assert tdata.obsp["lca_distances"][0, 1] == 0 + assert tdata.obsp["lca_distances"][0, 2] == 0 + assert tdata.obsp["lca_distances"][1, 2] == 1 -def test_all_tree_distance(tdata): - tdata_subset = tdata[tdata.obs.tree == "tree1"].copy() +def test_pairwise_tree_distance(tdata): + tdata_subset = tdata[tdata.obs.tree == "tree1"].copy() dist = tree_distance(tdata_subset, "depth", metric="path", copy=True) expected = np.array([[0, 5, 6], [5, 0, 3], [6, 3, 0]]) assert isinstance(dist, np.ndarray) @@ -61,6 +65,25 @@ def test_select_obs_tree_distance(tdata): assert dist[0, 1] == 5 +def test_sampled_tree_distance(tdata): + tree_distance(tdata, "depth", sample_n=3, random_state=0, metric="path") + assert isinstance(tdata.obsp["tree_distances"], sp.sparse.csr_matrix) + assert len(tdata.obsp["tree_distances"].data) == 3 + assert tdata.obsp["tree_distances"].shape == (5, 5) + assert tdata.obsp["tree_distances"].data.tolist() == [0, 3, 2] + assert tdata.obsp["tree_connectivities"].shape == (5, 5) + assert len(tdata.obsp["tree_connectivities"].data) == 3 + + +def test_connected_tree_distance(tdata): + tree_distance(tdata, "depth", connect_key="connectivities", metric="path") + assert isinstance(tdata.obsp["tree_distances"], sp.sparse.csr_matrix) + assert tdata.obsp["tree_distances"].shape == (5, 5) + assert len(tdata.obsp["tree_distances"].data) == 2 + assert tdata.obsp["tree_connectivities"].sum() == 2 + assert tdata.obsp["tree_distances"].data.tolist() == [0, 2] + + def test_tree_distance_invalid(tdata): with pytest.raises(ValueError): tree_distance(tdata, "bad", metric="path") From 3bd26b55eca4e03e2d7bd67eeafff6c39f656299 Mon Sep 17 00:00:00 2001 From: colganwi Date: Mon, 22 Jul 2024 17:42:00 -0400 Subject: [PATCH 19/25] compare distance by group --- src/pycea/tl/distance.py | 69 ++++++++++++++++++++++++++++------------ tests/test_distance.py | 28 +++++++++++----- 2 files changed, 69 insertions(+), 28 deletions(-) diff --git a/src/pycea/tl/distance.py b/src/pycea/tl/distance.py index 0559aae..3a8000b 100755 --- a/src/pycea/tl/distance.py +++ b/src/pycea/tl/distance.py @@ -137,6 +137,8 @@ def compare_distance( tdata: td.TreeData, dist_keys: str | Sequence[str] | None = None, sample_n: int | None = None, + groupby: str | None = None, + groups: str | Sequence[str] | None = None, random_state: int | None = None, ): """Get pairwise observation distances. @@ -149,7 +151,12 @@ def compare_distance( One or more `tdata.obsp` distance keys to compare. Only pairs where all distances are available are returned. sample_n - If specified, randomly sample `sample_n` pairs of observations. + If specified, randomly sample `sample_n` pairs of observations. If groupby is specified, + the sample is taken within each group. + groupby + If specified, only compare distances within groups. + groups + Restrict the comparison to these groups. random_state Random seed for sampling. @@ -161,8 +168,11 @@ def compare_distance( """ # Setup + if isinstance(groups, str): + groups = [groups] if random_state is not None: random.seed(random_state) + np.random.seed(random_state) if isinstance(dist_keys, str): dist_keys = [dist_keys] dist_keys = [key.replace("_distances", "") for key in dist_keys] @@ -181,23 +191,42 @@ def compare_distance( shared = shared.multiply(tdata.obsp[f"{key}_connectivities"]) else: dense = True - if sparse: - row, col = shared.nonzero() - pairs = list(zip(row, col)) - if sample_n is not None: - pairs = random.sample(pairs, sample_n) - elif dense: - if sample_n is not None: - if sample_n > tdata.n_obs**2: - raise ValueError("Sample size is larger than the number of pairs.") - pairs = set() - while len(pairs) < sample_n: - pairs.add((random.randint(0, tdata.n_obs - 1), random.randint(0, tdata.n_obs - 1))) - else: - pairs = [(i, j) for i in range(tdata.n_obs) for j in range(tdata.n_obs)] - # Get distances - pair_names = [(tdata.obs_names[i], tdata.obs_names[j]) for i, j in pairs] - distances = pd.DataFrame(pair_names, columns=["obs1", "obs2"]) - for key in dist_keys: - distances[f"{key}_distances"] = [tdata.obsp[f"{key}_distances"][i, j] for i, j in pairs] + # Get distances per group + if groupby is not None: + if groups is None: + groups = tdata.obs[groupby].unique() + indices = [np.where(tdata.obs[groupby] == group)[0] for group in groups] + else: + indices = [list(range(tdata.n_obs))] + distances = [] + for i, idx in enumerate(indices): + # Get pairs with sparse matrix + if sparse: + row, col = shared[idx, :][:, idx].nonzero() + pairs = list(zip(row, col)) + if sample_n is not None: + if sample_n > len(pairs): + raise ValueError("Sample size is larger than the number of pairs.") + pairs = random.sample(pairs, sample_n) + # Get pairs with dense matrix + elif dense: + if sample_n is not None: + if sample_n > len(idx) ** 2: + raise ValueError("Sample size is larger than the number of pairs.") + pairs = set() + while len(pairs) < sample_n: + pair = (np.random.choice(idx), np.random.choice(idx)) + if pair not in pairs: + pairs.add(pair) + else: + pairs = [(i, j) for i in idx for j in idx] + # Get distances + pair_names = [(tdata.obs_names[i], tdata.obs_names[j]) for i, j in pairs] + group_distances = pd.DataFrame(pair_names, columns=["obs1", "obs2"]) + for key in dist_keys: + group_distances[f"{key}_distances"] = [tdata.obsp[f"{key}_distances"][i, j] for i, j in pairs] + if groupby is not None: + group_distances[groupby] = groups[i] + distances.append(group_distances) + distances = pd.concat(distances) return distances diff --git a/tests/test_distance.py b/tests/test_distance.py index 6855b17..ec873cb 100755 --- a/tests/test_distance.py +++ b/tests/test_distance.py @@ -4,15 +4,15 @@ import scipy as sp import treedata as td -from pycea.tl.distance import distance, compare_distance +from pycea.tl.distance import compare_distance, distance @pytest.fixture def tdata(): tdata = td.TreeData( - obs=pd.DataFrame(index=["A", "B", "C"]), + obs=pd.DataFrame({"group": ["1", "1", "2"]}, index=["A", "B", "C"]), obsm={"spatial": np.array([[0, 0], [1, 1], [2, 2]]), "characters": np.array([[0, 0], [1, 1], [0, 1]])}, - obsp={"connectivities": sp.sparse.csr_matrix(([1,1], ([0, 0], [1, 2])), shape=(3, 3))}, + obsp={"connectivities": sp.sparse.csr_matrix(([1, 1], ([0, 0], [1, 2])), shape=(3, 3))}, ) yield tdata @@ -55,7 +55,7 @@ def test_select_obs_distance(tdata): def test_sampled_distance(tdata): - distance(tdata, "spatial", sample_n=2, metric="cityblock",random_state=0) + distance(tdata, "spatial", sample_n=2, metric="cityblock", random_state=0) assert tdata.obsp["spatial_distances"].shape == (3, 3) assert len(tdata.obsp["spatial_distances"].data) == 2 assert tdata.obsp["spatial_distances"].data.tolist() == [4, 0] @@ -68,7 +68,7 @@ def test_connected_distance(tdata): assert dist.shape == (3, 3) assert len(dist.data) == 2 assert dist.data.tolist() == [2, 4] - np.testing.assert_equal(tdata.obsp["spatial_connectivities"].data,tdata.obsp["connectivities"].data) + np.testing.assert_equal(tdata.obsp["spatial_connectivities"].data, tdata.obsp["connectivities"].data) def test_distance_invalid(tdata): @@ -98,7 +98,7 @@ def test_compare_distance(tdata): # sampled dist = compare_distance(tdata, dist_keys=["euclidean", "cityblock"], sample_n=2, random_state=0) assert dist.shape == (2, 4) - assert dist["cityblock_distances"].to_list() == [2, 0] + assert dist["cityblock_distances"].to_list() == [2, 2] def test_compare_sparse_distance(tdata): @@ -108,9 +108,20 @@ def test_compare_sparse_distance(tdata): assert dist.shape == (4, 4) assert dist["cityblock_distances"].to_list() == [0, 2, 4, 0] # sampled - dist = compare_distance(tdata, dist_keys=["euclidean", "cityblock"], sample_n=2, random_state=0) + dist = compare_distance(tdata, dist_keys=["euclidean", "cityblock"], sample_n=2, random_state=1) assert dist.shape == (2, 4) - assert dist["cityblock_distances"].to_list() == [0, 2] + assert dist["cityblock_distances"].to_list() == [2, 4] + + +def test_compare_group_distance(tdata): + distance(tdata, "spatial", metric="euclidean", key_added="euclidean") + distance(tdata, "spatial", metric="cityblock", key_added="cityblock") + dist = compare_distance(tdata, dist_keys=["euclidean", "cityblock"], groupby="group") + assert "group" in dist.columns + assert dist.shape == (5, 5) + # specify group + dist = compare_distance(tdata, dist_keys=["euclidean", "cityblock"], groupby="group", groups="1") + assert dist.shape == (4, 5) def test_compare_distance_invalid(tdata): @@ -122,5 +133,6 @@ def test_compare_distance_invalid(tdata): with pytest.raises(ValueError): compare_distance(tdata, dist_keys=["euclidean"], sample_n=100) + if __name__ == "__main__": pytest.main(["-v", __file__]) From c3f8329af449f9f527db7c8e9f6b4bf68c0e150d Mon Sep 17 00:00:00 2001 From: colganwi Date: Mon, 12 Aug 2024 15:09:52 -0400 Subject: [PATCH 20/25] added get subtree leaves --- src/pycea/utils.py | 5 +++++ tests/test_utils.py | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/src/pycea/utils.py b/src/pycea/utils.py index 9f264c6..4b58edc 100755 --- a/src/pycea/utils.py +++ b/src/pycea/utils.py @@ -24,6 +24,11 @@ def get_leaves(tree: nx.DiGraph): return [node for node in nx.dfs_postorder_nodes(tree, get_root(tree)) if tree.out_degree(node) == 0] +def get_subtree_leaves(tree: nx.DiGraph, node: str): + """Finds the leaves of a subtree""" + return [node for node in nx.dfs_postorder_nodes(tree, node) if tree.out_degree(node) == 0] + + def get_keyed_edge_data( tdata: td.TreeData, keys: str | Sequence[str], tree_keys: str | Sequence[str] = None ) -> pd.DataFrame: diff --git a/tests/test_utils.py b/tests/test_utils.py index 4e8d658..c74abe5 100755 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -10,6 +10,7 @@ get_keyed_obs_data, get_leaves, get_root, + get_subtree_leaves, ) @@ -50,6 +51,13 @@ def test_get_leaves(tree): # test with empty graph assert get_leaves(nx.DiGraph()) == [] +def test_get_subtree_leaves(tree): + assert get_subtree_leaves(tree, "B") == ["D"] + assert get_subtree_leaves(tree, "A") == ["D", "E"] + # Test with a single node + single_node_tree = nx.DiGraph() + single_node_tree.add_node("A") + assert get_subtree_leaves(single_node_tree, "A") == ["A"] def test_get_keyed_edge_data(tdata): data = get_keyed_edge_data(tdata, ["weight", "color"]) From 2811e3a8b4c089115ba3dd24ff8b958cd7b9dd09 Mon Sep 17 00:00:00 2001 From: colganwi Date: Sat, 17 Aug 2024 10:23:13 -0400 Subject: [PATCH 21/25] neighbor distance and doc changes --- .github/workflows/test.yaml | 4 - docs/api.md | 4 + src/pycea/pp/setup_tree.py | 16 +- src/pycea/tl/__init__.py | 1 + src/pycea/tl/_metrics.py | 45 ++++- src/pycea/tl/_utils.py | 104 +++++++++++ src/pycea/tl/ancestral_states.py | 23 ++- src/pycea/tl/clades.py | 22 ++- src/pycea/tl/distance.py | 287 ++++++++++++++++++------------- src/pycea/tl/sort.py | 2 +- src/pycea/tl/tree_distance.py | 260 +++++++++++++++------------- src/pycea/tl/tree_neighbors.py | 195 +++++++++++++++++++++ src/pycea/utils.py | 25 +++ tests/test_distance.py | 22 ++- tests/test_tree_distance.py | 18 +- tests/test_tree_neighbors.py | 79 +++++++++ tests/test_utils.py | 28 ++- 17 files changed, 841 insertions(+), 294 deletions(-) create mode 100755 src/pycea/tl/_utils.py create mode 100755 src/pycea/tl/tree_neighbors.py create mode 100755 tests/test_tree_neighbors.py diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 2e8c4a6..75752cc 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -27,10 +27,6 @@ jobs: python: "3.9" - os: ubuntu-latest python: "3.11" - - os: ubuntu-latest - python: "3.11" - pip-flags: "--pre" - name: PRE-RELEASE DEPENDENCIES name: ${{ matrix.name }} Python ${{ matrix.python }} diff --git a/docs/api.md b/docs/api.md index a499485..ee63842 100644 --- a/docs/api.md +++ b/docs/api.md @@ -23,7 +23,11 @@ tl.ancestral_states tl.clades + tl.compare_distance + tl.distance tl.sort + tl.tree_distance + tl.tree_neighbors ``` ## Plotting diff --git a/src/pycea/pp/setup_tree.py b/src/pycea/pp/setup_tree.py index 5f47fa5..bef94e7 100755 --- a/src/pycea/pp/setup_tree.py +++ b/src/pycea/pp/setup_tree.py @@ -3,6 +3,7 @@ from collections.abc import Sequence import networkx as nx +import pandas as pd import treedata as td from pycea.utils import get_keyed_leaf_data, get_keyed_node_data, get_root, get_trees @@ -17,7 +18,7 @@ def _add_depth(tree, depth_key): def add_depth( tdata: td.TreeData, key_added: str = "depth", tree: str | Sequence[str] | None = None, copy: bool = False -): +) -> None | pd.DataFrame: """Adds a depth attribute to the tree. Parameters @@ -29,17 +30,18 @@ def add_depth( tree The `obst` key or keys of the trees to use. If `None`, all trees are used. copy - If True, returns a :class:`pandas.DataFrame` with node depths. + If True, returns a :class:`DataFrame ` with node depths. Returns ------- - Returns `None` if `copy=False`, else returns a :class:`pandas.DataFrame`. Sets the following fields: + Returns `None` if `copy=False`, else returns node depths. - `tdata.obs[key_added]` : :class:`pandas.Series` (dtype `float`) - Distance from the root node. - `tdata.obst[tree].nodes[key_added]` : `float` - Distance from the root node. + Sets the following fields: + * `tdata.obs[key_added]` : :class:`Series ` (dtype `float`) + - Distance from the root node. + * `tdata.obst[tree].nodes[key_added]` : `float` + - Distance from the root node. """ tree_keys = tree trees = get_trees(tdata, tree_keys) diff --git a/src/pycea/tl/__init__.py b/src/pycea/tl/__init__.py index 8daadd7..68ea342 100644 --- a/src/pycea/tl/__init__.py +++ b/src/pycea/tl/__init__.py @@ -3,3 +3,4 @@ from .distance import compare_distance, distance from .sort import sort from .tree_distance import tree_distance +from .tree_neighbors import tree_neighbors diff --git a/src/pycea/tl/_metrics.py b/src/pycea/tl/_metrics.py index 67ec800..856ec9c 100755 --- a/src/pycea/tl/_metrics.py +++ b/src/pycea/tl/_metrics.py @@ -1,22 +1,28 @@ from collections.abc import Callable -from typing import Literal, Union +from typing import Literal import numpy as np +import treedata as td _MetricFn = Callable[[np.ndarray, np.ndarray], float] -# from sklearn.metrics.pairwise_distances.__doc__: -_MetricSparseCapable = Literal["cityblock", "cosine", "euclidean", "l1", "l2", "manhattan"] -_MetricScipySpatial = Literal[ + +_Metric = Literal[ "braycurtis", "canberra", "chebyshev", + "cityblock", + "cosine", "correlation", "dice", + "euclidean", "hamming", "jaccard", "kulsinski", + "l1", + "l2", "mahalanobis", "minkowski", + "manhattan", "rogerstanimoto", "russellrao", "seuclidean", @@ -25,4 +31,33 @@ "sqeuclidean", "yule", ] -_Metric = Union[_MetricSparseCapable, _MetricScipySpatial] + + +def _lca_distance(tree, depth_key, node1, node2, lca): + """Compute the lca distance between two nodes in a tree.""" + if node1 == node2: + return tree.nodes[node1][depth_key] + else: + return tree.nodes[lca][depth_key] + + +def _path_distance(tree, depth_key, node1, node2, lca): + """Compute the path distance between two nodes in a tree.""" + if node1 == node2: + return 0 + else: + return abs(tree.nodes[node1][depth_key] + tree.nodes[node2][depth_key] - 2 * tree.nodes[lca][depth_key]) + + +_TreeMetricFn = Callable[[td.TreeData, str, str, str, str], np.ndarray] + +_TreeMetric = Literal["lca", "path"] + + +def _get_tree_metric(metric: str) -> _TreeMetricFn: + if metric == "lca": + return _lca_distance + elif metric == "path": + return _path_distance + else: + raise ValueError(f"Unknown metric: {metric}. Valid metrics are 'lca' and 'path'.") diff --git a/src/pycea/tl/_utils.py b/src/pycea/tl/_utils.py new file mode 100755 index 0000000..37d6752 --- /dev/null +++ b/src/pycea/tl/_utils.py @@ -0,0 +1,104 @@ +"""Tool utilities""" + +from __future__ import annotations + +import random +import warnings +from collections.abc import Mapping, Sequence + +import numpy as np +import scipy as sp +import treedata as td + + +def _check_previous_params(tdata: td.TreeData, params: Mapping, key: str, suffixes: Sequence[str]) -> None: + """When a function is updating previous results, check that the parameters are the same.""" + for suffix in suffixes: + if f"{key}_{suffix}" in tdata.uns: + prev_params = tdata.uns[f"{key}_{suffix}"]["params"] + for param, value in params.items(): + if param not in prev_params or prev_params[param] != value: + raise ValueError( + f"{param} value does not match previous call. " + f"Previous: {prev_params}. Current: {params}. " + f"Set `update=False` to avoid this error." + ) + return None + + +def _csr_data_mask(csr): + """Boolean mask of explicit data in a csr matrix including zeros""" + return sp.sparse.csr_matrix((np.ones(len(csr.data), dtype=bool), csr.indices, csr.indptr), shape=csr.shape) + + +def _set_random_state(random_state): + """Set random state""" + if random_state is not None: + random.seed(random_state) + np.random.seed(random_state) + return + + +def _format_keys(keys, suffix): + """Ensures that keys are formatted correctly""" + if keys is None: + pass + elif isinstance(keys, str): + if not keys.endswith(suffix): + keys = f"{keys}_{suffix}" + elif isinstance(keys, Sequence): + keys = [f"{key}_{suffix}" if not key.endswith(suffix) else key for key in keys] + else: + raise ValueError("keys must be a string or a sequence of strings.") + return keys + + +def _format_as_list(obj): + """Ensures that obj is a list""" + if obj is None: + pass + elif not isinstance(obj, Sequence): + obj = [obj] + return obj + + +def _check_tree_overlap(tdata, tree_keys): + """If overlap is allowed there can only be one tree""" + n_trees = len(tdata.obst.keys()) + if (n_trees > 1) and tdata.allow_overlap and len(tree_keys) != 1: + raise ValueError("Must specify a singe tree if tdata.allow_overlap is True.") + return + + +def _set_distances_and_connectivities(tdata, key_added, dist, connect, update): + """Set distances and connectivities in tdata""" + dist_key = f"{key_added}_distances" + connect_key = f"{key_added}_connectivities" + if update and (dist_key in tdata.obsp.keys()): + if isinstance(dist, np.ndarray): + tdata.obsp[dist_key] = dist + else: + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + mask = _csr_data_mask(dist) + tdata.obsp[dist_key][mask] = dist[mask] + else: + if dist_key in tdata.obsp.keys(): + del tdata.obsp[dist_key] + if f"{key_added}_neighbors" in tdata.uns.keys(): + del tdata.uns[f"{key_added}_neighbors"] + tdata.obsp[dist_key] = dist + if connect is not None: + tdata.obsp[connect_key] = connect + return None + + +def _assert_param_xor(params): + """Assert that only one of the parameters is set""" + n_set = sum([value is not None for key, value in params.items()]) + param_text = ", ".join(params.keys()) + if n_set > 1: + raise ValueError(f"Only one of {param_text} can be set.") + if n_set == 0: + raise ValueError(f"At least one of {param_text} must be set.") + return None diff --git a/src/pycea/tl/ancestral_states.py b/src/pycea/tl/ancestral_states.py index 9c072d4..b6dce1f 100755 --- a/src/pycea/tl/ancestral_states.py +++ b/src/pycea/tl/ancestral_states.py @@ -208,7 +208,7 @@ def ancestral_states( keys_added: str | Sequence[str] = None, tree: str | Sequence[str] | None = None, copy: bool = False, -) -> None: +) -> None | pd.DataFrame: """Reconstructs ancestral states for an attribute. Parameters @@ -218,8 +218,13 @@ def ancestral_states( keys One or more `obs_keys`, `var_names`, `obsm_keys`, or `obsp_keys` to reconstruct. method - Method to reconstruct ancestral states. One of "mean", "mode", "fitch_hartigan", "sankoff", - or any function that takes a list of values and returns a single value. + Method to reconstruct ancestral states: + + * 'mean' : The mean of leaves in subtree. + * 'mode' : The most common value in the subtree. + * 'fitch_hartigan' : The Fitch-Hartigan algorithm. + * 'sankoff' : The Sankoff algorithm with specified costs. + * Any function that takes a list of values and returns a single value. missing_state The state to consider as missing data. default_state @@ -227,18 +232,20 @@ def ancestral_states( costs A pd.DataFrame with the costs of changing states (from rows to columns). keys_added - The keys to store the ancestral states. If None, the same keys are used. + Attribute keys of `tdata.obst[tree].nodes` where ancestral states will be stored. If `None`, `keys` are used. tree The `obst` key or keys of the trees to use. If `None`, all trees are used. copy - If True, returns a :class:`pandas.DataFrame` with ancestral states. + If True, returns a :class:`DataFrame ` with ancestral states. Returns ------- - Returns `None` if `copy=False`, else returns a :class:`pandas.DataFrame`. Sets the following fields for each key: + Returns `None` if `copy=False`, else return :class:`DataFrame ` with ancestral states. + + Sets the following fields for each key: - `tdata.obst[tree].nodes[key_added]` : `float` | `Object` | `List[Object]` - Inferred ancestral states. List of states if data was an array. + * `tdata.obst[tree].nodes[key_added]` : `float` | `Object` | `List[Object]` + - Inferred ancestral states. List of states if data was an array. """ if isinstance(keys, str): keys = [keys] diff --git a/src/pycea/tl/clades.py b/src/pycea/tl/clades.py index 48f8d2c..f3a7845 100755 --- a/src/pycea/tl/clades.py +++ b/src/pycea/tl/clades.py @@ -6,7 +6,7 @@ import pandas as pd import treedata as td -from pycea.utils import get_keyed_leaf_data, get_root, get_trees +from pycea.utils import check_tree_has_key, get_keyed_leaf_data, get_root, get_trees def _nodes_at_depth(tree, parent, nodes, depth, depth_key): @@ -32,10 +32,7 @@ def _clades(tree, depth, depth_key, clades, clade_key, name_generator, update): # Check that root has depth key root = get_root(tree) if (depth is not None) and (clades is None): - if depth_key not in tree.nodes[root]: - raise ValueError( - f"Tree does not have {depth_key} attribute. You can run `pycea.pp.add_depth` to add depth attribute." - ) + check_tree_has_key(tree, depth_key) nodes = _nodes_at_depth(tree, root, [], depth, depth_key) clades = dict(zip(nodes, name_generator)) elif (clades is not None) and (depth is None): @@ -78,7 +75,7 @@ def clades( depth Depth to cut tree at. Must be specified if clades is None. depth_key - Key where depth is stored. + Attribute of `tdata.obst[tree].nodes` where depth is stored. clades A dictionary mapping nodes to clades. key_added @@ -88,17 +85,18 @@ def clades( tree The `obst` key or keys of the trees to use. If `None`, all trees are used. copy - If True, returns a :class:`pandas.DataFrame` with clades. + If True, returns a :class:`DataFrame ` with clades. Returns ------- - Returns `None` if `copy=False`, else returns a :class:`pandas.DataFrame`. Sets the following fields: + Returns `None` if `copy=False`, else returns a :class:`DataFrame `. - `tdata.obs[key_added]` : :class:`pandas.Series` (dtype `Object`) - Clade. - `tdata.obst[tree].nodes[key_added]` : `Object` - Clade. + Sets the following fields: + * `tdata.obs[key_added]` : :class:`Series ` (dtype `Object`) + - Clade assignment for each observation. + * `tdata.obst[tree].nodes[key_added]` : `Object` + - Clade assignment for each node. """ # Setup tree_keys = tree diff --git a/src/pycea/tl/distance.py b/src/pycea/tl/distance.py index 3a8000b..7bd8438 100755 --- a/src/pycea/tl/distance.py +++ b/src/pycea/tl/distance.py @@ -1,7 +1,6 @@ from __future__ import annotations import random -import warnings from collections.abc import Mapping, Sequence import numpy as np @@ -10,7 +9,36 @@ import treedata as td from sklearn.metrics import DistanceMetric +from pycea.utils import get_keyed_obsm_data + from ._metrics import _Metric, _MetricFn +from ._utils import ( + _check_previous_params, + _csr_data_mask, + _format_as_list, + _format_keys, + _set_distances_and_connectivities, + _set_random_state, +) + + +def _sample_pairs(pairs, sample_n, n_obs): + """Sample pairs""" + if sample_n is None: + pass + elif pairs is None: + if sample_n > n_obs**2: + raise ValueError("Sample size is larger than the number of pairs.") + pairs = set() + while len(pairs) < sample_n: + i = random.randint(0, n_obs - 1) + j = random.randint(0, n_obs - 1) + pairs.add((i, j)) + else: + if sample_n > len(pairs): + raise ValueError("Sample size is larger than the number of pairs.") + pairs = random.sample(pairs, sample_n) + return pairs def distance( @@ -18,13 +46,14 @@ def distance( key: str, obs: str | Sequence[str] | None = None, metric: _MetricFn | _Metric = "euclidean", - metric_kwargs: Mapping | None = None, + metric_kwds: Mapping | None = None, sample_n: int | None = None, connect_key: str | None = None, random_state: int | None = None, + update: bool = True, key_added: str | None = None, copy: bool = False, -): +) -> None | np.ndarray | sp.sparse.csr_matrix: """Computes distances between observations. Parameters @@ -35,10 +64,12 @@ def distance( Use the indicated key. `'X'` or any `tdata.obsm` key is valid. obs The observations to use: + - If `None`, pairwise distance for all observations is stored in `tdata.obsp`. - If a string, distance to all other observations is `tdata.obs`. - If a sequence, pairwise distance is stored in `tdata.obsp`. - If a sequence of pairs, distance between pairs is stored in `tdata.obsp`. + metric A known metric’s name or a callable that returns a distance. metric_kwds @@ -47,92 +78,141 @@ def distance( If specified, randomly sample `sample_n` pairs of observations. connect_key If specified, compute distances only between connected observations specified by - `tdata.obsp[{connect_key}_connectivities]`. + `tdata.obsp[{connect_key}_connectivities]`. random_state Random seed for sampling. key_added Distances are stored in `tdata.obsp['{key_added}_distances']` and - connectivities in .obsp['{key_added}_connectivities']. Defaults to `key`. + connectivities in `tdata.obsp['{key_added}_connectivities']`. Defaults to `key`. + update + If True, updates existing distances instead of overwriting. copy - If True, returns a :class:`np.array` or :class:`scipy.sparse.csr_matrix` with distances. + If True, returns a the distances. Returns ------- - Returns `None` if `copy=False`, else returns a :class:`numpy.array` or :class:`scipy.sparse.csr_matrix`. - Sets the following fields: + Returns `None` if `copy=False`, else returns distances. - `tdata.obsp['{key_added}_distances']` : :class:`numpy.array` or :class:`scipy.sparse.csr_matrix` (dtype `float`) - if `obs` is `None` or a sequence. - `tdata.obsp['{key_added}_connectivities']` : ::class:`scipy.sparse.csr_matrix` (dtype `float`) - if distances is sparse. - `tdata.obs['{key_added}_distances']` : :class:`pandas.Series` (dtype `float`) if `obs` is a string. + Sets the following fields: + * `tdata.obsp['{key_added}_distances']` : :class:`ndarray `/:class:`csr_matrix ` (dtype `float`) if `obs` is `None` or a sequence. + - Distances between observations. + * `tdata.obsp['{key_added}_connectivities']` : :class:`csr_matrix ` (dtype `float`) if distance is sparse. + - Connectivity between observations. + * `tdata.obs['{key_added}_distances']` : :class:`Series ` (dtype `float`) if `obs` is a string. + - Distance from specified observation to others. """ # Setup - metric_fn = DistanceMetric.get_metric(metric, **(metric_kwargs or {})) + _set_random_state(random_state) + metric_fn = DistanceMetric.get_metric(metric, **(metric_kwds or {})) key_added = key_added or key - if connect_key is not None: - if "connectivities" not in connect_key: - connect_key = f"{connect_key}_connectivities" - connectivities = None - if key == "X": - X = tdata.X - elif key in tdata.obsm: - X = tdata.obsm[key] - else: - raise ValueError(f"Key {key} not found in `tdata.obsm`.") - # Get pairs - pairs = None - if connect_key is not None: - if obs is not None: - warnings.warn("`obs` is ignored when connectivity is specified.", stacklevel=2) - if connect_key not in tdata.obsp.keys(): - raise ValueError(f"Connectivity key {connect_key} not found in `tdata.obsp`.") - pairs = list(zip(*tdata.obsp[connect_key].nonzero())) - else: - if isinstance(obs, Sequence) and isinstance(obs[0], tuple): + connect_key = _format_keys(connect_key, "connectivities") + single_obs = False + X = get_keyed_obsm_data(tdata, key) + if update: + _check_previous_params( + tdata, {"metric": metric, "metric_kwds": metric_kwds}, key_added, ["neighbors", "distances"] + ) + # Distance to single observation + if isinstance(obs, str): + idx = tdata.obs_names.get_loc(obs) + distances = metric_fn.pairwise(X[idx].reshape(1, -1), X).flatten() + single_obs = True + # Distance given pairs + elif connect_key or sample_n or (isinstance(obs, Sequence) and isinstance(obs[0], tuple)): + # Generate pairs + if connect_key: + pairs = list(zip(*tdata.obsp[connect_key].nonzero())) + elif obs: pairs = [(tdata.obs_names.get_loc(i), tdata.obs_names.get_loc(j)) for i, j in obs] - elif obs is None and sample_n is not None: - pairs = [(i, j) for i in range(tdata.n_obs) for j in range(tdata.n_obs)] - # Compute distances from pairs - if pairs is not None: - if sample_n is not None: - if sample_n > len(pairs): - raise ValueError("Sample size is larger than the number of pairs.") - if random_state is not None: - random.seed(random_state) - pairs = random.sample(pairs, sample_n) + else: + pairs = None + pairs = _sample_pairs(pairs, sample_n, tdata.n_obs) + # Compute distances distances = [metric_fn.pairwise(X[i : i + 1, :], X[j : j + 1, :])[0, 0] for i, j in pairs] distances = sp.sparse.csr_matrix((distances, zip(*pairs)), shape=(tdata.n_obs, tdata.n_obs)) - connectivities = sp.sparse.csr_matrix((np.ones(len(pairs)), zip(*pairs)), shape=(tdata.n_obs, tdata.n_obs)) - # Compute point distances - elif isinstance(obs, str): - idx = tdata.obs_names.get_loc(obs) - distances = metric_fn.pairwise(X[idx].reshape(1, -1), X).flatten() - # Compute all pairwise distances - elif obs is None: - distances = metric_fn.pairwise(X) - # Compute subset pairwise distances - elif isinstance(obs, Sequence) and isinstance(obs[0], str): - idx = [tdata.obs_names.get_loc(o) for o in obs] - rows = np.repeat(idx, len(idx)) - cols = np.tile(idx, len(idx)) - distances = metric_fn.pairwise(X[idx]) - distances = sp.sparse.csr_matrix((distances.flatten(), (rows, cols)), shape=(tdata.n_obs, tdata.n_obs)) - connectivities = sp.sparse.csr_matrix((np.ones(len(idx) ** 2), (rows, cols)), shape=(tdata.n_obs, tdata.n_obs)) + # Distance given indices + elif obs is None or (isinstance(obs, Sequence) and isinstance(obs[0], str)): + if obs is None: + distances = metric_fn.pairwise(X) + else: + idx = [tdata.obs_names.get_loc(o) for o in obs] + distances = metric_fn.pairwise(X[idx]) + distances = sp.sparse.csr_matrix( + (distances.flatten(), (np.repeat(idx, len(idx)), np.tile(idx, len(idx)))), + shape=(tdata.n_obs, tdata.n_obs), + ) else: raise ValueError("Invalid type for parameter `obs`.") - # Store distances and connectivities - if distances.ndim == 2: - tdata.obsp[f"{key_added}_distances"] = distances - else: + # Update tdata + if single_obs: tdata.obs[f"{key_added}_distances"] = distances - if connectivities is not None: - tdata.obsp[f"{key_added}_connectivities"] = connectivities + else: + param_dict = { + "connectivities_key": f"{key_added}_connectivities", + "distances_key": f"{key_added}_distances", + "params": { + "metric": metric, + "random_state": random_state, + "metric_kwds": metric_kwds, + }, + } + tdata.uns[f"{key_added}_distances"] = param_dict + if isinstance(distances, np.ndarray): + _set_distances_and_connectivities(tdata, key_added, distances, None, update) + else: + _set_distances_and_connectivities(tdata, key_added, distances, _csr_data_mask(distances), update) if copy: return distances +def _determine_shared_pairs(tdata, dist_keys): + """Determine shared pairs of observations""" + shared, dense = None, True + for dist_key in dist_keys: + if dist_key not in tdata.obsp.keys(): + raise ValueError(f"Distance key {dist_keys} not found in `tdata.obsp`.") + dist_matrix = tdata.obsp[dist_key] + if isinstance(dist_matrix, sp.sparse.csr_matrix): + dense = False + mask = _csr_data_mask(dist_matrix) + shared = mask.copy() if shared is None else shared.multiply(mask) + return shared, dense + + +def _get_group_indices(tdata, groupby, groups): + """Get indices for groups""" + if groupby is not None: + if groups is None: + groups = tdata.obs[groupby].unique() + indices = [np.where(tdata.obs[groupby] == group)[0] for group in groups] + else: + indices = [np.arange(tdata.n_obs)] + return indices, groups + + +def _get_pairs_for_group(idx, shared, dense, sample_n): + """Get pairs for group given a shared boolean matrix""" + if dense: + if sample_n is not None: + if sample_n > len(idx) ** 2: + raise ValueError("Sample size is larger than the number of pairs.") + pairs = set() + while len(pairs) < sample_n: + pair = (np.random.choice(idx), np.random.choice(idx)) + pairs.add(pair) + else: + pairs = [(i, j) for i in idx for j in idx] + else: + row, col = shared[idx, :][:, idx].nonzero() + pairs = list(zip(row, col)) + if sample_n is not None: + if sample_n > len(pairs): + raise ValueError("Sample size is larger than the number of pairs.") + pairs = random.sample(pairs, sample_n) + return pairs + + def compare_distance( tdata: td.TreeData, dist_keys: str | Sequence[str] | None = None, @@ -140,7 +220,7 @@ def compare_distance( groupby: str | None = None, groups: str | Sequence[str] | None = None, random_state: int | None = None, -): +) -> pd.DataFrame: """Get pairwise observation distances. Parameters @@ -162,69 +242,30 @@ def compare_distance( Returns ------- - Returns a :class:`pandas.DataFrame` with the following columns: - - `obs1` and `obs2` are the observation names. - - `{dist_key}_distances` are the distances between the observations. + Returns a :class:`DataFrame ` with the following columns: + + * `obs1` and `obs2` are the observation names. + * `{dist_key}_distances` are the distances between the observations. """ # Setup - if isinstance(groups, str): - groups = [groups] - if random_state is not None: - random.seed(random_state) - np.random.seed(random_state) - if isinstance(dist_keys, str): - dist_keys = [dist_keys] - dist_keys = [key.replace("_distances", "") for key in dist_keys] - # Get shared pairs - shared = None - dense = False - sparse = False - for key in dist_keys: - if f"{key}_distances" not in tdata.obsp.keys(): - raise ValueError(f"Distance key {key} not found in `tdata.obsp`.") - if isinstance(tdata.obsp[f"{key}_distances"], sp.sparse.csr_matrix): - sparse = True - if shared is None: - shared = tdata.obsp[f"{key}_connectivities"].copy() - else: - shared = shared.multiply(tdata.obsp[f"{key}_connectivities"]) - else: - dense = True - # Get distances per group - if groupby is not None: - if groups is None: - groups = tdata.obs[groupby].unique() - indices = [np.where(tdata.obs[groupby] == group)[0] for group in groups] - else: - indices = [list(range(tdata.n_obs))] + _set_random_state(random_state) + dist_keys = _format_as_list(dist_keys) + groups = _format_as_list(groups) + dist_keys = _format_keys(dist_keys, "distances") + # Get set of shared pairs + shared, dense = _determine_shared_pairs(tdata, dist_keys) + # Get distances for each group + indices, groups = _get_group_indices(tdata, groupby, groups) distances = [] for i, idx in enumerate(indices): - # Get pairs with sparse matrix - if sparse: - row, col = shared[idx, :][:, idx].nonzero() - pairs = list(zip(row, col)) - if sample_n is not None: - if sample_n > len(pairs): - raise ValueError("Sample size is larger than the number of pairs.") - pairs = random.sample(pairs, sample_n) - # Get pairs with dense matrix - elif dense: - if sample_n is not None: - if sample_n > len(idx) ** 2: - raise ValueError("Sample size is larger than the number of pairs.") - pairs = set() - while len(pairs) < sample_n: - pair = (np.random.choice(idx), np.random.choice(idx)) - if pair not in pairs: - pairs.add(pair) - else: - pairs = [(i, j) for i in idx for j in idx] - # Get distances + # Get pairs for group + pairs = _get_pairs_for_group(idx, shared, dense, sample_n) + # Get distances for pairs pair_names = [(tdata.obs_names[i], tdata.obs_names[j]) for i, j in pairs] group_distances = pd.DataFrame(pair_names, columns=["obs1", "obs2"]) - for key in dist_keys: - group_distances[f"{key}_distances"] = [tdata.obsp[f"{key}_distances"][i, j] for i, j in pairs] + for dist_key in dist_keys: + group_distances[dist_key] = [tdata.obsp[dist_key][i, j] for i, j in pairs] if groupby is not None: group_distances[groupby] = groups[i] distances.append(group_distances) diff --git a/src/pycea/tl/sort.py b/src/pycea/tl/sort.py index 7662028..6286768 100755 --- a/src/pycea/tl/sort.py +++ b/src/pycea/tl/sort.py @@ -31,7 +31,7 @@ def sort(tdata: td.TreeData, key: str, reverse: bool = False, tree: str | Sequen tdata TreeData object. key - Node attribute to sort by. + Attribute of `tdata.obst[tree].nodes` to sort by. reverse If True, sort in descending order. tree diff --git a/src/pycea/tl/tree_distance.py b/src/pycea/tl/tree_distance.py index 7199484..d0a1a0d 100755 --- a/src/pycea/tl/tree_distance.py +++ b/src/pycea/tl/tree_distance.py @@ -1,7 +1,6 @@ from __future__ import annotations import random -import warnings from collections import defaultdict from collections.abc import Sequence @@ -11,30 +10,24 @@ import scipy as sp import treedata as td -from pycea.utils import get_leaves, get_root, get_trees +from pycea.utils import check_tree_has_key, get_leaves, get_root, get_trees - -def _lca_distance(tree, depth_key, node1, node2, lca): - """Compute the lca distance between two nodes in a tree.""" - if node1 == node2: - return tree.nodes[node1][depth_key] - else: - return tree.nodes[lca][depth_key] - - -def _path_distance(tree, depth_key, node1, node2, lca): - """Compute the path distance between two nodes in a tree.""" - return abs(tree.nodes[node1][depth_key] + tree.nodes[node2][depth_key] - 2 * tree.nodes[lca][depth_key]) +from ._metrics import _get_tree_metric, _TreeMetric +from ._utils import ( + _check_previous_params, + _check_tree_overlap, + _csr_data_mask, + _format_keys, + _set_distances_and_connectivities, + _set_random_state, +) def _tree_distance(tree, depth_key, metric, pairs=None): """Compute distances between pairs of nodes in a tree.""" rows, cols, data = [], [], [] + check_tree_has_key(tree, depth_key) root = get_root(tree) - if depth_key not in tree.nodes[root]: - raise ValueError( - f"Tree does not have {depth_key} attribute. You can run `pycea.pp.add_depth` to add depth attribute." - ) lcas = dict(nx.tree_all_pairs_lowest_common_ancestor(tree, root=root, pairs=pairs)) for (node1, node2), lca in lcas.items(): rows.append(node1) @@ -43,18 +36,81 @@ def _tree_distance(tree, depth_key, metric, pairs=None): return rows, cols, data +def _all_pairs_shared_tree(trees, sample_n): + """Get all pairs of observations that share a tree.""" + if sample_n is None: + tree_pairs = {} + for key, tree in trees.items(): + leaves = get_leaves(tree) + tree_pairs[key] = [(i, j) for i in leaves for j in leaves] + else: + tree_to_leaf = {key: get_leaves(tree) for key, tree in trees.items()} + tree_keys = list(tree_to_leaf.keys()) + tree_n_pairs = np.array([len(leaves) ** 2 for leaves in tree_to_leaf.values()]) + tree_pairs = defaultdict(set) + n_pairs = 0 + if sample_n > tree_n_pairs.sum(): + raise ValueError("Sample size is larger than the number of pairs.") + k = 0 + while k < sample_n: + tree = random.choices(tree_keys, tree_n_pairs, k=1)[0] + i = random.choice(tree_to_leaf[tree]) + j = random.choice(tree_to_leaf[tree]) + if (i, j) not in tree_pairs[tree]: + tree_pairs[tree].add((i, j)) + n_pairs += 1 + k += 1 + tree_pairs = {key: list(pairs) for key, pairs in tree_pairs.items()} + return tree_pairs + + +def _assign_pairs_to_trees(pairs, trees): + """Assign pairs to trees.""" + leaf_to_tree = {leaf: key for key, tree in trees.items() for leaf in get_leaves(tree)} + has_tree = set(leaf_to_tree.keys()) + tree_pairs = defaultdict(list) + for i, j in pairs: + if i in has_tree and j in has_tree and leaf_to_tree[i] == leaf_to_tree[j]: + tree_pairs[leaf_to_tree[i]].append((i, j)) + return tree_pairs + + +def _sample_pairs(tree_pairs, sample_n): + """Given a dictionary of tree pairs, sample n pairs.""" + if sample_n is not None: + pairs_to_tree = {pair: key for key, pairs in tree_pairs.items() for pair in pairs} + if sample_n > len(pairs_to_tree): + raise ValueError("Sample size is larger than the number of pairs.") + sampled_pairs = random.sample(pairs_to_tree.keys(), sample_n) + tree_pairs = {key: [pair for pair in pairs if pair in sampled_pairs] for key, pairs in tree_pairs.items()} + return tree_pairs + + +def _convert_pair_distance_to_matrix(tdata, rows, cols, data): + """Convert pairs to distance matrix.""" + dense = False + rows = [tdata.obs_names.get_loc(row) for row in rows] + cols = [tdata.obs_names.get_loc(col) for col in cols] + distances = sp.sparse.csr_matrix((data, (rows, cols)), shape=(tdata.n_obs, tdata.n_obs)) + if len(data) == tdata.n_obs**2: + distances = distances.toarray() + dense = True + return distances, dense + + def tree_distance( tdata: td.TreeData, depth_key: str = "depth", obs: str | Sequence[str] | None = None, - metric: str = "path", + metric: _TreeMetric = "path", sample_n: int | None = None, connect_key: str | None = None, random_state: int | None = None, key_added: str | None = None, + update: bool = True, tree: str | Sequence[str] | None = None, copy: bool = False, -) -> None | np.array: +) -> None | sp.sparse.csr_matrix: """Computes tree distances between observations. Parameters @@ -62,145 +118,105 @@ def tree_distance( tdata The TreeData object. depth_key - Key where depth is stored. + Attribute of `tdata.obst[tree].nodes` where depth is stored. obs The observations to use: - - If `None`, pairwise distance for tree leaves is stored in `tdata.obsp[key_added]`. - - If a string, distance to all other tree leaves is `tdata.obs[key_added]`. - - If a sequence, pairwise distance is stored in `tdata.obsp[key_added]`. - - If a sequence of pairs, distance between pairs is stored in `tdata.obsp[key_added]`. + + - If `None`, pairwise distance for tree leaves is stored in `tdata.obsp`. + - If a string, distance to all other tree leaves is `tdata.obs`. + - If a sequence, pairwise distance is stored in `tdata.obsp`. + - If a sequence of pairs, distance between pairs is stored in `tdata.obsp`. metric The type of tree distance to compute: + - `'lca'`: lowest common ancestor depth. - `'path'`: abs(node1 depth + node2 depth - 2 * lca depth). sample_n If specified, randomly sample `sample_n` pairs of observations. connect_key - If specified, compute distances only between connected observations specified by - `tdata.obsp['{connect_key}_connectivities']`. + If specified, compute distances only between connected observations specified by `tdata.obsp['{connect_key}_connectivities']`. random_state Random seed for sampling. key_added Distances are stored in `tdata.obsp['{key_added}_distances']` and - connectivities in .obsp['{key_added}_connectivities']. Defaults to 'tree'. + connectivities in `tdata.obsp['{key_added}_connectivities']`. Defaults to 'tree'. + update + If True, updates existing distances instead of overwriting. tree The `obst` key or keys of the trees to use. If `None`, all trees are used. copy - If True, returns a :class:`np.array` or :class:`scipy.sparse.csr_matrix` with distances. + If True, returns a :class:`ndarray ` or :class:`csr_matrix ` with distances. Returns ------- - Returns `None` if `copy=False`, else returns a :class:`numpy.array` or :class:`scipy.sparse.csr_matrix`. + Returns `None` if `copy=False`, else returns :class:`ndarray `/:class:`csr_matrix `. + Sets the following fields: - `tdata.obsp['{key_added}_distances']` : :class:`numpy.array` or :class:`scipy.sparse.csr_matrix` (dtype `float`) - if `obs` is `None` or a sequence. - `tdata.obsp['{key_added}_connectivities']` : ::class:`scipy.sparse.csr_matrix` (dtype `float`) - if distances is sparse. - `tdata.obs['{key_added}_distances']` : :class:`pandas.Series` (dtype `float`) if `obs` is a string. + * `tdata.obsp['{key_added}_distances']` : :class:`ndarray `/:class:`csr_matrix ` (dtype `float`) if `obs` is `None` or a sequence. + - Distances between observations. + * `tdata.obsp['{key_added}_connectivities']` : :class:`csr_matrix ` (dtype `float`) if distance is sparse. + - Connectivity between observations. + * `tdata.obs['{key_added}_distances']` : :class:`Series ` (dtype `float`) if `obs` is a string. + - Distance from specified observation to others. """ # Setup - if random_state is not None: - random.seed(random_state) + _set_random_state(random_state) key_added = key_added or "tree" - if connect_key is not None: - if "connectivities" not in connect_key: - connect_key = f"{connect_key}_connectivities" + connect_key = _format_keys(connect_key, "connectivities") tree_keys = tree trees = get_trees(tdata, tree_keys) - if metric == "lca": - metric_fn = _lca_distance - elif metric == "path": - metric_fn = _path_distance - else: - raise ValueError(f"Unknown metric {metric}. Valid metrics are 'lca' and 'path'.") - if len(trees) > 1 and tdata.allow_overlap and len(tree_keys) != 1: - raise ValueError("Must specify a singe tree if tdata.allow_overlap is True.") - # All pairs - if obs is None and connect_key is None: - # Without sampling - if sample_n is None: - tree_pairs = {} - for key, tree in trees.items(): - leaves = get_leaves(tree) - tree_pairs[key] = [(i, j) for i in leaves for j in leaves] - # With sampling - else: - tree_to_leaf = {key: get_leaves(tree) for key, tree in trees.items()} - tree_keys = list(tree_to_leaf.keys()) - tree_n_pairs = np.array([len(leaves) ** 2 for leaves in tree_to_leaf.values()]) - tree_pairs = defaultdict(set) - n_pairs = 0 - if sample_n > tree_n_pairs.sum(): - raise ValueError("Sample size is larger than the number of pairs.") - k = 0 - while k < sample_n: - tree = random.choices(tree_keys, tree_n_pairs, k=1)[0] - i = random.choice(tree_to_leaf[tree]) - j = random.choice(tree_to_leaf[tree]) - if (i, j) not in tree_pairs[tree]: - tree_pairs[tree].add((i, j)) - n_pairs += 1 - k += 1 - tree_pairs = {key: list(pairs) for key, pairs in tree_pairs.items()} - # Selected pairs + metric_fn = _get_tree_metric(metric) + single_obs = False + _check_tree_overlap(tdata, tree_keys) + if update: + _check_previous_params(tdata, {"metric": metric}, key_added, ["neighbors", "distances"]) + # Get set of pairs for each tree + if not obs and not connect_key: + tree_pairs = _all_pairs_shared_tree(trees, sample_n) else: - if connect_key is not None: - if obs is not None: - warnings.warn("`obs` is ignored when connectivity is specified.", stacklevel=2) - if connect_key not in tdata.obsp.keys(): - raise ValueError(f"Connectivity key {connect_key} not found in `tdata.obsp`.") + if connect_key: pairs = list(zip(*tdata.obsp[connect_key].nonzero())) pairs = [(tdata.obs_names[i], tdata.obs_names[j]) for i, j in pairs] elif isinstance(obs, str): pairs = [(i, obs) for i in tdata.obs_names] + single_obs = True elif isinstance(obs, Sequence) and isinstance(obs[0], str): pairs = [(i, j) for i in obs for j in obs] elif isinstance(obs, Sequence) and isinstance(obs[0], tuple): pairs = obs else: raise ValueError("Invalid type for parameter `obs`.") - # Assign pairs to trees - leaf_to_tree = {leaf: key for key, tree in trees.items() for leaf in get_leaves(tree)} - has_tree = set(leaf_to_tree.keys()) - tree_pairs = defaultdict(list) - for i, j in pairs: - if i in has_tree and j in has_tree and leaf_to_tree[i] == leaf_to_tree[j]: - tree_pairs[leaf_to_tree[i]].append((i, j)) - # Sample pairs - if sample_n is not None: - pairs_to_tree = {pair: key for key, pairs in tree_pairs.items() for pair in pairs} - if sample_n > len(pairs_to_tree): - raise ValueError("Sample size is larger than the number of pairs.") - sampled_pairs = random.sample(pairs_to_tree.keys(), sample_n) - tree_pairs = {key: [pair for pair in pairs if pair in sampled_pairs] for key, pairs in tree_pairs.items()} - # Compute distances - if tree_pairs is not None: - rows, cols, data = [], [], [] - for key, pairs in tree_pairs.items(): - tree_rows, tree_cols, tree_data = _tree_distance(trees[key], depth_key, metric_fn, pairs) - rows.extend(tree_rows) - cols.extend(tree_cols) - data.extend(tree_data) - # Point distances - if isinstance(obs, str): - key = list(tree_pairs.keys())[0] - pairs = tree_pairs[key] - rows, cols, data = _tree_distance(trees[key], depth_key, metric_fn, pairs) - distances = pd.DataFrame({key_added: data}, index=rows) - tdata.obs[f"{key_added}_distances"] = distances - # Pairwise distances + if sample_n: + pairs = random.sample(pairs, sample_n) + tree_pairs = _assign_pairs_to_trees(pairs, trees) + tree_pairs = _sample_pairs(tree_pairs, sample_n) + # Compute distances for each tree + rows, cols, data = [], [], [] + for key, pairs in tree_pairs.items(): + tree_rows, tree_cols, tree_data = _tree_distance(trees[key], depth_key, metric_fn, pairs) + rows.extend(tree_rows) + cols.extend(tree_cols) + data.extend(tree_data) + # Distance to single observation + if single_obs: + distances = pd.DataFrame({key_added: data}, index=rows) + tdata.obs[f"{key_added}_distances"] = distances + # Pairwise distances + else: + distances, dense = _convert_pair_distance_to_matrix(tdata, rows, cols, data) + param_dict = { + "connectivities_key": f"{key_added}_connectivities", + "distances_key": f"{key_added}_distances", + "params": { + "metric": metric, + "random_state": random_state, + }, + } + tdata.uns[f"{key_added}_distances"] = param_dict + if dense: + _set_distances_and_connectivities(tdata, key_added, distances, None, update) else: - rows = [tdata.obs_names.get_loc(row) for row in rows] - cols = [tdata.obs_names.get_loc(col) for col in cols] - distances = sp.sparse.csr_matrix((data, (rows, cols)), shape=(tdata.n_obs, tdata.n_obs)) - if len(data) == tdata.n_obs**2: - distances = distances.toarray() - else: - connectivities = sp.sparse.csr_matrix( - (np.ones(len(data)), (rows, cols)), shape=(tdata.n_obs, tdata.n_obs) - ) - tdata.obsp[f"{key_added}_connectivities"] = connectivities - tdata.obsp[f"{key_added}_distances"] = distances + _set_distances_and_connectivities(tdata, key_added, distances, _csr_data_mask(distances), update) if copy: return distances diff --git a/src/pycea/tl/tree_neighbors.py b/src/pycea/tl/tree_neighbors.py new file mode 100755 index 0000000..ebe4a2b --- /dev/null +++ b/src/pycea/tl/tree_neighbors.py @@ -0,0 +1,195 @@ +from __future__ import annotations + +import heapq +import random +from collections.abc import Sequence + +import networkx as nx +import scipy as sp +import treedata as td + +from pycea.utils import check_tree_has_key, get_leaves, get_trees + +from ._metrics import _get_tree_metric, _TreeMetric +from ._utils import ( + _assert_param_xor, + _check_previous_params, + _check_tree_overlap, + _csr_data_mask, + _set_distances_and_connectivities, + _set_random_state, +) + + +def _bfs_by_distance(tree, start_node, n_neighbors, max_dist, metric, depth_key): + """Breadth-first search with a maximum distance.""" + # Setup + queue = [] + heapq.heappush(queue, (0, start_node)) + visited = set() + visited.add(start_node) + neighbors = [] + neighbor_distances = [] + # Breadth-first search + while queue and (len(neighbors) < n_neighbors): + distance, node = heapq.heappop(queue) + # Add children to queue + children = list(nx.descendants(tree, node)) + random.shuffle(children) + for child in children: + if child not in visited: + if metric == "path": + child_distance = distance + abs(tree.nodes[node][depth_key] - tree.nodes[child][depth_key]) + elif metric == "lca": + child_distance = distance + if child_distance <= max_dist: + # Check if child is a leaf + if tree.out_degree(child) == 0: + neighbors.append(child) + neighbor_distances.append(child_distance) + if len(neighbors) >= n_neighbors: + break + heapq.heappush(queue, (child_distance, child)) + visited.add(child) + # Add parents to queue + for parent in nx.ancestors(tree, node): + if parent not in visited: + if metric == "path": + parent_distance = distance + abs(tree.nodes[node][depth_key] - tree.nodes[parent][depth_key]) + elif metric == "lca": + parent_distance = tree.nodes[parent][depth_key] + if parent_distance <= max_dist: + heapq.heappush(queue, (parent_distance, parent)) + visited.add(parent) + return neighbors, neighbor_distances + + +def _tree_neighbors(tree, n_neighbors, max_dist, depth_key, metric, leaves=None): + """Identify neighbors in a given tree.""" + rows, cols, distances = [], [], [] + if leaves is None: + leaves = [node for node in tree.nodes() if tree.out_degree(node) == 0] + for leaf in leaves: + neighbors, neighbor_distances = _bfs_by_distance(tree, leaf, n_neighbors, max_dist, metric, depth_key) + rows.extend(neighbors) + cols.extend([leaf] * len(neighbors)) + distances.extend(neighbor_distances) + return rows, cols, distances + + +def tree_neighbors( + tdata: td.TreeData, + n_neighbors: int | None = None, + max_dist: float | None = None, + depth_key: str = "depth", + obs: str | Sequence[str] | None = None, + metric: _TreeMetric = "path", + random_state: int | None = None, + key_added: str = "tree", + update: bool = True, + tree: str | Sequence[str] | None = None, + copy: bool = False, +) -> None | tuple[sp.sparse.csr_matrix, sp.sparse.csr_matrix]: + """Identify neighbors in the tree. + + Parameters + ---------- + tdata + The TreeData object. + n_neighbors + The number of neighbors to identify for each leaf. Ties are broken randomly. + max_dist + If n_neighbors is None, identify all neighbors within this distance. + depth_key + Attribute of `tdata.obst[tree].nodes` where depth is stored. + obs + The observations to use: + + - If `None`, neighbors for all leaves are stored in `tdata.obsp`. + - If a string, neighbors of specified leaf are stored in `tdata.obs`. + - If a sequence, neighbors within specified leaves are stored in `tdata.obsp`. + metric + The type of tree distance to compute: + + - `'lca'`: lowest common ancestor depth. + - `'path'`: abs(node1 depth + node2 depth - 2 * lca depth). + random_state + Random seed for breaking ties. + key_added + Neighbor distances are stored in `tdata.obsp['{key_added}_distances']` and + neighbors in .obsp['{key_added}_connectivities']. Defaults to 'tree'. + update + If True, updates existing distances instead of overwriting. + tree + The `tdata.obst` key or keys of the trees to use. If `None`, all trees are used. + copy + If True, returns a tuple of connectivities and distances. + + Returns + ------- + Returns `None` if `copy=False`, else returns (connectivities, distances). + + Sets the following fields: + + * `tdata.obsp['{key_added}_distances']` : :class:`csr_matrix ` (dtype `float`) if `obs` is `None` or a sequence. + - Distances to neighboring observations. + * `tdata.obsp['{key_added}_connectivities']` : :class:`csr_matrix ` (dtype `float`) if distance is sparse. + - Set of neighbors for each observation. + * `tdata.obs['{key_added}_neighbors']` : :class:`Series ` (dtype `bool`) if `obs` is a string. + - Set of neighbors for specified observation. + """ + # Setup + _set_random_state(random_state) + _assert_param_xor({"n_neighbors": n_neighbors, "max_dist": max_dist}) + _ = _get_tree_metric(metric) + tree_keys = tree + _check_tree_overlap(tdata, tree_keys) + if update: + _check_previous_params(tdata, {"metric": metric}, key_added, ["neighbors", "distances"]) + # Neighbors of a single leaf + if isinstance(obs, str): + trees = get_trees(tdata, tree_keys) + leaf_to_tree = {leaf: key for key, tree in trees.items() for leaf in get_leaves(tree)} + if obs not in leaf_to_tree: + raise ValueError(f"Leaf {obs} not found in any tree.") + tree = trees[leaf_to_tree[obs]] + connectivities, _, distances = _tree_neighbors( + tree, n_neighbors or float("inf"), max_dist or float("inf"), depth_key, metric, leaves=[obs] + ) + tdata.obs[f"{key_added}_neighbors"] = tdata.obs_names.isin(connectivities) + # Neighbors for some or all leaves + else: + if isinstance(obs, Sequence): + tdata_subset = tdata[obs] + trees = get_trees(tdata_subset, tree_keys) + elif obs is None: + trees = get_trees(tdata, tree_keys) + else: + raise ValueError("obs must be a string, a sequence of strings, or None.") + # For each tree, identify neighbors + rows, cols, data = [], [], [] + for _, tree in trees.items(): + check_tree_has_key(tree, depth_key) + tree_rows, tree_cols, tree_data = _tree_neighbors( + tree, n_neighbors or float("inf"), max_dist or float("inf"), depth_key, metric + ) + rows.extend([tdata.obs_names.get_loc(row) for row in tree_rows]) + cols.extend([tdata.obs_names.get_loc(col) for col in tree_cols]) + data.extend(tree_data) + # Update tdata + distances = sp.sparse.csr_matrix((data, (rows, cols)), shape=(tdata.n_obs, tdata.n_obs)) + connectivities = _csr_data_mask(distances) + param_dict = { + "connectivities_key": f"{key_added}_connectivities", + "distances_key": f"{key_added}_distances", + "params": { + "n_neighbors": n_neighbors, + "max_dist": max_dist, + "metric": metric, + "random_state": random_state, + }, + } + _set_distances_and_connectivities(tdata, key_added, distances, connectivities, update) + tdata.uns[f"{key_added}_neighbors"] = param_dict + if copy: + return (connectivities, distances) diff --git a/src/pycea/utils.py b/src/pycea/utils.py index 4b58edc..551b574 100755 --- a/src/pycea/utils.py +++ b/src/pycea/utils.py @@ -1,9 +1,11 @@ from __future__ import annotations +import random from collections.abc import Mapping, Sequence import networkx as nx import pandas as pd +import scipy as sp import treedata as td @@ -29,6 +31,18 @@ def get_subtree_leaves(tree: nx.DiGraph, node: str): return [node for node in nx.dfs_postorder_nodes(tree, node) if tree.out_degree(node) == 0] +def check_tree_has_key(tree: nx.DiGraph, key: str): + """Checks that tree nodes have a given key.""" + # sample 10 nodes to check if the key is present + sampled_nodes = random.sample(list(tree.nodes), min(10, len(tree.nodes))) + for node in sampled_nodes: + if key not in tree.nodes[node]: + message = f"Tree does not have {key} attribute." + if key == "depth": + message += " You can run `pycea.pp.add_depth` to add depth attribute." + raise ValueError(message) + + def get_keyed_edge_data( tdata: td.TreeData, keys: str | Sequence[str], tree_keys: str | Sequence[str] = None ) -> pd.DataFrame: @@ -131,6 +145,17 @@ def get_keyed_obs_data(tdata: td.TreeData, keys: str | Sequence[str], layer: str return data, array_keys +def get_keyed_obsm_data(tdata: td.TreeData, key: str) -> sp.sparse.csr_matrix: + """Gets observation matrix data for a given key from a tree.""" + if key == "X": + X = tdata.X + elif key in tdata.obsm: + X = tdata.obsm[key] + else: + raise ValueError(f"Key {key} not found in `tdata.obsm`.") + return X + + def get_trees(tdata: td.TreeData, tree_keys: str | Sequence[str] | None) -> Mapping[str, nx.DiGraph]: """Gets tree data for a given key from a tree.""" trees = {} diff --git a/tests/test_distance.py b/tests/test_distance.py index ec873cb..1786518 100755 --- a/tests/test_distance.py +++ b/tests/test_distance.py @@ -25,6 +25,8 @@ def test_pairwise_distance(tdata): assert tdata.obsp["euclidean_distances"][1, 2] == pytest.approx(np.sqrt(2)) assert tdata.obsp["euclidean_distances"][0, 2] == pytest.approx(np.sqrt(8)) assert "euclidean_connectivities" not in tdata.obsp.keys() + assert "euclidean_distances" in tdata.uns.keys() + assert tdata.uns["euclidean_distances"]["params"]["metric"] == "euclidean" metric = lambda x, y: np.abs(x - y).sum() distance(tdata, "characters", metric=metric, key_added="manhatten") assert tdata.obsp["manhatten_distances"][0, 1] == 2 @@ -58,7 +60,7 @@ def test_sampled_distance(tdata): distance(tdata, "spatial", sample_n=2, metric="cityblock", random_state=0) assert tdata.obsp["spatial_distances"].shape == (3, 3) assert len(tdata.obsp["spatial_distances"].data) == 2 - assert tdata.obsp["spatial_distances"].data.tolist() == [4, 0] + assert tdata.obsp["spatial_distances"].data.tolist() == [2, 0] assert tdata.obsp["spatial_connectivities"].shape == (3, 3) assert len(tdata.obsp["spatial_connectivities"].data) == 2 @@ -71,6 +73,17 @@ def test_connected_distance(tdata): np.testing.assert_equal(tdata.obsp["spatial_connectivities"].data, tdata.obsp["connectivities"].data) +def test_update_distance(tdata): + distance(tdata, "spatial", sample_n=2, metric="cityblock", random_state=0) + assert tdata.obsp["spatial_distances"].data.tolist() == [2, 0] + distance(tdata, "spatial", sample_n=2, metric="cityblock", random_state=3, update=True) + assert tdata.obsp["spatial_distances"].data.tolist() == [2, 4, 0, 4] + distance(tdata, "spatial", sample_n=2, metric="cityblock", random_state=0, update=False) + assert tdata.obsp["spatial_distances"].data.tolist() == [2, 0] + with pytest.raises(ValueError): + distance(tdata, "spatial", sample_n=2, metric="euclidean", update=True) + + def test_distance_invalid(tdata): with pytest.raises(ValueError): distance(tdata, "bad", metric="cityblock") @@ -84,7 +97,7 @@ def test_distance_invalid(tdata): distance(tdata, "spatial", obs=[("A", "B", "C")], metric="cityblock") with pytest.raises(ValueError): distance(tdata, "spatial", metric="bad") - with pytest.raises(ValueError): + with pytest.raises(KeyError): distance(tdata, "spatial", connect_key="bad", metric="cityblock") @@ -106,11 +119,11 @@ def test_compare_sparse_distance(tdata): distance(tdata, "spatial", metric="cityblock", key_added="cityblock", connect_key="euclidean") dist = compare_distance(tdata, dist_keys=["euclidean", "cityblock"]) assert dist.shape == (4, 4) - assert dist["cityblock_distances"].to_list() == [0, 2, 4, 0] + assert dist["cityblock_distances"].to_list() == [2, 4, 0, 2] # sampled dist = compare_distance(tdata, dist_keys=["euclidean", "cityblock"], sample_n=2, random_state=1) assert dist.shape == (2, 4) - assert dist["cityblock_distances"].to_list() == [2, 4] + assert dist["cityblock_distances"].to_list() == [4, 0] def test_compare_group_distance(tdata): @@ -118,6 +131,7 @@ def test_compare_group_distance(tdata): distance(tdata, "spatial", metric="cityblock", key_added="cityblock") dist = compare_distance(tdata, dist_keys=["euclidean", "cityblock"], groupby="group") assert "group" in dist.columns + print(dist) assert dist.shape == (5, 5) # specify group dist = compare_distance(tdata, dist_keys=["euclidean", "cityblock"], groupby="group", groups="1") diff --git a/tests/test_tree_distance.py b/tests/test_tree_distance.py index d53ba3b..e1a66b4 100755 --- a/tests/test_tree_distance.py +++ b/tests/test_tree_distance.py @@ -22,13 +22,14 @@ def tdata(): yield tdata -def test_sparse_distance(tdata): +def test_sparse_tree_distance(tdata): dist = tree_distance(tdata, "depth", metric="path", copy=True) assert isinstance(dist, sp.sparse.csr_matrix) assert dist.shape == (5, 5) - print(dist.toarray()) assert dist[0, 1] == 5 assert dist[0, 2] == 6 + assert "tree_distances" in tdata.uns.keys() + assert tdata.uns["tree_distances"]["params"]["metric"] == "path" tree_distance(tdata, "depth", metric="lca", key_added="lca") assert isinstance(tdata.obsp["lca_distances"], sp.sparse.csr_matrix) assert isinstance(tdata.obsp["lca_connectivities"], sp.sparse.csr_matrix) @@ -59,7 +60,7 @@ def test_select_obs_tree_distance(tdata): assert len(tdata.obsp["tree_distances"].data) == 4 assert tdata.obsp["tree_distances"][0, 1] == 5 assert tdata.obsp["tree_distances"][0, 0] == 0 - dist = tree_distance(tdata, "depth", obs=[("A", "C")], metric="path", copy=True) + dist = tree_distance(tdata, "depth", obs=[("A", "C")], metric="path", copy=True, update=False) assert len(tdata.obsp["tree_distances"].data) == 1 assert isinstance(dist, sp.sparse.csr_matrix) assert dist[0, 1] == 5 @@ -84,6 +85,17 @@ def test_connected_tree_distance(tdata): assert tdata.obsp["tree_distances"].data.tolist() == [0, 2] +def test_update_tree_distance(tdata): + tree_distance(tdata, "depth", sample_n=2, random_state=0, metric="path") + assert tdata.obsp["tree_distances"].data.tolist() == [3, 2] + tree_distance(tdata, "depth", sample_n=1, random_state=1, metric="path", update=True) + assert tdata.obsp["tree_distances"].data.tolist() == [5, 3, 2] + tree_distance(tdata, "depth", sample_n=2, random_state=0, metric="path", update=False) + assert tdata.obsp["tree_distances"].data.tolist() == [3, 2] + with pytest.raises(ValueError): + tree_distance(tdata, "depth", sample_n=2, metric="lca", update=True) + + def test_tree_distance_invalid(tdata): with pytest.raises(ValueError): tree_distance(tdata, "bad", metric="path") diff --git a/tests/test_tree_neighbors.py b/tests/test_tree_neighbors.py new file mode 100755 index 0000000..e7ce3de --- /dev/null +++ b/tests/test_tree_neighbors.py @@ -0,0 +1,79 @@ +import networkx as nx +import numpy as np +import pandas as pd +import pytest +import treedata as td + +from pycea.tl.tree_neighbors import tree_neighbors + + +@pytest.fixture +def tdata(): + tree1 = nx.DiGraph([("root", "A"), ("root", "B"), ("A", "C"), ("A", "D"), ("A", "E"), ("B", "F")]) + nx.set_node_attributes(tree1, {"root": 0, "A": 2, "B": 1, "C": 3, "D": 3, "E": 3, "F": 3}, "depth") + tree2 = nx.DiGraph([("root", "G"), ("root", "H"), ("G", "I"), ("G", "J")]) + nx.set_node_attributes(tree2, {"root": 0, "G": 1, "H": 1, "I": 3, "J": 2}, "depth") + nx.set_node_attributes(tree2, {"root": 3, "G": 2, "H": 2, "I": 0, "J": 1}, "time") + tdata = td.TreeData( + obs=pd.DataFrame(index=["C", "D", "E", "F", "I", "J", "H"]), + obst={"tree1": tree1, "tree2": tree2, "empty": nx.DiGraph()}, + ) + yield tdata + + +def test_tree_neighbors_max(tdata): + (dist, neighbors) = tree_neighbors(tdata, max_dist=3, metric="path", copy=True) + assert tdata.obsp["tree_connectivities"].sum() == 10 + assert np.sum(dist > 0) == 10 + assert "tree_neighbors" in tdata.uns.keys() + assert tdata.uns["tree_neighbors"]["params"]["metric"] == "path" + tree_neighbors(tdata, max_dist=2, metric="path") + assert tdata.obsp["tree_connectivities"].sum() == 6 + tree_neighbors(tdata, max_dist=2, metric="lca", tree="tree2", key_added="lca", depth_key="time") + assert tdata.obsp["lca_connectivities"].sum() == 2 + + +def test_tree_neighbors_n(tdata): + tree_neighbors(tdata, n_neighbors=2, metric="path") + assert tdata.obsp["tree_connectivities"].sum() == 14 + tree_neighbors(tdata, n_neighbors=3, metric="path") + assert tdata.obsp["tree_connectivities"].sum() == 18 + tree_neighbors(tdata, n_neighbors=2, metric="lca", tree="tree2", key_added="lca", depth_key="time") + assert tdata.obsp["lca_connectivities"].sum() == 6 + + +def test_select_tree_neighbors(tdata): + tree_neighbors(tdata, n_neighbors=2, metric="path", obs="C") + assert tdata.obs.query("tree_neighbors").index.tolist() == ["D", "E"] + tree_neighbors(tdata, n_neighbors=3, metric="path", obs=["C", "D"], random_state=0) + assert tdata.obsp["tree_connectivities"].sum() == 2 + + +def test_update_tree_neighbors(tdata): + tree_neighbors(tdata, n_neighbors=3, metric="path") + tree_neighbors(tdata, n_neighbors=2, metric="path", update=True) + assert tdata.obsp["tree_connectivities"].sum() == 14 # connectivities are updated + assert (tdata.obsp["tree_distances"] > 0).sum() == 18 # but distances are not + with pytest.raises(ValueError): + tree_neighbors(tdata, n_neighbors=2, metric="lca", tree="tree2", update=True) + tree_neighbors(tdata, n_neighbors=2, metric="lca", tree="tree2", update=False) + assert tdata.obsp["tree_connectivities"].sum() == 6 + + +def test_tree_neighbors_invalid(tdata): + with pytest.raises(ValueError): + tree_neighbors(tdata, n_neighbors=3, metric="invalid") + with pytest.raises(ValueError): + tree_neighbors(tdata, n_neighbors=3, metric="path", obs="invalid") + with pytest.raises(ValueError): + tree_neighbors(tdata, n_neighbors=3, metric="path", tree="invalid") + with pytest.raises(ValueError): + tree_neighbors(tdata, n_neighbors=3, metric="path", tree=["tree1", "invalid"]) + with pytest.raises(KeyError): + tree_neighbors(tdata, n_neighbors=3, metric="path", obs=["C", "invalid"]) + with pytest.raises(ValueError): + tree_neighbors(tdata, n_neighbors=3, metric="path", depth_key="invalid") + + +if __name__ == "__main__": + pytest.main(["-v", __file__]) diff --git a/tests/test_utils.py b/tests/test_utils.py index c74abe5..787c566 100755 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -4,10 +4,12 @@ import treedata as td from pycea.utils import ( + check_tree_has_key, get_keyed_edge_data, get_keyed_leaf_data, get_keyed_node_data, get_keyed_obs_data, + get_keyed_obsm_data, get_leaves, get_root, get_subtree_leaves, @@ -18,8 +20,8 @@ def tree(): t = nx.DiGraph() t.add_edges_from([("A", "B"), ("A", "C"), ("B", "D"), ("C", "E")]) - nx.set_node_attributes(t, {"A": 1, "B": 2, "D": 4}, "value") - nx.set_node_attributes(t, {"A": "red", "B": "red", "D": "blue"}, "color") + nx.set_node_attributes(t, {"A": 1, "B": 2, "C": 2, "D": 4, "E": 4}, "value") + nx.set_node_attributes(t, {"A": "red", "B": "red", "D": "blue", "E": "blue"}, "color") nx.set_edge_attributes(t, {("A", "B"): 5, ("B", "D"): 3, ("C", "E"): 4}, "weight") nx.set_edge_attributes(t, {("A", "B"): "red", ("B", "D"): "red", ("C", "E"): "blue"}, "color") yield t @@ -51,6 +53,7 @@ def test_get_leaves(tree): # test with empty graph assert get_leaves(nx.DiGraph()) == [] + def test_get_subtree_leaves(tree): assert get_subtree_leaves(tree, "B") == ["D"] assert get_subtree_leaves(tree, "A") == ["D", "E"] @@ -59,6 +62,7 @@ def test_get_subtree_leaves(tree): single_node_tree.add_node("A") assert get_subtree_leaves(single_node_tree, "A") == ["A"] + def test_get_keyed_edge_data(tdata): data = get_keyed_edge_data(tdata, ["weight", "color"]) assert data.columns.tolist() == ["weight", "color"] @@ -70,15 +74,15 @@ def test_get_keyed_node_data(tdata): data = get_keyed_node_data(tdata, ["value", "color"]) assert data.columns.tolist() == ["value", "color"] assert data.index.names == ["tree", "node"] - assert data["value"].to_list() == [1, 2, 4] + assert data["value"].to_list() == [1, 2, 2, 4, 4] def test_get_keyed_leaf_data(tdata): data = get_keyed_leaf_data(tdata, ["value", "color"]) print(data) assert data.columns.tolist() == ["value", "color"] - assert data["value"].tolist() == [4] - assert data["color"].tolist() == ["blue"] + assert data["value"].tolist() == [4, 4] + assert data["color"].tolist() == ["blue", "blue"] def test_get_keyed_obs_data_valid_keys(tdata): @@ -106,5 +110,19 @@ def test_get_keyed_obs_data_invalid_keys(tdata): get_keyed_obs_data(tdata, ["value", "spatial"]) +def test_check_tree_has_key(tree): + check_tree_has_key(tree, "value") + with pytest.raises(ValueError): + check_tree_has_key(tree, "bad") + + +def test_get_keyed_obsm_data(tdata): + data = get_keyed_obsm_data(tdata, "spatial") + assert data.columns.tolist() == [0, 1] + assert data.index.tolist() == ["D", "E"] + assert data[0].tolist() == [0, 1] + assert data[1].tolist() == [0, 1] + + if __name__ == "__main__": pytest.main(["-v", __file__]) From 3887c57bd3e2ba625bd6e4420ff1b3e8ade08a0e Mon Sep 17 00:00:00 2001 From: colganwi Date: Sat, 17 Aug 2024 10:34:11 -0400 Subject: [PATCH 22/25] bumping treedata version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 19817e5..e88fa61 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,7 +22,7 @@ dependencies = [ "cycler", "networkx", "scanpy", - "treedata", + "treedata>=0.0.2", "matplotlib", "numpy", "pandas", From 4da05b5401b456327314748a53f9adf361bdb218 Mon Sep 17 00:00:00 2001 From: colganwi Date: Sat, 17 Aug 2024 10:43:14 -0400 Subject: [PATCH 23/25] bumping build to 3.11 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index e88fa61..19817e5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,7 +22,7 @@ dependencies = [ "cycler", "networkx", "scanpy", - "treedata>=0.0.2", + "treedata", "matplotlib", "numpy", "pandas", From 76f6db52066557cd71c0e55134f037d80101727f Mon Sep 17 00:00:00 2001 From: colganwi Date: Sat, 17 Aug 2024 10:56:01 -0400 Subject: [PATCH 24/25] zip python 3.11 changes --- .github/workflows/build.yaml | 4 ++-- .github/workflows/test.yaml | 4 ++-- src/pycea/tl/distance.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 265a95e..8bba03e 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -15,10 +15,10 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - name: Set up Python 3.10 + - name: Set up Python 3.11 uses: actions/setup-python@v4 with: - python-version: "3.10" + python-version: "3.11" cache: "pip" cache-dependency-path: "**/pyproject.toml" - name: Install build dependencies diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 75752cc..d8bb12a 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -24,9 +24,9 @@ jobs: matrix: include: - os: ubuntu-latest - python: "3.9" + python: "3.10" - os: ubuntu-latest - python: "3.11" + python: "3.12" name: ${{ matrix.name }} Python ${{ matrix.python }} diff --git a/src/pycea/tl/distance.py b/src/pycea/tl/distance.py index 7bd8438..718bfc2 100755 --- a/src/pycea/tl/distance.py +++ b/src/pycea/tl/distance.py @@ -130,7 +130,7 @@ def distance( pairs = _sample_pairs(pairs, sample_n, tdata.n_obs) # Compute distances distances = [metric_fn.pairwise(X[i : i + 1, :], X[j : j + 1, :])[0, 0] for i, j in pairs] - distances = sp.sparse.csr_matrix((distances, zip(*pairs)), shape=(tdata.n_obs, tdata.n_obs)) + distances = sp.sparse.csr_matrix((distances, tuple(map(list, zip(*pairs)))), shape=(tdata.n_obs, tdata.n_obs)) # Distance given indices elif obs is None or (isinstance(obs, Sequence) and isinstance(obs[0], str)): if obs is None: From b7aa66bab81e317fa0e6a057c085b0ad61cd4881 Mon Sep 17 00:00:00 2001 From: colganwi Date: Sat, 17 Aug 2024 11:11:14 -0400 Subject: [PATCH 25/25] added more tests --- src/pycea/tl/tree_distance.py | 2 +- tests/test_distance.py | 6 ++++++ tests/test_tree_distance.py | 6 ++++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/pycea/tl/tree_distance.py b/src/pycea/tl/tree_distance.py index d0a1a0d..aaced70 100755 --- a/src/pycea/tl/tree_distance.py +++ b/src/pycea/tl/tree_distance.py @@ -81,7 +81,7 @@ def _sample_pairs(tree_pairs, sample_n): pairs_to_tree = {pair: key for key, pairs in tree_pairs.items() for pair in pairs} if sample_n > len(pairs_to_tree): raise ValueError("Sample size is larger than the number of pairs.") - sampled_pairs = random.sample(pairs_to_tree.keys(), sample_n) + sampled_pairs = random.sample(list(pairs_to_tree.keys()), sample_n) tree_pairs = {key: [pair for pair in pairs if pair in sampled_pairs] for key, pairs in tree_pairs.items()} return tree_pairs diff --git a/tests/test_distance.py b/tests/test_distance.py index 1786518..df22e21 100755 --- a/tests/test_distance.py +++ b/tests/test_distance.py @@ -95,10 +95,16 @@ def test_distance_invalid(tdata): distance(tdata, "spatial", obs=[("A",)], metric="cityblock") with pytest.raises(ValueError): distance(tdata, "spatial", obs=[("A", "B", "C")], metric="cityblock") + with pytest.raises(ValueError): + distance(tdata, "spatial", sample_n=100, metric="cityblock") + with pytest.raises(ValueError): + distance(tdata, "spatial", obs=["A", "B"], sample_n=100, metric="cityblock") with pytest.raises(ValueError): distance(tdata, "spatial", metric="bad") with pytest.raises(KeyError): distance(tdata, "spatial", connect_key="bad", metric="cityblock") + with pytest.raises(ValueError): + distance(tdata, "spatial", connect_key=-1, metric="cityblock") def test_compare_distance(tdata): diff --git a/tests/test_tree_distance.py b/tests/test_tree_distance.py index e1a66b4..e2fccec 100755 --- a/tests/test_tree_distance.py +++ b/tests/test_tree_distance.py @@ -74,6 +74,8 @@ def test_sampled_tree_distance(tdata): assert tdata.obsp["tree_distances"].data.tolist() == [0, 3, 2] assert tdata.obsp["tree_connectivities"].shape == (5, 5) assert len(tdata.obsp["tree_connectivities"].data) == 3 + tree_distance(tdata, "depth", sample_n=3, obs=["A", "C"], random_state=0, metric="path", update=False) + assert len(tdata.obsp["tree_distances"].data) == 3 def test_connected_tree_distance(tdata): @@ -107,6 +109,10 @@ def test_tree_distance_invalid(tdata): tree_distance(tdata, "depth", obs=[("A",)], metric="path") with pytest.raises(ValueError): tree_distance(tdata, "depth", obs=[("A", "B", "C")], metric="path") + with pytest.raises(ValueError): + tree_distance(tdata, "depth", sample_n=100, metric="path") + with pytest.raises(ValueError): + tree_distance(tdata, "depth", obs=["A", "C"], sample_n=100, metric="path") with pytest.raises(ValueError): tree_distance(tdata, "depth", metric="bad")