lsnu commited on
Commit
1973904
·
verified ·
1 Parent(s): 5611258

Add PickClutter smoke_v5 benchmark GIF renders

Browse files

Upload the full smoke_v5_eval_tuned_softerpref dense-occlusion GIF rerender bundle, manifest/index, renderer script, and top-level docs updates.

This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +100 -0
  2. MODEL_AND_ARTIFACT_INDEX.md +6 -0
  3. PUBLIC_BENCHMARK_RESULTS.md +4 -0
  4. README.md +34 -0
  5. code/VLAarchtests2_code/VLAarchtests/code/reveal_vla_bimanual/eval/render_maniskill_pickclutter_benchmark_gifs.py +835 -0
  6. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/INDEX.md +59 -0
  7. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172000.gif +3 -0
  8. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172001.gif +3 -0
  9. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172002.gif +3 -0
  10. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172003.gif +3 -0
  11. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172004.gif +3 -0
  12. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172005.gif +3 -0
  13. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172006.gif +3 -0
  14. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172007.gif +3 -0
  15. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172008.gif +3 -0
  16. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172009.gif +3 -0
  17. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172010.gif +3 -0
  18. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172011.gif +3 -0
  19. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172012.gif +3 -0
  20. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172013.gif +3 -0
  21. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172014.gif +3 -0
  22. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172015.gif +3 -0
  23. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172016.gif +3 -0
  24. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172017.gif +3 -0
  25. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172018.gif +3 -0
  26. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172019.gif +3 -0
  27. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172020.gif +3 -0
  28. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172021.gif +3 -0
  29. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172022.gif +3 -0
  30. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172023.gif +3 -0
  31. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172024.gif +3 -0
  32. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172025.gif +3 -0
  33. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172026.gif +3 -0
  34. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172027.gif +3 -0
  35. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172028.gif +3 -0
  36. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172029.gif +3 -0
  37. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172030.gif +3 -0
  38. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172031.gif +3 -0
  39. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172032.gif +3 -0
  40. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172033.gif +3 -0
  41. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172034.gif +3 -0
  42. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172035.gif +3 -0
  43. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172036.gif +3 -0
  44. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172037.gif +3 -0
  45. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172038.gif +3 -0
  46. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172039.gif +3 -0
  47. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172040.gif +3 -0
  48. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172041.gif +3 -0
  49. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172042.gif +3 -0
  50. reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172043.gif +3 -0
.gitattributes CHANGED
@@ -36,3 +36,103 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
36
  code/VLAarchtests2_code/VLAarchtests/code/reveal_vla_bimanual/eval/__pycache__/run_maniskill_pickclutter_smoke.cpython-311.pyc filter=lfs diff=lfs merge=lfs -text
37
  code/VLAarchtests2_code/VLAarchtests/code/reveal_vla_bimanual/eval/__pycache__/run_maniskill_bridge_retrieval_smoke.cpython-311.pyc filter=lfs diff=lfs merge=lfs -text
38
  reports/proxy_rank_only_live/active/reveal_benchmark.json filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
36
  code/VLAarchtests2_code/VLAarchtests/code/reveal_vla_bimanual/eval/__pycache__/run_maniskill_pickclutter_smoke.cpython-311.pyc filter=lfs diff=lfs merge=lfs -text
37
  code/VLAarchtests2_code/VLAarchtests/code/reveal_vla_bimanual/eval/__pycache__/run_maniskill_bridge_retrieval_smoke.cpython-311.pyc filter=lfs diff=lfs merge=lfs -text
38
  reports/proxy_rank_only_live/active/reveal_benchmark.json filter=lfs diff=lfs merge=lfs -text
39
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172000.gif filter=lfs diff=lfs merge=lfs -text
40
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172001.gif filter=lfs diff=lfs merge=lfs -text
41
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172002.gif filter=lfs diff=lfs merge=lfs -text
42
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172003.gif filter=lfs diff=lfs merge=lfs -text
43
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172004.gif filter=lfs diff=lfs merge=lfs -text
44
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172005.gif filter=lfs diff=lfs merge=lfs -text
45
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172006.gif filter=lfs diff=lfs merge=lfs -text
46
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172007.gif filter=lfs diff=lfs merge=lfs -text
47
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172008.gif filter=lfs diff=lfs merge=lfs -text
48
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172009.gif filter=lfs diff=lfs merge=lfs -text
49
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172010.gif filter=lfs diff=lfs merge=lfs -text
50
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172011.gif filter=lfs diff=lfs merge=lfs -text
51
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172012.gif filter=lfs diff=lfs merge=lfs -text
52
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172013.gif filter=lfs diff=lfs merge=lfs -text
53
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172014.gif filter=lfs diff=lfs merge=lfs -text
54
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172015.gif filter=lfs diff=lfs merge=lfs -text
55
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172016.gif filter=lfs diff=lfs merge=lfs -text
56
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172017.gif filter=lfs diff=lfs merge=lfs -text
57
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172018.gif filter=lfs diff=lfs merge=lfs -text
58
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172019.gif filter=lfs diff=lfs merge=lfs -text
59
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172020.gif filter=lfs diff=lfs merge=lfs -text
60
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172021.gif filter=lfs diff=lfs merge=lfs -text
61
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172022.gif filter=lfs diff=lfs merge=lfs -text
62
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172023.gif filter=lfs diff=lfs merge=lfs -text
63
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172024.gif filter=lfs diff=lfs merge=lfs -text
64
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172025.gif filter=lfs diff=lfs merge=lfs -text
65
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172026.gif filter=lfs diff=lfs merge=lfs -text
66
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172027.gif filter=lfs diff=lfs merge=lfs -text
67
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172028.gif filter=lfs diff=lfs merge=lfs -text
68
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172029.gif filter=lfs diff=lfs merge=lfs -text
69
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172030.gif filter=lfs diff=lfs merge=lfs -text
70
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172031.gif filter=lfs diff=lfs merge=lfs -text
71
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172032.gif filter=lfs diff=lfs merge=lfs -text
72
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172033.gif filter=lfs diff=lfs merge=lfs -text
73
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172034.gif filter=lfs diff=lfs merge=lfs -text
74
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172035.gif filter=lfs diff=lfs merge=lfs -text
75
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172036.gif filter=lfs diff=lfs merge=lfs -text
76
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172037.gif filter=lfs diff=lfs merge=lfs -text
77
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172038.gif filter=lfs diff=lfs merge=lfs -text
78
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172039.gif filter=lfs diff=lfs merge=lfs -text
79
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172040.gif filter=lfs diff=lfs merge=lfs -text
80
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172041.gif filter=lfs diff=lfs merge=lfs -text
81
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172042.gif filter=lfs diff=lfs merge=lfs -text
82
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172043.gif filter=lfs diff=lfs merge=lfs -text
83
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172044.gif filter=lfs diff=lfs merge=lfs -text
84
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172045.gif filter=lfs diff=lfs merge=lfs -text
85
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172046.gif filter=lfs diff=lfs merge=lfs -text
86
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172047.gif filter=lfs diff=lfs merge=lfs -text
87
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172048.gif filter=lfs diff=lfs merge=lfs -text
88
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172049.gif filter=lfs diff=lfs merge=lfs -text
89
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172000.gif filter=lfs diff=lfs merge=lfs -text
90
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172001.gif filter=lfs diff=lfs merge=lfs -text
91
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172002.gif filter=lfs diff=lfs merge=lfs -text
92
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172003.gif filter=lfs diff=lfs merge=lfs -text
93
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172004.gif filter=lfs diff=lfs merge=lfs -text
94
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172005.gif filter=lfs diff=lfs merge=lfs -text
95
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172006.gif filter=lfs diff=lfs merge=lfs -text
96
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172007.gif filter=lfs diff=lfs merge=lfs -text
97
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172008.gif filter=lfs diff=lfs merge=lfs -text
98
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172009.gif filter=lfs diff=lfs merge=lfs -text
99
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172010.gif filter=lfs diff=lfs merge=lfs -text
100
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172011.gif filter=lfs diff=lfs merge=lfs -text
101
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172012.gif filter=lfs diff=lfs merge=lfs -text
102
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172013.gif filter=lfs diff=lfs merge=lfs -text
103
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172014.gif filter=lfs diff=lfs merge=lfs -text
104
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172015.gif filter=lfs diff=lfs merge=lfs -text
105
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172016.gif filter=lfs diff=lfs merge=lfs -text
106
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172017.gif filter=lfs diff=lfs merge=lfs -text
107
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172018.gif filter=lfs diff=lfs merge=lfs -text
108
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172019.gif filter=lfs diff=lfs merge=lfs -text
109
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172020.gif filter=lfs diff=lfs merge=lfs -text
110
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172021.gif filter=lfs diff=lfs merge=lfs -text
111
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172022.gif filter=lfs diff=lfs merge=lfs -text
112
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172023.gif filter=lfs diff=lfs merge=lfs -text
113
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172024.gif filter=lfs diff=lfs merge=lfs -text
114
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172025.gif filter=lfs diff=lfs merge=lfs -text
115
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172026.gif filter=lfs diff=lfs merge=lfs -text
116
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172027.gif filter=lfs diff=lfs merge=lfs -text
117
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172028.gif filter=lfs diff=lfs merge=lfs -text
118
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172029.gif filter=lfs diff=lfs merge=lfs -text
119
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172030.gif filter=lfs diff=lfs merge=lfs -text
120
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172031.gif filter=lfs diff=lfs merge=lfs -text
121
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172032.gif filter=lfs diff=lfs merge=lfs -text
122
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172033.gif filter=lfs diff=lfs merge=lfs -text
123
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172034.gif filter=lfs diff=lfs merge=lfs -text
124
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172035.gif filter=lfs diff=lfs merge=lfs -text
125
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172036.gif filter=lfs diff=lfs merge=lfs -text
126
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172037.gif filter=lfs diff=lfs merge=lfs -text
127
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172038.gif filter=lfs diff=lfs merge=lfs -text
128
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172039.gif filter=lfs diff=lfs merge=lfs -text
129
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172040.gif filter=lfs diff=lfs merge=lfs -text
130
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172041.gif filter=lfs diff=lfs merge=lfs -text
131
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172042.gif filter=lfs diff=lfs merge=lfs -text
132
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172043.gif filter=lfs diff=lfs merge=lfs -text
133
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172044.gif filter=lfs diff=lfs merge=lfs -text
134
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172045.gif filter=lfs diff=lfs merge=lfs -text
135
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172046.gif filter=lfs diff=lfs merge=lfs -text
136
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172047.gif filter=lfs diff=lfs merge=lfs -text
137
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172048.gif filter=lfs diff=lfs merge=lfs -text
138
+ reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/trunk_only_ft/seed_172049.gif filter=lfs diff=lfs merge=lfs -text
MODEL_AND_ARTIFACT_INDEX.md CHANGED
@@ -16,6 +16,8 @@
16
 
