from ops import *
import statistics
a=json.loads(Path('/tmp/codex/ltb1021/2026-09-26_pose-reference_r01/summary-v2.json').read_text())
a=next(x for x in a if x['level']==16)
b=json.loads((HERE/'summary-v2.json').read_text())[0]
old=json.loads(Path('/tmp/codex/ltb1021/2026-09-26_pose-reference_r01/pose/conditions.json').read_text())
new=json.loads((HERE/'pose/conditions.json').read_text())
fields=('source_sha256','source_options_sha256','fps','scenarios','pose','display_score','display_categories')
old={r['camera']:r for r in old['conditions']};new={r['camera']:r for r in new['conditions']}
differences={c:[f for f in fields if old[c][f]!=v[f]] for c,v in new.items()}
rows=[]
for name,s in [('A',a),('B',b)]:
    p=s['providers']['pose'];m=s['models']['RFDETRKeypointPreview']
    rows.append(dict(path=name,mean_fps=p['per_channel_accepted_mean'],min_fps=p['per_channel_accepted_min'],
        max_fps=p['per_channel_accepted_max'],completed_fps=p['completed_fps'],accepted_fps=p['accepted_fps'],
        sent_fps=p['sent_fps'],late_pct=p['rejected_pct'],cpu_cores=s['container_mean_cores'],
        runnable_thread_s=sum(x['runnable_wait_thread_s'] for x in s['cpu'].values()),host_busy=s['host_cpu_busy_pct'],
        gpu_util=s['gpu_util_mean'],gpu_memory=s['gpu_memory_peak_mib'],ram=s['ram_peak_mib'],
        queue_ms=m['stats']['queue']['mean_ms'],compute_ms=m['stats']['compute_infer']['mean_ms'],
        mean_batch=m['mean_batch'],batch_executions=m['batch_executions'],
        durations={k:dict(mean_ms=v['mean_ms'],p95_bucket_upper_ms=v['p95_bucket_upper_ms']) for k,v in p['durations'].items()}))
stage=json.loads((HERE/'pose/stage-16.json').read_text());first,last=stage['samples'][0],stage['samples'][-1]
extra=[]
for c,bc in last['channels'].items():
    ac=first['channels'][c];ap=ac['providers']['pose']['metadata_path'];bp=bc['providers']['pose']['metadata_path']
    assert bp['execution_path']=='provider-linear-trial' and not bp['freshness_enabled']
    before=ap['provider_timing']['pose']['selected_to_response'];after=bp['provider_timing']['pose']['selected_to_response']
    count=after['count']-before['count']
    extra.append(dict(camera=c,over100_count=after['over_100ms']-before['over_100ms'],responses=count,
        age_mean_ms=(after['sum_ms']-before['sum_ms'])/count,
        queue_drop=bp.get('completed_queue_drop',0)-ap.get('completed_queue_drop',0),
        queue_expired=bp.get('completed_queue_expired',0)-ap.get('completed_queue_expired',0),
        finalized=bp['finalized']-ap['finalized'],
        queue_depth_peak=max(x['channels'][c]['providers']['pose']['metadata_path']['queued'] for x in stage['samples']),
        requested_minus_responses_peak=max(x['channels'][c]['providers']['pose']['metadata_path']['providers']['pose'].get('requests',0)-x['channels'][c]['providers']['pose']['metadata_path']['providers']['pose']['responses'] for x in stage['samples'])))
save('comparison.json',dict(rows=rows,condition_differences=differences,b_lanes=extra,
    limitation='Historical A, not simultaneous identical video Frames; B sender detailed timing additionally enabled'))
print(json.dumps(dict(rows=rows,condition_differences=differences,queue_dropped=sum(x['queue_drop']+x['queue_expired'] for x in extra)),indent=2))
