b1k_model / evaluation /behavior_analysis /plot_behavior.py
davidwdw's picture
Upload B1K model checkpoints, training recipes, and evaluation artifacts (part 4)
4a2a6e4 verified
Raw History Blame Contribute Delete
2.22 kB
from pathlib import Path
import json
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from matplotlib.lines import Line2D
ROOT=Path(__file__).resolve().parent
rows=json.loads((ROOT/'per_instance.json').read_text())
transitions=json.loads((ROOT/'transitions.json').read_text())
variants=['human','codegen_success','mix_h50_c50']
labels=['Human','Codegen','Mix 50:50']
colors=['#177c76','#ce5835','#6956a7']
fig,axes=plt.subplots(3,3,figsize=(14,8),sharex=True,sharey=True)
for col,instance in enumerate([303,304,312]):
for row,(v,label,color) in enumerate(zip(variants,labels,colors)):
ax=axes[row,col]
r=next(r for r in rows if r['variant']==v and r['instance_id']==instance)
tr=transitions[f'{v}/{instance}']
x=[0]+[c['step'] for c in tr]+[r['steps']]
y=[0]+[c['after'] for c in tr]+[tr[-1]['after'] if tr else 0]
ax.step(x,y,where='post',color=color,lw=1.5)
resets=[c for c in tr if c['kind']=='Stage corrected']
ax.scatter([c['step'] for c in resets],[c['after'] for c in resets],color='#be2432',s=17,zorder=5)
ax.scatter([r['steps']],[y[-1]],marker='o' if r['success'] else 'x',s=55,color=color,zorder=6)
outcome='SUCCESS' if r['success'] else 'TIMEOUT'
ax.text(.03,.96,f"{label}: {outcome}\n4→2 resets: {r['stage4_resets']} | action overrides: {r['action_modified']}",transform=ax.transAxes,va='top',fontsize=9,bbox=dict(facecolor='white',alpha=.9,edgecolor='none'))
ax.set_ylim(-.2,5.6);ax.set_yticks(range(5));ax.set_xlim(0,3330)
ax.grid(alpha=.16)
if row==0:ax.set_title(f'Instance {instance}',weight='bold')
if col==0:ax.set_ylabel('Wrapper stage')
if row==2:ax.set_xlabel('Simulator steps')
fig.suptitle('Task 00: stage cycling and action intervention in recorded runs',fontsize=15,weight='bold')
fig.text(.5,.025,'Red dots: heuristic stage reset 4→2. Curves reconstructed from every logged stage transition.\nAction overrides replace the predicted chunk with current state and opened gripper(s).',ha='center',fontsize=10)
fig.tight_layout(rect=[0,.08,1,.95])
fig.savefig(ROOT/'stage_timelines.png',dpi=170)
fig.savefig(ROOT/'stage_timelines.pdf')