17
  - `reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref/`
18
  - strongest current dense-occlusion result
 
 
19
  - `reports/maniskill_bag_bridge_eval_less_bonus_seed17/`
20
  - `reports/maniskill_bag_bridge_eval_less_bonus_seed23/`
21
  - `reports/maniskill_bag_bridge_eval_less_bonus_2seed_manual_summary.json`
@@ -40,6 +42,10 @@
40
  - `docs/public_bridge_smoke_run_log_2026-04-01.md`
41
  - `docs/minimum_sign_of_life_maniskill_pickclutter_run_2026-04-01.md`
42
 
 
 
 
 
43
  ## Repo History
44
 
45
  - `history/VLAarchtests_previous_README.md`
 
16
 
17
  - `reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref/`
18
  - strongest current dense-occlusion result
19
+ - `reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/`
20
+ - side-by-side visual rerender of the final dense-occlusion held-out benchmark
21
  - `reports/maniskill_bag_bridge_eval_less_bonus_seed17/`
22
  - `reports/maniskill_bag_bridge_eval_less_bonus_seed23/`
23
  - `reports/maniskill_bag_bridge_eval_less_bonus_2seed_manual_summary.json`
 
42
  - `docs/public_bridge_smoke_run_log_2026-04-01.md`
43
  - `docs/minimum_sign_of_life_maniskill_pickclutter_run_2026-04-01.md`
44
 
45
+ ## Main Current Render Code
46
+
47
+ - `code/VLAarchtests2_code/VLAarchtests/code/reveal_vla_bimanual/eval/render_maniskill_pickclutter_benchmark_gifs.py`
48
+
49
  ## Repo History
50
 
51
  - `history/VLAarchtests_previous_README.md`
PUBLIC_BENCHMARK_RESULTS.md CHANGED
@@ -53,6 +53,10 @@ Benchmark:
53
  - `95% CI = [0.44, 0.72]`
54
  - `intervention_rate = 1.0`
55
  - `non_base_selection_rate = 1.0`
 
 
 
 
56
 
57
  ### Exact `smoke_v5` eval tuning carried to held-out
58
 
 
53
  - `95% CI = [0.44, 0.72]`
54
  - `intervention_rate = 1.0`
55
  - `non_base_selection_rate = 1.0`
56
+ - `reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/`
57
+ - full rerender of all `50` held-out seeds for `trunk_only_ft` and `adapter_active_ft`
58
+ - includes `index.html`, `INDEX.md`, and `manifest.json`
59
+ - rerender manifest reports `0` success mismatches against the saved benchmark json files
60
 
61
  ### Exact `smoke_v5` eval tuning carried to held-out
62
 
README.md CHANGED
@@ -33,6 +33,7 @@ The main new addition in this repo is the public benchmark track work for the el
33
  - ManiSkill bridge cloth retrieval proxy as the folded-cloth retrieval proxy
34
  - the public benchmark package code and summaries
35
  - the train/eval logs, checkpoints, cached datasets, validation sweeps, and correction logs for those runs
 
36
  - the same-machine environment snapshot for the public benchmark stack used on this RunPod
37
 
38
  ## Top-Level Contents
@@ -60,6 +61,24 @@ The main new addition in this repo is the public benchmark track work for the el
60
  - `MODEL_AND_ARTIFACT_INDEX.md`
61
  - practical map of the main artifact roots to start from
62
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
63
  ## Architecture State Carried Forward
64
 
65
  The core model family inherited from `VLAarchtests3` is still:
@@ -218,6 +237,21 @@ The big changes across `smoke_v2`, `smoke_v3`, `smoke_v4`, and `smoke_v5` were:
218
 
219
  The big occlusion win was not caused by changing the eval episodes.
220
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
221
  ## Crucial Caveats
222
 
223
  ### Occlusion result was planner-tuned
 
33
  - ManiSkill bridge cloth retrieval proxy as the folded-cloth retrieval proxy
34
  - the public benchmark package code and summaries
35
  - the train/eval logs, checkpoints, cached datasets, validation sweeps, and correction logs for those runs
36
+ - full visual rerenders of the final `smoke_v5_eval_tuned_softerpref` dense-occlusion benchmark for both `trunk_only_ft` and `adapter_active_ft`
37
  - the same-machine environment snapshot for the public benchmark stack used on this RunPod
38
 
39
  ## Top-Level Contents
 
61
  - `MODEL_AND_ARTIFACT_INDEX.md`
62
  - practical map of the main artifact roots to start from
63
 
64
+ ## Benchmark GIF Renders
65
+
66
+ The repo now also includes a full rendered replay of the final dense-occlusion benchmark:
67
+
68
+ - `reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/`
69
+ - `50` held-out `trunk_only_ft` gifs
70
+ - `50` held-out `adapter_active_ft` gifs
71
+ - `index.html`, `INDEX.md`, and `manifest.json` for browsing and validation
72
+ - renderer:
73
+ - `code/VLAarchtests2_code/VLAarchtests/code/reveal_vla_bimanual/eval/render_maniskill_pickclutter_benchmark_gifs.py`
74
+
75
+ Important caveats:
76
+
77
+ - these gifs are rerendered from the saved `smoke_v5_eval_tuned_softerpref` checkpoints and exact held-out seeds, not a different benchmark run
78
+ - the rerender kept the same `softer_pref` planner override used in the reported held-out result
79
+ - the rerender manifest records `0` success mismatches versus the saved benchmark json files
80
+ - only the dense-occlusion track has this full gif export right now
81
+
82
  ## Architecture State Carried Forward
83
 
84
  The core model family inherited from `VLAarchtests3` is still:
 
237
 
238
  The big occlusion win was not caused by changing the eval episodes.
239
 
240
+ ### Dense-Occlusion Render Artifacts
241
+
242
+ The final dense-occlusion run also has a full visual export in:
243
+
244
+ - `reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/`
245
+
246
+ Those gifs show the robot interacting with the 3D scene and overlay the adaptor state per frame. For `adapter_active_ft`, the overlay includes:
247
+
248
+ - adaptor on/off state
249
+ - whether a non-base proposal was selected
250
+ - candidate index
251
+ - planner name
252
+ - planner score/confidence
253
+ - state signals such as visibility, access, gap, and damage
254
+
255
  ## Crucial Caveats
256
 
257
  ### Occlusion result was planner-tuned
