from ops import *
import csv
rows=[];inputs={}
for label in ('baseline','source-baseline-r2','candidate'):
    data=json.loads((HERE/label/'analysis.json').read_text());inputs[label]=data
    for s in data['summary']:
        row=dict(trial=label,stage=s['stage'],channels=s['level'],seconds=s['seconds'],
            complete_fps_per_channel=s['complete_mean'],redis_fps_per_channel=s['redis_mean'],
            redis_min_fps=s['redis_min'],redis_std_fps=s['redis_std'],
            completed_queue_expired=s['expired'],expired_per_second=s['expired']/s['seconds'],
            completed_capacity_drop=s['capacity_drop'],cpu_busy_pct=s['cpu_busy_pct'],
            gpu_util_pct=s['gpu_util_mean'],throttled_us=s['throttled_us'])
        for k in ('depay_to_source_exit','source_encoded_queue','decode_between_queues','source_raw_queue',
                  'source_exit_to_ingress','preprocess_start_to_preprocess_output',
                  'preprocess_output_to_infer_entry','preprocess_to_infer_output','copy_wall',
                  'copy_thread_cpu','result_total_wall','result_total_cpu'):
            row[k+'_ms']=s['durations'].get(k,{}).get('mean_ms')
        row.update(triton_queue_ms=s['triton']['queue']['mean_ms'],
                   triton_compute_ms=s['triton']['compute_infer']['mean_ms'])
        rows.append(row)
with (HERE/'comparison.csv').open('w',newline='') as f:
    w=csv.DictWriter(f,fieldnames=list(rows[0]));w.writeheader();w.writerows(rows)
with (HERE/'comparison.json').open('w') as f:
    json.dump(dict(rows=rows,inputs={k:dict(points=v['points'],redis_joined=v['redis_joined'],
         redis_unmatched=v['redis_unmatched'],resets=v['resets']) for k,v in inputs.items()},
         definitions=dict(complete='provider responses delta / monotonic stable seconds / channels',
             redis='successful child delivery count delta / stable seconds / channels',
             duration='duration sum delta / duration count delta; ms',
             expired='completed queue >1s; count not a frame-cohort percentage',
             source_probe='depay sink after jitterbuffer to decoded source bin ghost output before mux',
             native_end='software output probe, not GPU completion timestamp',
             drift='fixed first valid observed sample per run/SSRC/rate, monotonic delta minus unwrapped RTP delta',
             sample_scope='baseline64; source-baseline-r2/candidate8 frames or8KiB status samples; no all-frame percentile'),
         conditions=dict(pose_scenarios=['intrusion','loitering','fall','fight'],artifact=True,training=True,
           queue_age_seconds=1,queue_capacity=32,model_batch=8,instances=8,target_fps=10,
           freshness=False,linear=True,no_capture=False,latest_test_persistent_default=True,
           historical_images=['input-lag-f33f635e1e'],same_image_comparison=['source-baseline-r2','candidate'],
           current_image='input-lag-f12524504a',identical_video_frames=False)),f,indent=2)
print(json.dumps(rows))
