from collections import defaultdict,Counter from itertools import combinations def run(load,read,check): r=load('C286_DATA.json')['target_register'];ix=defaultdict(list) for i,z in enumerate(r):ix[z['center']].append(i) reach={(p['input'],p['output']) for p in load('C451_DATA.json')['reachable_pairs']};pairs=[];labels=[] for x,y in combinations(sorted(ix),2): if (y-x)%529:continue row={'lower':x,'upper':y,'K_multiple':(y-x)//529,'lower_indices':ix[x],'upper_indices':ix[y],'forward_reachable':(x,y) in reach,'reverse_reachable':(y,x) in reach};pairs.append(row) for i in ix[x]: for j in ix[y]:labels.append({'lower_record':i,'upper_record':j,'K_multiple':row['K_multiple'],'roles':[r[i]['role'],r[j]['role']],'traditions':[r[i]['tradition'],r[j]['tradition']]}) check(f'disconnected_{x}_{y}',not row['forward_reachable'] and not row['reverse_reachable']) counts=Counter(p['K_multiple'] for p in pairs) return {'step':'C454','K_pairs':pairs,'labelled_K_pairs':labels,'counts':{'coordinate_pairs':len(pairs),'label_pairs':len(labels),'by_multiple':dict(sorted(counts.items())),'odd_multiple_pairs':sum(p['K_multiple']%2 for p in pairs),'even_multiple_pairs':sum(p['K_multiple']%2==0 for p in pairs),'reachable_K_pairs':sum(p['forward_reachable'] or p['reverse_reachable'] for p in pairs)}}