code/VLAarchtests2_code/VLAarchtests/code/reveal_vla_bimanual/eval/render_maniskill_pickclutter_benchmark_gifs.py ADDED
@@ -0,0 +1,835 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from __future__ import annotations
2
+
3
+ import argparse
4
+ import html
5
+ import json
6
+ from collections import deque
7
+ from pathlib import Path
8
+ from typing import Any, Callable, Sequence
9
+
10
+ import imageio.v2 as imageio
11
+ import numpy as np
12
+ from PIL import Image, ImageDraw, ImageFont
13
+
14
+ from eval import run_maniskill_pickclutter_smoke as smoke
15
+
16
+
17
+ WORKSPACE_ROOT = Path("/workspace/workspace")
18
+ DEFAULT_REPORT_DIR = WORKSPACE_ROOT / "reports" / "maniskill_pickclutter_smoke_v5_eval_tuned_softerpref"
19
+ DEFAULT_OUTPUT_DIR = WORKSPACE_ROOT / "reports" / "maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs"
20
+ DEFAULT_CHECKPOINT_ROOT = WORKSPACE_ROOT / "outputs" / "maniskill_pickclutter_smoke_v5"
21
+ DEFAULT_TRUNK_CHECKPOINT = DEFAULT_CHECKPOINT_ROOT / "trunk_only_ft_seed17" / "checkpoint_best.pt"
22
+ DEFAULT_ADAPTER_CHECKPOINT = DEFAULT_CHECKPOINT_ROOT / "adapter_active_ft_seed17" / "checkpoint_best.pt"
23
+ DEFAULT_SPLIT_PATH = WORKSPACE_ROOT / "data" / "maniskill_pickclutter" / "smoke_v3" / "episode_splits.json"
24
+ DEFAULT_RENDER_EPISODES = 50
25
+ SOFTER_PREF_OVERRIDES = {
26
+ "mode_preference_bonus": 0.75,
27
+ "premature_retrieve_penalty": 0.5,
28
+ "premature_insert_penalty": 0.25,
29
+ "premature_maintain_penalty": 1.0,
30
+ "occlusion_maintain_gap_min_access": 0.30,
31
+ "occlusion_maintain_gap_min_visibility": 0.20,
32
+ "retrieve_stage_access_threshold": 0.18,
33
+ "retrieve_stage_reveal_threshold": 0.18,
34
+ "retrieve_stage_support_threshold": 0.18,
35
+ }
36
+
37
+
38
+ def _load_font(size: int) -> ImageFont.ImageFont:
39
+ for candidate in (
40
+ "/usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf",
41
+ "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf",
42
+ ):
43
+ path = Path(candidate)
44
+ if path.exists():
45
+ try:
46
+ return ImageFont.truetype(str(path), size=size)
47
+ except OSError:
48
+ continue
49
+ return ImageFont.load_default()
50
+
51
+
52
+ FONT = _load_font(16)
53
+ SMALL_FONT = _load_font(14)
54
+
55
+
56
+ def _parse_args() -> argparse.Namespace:
57
+ parser = argparse.ArgumentParser(description="Render the fixed smoke_v5_eval_tuned_softerpref PickClutter benchmark as GIFs.")
58
+ parser.add_argument("--report-dir", type=Path, default=DEFAULT_REPORT_DIR)
59
+ parser.add_argument("--output-dir", type=Path, default=DEFAULT_OUTPUT_DIR)
60
+ parser.add_argument("--split-path", type=Path, default=DEFAULT_SPLIT_PATH)
61
+ parser.add_argument("--trunk-checkpoint", type=Path, default=DEFAULT_TRUNK_CHECKPOINT)
62
+ parser.add_argument("--adapter-checkpoint", type=Path, default=DEFAULT_ADAPTER_CHECKPOINT)
63
+ parser.add_argument("--seed", type=int, default=17, help="Training seed used for the checkpoints.")
64
+ parser.add_argument("--limit", type=int, default=DEFAULT_RENDER_EPISODES)
65
+ parser.add_argument("--start-index", type=int, default=0)
66
+ parser.add_argument("--mode", choices=("both", "trunk_only_ft", "adapter_active_ft"), default="both")
67
+ parser.add_argument("--frame-stride", type=int, default=3, help="Capture every N low-level env steps.")
68
+ parser.add_argument("--fps", type=int, default=8)
69
+ parser.add_argument("--render-size", type=int, default=512)
70
+ parser.add_argument("--initial-hold", type=int, default=6)
71
+ parser.add_argument("--final-hold", type=int, default=10)
72
+ parser.add_argument("--skip-existing", action="store_true")
73
+ return parser.parse_args()
74
+
75
+
76
+ def _load_eval_seeds(split_path: Path, *, start_index: int, limit: int) -> list[int]:
77
+ payload = json.loads(split_path.read_text(encoding="utf-8"))
78
+ seeds = [int(seed) for seed in payload["eval"]]
79
+ return seeds[start_index : start_index + limit]
80
+
81
+
82
+ def _load_expected_records(report_path: Path) -> dict[int, dict[str, Any]]:
83
+ payload = json.loads(report_path.read_text(encoding="utf-8"))
84
+ return {
85
+ int(record["episode_seed"]): record
86
+ for record in payload.get("episode_records", [])
87
+ }
88
+
89
+
90
+ def _float_value(value: Any) -> float | None:
91
+ if value is None:
92
+ return None
93
+ array = smoke._np(value).reshape(-1)
94
+ if array.size == 0:
95
+ return None
96
+ return float(array[0])
97
+
98
+
99
+ def _vector_values(value: Any) -> list[float]:
100
+ return [float(item) for item in smoke._np(value).reshape(-1).tolist()]
101
+
102
+
103
+ def _stringify_mode_list(value: Any) -> list[str]:
104
+ if value is None:
105
+ return []
106
+ if isinstance(value, (list, tuple)):
107
+ if value and isinstance(value[0], (list, tuple)):
108
+ return [str(item) for item in value[0]]
109
+ return [str(item) for item in value]
110
+ return [str(value)]
111
+
112
+
113
+ def _to_render_rgb(frame: Any) -> np.ndarray:
114
+ array = smoke._np(frame)
115
+ if array.ndim == 4:
116
+ array = array[0]
117
+ array = np.asarray(array, dtype=np.uint8)
118
+ if array.shape[-1] == 4:
119
+ array = array[..., :3]
120
+ return array
121
+
122
+
123
+ def _state_line(label: str, value: float | None) -> str:
124
+ if value is None:
125
+ return f"{label}=n/a"
126
+ return f"{label}={value:.2f}"
127
+
128
+
129
+ def _build_overlay_lines(
130
+ *,
131
+ render_mode_name: str,
132
+ episode_seed: int,
133
+ macro_step: int,
134
+ macro_limit: int,
135
+ low_level_step: int,
136
+ selected_mode: str,
137
+ adapter_active: bool,
138
+ non_base: bool,
139
+ selected_index: int | None,
140
+ selected_score: float | None,
141
+ selected_confidence: float | None,
142
+ planning_mode: str | None,
143
+ interaction_state: dict[str, Any],
144
+ env: smoke.PickClutterRevealEnv,
145
+ ) -> list[str]:
146
+ display_name = "adapter_on" if render_mode_name == "adapter_active_ft" else "trunk_only"
147
+ success_now = smoke._success_from_state(env)
148
+ progress = smoke._extraction_progress(env)
149
+ clearance = smoke._clearance_score(env)
150
+ lines = [
151
+ f"{display_name} | seed {episode_seed} | macro {macro_step}/{macro_limit}",
152
+ f"sim {low_level_step} | mode {selected_mode} | ok {'yes' if success_now else 'no'} | prog {progress:.2f} | clr {clearance:.2f}",
153
+ ]
154
+ if render_mode_name == "trunk_only_ft":
155
+ lines.append("policy trunk_only | adaptor off")
156
+ return lines
157
+ state_conf = _float_value(interaction_state.get("state_confidence"))
158
+ visibility = _float_value(interaction_state.get("target_visibility_confidence"))
159
+ access = _float_value(interaction_state.get("actor_feasibility_score"))
160
+ gap_width = _float_value(interaction_state.get("gap_width"))
161
+ damage = _float_value(interaction_state.get("damage_proxy"))
162
+ lines.append(
163
+ f"adaptor {'on' if adapter_active else 'pass'} | non_base {'yes' if non_base else 'no'}"
164
+ f" | cand {selected_index if selected_index is not None else 'n/a'}"
165
+ )
166
+ lines.append(
167
+ f"planner {planning_mode or 'n/a'}"
168
+ + " | "
169
+ + (f"score {selected_score:.2f}" if selected_score is not None else "score n/a")
170
+ + " | "
171
+ + (f"conf {selected_confidence:.2f}" if selected_confidence is not None else "conf n/a")
172
+ )
173
+ lines.append(" | ".join([_state_line("state", state_conf), _state_line("vis", visibility), _state_line("access", access)]))
174
+ lines.append(
175
+ " | ".join(
176
+ [
177
+ _state_line("gap", gap_width),
178
+ _state_line("dmg", damage),
179
+ ]
180
+ )
181
+ )
182
+ return lines
183
+
184
+
185
+ def _annotate_frame(frame: np.ndarray, lines: Sequence[str], *, render_size: int) -> np.ndarray:
186
+ image = Image.fromarray(frame)
187
+ if image.size != (render_size, render_size):
188
+ image = image.resize((render_size, render_size), resample=Image.Resampling.BILINEAR)
189
+ overlay_height = 148
190
+ canvas = Image.new("RGB", (render_size, render_size + overlay_height), color=(0, 0, 0))
191
+ canvas.paste(image, (0, 0))
192
+ draw = ImageDraw.Draw(canvas, "RGBA")
193
+ draw.rectangle((0, render_size, render_size, render_size + overlay_height), fill=(0, 0, 0, 220))
194
+ y = render_size + 10
195
+ for index, line in enumerate(lines):
196
+ font = FONT if index < 2 else SMALL_FONT
197
+ draw.text((12, y), line, font=font, fill=(245, 245, 245, 255))
198
+ y += 22 if index < 2 else 20
199
+ return np.asarray(canvas, dtype=np.uint8)
200
+
201
+
202
+ class FrameRecorder:
203
+ def __init__(
204
+ self,
205
+ *,
206
+ render_mode_name: str,
207
+ output_path: Path,
208
+ render_size: int,
209
+ frame_stride: int,
210
+ fps: int,
211
+ initial_hold: int,
212
+ final_hold: int,
213
+ ) -> None:
214
+ self.render_mode_name = render_mode_name
215
+ self.output_path = output_path
216
+ self.render_size = int(render_size)
217
+ self.frame_stride = max(1, int(frame_stride))
218
+ self.fps = max(1, int(fps))
219
+ self.initial_hold = max(1, int(initial_hold))
220
+ self.final_hold = max(1, int(final_hold))
221
+ self.frames: list[np.ndarray] = []
222
+ self.low_level_step = 0
223
+
224
+ def capture(
225
+ self,
226
+ env: smoke.PickClutterRevealEnv,
227
+ *,
228
+ overlay_lines: Sequence[str],
229
+ force: bool = False,
230
+ hold: int = 1,
231
+ ) -> None:
232
+ if not force and (self.low_level_step % self.frame_stride) != 0:
233
+ self.low_level_step += 1
234
+ return
235
+ frame = _to_render_rgb(env.render())
236
+ annotated = _annotate_frame(frame, overlay_lines, render_size=self.render_size)
237
+ repeat = max(1, int(hold))
238
+ for _ in range(repeat):
239
+ self.frames.append(annotated)
240
+ self.low_level_step += 1
241
+
242
+ def write(self) -> None:
243
+ self.output_path.parent.mkdir(parents=True, exist_ok=True)
244
+ imageio.mimsave(self.output_path, self.frames, duration=1.0 / float(self.fps), loop=0)
245
+
246
+
247
+ def _selected_adapter_details(outputs: dict[str, Any], *, selected_mode: str, active_mask: bool) -> dict[str, Any]:
248
+ if "proposal_mode_names" not in outputs or "best_candidate_indices" not in outputs:
249
+ return {
250
+ "selected_index": None,
251
+ "selected_score": None,
252
+ "selected_confidence": None,
253
+ "planning_mode": outputs.get("planning_mode"),
254
+ "interaction_state": outputs.get("interaction_state", {}),
255
+ }
256
+ proposal_mode_names = _stringify_mode_list(outputs.get("proposal_mode_names"))
257
+ best_index = int(smoke._np(outputs["best_candidate_indices"]).reshape(-1)[0])
258
+ planner_scores = _vector_values(outputs.get("planner_scores"))
259
+ confidences = _vector_values(outputs.get("adapter_confidence"))
260
+ score = planner_scores[best_index] if best_index < len(planner_scores) else None
261
+ confidence = confidences[best_index] if best_index < len(confidences) else None
262
+ if not active_mask:
263
+ best_index = proposal_mode_names.index(selected_mode) if selected_mode in proposal_mode_names else None
264
+ score = None if best_index is None or best_index >= len(planner_scores) else planner_scores[best_index]
265
+ confidence = None if best_index is None or best_index >= len(confidences) else confidences[best_index]
266
+ return {
267
+ "selected_index": best_index,
268
+ "selected_score": None if score is None else float(score),
269
+ "selected_confidence": None if confidence is None else float(confidence),
270
+ "planning_mode": outputs.get("planning_mode"),
271
+ "interaction_state": outputs.get("interaction_state", {}),
272
+ }
273
+
274
+
275
+ def _capture_repeat_delta(
276
+ env: smoke.PickClutterRevealEnv,
277
+ delta_xyz: Sequence[float],
278
+ *,
279
+ open_gripper: bool,
280
+ steps: int,
281
+ capture_callback: Callable[[smoke.PickClutterRevealEnv], None],
282
+ ) -> dict[str, Any]:
283
+ last_obs: dict[str, Any] | None = None
284
+ action = np.zeros((1, 4), dtype=np.float32)
285
+ action[0, :3] = np.asarray(delta_xyz, dtype=np.float32)
286
+ action[0, 3] = smoke._gripper_action(open_gripper)
287
+ info = env.get_info()
288
+ for _ in range(int(steps)):
289
+ obs, _, terminated, truncated, info = env.step(action)
290
+ last_obs = obs
291
+ capture_callback(env)
292
+ if bool(np.asarray(terminated).reshape(-1)[0]) or bool(np.asarray(truncated).reshape(-1)[0]):
293
+ break
294
+ return {
295
+ "obs": last_obs if last_obs is not None else env.get_obs(info),
296
+ "terminated": False,
297
+ "truncated": False,
298
+ "info": info,
299
+ }
300
+
301
+
302
+ def _capture_move_tcp_to(
303
+ env: smoke.PickClutterRevealEnv,
304
+ target_xyz: Sequence[float],
305
+ *,
306
+ open_gripper: bool,
307
+ capture_callback: Callable[[smoke.PickClutterRevealEnv], None],
308
+ max_steps: int = 120,
309
+ tolerance: float = 0.008,
310
+ ) -> dict[str, Any]:
311
+ last_obs: dict[str, Any] | None = None
312
+ target = np.asarray(target_xyz, dtype=np.float32)
313
+ info = env.get_info()
314
+ for _ in range(int(max_steps)):
315
+ tcp = smoke._vec3(env.unwrapped.agent.tcp.pose.p)
316
+ delta = target - tcp
317
+ if float(np.linalg.norm(delta)) <= float(tolerance):
318
+ break
319
+ action = np.zeros((1, 4), dtype=np.float32)
320
+ action[0, :3] = np.clip(delta / 0.04, -1.0, 1.0)
321
+ action[0, 3] = smoke._gripper_action(open_gripper)
322
+ obs, _, terminated, truncated, info = env.step(action)
323
+ last_obs = obs
324
+ capture_callback(env)
325
+ if bool(np.asarray(terminated).reshape(-1)[0]) or bool(np.asarray(truncated).reshape(-1)[0]):
326
+ break
327
+ return {
328
+ "obs": last_obs if last_obs is not None else env.get_obs(info),
329
+ "info": info,
330
+ }
331
+
332
+
333
+ def _capture_execute_push(
334
+ env: smoke.PickClutterRevealEnv,
335
+ *,
336
+ anchor_xyz: np.ndarray,
337
+ pre_offset: np.ndarray,
338
+ push_delta: np.ndarray,
339
+ push_steps: int,
340
+ capture_callback: Callable[[smoke.PickClutterRevealEnv], None],
341
+ ) -> dict[str, Any]:
342
+ _capture_move_tcp_to(
343
+ env,
344
+ anchor_xyz + np.array([0.0, 0.0, 0.08], dtype=np.float32) + pre_offset,
345
+ open_gripper=True,
346
+ capture_callback=capture_callback,
347
+ )
348
+ _capture_move_tcp_to(
349
+ env,
350
+ anchor_xyz + pre_offset,
351
+ open_gripper=True,
352
+ capture_callback=capture_callback,
353
+ max_steps=100,
354
+ tolerance=0.010,
355
+ )
356
+ result = _capture_repeat_delta(
357
+ env,
358
+ push_delta,
359
+ open_gripper=True,
360
+ steps=push_steps,
361
+ capture_callback=capture_callback,
362
+ )
363
+ _capture_move_tcp_to(
364
+ env,
365
+ np.array([smoke._vec3(env.unwrapped.agent.tcp.pose.p)[0], smoke._vec3(env.unwrapped.agent.tcp.pose.p)[1], 0.10], dtype=np.float32),
366
+ open_gripper=True,
367
+ capture_callback=capture_callback,
368
+ max_steps=80,
369
+ tolerance=0.012,
370
+ )
371
+ return result
372
+
373
+
374
+ def _capture_execute_mode(
375
+ env: smoke.PickClutterRevealEnv,
376
+ mode_name: str,
377
+ *,
378
+ capture_callback: Callable[[smoke.PickClutterRevealEnv], None],
379
+ ) -> dict[str, Any]:
380
+ target = smoke._target_position(env)
381
+ blocker = smoke._find_path_blocker(env)
382
+ if mode_name == "retrieve":
383
+ return _capture_execute_push(
384
+ env,
385
+ anchor_xyz=target,
386
+ pre_offset=np.array([0.0, 0.035, 0.026], dtype=np.float32),
387
+ push_delta=np.array([0.0, -0.7, 0.0], dtype=np.float32),
388
+ push_steps=18,
389
+ capture_callback=capture_callback,
390
+ )
391
+ if mode_name == "insert_actor":
392
+ return _capture_execute_push(
393
+ env,
394
+ anchor_xyz=target,
395
+ pre_offset=np.array([0.0, 0.045, 0.028], dtype=np.float32),
396
+ push_delta=np.array([0.0, -0.4, 0.0], dtype=np.float32),
397
+ push_steps=10,
398
+ capture_callback=capture_callback,
399
+ )
400
+ if mode_name == "widen_gap":
401
+ anchor = blocker if blocker is not None else target
402
+ direction = -1.0 if anchor[0] >= target[0] else 1.0
403
+ return _capture_execute_push(
404
+ env,
405
+ anchor_xyz=anchor,
406
+ pre_offset=np.array([0.0, 0.025, 0.028], dtype=np.float32),
407
+ push_delta=np.array([0.75 * direction, -0.12, 0.0], dtype=np.float32),
408
+ push_steps=18,
409
+ capture_callback=capture_callback,
410
+ )
411
+ if mode_name == "sweep_left":
412
+ anchor = blocker if blocker is not None else target
413
+ return _capture_execute_push(
414
+ env,
415
+ anchor_xyz=anchor,
416
+ pre_offset=np.array([0.015, 0.025, 0.028], dtype=np.float32),
417
+ push_delta=np.array([-0.70, -0.10, 0.0], dtype=np.float32),
418
+ push_steps=14,
419
+ capture_callback=capture_callback,
420
+ )
421
+ if mode_name == "sweep_right":
422
+ anchor = blocker if blocker is not None else target
423
+ return _capture_execute_push(
424
+ env,
425
+ anchor_xyz=anchor,
426
+ pre_offset=np.array([-0.015, 0.025, 0.028], dtype=np.float32),
427
+ push_delta=np.array([0.70, -0.10, 0.0], dtype=np.float32),
428
+ push_steps=14,
429
+ capture_callback=capture_callback,
430
+ )
431
+ if mode_name == "pin_canopy":
432
+ anchor = blocker if blocker is not None else target
433
+ return _capture_execute_push(
434
+ env,
435
+ anchor_xyz=anchor,
436
+ pre_offset=np.array([0.0, -0.015, 0.028], dtype=np.float32),
437
+ push_delta=np.array([0.0, 0.35, 0.0], dtype=np.float32),
438
+ push_steps=10,
439
+ capture_callback=capture_callback,
440
+ )
441
+ if mode_name in {"maintain_gap", "base_action"}:
442
+ _capture_move_tcp_to(
443
+ env,
444
+ np.array([target[0], target[1] + 0.02, 0.10], dtype=np.float32),
445
+ open_gripper=True,
446
+ capture_callback=capture_callback,
447
+ max_steps=60,
448
+ tolerance=0.015,
449
+ )
450
+ return _capture_repeat_delta(
451
+ env,
452
+ np.array([0.0, -0.10, 0.0], dtype=np.float32),
453
+ open_gripper=True,
454
+ steps=4,
455
+ capture_callback=capture_callback,
456
+ )
457
+ raise KeyError(f"Unsupported mode: {mode_name}")
458
+
459
+
460
+ def _render_episode(
461
+ *,
462
+ model: Any,
463
+ device: Any,
464
+ adapter_mode: str,
465
+ render_mode_name: str,
466
+ episode_seed: int,
467
+ expected_record: dict[str, Any] | None,
468
+ output_path: Path,
469
+ frame_stride: int,
470
+ fps: int,
471
+ render_size: int,
472
+ initial_hold: int,
473
+ final_hold: int,
474
+ ) -> dict[str, Any]:
475
+ obs_env = smoke.PickClutterRevealEnv(
476
+ obs_mode="rgb+depth+segmentation",
477
+ control_mode="pd_ee_delta_pos",
478
+ render_mode="rgb_array",
479
+ )
480
+ sim_env = smoke.PickClutterRevealEnv(
481
+ obs_mode="none",
482
+ control_mode="pd_ee_delta_pos",
483
+ render_mode="rgb_array",
484
+ )
485
+ recorder = FrameRecorder(
486
+ render_mode_name=render_mode_name,
487
+ output_path=output_path,
488
+ render_size=render_size,
489
+ frame_stride=frame_stride,
490
+ fps=fps,
491
+ initial_hold=initial_hold,
492
+ final_hold=final_hold,
493
+ )
494
+ history: deque[dict[str, Any]] = deque(maxlen=smoke.HISTORY_STEPS)
495
+ success = False
496
+ first_reveal_step: int | None = None
497
+ first_retrieve_step: int | None = None
498
+ episode_disturbance: list[float] = []
499
+ try:
500
+ obs, _ = obs_env.reset(seed=int(episode_seed))
501
+ sim_env.reset(seed=int(episode_seed))
502
+ smoke._sync_env_state(obs_env, sim_env)
503
+ bootstrap_name = "adapter_on" if render_mode_name == "adapter_active_ft" else "trunk_only"
504
+ bootstrap_lines = [
505
+ f"{bootstrap_name} | seed {episode_seed} | macro 0/{smoke.MAX_MACRO_STEPS}",
506
+ "sim 0 | mode reset | ok no | prog 0.00 | clr 0.00",
507
+ "adaptor bootstrapping benchmark render",
508
+ ]
509
+ recorder.capture(sim_env, overlay_lines=bootstrap_lines, force=True, hold=initial_hold)
510
+ for decision_step in range(smoke.MAX_MACRO_STEPS):
511
+ obs_bundle = smoke._extract_sensor_bundle(obs)
512
+ proprio = smoke._build_proprio(obs_env)
513
+ batch = smoke._batch_from_obs(obs_bundle, proprio, list(history), device)
514
+ with smoke.torch.no_grad():
515
+ if adapter_mode == "trunk_only":
516
+ outputs = model(**batch)
517
+ else:
518
+ outputs = model(
519
+ **batch,
520
+ adapter_mode=adapter_mode,
521
+ use_transition_model=True,
522
+ use_task_conditioning=True,
523
+ )
524
+ selected_mode, active_mask, non_base = smoke._eval_mode_name(outputs, render_mode_name)
525
+ adapter_details = _selected_adapter_details(outputs, selected_mode=selected_mode, active_mask=active_mask)
526
+
527
+ def capture_callback(current_env: smoke.PickClutterRevealEnv) -> None:
528
+ overlay_lines = _build_overlay_lines(
529
+ render_mode_name=render_mode_name,
530
+ episode_seed=episode_seed,
531
+ macro_step=decision_step + 1,
532
+ macro_limit=smoke.MAX_MACRO_STEPS,
533
+ low_level_step=recorder.low_level_step,
534
+ selected_mode=selected_mode,
535
+ adapter_active=active_mask,
536
+ non_base=non_base,
537
+ selected_index=adapter_details["selected_index"],
538
+ selected_score=adapter_details["selected_score"],
539
+ selected_confidence=adapter_details["selected_confidence"],
540
+ planning_mode=None if adapter_details["planning_mode"] is None else str(adapter_details["planning_mode"]),
541
+ interaction_state=adapter_details["interaction_state"] or {},
542
+ env=current_env,
543
+ )
544
+ recorder.capture(current_env, overlay_lines=overlay_lines)
545
+
546
+ pre_action_lines = _build_overlay_lines(
547
+ render_mode_name=render_mode_name,
548
+ episode_seed=episode_seed,
549
+ macro_step=decision_step + 1,
550
+ macro_limit=smoke.MAX_MACRO_STEPS,
551
+ low_level_step=recorder.low_level_step,
552
+ selected_mode=selected_mode,
553
+ adapter_active=active_mask,
554
+ non_base=non_base,
555
+ selected_index=adapter_details["selected_index"],
556
+ selected_score=adapter_details["selected_score"],
557
+ selected_confidence=adapter_details["selected_confidence"],
558
+ planning_mode=None if adapter_details["planning_mode"] is None else str(adapter_details["planning_mode"]),
559
+ interaction_state=adapter_details["interaction_state"] or {},
560
+ env=sim_env,
561
+ )
562
+ recorder.capture(sim_env, overlay_lines=pre_action_lines, force=True, hold=2)
563
+ start_positions = smoke._all_positions(obs_env)
564
+ smoke._sync_env_state(obs_env, sim_env)
565
+ _capture_execute_mode(sim_env, selected_mode, capture_callback=capture_callback)
566
+ end_metrics = smoke._candidate_metrics(sim_env, start_positions=start_positions, current_obs_bundle=None)
567
+ smoke._sync_env_state(sim_env, obs_env)
568
+ obs = obs_env.get_obs(obs_env.get_info())
569
+ history.append(
570
+ smoke._init_history_entry(
571
+ obs_bundle,
572
+ proprio,
573
+ smoke.CANONICAL_CHUNKS.get(selected_mode, smoke.CANONICAL_CHUNKS["base_action"]),
574
+ )
575
+ )
576
+ episode_disturbance.append(end_metrics["disturbance"])
577
+ if selected_mode != "retrieve" and selected_mode not in {"base_action", "maintain_gap"} and first_reveal_step is None:
578
+ first_reveal_step = decision_step + 1
579
+ if selected_mode == "retrieve" and first_retrieve_step is None:
580
+ first_retrieve_step = decision_step + 1
581
+ if smoke._success_from_state(obs_env):
582
+ success = True
583
+ break
584
+ completion_name = "adapter_on" if render_mode_name == "adapter_active_ft" else "trunk_only"
585
+ completion_lines = [
586
+ f"{completion_name} | seed {episode_seed} | macro {len(history)}/{smoke.MAX_MACRO_STEPS}",
587
+ f"sim {recorder.low_level_step} | done | success {'yes' if success else 'no'} | expected {'yes' if bool(expected_record and expected_record.get('success')) else 'no'}",
588
+ f"steps {len(history)} | first_reveal {first_reveal_step} | first_retrieve {first_retrieve_step}",
589
+ ]
590
+ recorder.capture(sim_env, overlay_lines=completion_lines, force=True, hold=final_hold)
591
+ recorder.write()
592
+ finally:
593
+ obs_env.close()
594
+ sim_env.close()
595
+ expected_success = None if expected_record is None else bool(expected_record.get("success"))
596
+ return {
597
+ "episode_seed": int(episode_seed),
598
+ "render_mode_name": render_mode_name,
599
+ "adapter_mode": adapter_mode,
600
+ "gif_path": str(output_path),
601
+ "frames": len(recorder.frames),
602
+ "success": bool(success),
603
+ "expected_success": expected_success,
604
+ "matches_expected_success": None if expected_success is None else bool(success) == expected_success,
605
+ "steps": len(history),
606
+ "first_reveal_step": first_reveal_step,
607
+ "first_retrieve_step": first_retrieve_step,
608
+ "episode_disturbance": float(np.mean(episode_disturbance)) if episode_disturbance else 0.0,
609
+ }
610
+
611
+
612
+ def _render_mode_bundle(
613
+ *,
614
+ model: Any,
615
+ device: Any,
616
+ adapter_mode: str,
617
+ render_mode_name: str,
618
+ seeds: Sequence[int],
619
+ expected_records: dict[int, dict[str, Any]],
620
+ output_dir: Path,
621
+ frame_stride: int,
622
+ fps: int,
623
+ render_size: int,
624
+ initial_hold: int,
625
+ final_hold: int,
626
+ skip_existing: bool,
627
+ ) -> list[dict[str, Any]]:
628
+ mode_dir = output_dir / render_mode_name
629
+ records: list[dict[str, Any]] = []
630
+ for episode_seed in seeds:
631
+ output_path = mode_dir / f"seed_{int(episode_seed)}.gif"
632
+ if skip_existing and output_path.exists():
633
+ expected = expected_records.get(int(episode_seed))
634
+ records.append(
635
+ {
636
+ "episode_seed": int(episode_seed),
637
+ "render_mode_name": render_mode_name,
638
+ "adapter_mode": adapter_mode,
639
+ "gif_path": str(output_path),
640
+ "frames": None,
641
+ "success": None,
642
+ "expected_success": None if expected is None else bool(expected.get("success")),
643
+ "matches_expected_success": None,
644
+ "steps": None,
645
+ "first_reveal_step": None,
646
+ "first_retrieve_step": None,
647
+ "episode_disturbance": None,
648
+ "skipped_existing": True,
649
+ }
650
+ )
651
+ print(json.dumps({"phase": "render_skip_existing", "mode": render_mode_name, "episode_seed": int(episode_seed)}), flush=True)
652
+ continue
653
+ record = _render_episode(
654
+ model=model,
655
+ device=device,
656
+ adapter_mode=adapter_mode,
657
+ render_mode_name=render_mode_name,
658
+ episode_seed=int(episode_seed),
659
+ expected_record=expected_records.get(int(episode_seed)),
660
+ output_path=output_path,
661
+ frame_stride=frame_stride,
662
+ fps=fps,
663
+ render_size=render_size,
664
+ initial_hold=initial_hold,
665
+ final_hold=final_hold,
666
+ )
667
+ records.append(record)
668
+ print(
669
+ json.dumps(
670
+ {
671
+ "phase": "render_episode_complete",
672
+ "mode": render_mode_name,
673
+ "episode_seed": int(episode_seed),
674
+ "success": record["success"],
675
+ "expected_success": record["expected_success"],
676
+ "matches_expected_success": record["matches_expected_success"],
677
+ "gif_path": str(output_path),
678
+ }
679
+ ),
680
+ flush=True,
681
+ )
682
+ return records
683
+
684
+
685
+ def _write_manifest(output_dir: Path, payload: dict[str, Any]) -> None:
686
+ output_dir.mkdir(parents=True, exist_ok=True)
687
+ (output_dir / "manifest.json").write_text(json.dumps(payload, indent=2) + "\n", encoding="utf-8")
688
+
689
+
690
+ def _write_index(output_dir: Path, payload: dict[str, Any]) -> None:
691
+ rows = []
692
+ all_seeds = payload["seeds"]
693
+ by_mode: dict[str, dict[int, dict[str, Any]]] = {}
694
+ for mode_payload in payload["mode_records"]:
695
+ by_mode[mode_payload["render_mode_name"]] = {
696
+ int(record["episode_seed"]): record for record in mode_payload["records"]
697
+ }
698
+ for episode_seed in all_seeds:
699
+ trunk = by_mode.get("trunk_only_ft", {}).get(int(episode_seed))
700
+ active = by_mode.get("adapter_active_ft", {}).get(int(episode_seed))
701
+ rows.append(
702
+ {
703
+ "episode_seed": int(episode_seed),
704
+ "trunk_gif": "" if trunk is None else Path(str(trunk["gif_path"])).relative_to(output_dir).as_posix(),
705
+ "trunk_success": None if trunk is None else trunk["success"],
706
+ "adapter_gif": "" if active is None else Path(str(active["gif_path"])).relative_to(output_dir).as_posix(),
707
+ "adapter_success": None if active is None else active["success"],
708
+ }
709
+ )
710
+ markdown_lines = [
711
+ "# PickClutter smoke_v5_eval_tuned_softerpref GIF index",
712
+ "",
713
+ "- exact checkpoints: `maniskill_pickclutter_smoke_v5` seed17",
714
+ "- exact held-out seeds: `172000..172049`",
715
+ "- exact planner override: `softer_pref`",
716
+ "- overlays show selected mode and adaptor state on each frame",
717
+ "",
718
+ "| episode_seed | trunk_only_ft | success | adapter_active_ft | success |",
719
+ "| --- | --- | --- | --- | --- |",
720
+ ]
721
+ html_rows = []
722
+ for row in rows:
723
+ markdown_lines.append(
724
+ f"| {row['episode_seed']} | "
725
+ f"[gif]({row['trunk_gif']}) | {row['trunk_success']} | "
726
+ f"[gif]({row['adapter_gif']}) | {row['adapter_success']} |"
727
+ )
728
+ html_rows.append(
729
+ "<tr>"
730
+ f"<td>{row['episode_seed']}</td>"
731
+ f"<td><img src=\"{html.escape(row['trunk_gif'])}\" width=\"360\"></td>"
732
+ f"<td>{row['trunk_success']}</td>"
733
+ f"<td><img src=\"{html.escape(row['adapter_gif'])}\" width=\"360\"></td>"
734
+ f"<td>{row['adapter_success']}</td>"
735
+ "</tr>"
736
+ )
737
+ (output_dir / "INDEX.md").write_text("\n".join(markdown_lines) + "\n", encoding="utf-8")
738
+ html_text = (
739
+ "<!doctype html><html><head><meta charset=\"utf-8\"><title>PickClutter smoke_v5_eval_tuned_softerpref GIFs</title>"
740
+ "<style>body{font-family:Arial,sans-serif;background:#111;color:#f0f0f0;margin:20px;}table{border-collapse:collapse;width:100%;}"
741
+ "td,th{border:1px solid #444;padding:8px;vertical-align:top;}img{display:block;background:#222;}</style></head><body>"
742
+ "<h1>PickClutter smoke_v5_eval_tuned_softerpref GIFs</h1>"
743
+ "<p>Exact checkpoints: maniskill_pickclutter_smoke_v5 seed17. Exact held-out seeds: 172000..172049. Exact planner override: softer_pref.</p>"
744
+ "<table><thead><tr><th>episode_seed</th><th>trunk_only_ft</th><th>success</th><th>adapter_active_ft</th><th>success</th></tr></thead><tbody>"
745
+ + "".join(html_rows)
746
+ + "</tbody></table></body></html>"
747
+ )
748
+ (output_dir / "index.html").write_text(html_text, encoding="utf-8")
749
+
750
+
751
+ def main() -> None:
752
+ args = _parse_args()
753
+ seeds = _load_eval_seeds(args.split_path, start_index=args.start_index, limit=args.limit)
754
+ manifest_payload = {
755
+ "source_report_dir": str(args.report_dir),
756
+ "output_dir": str(args.output_dir),
757
+ "split_path": str(args.split_path),
758
+ "checkpoints": {
759
+ "trunk_only_ft": str(args.trunk_checkpoint),
760
+ "adapter_active_ft": str(args.adapter_checkpoint),
761
+ },
762
+ "planner_overrides": SOFTER_PREF_OVERRIDES,
763
+ "seeds": [int(seed) for seed in seeds],
764
+ "mode_records": [],
765
+ }
766
+
767
+ mode_specs: list[tuple[str, str, Path, dict[int, dict[str, Any]]]] = []
768
+ if args.mode in {"both", "trunk_only_ft"}:
769
+ mode_specs.append(
770
+ (
771
+ "trunk_only",
772
+ "trunk_only_ft",
773
+ args.trunk_checkpoint,
774
+ _load_expected_records(args.report_dir / f"trunk_only_ft_seed{args.seed}.json"),
775
+ )
776
+ )
777
+ if args.mode in {"both", "adapter_active_ft"}:
778
+ mode_specs.append(
779
+ (
780
+ "adapter_active",
781
+ "adapter_active_ft",
782
+ args.adapter_checkpoint,
783
+ _load_expected_records(args.report_dir / f"adapter_active_ft_seed{args.seed}.json"),
784
+ )
785
+ )
786
+
787
+ for adapter_mode, render_mode_name, checkpoint_path, expected_records in mode_specs:
788
+ print(
789
+ json.dumps(
790
+ {
791
+ "phase": "render_mode_start",
792
+ "adapter_mode": adapter_mode,
793
+ "render_mode_name": render_mode_name,
794
+ "episodes": len(seeds),
795
+ "checkpoint_path": str(checkpoint_path),
796
+ }
797
+ ),
798
+ flush=True,
799
+ )
800
+ model, _checkpoint = smoke._load_checkpoint(
801
+ checkpoint_path,
802
+ adapter_mode=adapter_mode if adapter_mode != "trunk_only" else None,
803
+ planner_overrides=SOFTER_PREF_OVERRIDES,
804
+ )
805
+ device = next(model.parameters()).device
806
+ mode_records = _render_mode_bundle(
807
+ model=model,
808
+ device=device,
809
+ adapter_mode=adapter_mode,
810
+ render_mode_name=render_mode_name,
811
+ seeds=seeds,
812
+ expected_records=expected_records,
813
+ output_dir=args.output_dir,
814
+ frame_stride=args.frame_stride,
815
+ fps=args.fps,
816
+ render_size=args.render_size,
817
+ initial_hold=args.initial_hold,
818
+ final_hold=args.final_hold,
819
+ skip_existing=args.skip_existing,
820
+ )
821
+ manifest_payload["mode_records"].append(
822
+ {
823
+ "adapter_mode": adapter_mode,
824
+ "render_mode_name": render_mode_name,
825
+ "records": mode_records,
826
+ }
827
+ )
828
+ _write_manifest(args.output_dir, manifest_payload)
829
+ _write_index(args.output_dir, manifest_payload)
830
+ _write_manifest(args.output_dir, manifest_payload)
831
+ print(json.dumps({"phase": "render_complete", "output_dir": str(args.output_dir)}), flush=True)
832
+
833
+
834
+ if __name__ == "__main__":
835
+ main()
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/INDEX.md ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # PickClutter smoke_v5_eval_tuned_softerpref GIF index
2
+
3
+ - exact checkpoints: `maniskill_pickclutter_smoke_v5` seed17
4
+ - exact held-out seeds: `172000..172049`
5
+ - exact planner override: `softer_pref`
6
+ - overlays show selected mode and adaptor state on each frame
7
+
8
+ | episode_seed | trunk_only_ft | success | adapter_active_ft | success |
9
+ | --- | --- | --- | --- | --- |
10
+ | 172000 | [gif](trunk_only_ft/seed_172000.gif) | False | [gif](adapter_active_ft/seed_172000.gif) | True |
11
+ | 172001 | [gif](trunk_only_ft/seed_172001.gif) | False | [gif](adapter_active_ft/seed_172001.gif) | True |
12
+ | 172002 | [gif](trunk_only_ft/seed_172002.gif) | True | [gif](adapter_active_ft/seed_172002.gif) | True |
13
+ | 172003 | [gif](trunk_only_ft/seed_172003.gif) | False | [gif](adapter_active_ft/seed_172003.gif) | False |
14
+ | 172004 | [gif](trunk_only_ft/seed_172004.gif) | False | [gif](adapter_active_ft/seed_172004.gif) | True |
15
+ | 172005 | [gif](trunk_only_ft/seed_172005.gif) | False | [gif](adapter_active_ft/seed_172005.gif) | True |
16
+ | 172006 | [gif](trunk_only_ft/seed_172006.gif) | False | [gif](adapter_active_ft/seed_172006.gif) | False |
17
+ | 172007 | [gif](trunk_only_ft/seed_172007.gif) | False | [gif](adapter_active_ft/seed_172007.gif) | False |
18
+ | 172008 | [gif](trunk_only_ft/seed_172008.gif) | False | [gif](adapter_active_ft/seed_172008.gif) | False |
19
+ | 172009 | [gif](trunk_only_ft/seed_172009.gif) | False | [gif](adapter_active_ft/seed_172009.gif) | True |
20
+ | 172010 | [gif](trunk_only_ft/seed_172010.gif) | False | [gif](adapter_active_ft/seed_172010.gif) | True |
21
+ | 172011 | [gif](trunk_only_ft/seed_172011.gif) | False | [gif](adapter_active_ft/seed_172011.gif) | True |
22
+ | 172012 | [gif](trunk_only_ft/seed_172012.gif) | False | [gif](adapter_active_ft/seed_172012.gif) | False |
23
+ | 172013 | [gif](trunk_only_ft/seed_172013.gif) | False | [gif](adapter_active_ft/seed_172013.gif) | False |
24
+ | 172014 | [gif](trunk_only_ft/seed_172014.gif) | False | [gif](adapter_active_ft/seed_172014.gif) | False |
25
+ | 172015 | [gif](trunk_only_ft/seed_172015.gif) | False | [gif](adapter_active_ft/seed_172015.gif) | False |
26
+ | 172016 | [gif](trunk_only_ft/seed_172016.gif) | True | [gif](adapter_active_ft/seed_172016.gif) | True |
27
+ | 172017 | [gif](trunk_only_ft/seed_172017.gif) | False | [gif](adapter_active_ft/seed_172017.gif) | True |
28
+ | 172018 | [gif](trunk_only_ft/seed_172018.gif) | False | [gif](adapter_active_ft/seed_172018.gif) | True |
29
+ | 172019 | [gif](trunk_only_ft/seed_172019.gif) | False | [gif](adapter_active_ft/seed_172019.gif) | False |
30
+ | 172020 | [gif](trunk_only_ft/seed_172020.gif) | False | [gif](adapter_active_ft/seed_172020.gif) | True |
31
+ | 172021 | [gif](trunk_only_ft/seed_172021.gif) | False | [gif](adapter_active_ft/seed_172021.gif) | True |
32
+ | 172022 | [gif](trunk_only_ft/seed_172022.gif) | False | [gif](adapter_active_ft/seed_172022.gif) | True |
33
+ | 172023 | [gif](trunk_only_ft/seed_172023.gif) | False | [gif](adapter_active_ft/seed_172023.gif) | True |
34
+ | 172024 | [gif](trunk_only_ft/seed_172024.gif) | False | [gif](adapter_active_ft/seed_172024.gif) | False |
35
+ | 172025 | [gif](trunk_only_ft/seed_172025.gif) | False | [gif](adapter_active_ft/seed_172025.gif) | True |
36
+ | 172026 | [gif](trunk_only_ft/seed_172026.gif) | False | [gif](adapter_active_ft/seed_172026.gif) | True |
37
+ | 172027 | [gif](trunk_only_ft/seed_172027.gif) | False | [gif](adapter_active_ft/seed_172027.gif) | True |
38
+ | 172028 | [gif](trunk_only_ft/seed_172028.gif) | False | [gif](adapter_active_ft/seed_172028.gif) | False |
39
+ | 172029 | [gif](trunk_only_ft/seed_172029.gif) | False | [gif](adapter_active_ft/seed_172029.gif) | True |
40
+ | 172030 | [gif](trunk_only_ft/seed_172030.gif) | False | [gif](adapter_active_ft/seed_172030.gif) | True |
41
+ | 172031 | [gif](trunk_only_ft/seed_172031.gif) | False | [gif](adapter_active_ft/seed_172031.gif) | False |
42
+ | 172032 | [gif](trunk_only_ft/seed_172032.gif) | False | [gif](adapter_active_ft/seed_172032.gif) | True |
43
+ | 172033 | [gif](trunk_only_ft/seed_172033.gif) | False | [gif](adapter_active_ft/seed_172033.gif) | True |
44
+ | 172034 | [gif](trunk_only_ft/seed_172034.gif) | False | [gif](adapter_active_ft/seed_172034.gif) | True |
45
+ | 172035 | [gif](trunk_only_ft/seed_172035.gif) | False | [gif](adapter_active_ft/seed_172035.gif) | True |
46
+ | 172036 | [gif](trunk_only_ft/seed_172036.gif) | False | [gif](adapter_active_ft/seed_172036.gif) | False |
47
+ | 172037 | [gif](trunk_only_ft/seed_172037.gif) | False | [gif](adapter_active_ft/seed_172037.gif) | False |
48
+ | 172038 | [gif](trunk_only_ft/seed_172038.gif) | False | [gif](adapter_active_ft/seed_172038.gif) | True |
49
+ | 172039 | [gif](trunk_only_ft/seed_172039.gif) | False | [gif](adapter_active_ft/seed_172039.gif) | True |
50
+ | 172040 | [gif](trunk_only_ft/seed_172040.gif) | False | [gif](adapter_active_ft/seed_172040.gif) | True |
51
+ | 172041 | [gif](trunk_only_ft/seed_172041.gif) | False | [gif](adapter_active_ft/seed_172041.gif) | True |
52
+ | 172042 | [gif](trunk_only_ft/seed_172042.gif) | False | [gif](adapter_active_ft/seed_172042.gif) | False |
53
+ | 172043 | [gif](trunk_only_ft/seed_172043.gif) | False | [gif](adapter_active_ft/seed_172043.gif) | False |
54
+ | 172044 | [gif](trunk_only_ft/seed_172044.gif) | False | [gif](adapter_active_ft/seed_172044.gif) | True |
55
+ | 172045 | [gif](trunk_only_ft/seed_172045.gif) | False | [gif](adapter_active_ft/seed_172045.gif) | False |
56
+ | 172046 | [gif](trunk_only_ft/seed_172046.gif) | False | [gif](adapter_active_ft/seed_172046.gif) | True |
57
+ | 172047 | [gif](trunk_only_ft/seed_172047.gif) | False | [gif](adapter_active_ft/seed_172047.gif) | False |
58
+ | 172048 | [gif](trunk_only_ft/seed_172048.gif) | False | [gif](adapter_active_ft/seed_172048.gif) | False |
59
+ | 172049 | [gif](trunk_only_ft/seed_172049.gif) | False | [gif](adapter_active_ft/seed_172049.gif) | True |
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172000.gif ADDED

