@@ -59,40 +59,45 @@ def find_matches(
5959 ... {1: [4, 3, 2, 1], 2: [1, 2, 3, 4], 3: [2, 3, 4, 1], 4: [3, 4, 1, 2]})
6060 {1: 2, 2: 3, 3: 4, 4: 1}
6161 >>> gs.find_matches(
62- ... {1: [2, 3, 4, 5, 6, 1], 2: [2, 4, 5, 6, 1, 3], 3: [4, 5, 6, 1, 2, 3], 4: [5, 6, 1, 2, 3, 4], 5: [2, 1, 6, 3, 4, 5], 6: [1, 2, 3, 4, 5, 6]},
63- ... {1: [6, 1, 2, 3, 4, 5], 2: [1, 2, 3, 4, 5, 6], 3: [2, 3, 4, 5, 6, 1], 4: [3, 4, 5, 6, 1, 2], 5: [4, 5, 6, 1, 2, 3], 6: [5, 6, 1, 2, 3, 4]})
62+ ... {1: [2, 3, 4, 5, 6, 1], 2: [2, 4, 5, 6, 1, 3], 3: [4, 5, 6, 1, 2, 3],
63+ ... 4: [5, 6, 1, 2, 3, 4], 5: [2, 1, 6, 3, 4, 5], 6: [1, 2, 3, 4, 5, 6]},
64+ ... {1: [6, 1, 2, 3, 4, 5], 2: [1, 2, 3, 4, 5, 6], 3: [2, 3, 4, 5, 6, 1],
65+ ... 4: [3, 4, 5, 6, 1, 2], 5: [4, 5, 6, 1, 2, 3], 6: [5, 6, 1, 2, 3, 4]})
6466 {1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 1}
6567 """
6668
67- matches = { key : - 1 for key in proposers_preferences .keys ()}
68-
69+ matches = dict . fromkeys ( proposers_preferences .keys (), - 1 )
70+ tested_matches = dict . fromkeys ( proposers_preferences . keys (), 0 )
6971 free_proposers = list (proposers_preferences .keys ())
70- tested_matches = {key : 0 for key in proposers_preferences .keys ()}
7172
7273 while free_proposers :
7374 proposer = free_proposers [0 ]
7475
76+ # continue if all options for proposer have been exhausted
7577 if tested_matches [proposer ] == len (proposers_preferences [proposer ]):
7678 free_proposers .remove (proposer )
7779 continue
7880
7981 receiver = proposers_preferences [proposer ][tested_matches [proposer ]]
8082 tested_matches [proposer ] += 1
8183
84+ # set receiver as match if not previously matched
8285 if receiver not in matches .values ():
8386 matches [proposer ] = receiver
8487 free_proposers .remove (proposer )
8588 continue
8689 cur_proposer = next (
8790 prop for prop , rec in matches .items () if rec == receiver
8891 )
92+
93+ # give receiver new proposer match only if it preferes new over old
8994 if receivers_preferences [receiver ].index (proposer ) < receivers_preferences [
9095 receiver
9196 ].index (cur_proposer ):
92- matches [cur_proposer ] = - 1
93- matches [proposer ] = receiver
9497 free_proposers .remove (proposer )
9598 free_proposers .append (cur_proposer )
99+ matches [cur_proposer ] = - 1
100+ matches [proposer ] = receiver
96101
97102 return matches
98103
0 commit comments