@@ -237,48 +237,37 @@ def norm_name(uid, tree_num):
237237 if not reassignments :
238238 return ops
239239
240- # Apply reassignments
241- new_match_pairs = set ()
242- demoted1 = set ()
243- demoted2 = set ()
244- promoted1 = set ()
245- promoted2 = set ()
246-
240+ # Apply reassignments: build substitution maps
241+ swap_i = {} # orig_i -> new_i
242+ swap_j = {} # orig_j -> new_j
247243 for orig_i , orig_j , new_i , new_j in reassignments :
248- new_match_pairs .add ((new_i , new_j ))
249244 if new_i != orig_i :
250- demoted1 .add (orig_i )
251- promoted1 .add (new_i )
245+ swap_i [orig_i ] = new_i
252246 if new_j != orig_j :
253- demoted2 .add (orig_j )
254- promoted2 .add (new_j )
247+ swap_j [orig_j ] = new_j
248+ promoted1 = set (swap_i .values ())
249+ promoted2 = set (swap_j .values ())
255250
256251 final_ops = []
257- emitted_matches = set ()
258252 for op , i , j in ops :
259253 if op == "match" :
260- i_demoted = i in demoted1
261- j_demoted = j in demoted2
262- if i_demoted and j_demoted :
263- final_ops .append (("delete" , i , None ))
264- final_ops .append (("insert" , None , j ))
265- elif i_demoted :
266- final_ops .append (("delete" , i , None ))
267- elif j_demoted :
268- final_ops .append (("insert" , None , j ))
254+ ni = swap_i .get (i , i )
255+ nj = swap_j .get (j , j )
256+ if ni != i or nj != j :
257+ if ni == i :
258+ final_ops .append (("insert" , None , j ))
259+ elif nj == j :
260+ final_ops .append (("delete" , i , None ))
261+ else :
262+ final_ops .append (("delete" , i , None ))
263+ final_ops .append (("insert" , None , j ))
264+ final_ops .append (("match" , ni , nj ))
269265 else :
270266 final_ops .append (("match" , i , j ))
271- emitted_matches .add ((i , j ))
272- elif op == "delete" :
273- if i not in promoted1 :
274- final_ops .append (("delete" , i , None ))
275- elif op == "insert" :
276- if j not in promoted2 :
277- final_ops .append (("insert" , None , j ))
278-
279- for new_i , new_j in new_match_pairs :
280- if (new_i , new_j ) not in emitted_matches :
281- final_ops .append (("match" , new_i , new_j ))
267+ elif op == "delete" and i not in promoted1 :
268+ final_ops .append (("delete" , i , None ))
269+ elif op == "insert" and j not in promoted2 :
270+ final_ops .append (("insert" , None , j ))
282271
283272 return final_ops
284273
0 commit comments