Git LFS Details

  • SHA256: 368bed2ec1c645ec41588a0dd931b61b09449e56b8b2e555e4aab1a45300635f
  • Pointer size: 132 Bytes
  • Size of remote file: 2.46 MB
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172001.gif ADDED

Git LFS Details

  • SHA256: 9ddb71ea414af62085bc2d625c54e0f07c395e7870a512a88b657391d5884887
  • Pointer size: 132 Bytes
  • Size of remote file: 4.8 MB
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172002.gif ADDED

Git LFS Details

  • SHA256: 8ae5efab4936e5be30ee86987e62b963ac3c657b980e93528ab89d50270a93da
  • Pointer size: 132 Bytes
  • Size of remote file: 1.09 MB
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172003.gif ADDED

Git LFS Details

  • SHA256: 0e62721ffe2a0105bbd87cccd63c3d3a97d74878269e8f40522570c4dea77b21
  • Pointer size: 132 Bytes
  • Size of remote file: 5.12 MB
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172004.gif ADDED

Git LFS Details

  • SHA256: 58b510f23601f2a831e50db806f2c5bc09244d41bb7672f081db8b6302f1655a
  • Pointer size: 132 Bytes
  • Size of remote file: 6 MB
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172005.gif ADDED

Git LFS Details

  • SHA256: fa0bec9c5383f77660be4cd3438a854684497d88ba9d29f891028a7e596da9e2
  • Pointer size: 132 Bytes
  • Size of remote file: 2.47 MB
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172006.gif ADDED

