diff --git a/historydag/beast_loader.py b/historydag/beast_loader.py index 79e1a38..9e6c20f 100644 --- a/historydag/beast_loader.py +++ b/historydag/beast_loader.py @@ -34,7 +34,6 @@ def dag_from_beast_trees( include_sequence_names_in_labels: If True, augment leaf node labels with a ``name`` attribute containing the name of the corresponding sequence. Useful for distinguishing leaves when observed sequences are not unique. - """ dp_trees = load_beast_trees( beast_xml_file, diff --git a/historydag/dag.py b/historydag/dag.py index ed825bd..134edd8 100644 --- a/historydag/dag.py +++ b/historydag/dag.py @@ -2315,7 +2315,7 @@ def trim_optimal_rf_distance( history, rooted=rooted, one_sided=one_sided, - one_sided_coefficients=one_sided_coefficients + one_sided_coefficients=one_sided_coefficients, ) return self.trim_optimal_weight(**kwargs, optimal_func=optimal_func) @@ -2339,7 +2339,7 @@ def optimal_rf_distance( history, rooted=rooted, one_sided=one_sided, - one_sided_coefficients=one_sided_coefficients + one_sided_coefficients=one_sided_coefficients, ) return self.optimal_weight_annotate(**kwargs, optimal_func=optimal_func) @@ -2363,7 +2363,7 @@ def count_rf_distances( history, rooted=rooted, one_sided=one_sided, - one_sided_coefficients=one_sided_coefficients + one_sided_coefficients=one_sided_coefficients, ) return self.weight_count(**kwargs) diff --git a/historydag/utils.py b/historydag/utils.py index 9eb80b5..ba7d679 100644 --- a/historydag/utils.py +++ b/historydag/utils.py @@ -665,27 +665,28 @@ def make_rfdistance_countfuncs( of the IntState is computed as `a + sign(b) + |B|`, which on the UA node of the hDAG gives RF distance. """ - rf_type_suffix = 'distance' - if one_sided_coefficients != (1,1): - rf_type_suffix = 'nonstandard' + rf_type_suffix = "distance" + if one_sided_coefficients != (1, 1): + rf_type_suffix = "nonstandard" if one_sided is None: pass - elif one_sided.lower() == 'left': + elif one_sided.lower() == "left": one_sided_coefficients = (1, 0) - one_sided_suffix = 'left_difference' - elif one_sided.lower() == 'right': + rf_type_suffix = "left_difference" + elif one_sided.lower() == "right": one_sided_coefficients = (0, 1) - one_sided_suffix = 'right_difference' + rf_type_suffix = "right_difference" else: - raise ValueError(f"Argument `one_sided` must have value 'left', 'right', or None, not {one_sided}") + raise ValueError( + f"Argument `one_sided` must have value 'left', 'right', or None, not {one_sided}" + ) s, t = one_sided_coefficients taxa = frozenset(n.label for n in ref_tree.get_leaves()) if not rooted: - # TODO sidedness not tested for rooted def split(node): cu = node.clade_union() @@ -742,10 +743,9 @@ def edge_func(n1, n2): summer(w.state for w in wlist) ), }, - name="RF_unrooted_distance", + name="RF_unrooted_distance_" + rf_type_suffix, ) else: - # TODO sidedness not tested for unrooted ref_cus = frozenset( node.clade_union() for node in ref_tree.preorder(skip_ua_node=True) ) diff --git a/tests/test_factory.py b/tests/test_factory.py index aedbe3e..d35ff9a 100644 --- a/tests/test_factory.py +++ b/tests/test_factory.py @@ -493,18 +493,30 @@ def rooted_rf_distance(history1, history2): cladeset2 = {n.clade_union() for n in history2.preorder(skip_ua_node=True)} return len(cladeset1 ^ cladeset2) + def test_right_left_rf_add_correctly(): # In both the rooted and unrooted cases, left and right RF distances should # sum to the normal RF distance. for rooted in (True, False): for dag in dags: ref_tree = dag.sample() - left_kwargs = dagutils.make_rfdistance_countfuncs(ref_tree, rooted=rooted, one_sided='left') - right_kwargs = dagutils.make_rfdistance_countfuncs(ref_tree, rooted=rooted, one_sided='right') + left_kwargs = dagutils.make_rfdistance_countfuncs( + ref_tree, rooted=rooted, one_sided="left" + ) + right_kwargs = dagutils.make_rfdistance_countfuncs( + ref_tree, rooted=rooted, one_sided="right" + ) kwargs = dagutils.make_rfdistance_countfuncs(ref_tree, rooted=rooted) for tree in dag: - assert tree.optimal_weight_annotate(**left_kwargs) + tree.optimal_weight_annotate(**right_kwargs) == tree.optimal_weight_annotate(**kwargs) + assert tree.optimal_weight_annotate( + **left_kwargs + ) + tree.optimal_weight_annotate( + **right_kwargs + ) == tree.optimal_weight_annotate( + **kwargs + ) + def test_right_left_rf_collapse(): """ @@ -533,18 +545,25 @@ def test_right_left_rf_collapse(): continue else: count += 1 - left_kwargs = dagutils.make_rfdistance_countfuncs(ctree, rooted=rooted, one_sided='left') + left_kwargs = dagutils.make_rfdistance_countfuncs( + ctree, rooted=rooted, one_sided="left" + ) assert tree.optimal_weight_annotate(**left_kwargs) == 0 - oleft_kwargs = dagutils.make_rfdistance_countfuncs(tree, rooted=rooted, one_sided='left') + oleft_kwargs = dagutils.make_rfdistance_countfuncs( + tree, rooted=rooted, one_sided="left" + ) assert ctree.optimal_weight_annotate(**oleft_kwargs) > 0 - right_kwargs = dagutils.make_rfdistance_countfuncs(ctree, rooted=rooted, one_sided='right') + right_kwargs = dagutils.make_rfdistance_countfuncs( + ctree, rooted=rooted, one_sided="right" + ) assert tree.optimal_weight_annotate(**right_kwargs) > 0 - oright_kwargs = dagutils.make_rfdistance_countfuncs(tree, rooted=rooted, one_sided='right') + oright_kwargs = dagutils.make_rfdistance_countfuncs( + tree, rooted=rooted, one_sided="right" + ) assert ctree.optimal_weight_annotate(**oright_kwargs) == 0 assert count > 0 - def test_rf_rooted_distances(): for dag in dags: ref_tree = dag.sample() @@ -642,8 +661,10 @@ def test_optimal_sum_rf_distance(): calculated_sum = tree.optimal_sum_rf_distance(dag) assert calculated_sum == expected_sum + # ############# END RF Distance Tests: ############### + def test_trim_range(): for curr_dag in [dags[-1], cdags[-1]]: history_dag = curr_dag.copy()