from collections import defaultdict,deque,Counter def run(load,read,check): r=load('C286_DATA.json')['target_register'];X=sorted({z['center'] for z in r});adj={x:[] for x in X};arrows=[] for e in load('C446_DATA.json')['edges']: for x,y in {(e['lower'],e['upper']),(e['upper'],e['lower'])}: arrows.append({'input':x,'output':y,'operator':'R','anchor':e['center']}) for e in load('PREVIOUS_DATA.json')['arrows']:arrows.append({'input':e['input'],'output':e['output'],'operator':'E','anchor':e['pivot']}) arrows=sorted(arrows,key=lambda a:(a['input'],a['output'],a['operator'],a['anchor'])) for a in arrows:adj[a['input']].append(a);check('parity_'+str(a),a['input']%2==a['output']%2) reach={};paths=[];hits=[] for x in X: seen={x:[]};q=deque([x]) while q: y=q.popleft() for a in adj[y]: z=a['output'] if z not in seen:seen[z]=seen[y]+[a];q.append(z) reach[x]=set(seen) for y,p in sorted(seen.items()): if x==y:continue row={'input':x,'output':y,'signed_gap':y-x,'length':len(p),'path':p};paths.append(row) if (y-x)%529==0:hits.append(row) remaining=set(X);scc=[] while remaining: x=min(remaining);cc=sorted(y for y in reach[x] if x in reach[y]);remaining-=set(cc);scc.append(cc) old={(p['input'],p['output']) for p in load('C446_DATA.json')['shortest_witnesses']};old|={(y,x) for x,y in list(old)} new=[p for p in paths if (p['input'],p['output']) not in old] return {'step':'C451','arrows':arrows,'reachable_pairs':paths,'new_reachable_pairs':new,'strong_components':scc,'K_hits':hits,'counts':{'operator_arrows':len(arrows),'reachable_directed_distinct_pairs':len(paths),'new_reachable_pairs':len(new),'strong_components':len(scc),'max_strong_component':max(map(len,scc)),'max_shortest_length':max(p['length'] for p in paths),'K_hits':len(hits),'SCC_size_distribution':dict(sorted(Counter(map(len,scc)).items()))}}