Git LFS Details

  • SHA256: d0a44776e907f288cf73383fb897ffa6d47c8b1cd8dc6f34da2c060889dee092
  • Pointer size: 132 Bytes
  • Size of remote file: 2.38 MB
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172007.gif ADDED

Git LFS Details

  • SHA256: 6af5da3b08ea866f8f232f45035da4d22e9639ba99863dd81a67b4fc28f00d84
  • Pointer size: 132 Bytes
  • Size of remote file: 5.43 MB
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172008.gif ADDED

Git LFS Details

  • SHA256: b95b6e3bd36fd2b24fe1725640d2ba89201df026741059aa0b3fd2c860ef29ef
  • Pointer size: 132 Bytes
  • Size of remote file: 2.46 MB
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172009.gif ADDED

Git LFS Details

  • SHA256: bb733a957e5062497dd3d1d758d439ce2470088c6e4ca04df32f7d79b4829cf0
  • Pointer size: 132 Bytes
  • Size of remote file: 3.08 MB
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172010.gif ADDED

Git LFS Details

  • SHA256: 6c4611b63653519ead4bb7fc22c4184aeb87984d8d8b69a60a816c6ad92e69e6
  • Pointer size: 132 Bytes
  • Size of remote file: 4.62 MB
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172011.gif ADDED

