From 5751aa26829fd01b222b658e63c0a6c2214d4c71 Mon Sep 17 00:00:00 2001 From: Muriithi Frederick Muriuki Date: Thu, 22 Jul 2021 15:01:27 +0300 Subject: Test for shortest distance between members in a list and coordinate Issue: https://github.com/genenetwork/gn-gemtext-threads/blob/main/topics/gn1-migration-to-gn2/clustering.gmi * gn3/computations/slink.py: add code to pass new test * tests/unit/computations/test_slink.py: new test Given a list of members in a group, and a coordinate for a member in the same group, find the distance of the closest member from the given coordinate in the group. --- gn3/computations/slink.py | 5 ++++- tests/unit/computations/test_slink.py | 12 ++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/gn3/computations/slink.py b/gn3/computations/slink.py index 7b4016a..3156b31 100644 --- a/gn3/computations/slink.py +++ b/gn3/computations/slink.py @@ -70,6 +70,9 @@ This description should be updated once the form/type of 'distance' identified." raise_mirrorerror_of_distances_one_way_are_not_same_other_way(lists) raise_valueerror_on_negative_distances(lists) #### END: Guard Functions #### - return None if type(i) == int and type(j) == int: # From member i to member j return lists[i][j] + elif type(i) == int and (type(j) in [list, tuple]): + return min(map(lambda j_new: nearest(lists, i, j_new), j)) + elif type(j) == int and (type(i) in [list, tuple]): + return min(map(lambda i_new: nearest(lists, i_new, j), i)) diff --git a/tests/unit/computations/test_slink.py b/tests/unit/computations/test_slink.py index 166eff9..64d123c 100644 --- a/tests/unit/computations/test_slink.py +++ b/tests/unit/computations/test_slink.py @@ -172,3 +172,15 @@ class TestSlink(TestCase): 4,4,0]]: with self.subTest(lst=lst): self.assertEqual(nearest(lst, i, j), expected) + + def test_given_a_list_or_tuple_of_members_distances_and_a_coordinate_find_closest_member_to_member_at_coordinate(self): + for md, ml, mc, ed in [ + [[[0,9,3,6,11],[9,0,7,5,10],[3,7,0,9,2],[6,5,9,0,8],[11,10,2,8,0]],[0,1,2,3,4],3,0], + [[[0,9,3,6,11],[9,0,7,5,10],[3,7,0,9,2],[6,5,9,0,8],[11,10,2,8,0]],[0,1,2,4],3,5], + [[[0,9,3,6,11],[9,0,7,5,10],[3,7,0,9,2],[6,5,9,0,8],[11,10,2,8,0]],[0,2,4],3,6], + [[[0,9,3,6,11],[9,0,7,5,10],[3,7,0,9,2],[6,5,9,0,8],[11,10,2,8,0]],[2,4],3,8]]: + with self.subTest( + members_distances=md, members_list=ml, member_coordinate=mc, + expected_distance=ed): + self.assertEqual(nearest(md, ml, mc), ed) + self.assertEqual(nearest(md, mc, ml), ed) -- cgit v1.2.3