Git LFS Details

  • SHA256: 93763061aa16d63b2d13affa385ef32778c043b97ee07606d0b716c150daa72b
  • Pointer size: 132 Bytes
  • Size of remote file: 1.41 MB
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172012.gif ADDED

Git LFS Details

  • SHA256: 0c6dff21816ea6c55caea8415aadf26ba3530d15143955d174196b73ddfa8f84
  • Pointer size: 133 Bytes
  • Size of remote file: 11.2 MB
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172013.gif ADDED

Git LFS Details

  • SHA256: 017454042b03e75f96b2ac7de09368be9a0bb1242cfbe65635e15422df4707a9
  • Pointer size: 132 Bytes
  • Size of remote file: 4.79 MB
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172014.gif ADDED

Git LFS Details

  • SHA256: b1e190ab77650faec9cf6db209a285f39612cc095ce030fda53388bc15c6e9dc
  • Pointer size: 132 Bytes
  • Size of remote file: 2.99 MB
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172015.gif ADDED

Git LFS Details

  • SHA256: 3c6102bb32a1f1a3f021ab510d695746e0339cc0ef4074c73d7678429c33b3e2
  • Pointer size: 132 Bytes
  • Size of remote file: 6.21 MB
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172016.gif ADDED

Git LFS Details

  • SHA256: d72bbb35f72f98bf6552fc2b6bdb49477e20760f5ee15df487a444ad95f61ef3
  • Pointer size: 132 Bytes
  • Size of remote file: 1.27 MB
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172017.gif ADDED

Git LFS Details

  • SHA256: 4e48596ae054c86f97fa4c8cb3dce4c9494e399b92f8b0a6d45c88032ce5a1a9
  • Pointer size: 132 Bytes
  • Size of remote file: 7.59 MB
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172018.gif ADDED

Git LFS Details

  • SHA256: 3cb017170ae81292800361f56f136d29973b47c27339d5a16141a01bd087b4a4
  • Pointer size: 132 Bytes
  • Size of remote file: 1.31 MB
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172019.gif ADDED

Git LFS Details

  • SHA256: b3546b2ec1ebdc2855a95be2a90ad863ac4260c96c2c5b3f77f698aefd1da6bd
  • Pointer size: 132 Bytes
  • Size of remote file: 9.29 MB
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172020.gif ADDED

Git LFS Details

  • SHA256: bf34e6d0ab587c182285d9abb3bfce8cf2347ce71d72e4d3be61f50e86133f1f
  • Pointer size: 132 Bytes
  • Size of remote file: 1.21 MB
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172021.gif ADDED

Git LFS Details

  • SHA256: c157283f8de0baef55324887917a7537670b1a33b4da45bc1ab799ca68627b61
  • Pointer size: 132 Bytes
  • Size of remote file: 2.34 MB
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172022.gif ADDED

Git LFS Details

  • SHA256: c96f0a49e129385a2c7bea803ec5ac52f0562b09316584d6239e75f838d84b09
  • Pointer size: 132 Bytes
  • Size of remote file: 4.59 MB
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172023.gif ADDED

Git LFS Details

  • SHA256: 2577a7af1cfadbdee52ce146600de4bdfe1d612afcc7abdd0b17399e2a59ba4f
  • Pointer size: 132 Bytes
  • Size of remote file: 4.94 MB
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172024.gif ADDED

Git LFS Details

  • SHA256: 6edafb136de85f389c16deb016f9ed5e4c5f377e9a8efb902b216ff6c4f37b42
  • Pointer size: 132 Bytes
  • Size of remote file: 4.44 MB
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172025.gif ADDED

Git LFS Details

  • SHA256: 2ad6bf454160c2e9b2c4f76918ad3e4df78e82fc4c01fe0bf60cea5f1260809e
  • Pointer size: 132 Bytes
  • Size of remote file: 1.58 MB
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172026.gif ADDED

Git LFS Details

  • SHA256: 436c1380f6573861ef852d96d51722c19c9d5510b103ca1201fedbd72d826948
  • Pointer size: 132 Bytes
  • Size of remote file: 1.94 MB
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172027.gif ADDED

Git LFS Details

  • SHA256: 975fe659e90a351aab008baf6f4564a7814b6a267cc3e9d6620daac74b397db7
  • Pointer size: 132 Bytes
  • Size of remote file: 2.54 MB
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172028.gif ADDED

Git LFS Details

  • SHA256: 71fd2acbee479bfb0ba70a0f1d780626362b5b4fb545f88c4ccdcc0034ebf269
  • Pointer size: 132 Bytes
  • Size of remote file: 9.12 MB
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172029.gif ADDED

Git LFS Details

  • SHA256: 64f4e0836357ceb3928bc2ef77423eab9ea67a622824aa705f70f95a3c462cd7
  • Pointer size: 132 Bytes
  • Size of remote file: 2.92 MB
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172030.gif ADDED

Git LFS Details

  • SHA256: a75bf8b45d17eeeed3011ea8480bd72fd3fd33cb4d69531f43269f3210d3259f
  • Pointer size: 132 Bytes
  • Size of remote file: 1.5 MB
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172031.gif ADDED

Git LFS Details

  • SHA256: c5373107c71f7b6f19300d489084cceb1b63ae2f41b4cb4bf9790b63f39ea875
  • Pointer size: 132 Bytes
  • Size of remote file: 6.65 MB
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172032.gif ADDED

Git LFS Details

  • SHA256: 2bd36a48f3a4c70359464282b76504cb11e53e367bc588b16d003c2495117637
  • Pointer size: 132 Bytes
  • Size of remote file: 1.63 MB
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172033.gif ADDED

Git LFS Details

  • SHA256: 89c3c3620f166523dcc689418e4208a2e40f201ae3b1e3d51d3334ad4b9ea977
  • Pointer size: 132 Bytes
  • Size of remote file: 4.85 MB
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172034.gif ADDED

Git LFS Details

  • SHA256: 56bc6b5afba39961039e8360a4a2a0942d85055bf10c27b36cad9485663b7919
  • Pointer size: 132 Bytes
  • Size of remote file: 1.16 MB
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172035.gif ADDED

Git LFS Details

  • SHA256: 48e63feabc540508baa22a9f35cda32105509ef8dd35cc3bedcba23ba7c23c3d
  • Pointer size: 132 Bytes
  • Size of remote file: 2.58 MB
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172036.gif ADDED

Git LFS Details

  • SHA256: 23ea3a2ef2133db3ecf3697a9467f9452217246508cd1ed4b21469f247c64f9a
  • Pointer size: 132 Bytes
  • Size of remote file: 3.11 MB
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172037.gif ADDED

Git LFS Details

  • SHA256: ebac666f2c6718328c144484f1742671f34475906687a5c563dae3f979ef2085
  • Pointer size: 132 Bytes
  • Size of remote file: 7.14 MB
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172038.gif ADDED

Git LFS Details

  • SHA256: 9b1978e57c75d723b79fa7e5aa6d40e895f39d1c70666deee5aa4768a618eba5
  • Pointer size: 132 Bytes
  • Size of remote file: 2.56 MB
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172039.gif ADDED

Git LFS Details

  • SHA256: ff527ef4cf294747a7e54cbead02a4b8a4580b2a4baf087bd353bae23aac5804
  • Pointer size: 132 Bytes
  • Size of remote file: 2.36 MB
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172040.gif ADDED

Git LFS Details

  • SHA256: 9b1d614e0c8b47054c600cbad4f5357171e7d6ddee7101c35fb6ea85041bfbd1
  • Pointer size: 132 Bytes
  • Size of remote file: 1.64 MB
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172041.gif ADDED

Git LFS Details

  • SHA256: c7fb63b5efb3b75f1c397a6f271b6a433a23c1bfccd72284fd2e8ed36eb138ea
  • Pointer size: 132 Bytes
  • Size of remote file: 3.02 MB
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172042.gif ADDED

Git LFS Details

  • SHA256: 23e6ae684c200d3a7d03dff22397eec99045039f09daec0f111af50e6f7e70a1
  • Pointer size: 132 Bytes
  • Size of remote file: 8.64 MB
reports/maniskill_pickclutter_smoke_v5_eval_tuned_softerpref_gifs/adapter_active_ft/seed_172043.gif ADDED

Git LFS Details

  • SHA256: 7eadebebf1383ddfda2ba5a60ab986c7d39b8e6ce9f1a561a00fdc793d0d42fd
  • Pointer size: 132 Bytes
  • Size of remote file: 4.91 MB