cccat6 commited on
Commit
cc396fd
·
verified ·
1 Parent(s): 761835a

Rename traditional baseline artifacts as LOS controllers

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +386 -0
  2. experiments/BASELINES.md +3 -3
  3. experiments/EXPERIMENT_MATRIX.md +3 -3
  4. experiments/METHOD_AUDIT.md +3 -3
  5. experiments/README.md +3 -3
  6. experiments/TASK_PLAN.md +3 -3
  7. experiments/current_estimator_los_controller/README.md +3 -0
  8. experiments/current_estimator_los_controller/__init__.py +1 -0
  9. experiments/current_estimator_los_controller/checkpoint/.gitkeep +0 -0
  10. experiments/current_estimator_los_controller/result/.gitkeep +0 -0
  11. experiments/current_estimator_los_controller/src/__init__.py +1 -0
  12. experiments/current_estimator_los_controller/src/config.py +5 -0
  13. experiments/current_estimator_los_controller/src/controller.py +19 -0
  14. experiments/current_estimator_los_controller/src/estimator.py +9 -0
  15. experiments/current_estimator_los_controller/src/evaluate.py +10 -0
  16. experiments/docs/EXPERIMENT_PROTOCOL.md +6 -6
  17. experiments/export_paper_artifacts.py +1198 -0
  18. experiments/no_flow_los_controller/README.md +3 -0
  19. experiments/no_flow_los_controller/__init__.py +1 -0
  20. experiments/no_flow_los_controller/checkpoint/.gitkeep +0 -0
  21. experiments/no_flow_los_controller/result/.gitkeep +0 -0
  22. experiments/no_flow_los_controller/src/__init__.py +1 -0
  23. experiments/no_flow_los_controller/src/config.py +5 -0
  24. experiments/no_flow_los_controller/src/controller.py +11 -0
  25. experiments/no_flow_los_controller/src/evaluate.py +8 -0
  26. experiments/oracle_flow_los_controller/README.md +5 -0
  27. experiments/oracle_flow_los_controller/__init__.py +1 -0
  28. experiments/oracle_flow_los_controller/checkpoint/.gitkeep +0 -0
  29. experiments/oracle_flow_los_controller/result/.gitkeep +0 -0
  30. experiments/oracle_flow_los_controller/src/__init__.py +1 -0
  31. experiments/oracle_flow_los_controller/src/config.py +5 -0
  32. experiments/oracle_flow_los_controller/src/controller.py +19 -0
  33. experiments/oracle_flow_los_controller/src/evaluate.py +8 -0
  34. experiments/plot_task_schematics.py +171 -0
  35. experiments/reports/paper_artifacts/README.md +66 -0
  36. experiments/reports/paper_artifacts/fig3/figure3_frame_manifest.csv +25 -0
  37. experiments/reports/paper_artifacts/fig3/figure3_frame_manifest.tsv +25 -0
  38. experiments/reports/paper_artifacts/fig3/figure3_placeholder_contact_sheet.png +3 -0
  39. experiments/reports/paper_artifacts/fig3/figure3_provenance.md +30 -0
  40. experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_reach_target_uniform_ep000_first_frame000.png +0 -0
  41. experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_reach_target_uniform_ep000_last_frame149.png +0 -0
  42. experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_reach_target_uniform_ep000_middle_frame075.png +0 -0
  43. experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_station_keeping_vortex_center_ep000_first_frame000.png +0 -0
  44. experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_station_keeping_vortex_center_ep000_last_frame097.png +0 -0
  45. experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_station_keeping_vortex_center_ep000_middle_frame049.png +0 -0
  46. experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_waypoint_square_gradient_ep000_first_frame000.png +0 -0
  47. experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_waypoint_square_gradient_ep000_last_frame272.png +0 -0
  48. experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_waypoint_square_gradient_ep000_middle_frame136.png +0 -0
  49. experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_waypoint_zigzag_random_fourier_ep000_first_frame000.png +0 -0
  50. experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_waypoint_zigzag_random_fourier_ep000_last_frame319.png +0 -0
.gitattributes CHANGED
@@ -1865,3 +1865,389 @@ experiments/reports/paper_planning/gifs/image_planning_tdmpc2_inferred_twin_wayp
1865
  experiments/reports/paper_planning/gifs/image_planning_tdmpc2_inferred_twin_waypoint_zigzag_vortex_center_ep000.gif filter=lfs diff=lfs merge=lfs -text
1866
  experiments/reports/paper_planning/gifs/image_planning_tdmpc2_inferred_twin_waypoint_zigzag_vortex_center_ep001.gif filter=lfs diff=lfs merge=lfs -text
1867
  experiments/reports/paper_planning/gifs/image_planning_tdmpc2_inferred_twin_waypoint_zigzag_vortex_center_ep002.gif filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1865
  experiments/reports/paper_planning/gifs/image_planning_tdmpc2_inferred_twin_waypoint_zigzag_vortex_center_ep000.gif filter=lfs diff=lfs merge=lfs -text
1866
  experiments/reports/paper_planning/gifs/image_planning_tdmpc2_inferred_twin_waypoint_zigzag_vortex_center_ep001.gif filter=lfs diff=lfs merge=lfs -text
1867
  experiments/reports/paper_planning/gifs/image_planning_tdmpc2_inferred_twin_waypoint_zigzag_vortex_center_ep002.gif filter=lfs diff=lfs merge=lfs -text
1868
+ experiments/reports/paper_artifacts/fig3/figure3_placeholder_contact_sheet.png filter=lfs diff=lfs merge=lfs -text
1869
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_reach_target_double_gyre_ep000.gif filter=lfs diff=lfs merge=lfs -text
1870
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_reach_target_double_gyre_ep002.gif filter=lfs diff=lfs merge=lfs -text
1871
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_reach_target_shear_ep002.gif filter=lfs diff=lfs merge=lfs -text
1872
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_reach_target_source_sink_pair_ep000.gif filter=lfs diff=lfs merge=lfs -text
1873
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_reach_target_source_sink_pair_ep002.gif filter=lfs diff=lfs merge=lfs -text
1874
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_reach_target_uniform_ep000.gif filter=lfs diff=lfs merge=lfs -text
1875
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_reach_target_vortex_center_ep002.gif filter=lfs diff=lfs merge=lfs -text
1876
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_square_double_gyre_ep000.gif filter=lfs diff=lfs merge=lfs -text
1877
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_square_double_gyre_ep001.gif filter=lfs diff=lfs merge=lfs -text
1878
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_square_double_gyre_ep002.gif filter=lfs diff=lfs merge=lfs -text
1879
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_square_gradient_ep000.gif filter=lfs diff=lfs merge=lfs -text
1880
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_square_gradient_ep001.gif filter=lfs diff=lfs merge=lfs -text
1881
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_square_gradient_ep002.gif filter=lfs diff=lfs merge=lfs -text
1882
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_square_noflow_ep000.gif filter=lfs diff=lfs merge=lfs -text
1883
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_square_noflow_ep001.gif filter=lfs diff=lfs merge=lfs -text
1884
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_square_noflow_ep002.gif filter=lfs diff=lfs merge=lfs -text
1885
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_square_random_fourier_ep000.gif filter=lfs diff=lfs merge=lfs -text
1886
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_square_random_fourier_ep001.gif filter=lfs diff=lfs merge=lfs -text
1887
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_square_random_fourier_ep002.gif filter=lfs diff=lfs merge=lfs -text
1888
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_square_shear_ep000.gif filter=lfs diff=lfs merge=lfs -text
1889
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_square_shear_ep001.gif filter=lfs diff=lfs merge=lfs -text
1890
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_square_shear_ep002.gif filter=lfs diff=lfs merge=lfs -text
1891
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_square_source_sink_ep000.gif filter=lfs diff=lfs merge=lfs -text
1892
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_square_source_sink_ep001.gif filter=lfs diff=lfs merge=lfs -text
1893
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_square_source_sink_ep002.gif filter=lfs diff=lfs merge=lfs -text
1894
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_square_source_sink_pair_ep000.gif filter=lfs diff=lfs merge=lfs -text
1895
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_square_source_sink_pair_ep001.gif filter=lfs diff=lfs merge=lfs -text
1896
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_square_source_sink_pair_ep002.gif filter=lfs diff=lfs merge=lfs -text
1897
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_square_turbulent_patch_ep000.gif filter=lfs diff=lfs merge=lfs -text
1898
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_square_turbulent_patch_ep001.gif filter=lfs diff=lfs merge=lfs -text
1899
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_square_turbulent_patch_ep002.gif filter=lfs diff=lfs merge=lfs -text
1900
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_square_uniform_ep000.gif filter=lfs diff=lfs merge=lfs -text
1901
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_square_uniform_ep001.gif filter=lfs diff=lfs merge=lfs -text
1902
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_square_uniform_ep002.gif filter=lfs diff=lfs merge=lfs -text
1903
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_square_vortex_center_ep000.gif filter=lfs diff=lfs merge=lfs -text
1904
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_square_vortex_center_ep001.gif filter=lfs diff=lfs merge=lfs -text
1905
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_square_vortex_center_ep002.gif filter=lfs diff=lfs merge=lfs -text
1906
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_zigzag_double_gyre_ep000.gif filter=lfs diff=lfs merge=lfs -text
1907
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_zigzag_double_gyre_ep001.gif filter=lfs diff=lfs merge=lfs -text
1908
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_zigzag_double_gyre_ep002.gif filter=lfs diff=lfs merge=lfs -text
1909
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_zigzag_gradient_ep000.gif filter=lfs diff=lfs merge=lfs -text
1910
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_zigzag_gradient_ep001.gif filter=lfs diff=lfs merge=lfs -text
1911
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_zigzag_gradient_ep002.gif filter=lfs diff=lfs merge=lfs -text
1912
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_zigzag_noflow_ep000.gif filter=lfs diff=lfs merge=lfs -text
1913
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_zigzag_noflow_ep001.gif filter=lfs diff=lfs merge=lfs -text
1914
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_zigzag_noflow_ep002.gif filter=lfs diff=lfs merge=lfs -text
1915
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_zigzag_random_fourier_ep000.gif filter=lfs diff=lfs merge=lfs -text
1916
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_zigzag_random_fourier_ep001.gif filter=lfs diff=lfs merge=lfs -text
1917
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_zigzag_random_fourier_ep002.gif filter=lfs diff=lfs merge=lfs -text
1918
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_zigzag_shear_ep000.gif filter=lfs diff=lfs merge=lfs -text
1919
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_zigzag_shear_ep001.gif filter=lfs diff=lfs merge=lfs -text
1920
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_zigzag_shear_ep002.gif filter=lfs diff=lfs merge=lfs -text
1921
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_zigzag_source_sink_ep000.gif filter=lfs diff=lfs merge=lfs -text
1922
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_zigzag_source_sink_ep001.gif filter=lfs diff=lfs merge=lfs -text
1923
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_zigzag_source_sink_ep002.gif filter=lfs diff=lfs merge=lfs -text
1924
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_zigzag_source_sink_pair_ep000.gif filter=lfs diff=lfs merge=lfs -text
1925
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_zigzag_source_sink_pair_ep001.gif filter=lfs diff=lfs merge=lfs -text
1926
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_zigzag_source_sink_pair_ep002.gif filter=lfs diff=lfs merge=lfs -text
1927
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_zigzag_turbulent_patch_ep000.gif filter=lfs diff=lfs merge=lfs -text
1928
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_zigzag_turbulent_patch_ep001.gif filter=lfs diff=lfs merge=lfs -text
1929
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_zigzag_turbulent_patch_ep002.gif filter=lfs diff=lfs merge=lfs -text
1930
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_zigzag_uniform_ep000.gif filter=lfs diff=lfs merge=lfs -text
1931
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_zigzag_uniform_ep001.gif filter=lfs diff=lfs merge=lfs -text
1932
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_zigzag_uniform_ep002.gif filter=lfs diff=lfs merge=lfs -text
1933
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_zigzag_vortex_center_ep000.gif filter=lfs diff=lfs merge=lfs -text
1934
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_zigzag_vortex_center_ep001.gif filter=lfs diff=lfs merge=lfs -text
1935
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_triangle_waypoint_zigzag_vortex_center_ep002.gif filter=lfs diff=lfs merge=lfs -text
1936
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_square_double_gyre_ep000.gif filter=lfs diff=lfs merge=lfs -text
1937
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_square_double_gyre_ep001.gif filter=lfs diff=lfs merge=lfs -text
1938
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_square_double_gyre_ep002.gif filter=lfs diff=lfs merge=lfs -text
1939
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_square_gradient_ep000.gif filter=lfs diff=lfs merge=lfs -text
1940
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_square_gradient_ep001.gif filter=lfs diff=lfs merge=lfs -text
1941
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_square_gradient_ep002.gif filter=lfs diff=lfs merge=lfs -text
1942
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_square_noflow_ep000.gif filter=lfs diff=lfs merge=lfs -text
1943
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_square_noflow_ep001.gif filter=lfs diff=lfs merge=lfs -text
1944
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_square_noflow_ep002.gif filter=lfs diff=lfs merge=lfs -text
1945
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_square_random_fourier_ep000.gif filter=lfs diff=lfs merge=lfs -text
1946
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_square_random_fourier_ep001.gif filter=lfs diff=lfs merge=lfs -text
1947
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_square_random_fourier_ep002.gif filter=lfs diff=lfs merge=lfs -text
1948
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_square_shear_ep000.gif filter=lfs diff=lfs merge=lfs -text
1949
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_square_shear_ep001.gif filter=lfs diff=lfs merge=lfs -text
1950
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_square_shear_ep002.gif filter=lfs diff=lfs merge=lfs -text
1951
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_square_source_sink_ep000.gif filter=lfs diff=lfs merge=lfs -text
1952
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_square_source_sink_ep001.gif filter=lfs diff=lfs merge=lfs -text
1953
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_square_source_sink_ep002.gif filter=lfs diff=lfs merge=lfs -text
1954
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_square_source_sink_pair_ep000.gif filter=lfs diff=lfs merge=lfs -text
1955
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_square_source_sink_pair_ep001.gif filter=lfs diff=lfs merge=lfs -text
1956
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_square_source_sink_pair_ep002.gif filter=lfs diff=lfs merge=lfs -text
1957
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_square_turbulent_patch_ep000.gif filter=lfs diff=lfs merge=lfs -text
1958
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_square_turbulent_patch_ep001.gif filter=lfs diff=lfs merge=lfs -text
1959
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_square_turbulent_patch_ep002.gif filter=lfs diff=lfs merge=lfs -text
1960
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_square_uniform_ep000.gif filter=lfs diff=lfs merge=lfs -text
1961
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_square_uniform_ep001.gif filter=lfs diff=lfs merge=lfs -text
1962
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_square_uniform_ep002.gif filter=lfs diff=lfs merge=lfs -text
1963
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_square_vortex_center_ep000.gif filter=lfs diff=lfs merge=lfs -text
1964
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_square_vortex_center_ep001.gif filter=lfs diff=lfs merge=lfs -text
1965
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_square_vortex_center_ep002.gif filter=lfs diff=lfs merge=lfs -text
1966
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_zigzag_double_gyre_ep000.gif filter=lfs diff=lfs merge=lfs -text
1967
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_zigzag_double_gyre_ep001.gif filter=lfs diff=lfs merge=lfs -text
1968
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_zigzag_double_gyre_ep002.gif filter=lfs diff=lfs merge=lfs -text
1969
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_zigzag_gradient_ep000.gif filter=lfs diff=lfs merge=lfs -text
1970
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_zigzag_gradient_ep001.gif filter=lfs diff=lfs merge=lfs -text
1971
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_zigzag_gradient_ep002.gif filter=lfs diff=lfs merge=lfs -text
1972
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_zigzag_noflow_ep000.gif filter=lfs diff=lfs merge=lfs -text
1973
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_zigzag_noflow_ep001.gif filter=lfs diff=lfs merge=lfs -text
1974
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_zigzag_noflow_ep002.gif filter=lfs diff=lfs merge=lfs -text
1975
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_zigzag_random_fourier_ep000.gif filter=lfs diff=lfs merge=lfs -text
1976
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_zigzag_random_fourier_ep001.gif filter=lfs diff=lfs merge=lfs -text
1977
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_zigzag_random_fourier_ep002.gif filter=lfs diff=lfs merge=lfs -text
1978
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_zigzag_shear_ep000.gif filter=lfs diff=lfs merge=lfs -text
1979
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_zigzag_shear_ep001.gif filter=lfs diff=lfs merge=lfs -text
1980
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_zigzag_shear_ep002.gif filter=lfs diff=lfs merge=lfs -text
1981
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_zigzag_source_sink_ep000.gif filter=lfs diff=lfs merge=lfs -text
1982
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_zigzag_source_sink_ep001.gif filter=lfs diff=lfs merge=lfs -text
1983
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_zigzag_source_sink_ep002.gif filter=lfs diff=lfs merge=lfs -text
1984
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_zigzag_source_sink_pair_ep000.gif filter=lfs diff=lfs merge=lfs -text
1985
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_zigzag_source_sink_pair_ep001.gif filter=lfs diff=lfs merge=lfs -text
1986
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_zigzag_source_sink_pair_ep002.gif filter=lfs diff=lfs merge=lfs -text
1987
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_zigzag_turbulent_patch_ep000.gif filter=lfs diff=lfs merge=lfs -text
1988
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_zigzag_turbulent_patch_ep001.gif filter=lfs diff=lfs merge=lfs -text
1989
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_zigzag_turbulent_patch_ep002.gif filter=lfs diff=lfs merge=lfs -text
1990
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_zigzag_uniform_ep000.gif filter=lfs diff=lfs merge=lfs -text
1991
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_zigzag_uniform_ep001.gif filter=lfs diff=lfs merge=lfs -text
1992
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_zigzag_uniform_ep002.gif filter=lfs diff=lfs merge=lfs -text
1993
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_zigzag_vortex_center_ep000.gif filter=lfs diff=lfs merge=lfs -text
1994
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_zigzag_vortex_center_ep001.gif filter=lfs diff=lfs merge=lfs -text
1995
+ experiments/reports/paper_planning/gifs/image_planning_current_estimator_los_controller_inferred_twin_waypoint_zigzag_vortex_center_ep002.gif filter=lfs diff=lfs merge=lfs -text
1996
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_reach_target_double_gyre_ep000.gif filter=lfs diff=lfs merge=lfs -text
1997
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_reach_target_double_gyre_ep002.gif filter=lfs diff=lfs merge=lfs -text
1998
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_reach_target_shear_ep002.gif filter=lfs diff=lfs merge=lfs -text
1999
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_reach_target_source_sink_pair_ep000.gif filter=lfs diff=lfs merge=lfs -text
2000
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_reach_target_source_sink_pair_ep002.gif filter=lfs diff=lfs merge=lfs -text
2001
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_reach_target_uniform_ep000.gif filter=lfs diff=lfs merge=lfs -text
2002
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_reach_target_vortex_center_ep002.gif filter=lfs diff=lfs merge=lfs -text
2003
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_square_double_gyre_ep000.gif filter=lfs diff=lfs merge=lfs -text
2004
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_square_double_gyre_ep001.gif filter=lfs diff=lfs merge=lfs -text
2005
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_square_double_gyre_ep002.gif filter=lfs diff=lfs merge=lfs -text
2006
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_square_gradient_ep000.gif filter=lfs diff=lfs merge=lfs -text
2007
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_square_gradient_ep001.gif filter=lfs diff=lfs merge=lfs -text
2008
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_square_gradient_ep002.gif filter=lfs diff=lfs merge=lfs -text
2009
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_square_noflow_ep000.gif filter=lfs diff=lfs merge=lfs -text
2010
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_square_noflow_ep001.gif filter=lfs diff=lfs merge=lfs -text
2011
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_square_noflow_ep002.gif filter=lfs diff=lfs merge=lfs -text
2012
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_square_random_fourier_ep000.gif filter=lfs diff=lfs merge=lfs -text
2013
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_square_random_fourier_ep001.gif filter=lfs diff=lfs merge=lfs -text
2014
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_square_random_fourier_ep002.gif filter=lfs diff=lfs merge=lfs -text
2015
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_square_shear_ep000.gif filter=lfs diff=lfs merge=lfs -text
2016
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_square_shear_ep001.gif filter=lfs diff=lfs merge=lfs -text
2017
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_square_shear_ep002.gif filter=lfs diff=lfs merge=lfs -text
2018
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_square_source_sink_ep000.gif filter=lfs diff=lfs merge=lfs -text
2019
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_square_source_sink_ep001.gif filter=lfs diff=lfs merge=lfs -text
2020
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_square_source_sink_ep002.gif filter=lfs diff=lfs merge=lfs -text
2021
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_square_source_sink_pair_ep000.gif filter=lfs diff=lfs merge=lfs -text
2022
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_square_source_sink_pair_ep001.gif filter=lfs diff=lfs merge=lfs -text
2023
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_square_source_sink_pair_ep002.gif filter=lfs diff=lfs merge=lfs -text
2024
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_square_turbulent_patch_ep000.gif filter=lfs diff=lfs merge=lfs -text
2025
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_square_turbulent_patch_ep001.gif filter=lfs diff=lfs merge=lfs -text
2026
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_square_turbulent_patch_ep002.gif filter=lfs diff=lfs merge=lfs -text
2027
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_square_uniform_ep000.gif filter=lfs diff=lfs merge=lfs -text
2028
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_square_uniform_ep001.gif filter=lfs diff=lfs merge=lfs -text
2029
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_square_uniform_ep002.gif filter=lfs diff=lfs merge=lfs -text
2030
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_square_vortex_center_ep000.gif filter=lfs diff=lfs merge=lfs -text
2031
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_square_vortex_center_ep001.gif filter=lfs diff=lfs merge=lfs -text
2032
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_square_vortex_center_ep002.gif filter=lfs diff=lfs merge=lfs -text
2033
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_zigzag_double_gyre_ep000.gif filter=lfs diff=lfs merge=lfs -text
2034
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_zigzag_double_gyre_ep001.gif filter=lfs diff=lfs merge=lfs -text
2035
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_zigzag_double_gyre_ep002.gif filter=lfs diff=lfs merge=lfs -text
2036
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_zigzag_gradient_ep000.gif filter=lfs diff=lfs merge=lfs -text
2037
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_zigzag_gradient_ep001.gif filter=lfs diff=lfs merge=lfs -text
2038
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_zigzag_gradient_ep002.gif filter=lfs diff=lfs merge=lfs -text
2039
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_zigzag_noflow_ep000.gif filter=lfs diff=lfs merge=lfs -text
2040
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_zigzag_noflow_ep001.gif filter=lfs diff=lfs merge=lfs -text
2041
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_zigzag_noflow_ep002.gif filter=lfs diff=lfs merge=lfs -text
2042
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_zigzag_random_fourier_ep000.gif filter=lfs diff=lfs merge=lfs -text
2043
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_zigzag_random_fourier_ep001.gif filter=lfs diff=lfs merge=lfs -text
2044
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_zigzag_random_fourier_ep002.gif filter=lfs diff=lfs merge=lfs -text
2045
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_zigzag_shear_ep000.gif filter=lfs diff=lfs merge=lfs -text
2046
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_zigzag_shear_ep001.gif filter=lfs diff=lfs merge=lfs -text
2047
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_zigzag_shear_ep002.gif filter=lfs diff=lfs merge=lfs -text
2048
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_zigzag_source_sink_ep000.gif filter=lfs diff=lfs merge=lfs -text
2049
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_zigzag_source_sink_ep001.gif filter=lfs diff=lfs merge=lfs -text
2050
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_zigzag_source_sink_ep002.gif filter=lfs diff=lfs merge=lfs -text
2051
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_zigzag_source_sink_pair_ep000.gif filter=lfs diff=lfs merge=lfs -text
2052
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_zigzag_source_sink_pair_ep001.gif filter=lfs diff=lfs merge=lfs -text
2053
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_zigzag_source_sink_pair_ep002.gif filter=lfs diff=lfs merge=lfs -text
2054
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_zigzag_turbulent_patch_ep000.gif filter=lfs diff=lfs merge=lfs -text
2055
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_zigzag_turbulent_patch_ep001.gif filter=lfs diff=lfs merge=lfs -text
2056
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_zigzag_turbulent_patch_ep002.gif filter=lfs diff=lfs merge=lfs -text
2057
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_zigzag_uniform_ep000.gif filter=lfs diff=lfs merge=lfs -text
2058
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_zigzag_uniform_ep001.gif filter=lfs diff=lfs merge=lfs -text
2059
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_zigzag_uniform_ep002.gif filter=lfs diff=lfs merge=lfs -text
2060
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_zigzag_vortex_center_ep000.gif filter=lfs diff=lfs merge=lfs -text
2061
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_zigzag_vortex_center_ep001.gif filter=lfs diff=lfs merge=lfs -text
2062
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_triangle_waypoint_zigzag_vortex_center_ep002.gif filter=lfs diff=lfs merge=lfs -text
2063
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_reach_target_gradient_ep002.gif filter=lfs diff=lfs merge=lfs -text
2064
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_reach_target_source_sink_ep002.gif filter=lfs diff=lfs merge=lfs -text
2065
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_reach_target_uniform_ep000.gif filter=lfs diff=lfs merge=lfs -text
2066
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_reach_target_vortex_center_ep002.gif filter=lfs diff=lfs merge=lfs -text
2067
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_square_double_gyre_ep000.gif filter=lfs diff=lfs merge=lfs -text
2068
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_square_double_gyre_ep001.gif filter=lfs diff=lfs merge=lfs -text
2069
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_square_double_gyre_ep002.gif filter=lfs diff=lfs merge=lfs -text
2070
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_square_gradient_ep000.gif filter=lfs diff=lfs merge=lfs -text
2071
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_square_gradient_ep001.gif filter=lfs diff=lfs merge=lfs -text
2072
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_square_gradient_ep002.gif filter=lfs diff=lfs merge=lfs -text
2073
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_square_noflow_ep000.gif filter=lfs diff=lfs merge=lfs -text
2074
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_square_noflow_ep001.gif filter=lfs diff=lfs merge=lfs -text
2075
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_square_random_fourier_ep001.gif filter=lfs diff=lfs merge=lfs -text
2076
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_square_shear_ep001.gif filter=lfs diff=lfs merge=lfs -text
2077
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_square_shear_ep002.gif filter=lfs diff=lfs merge=lfs -text
2078
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_square_source_sink_ep000.gif filter=lfs diff=lfs merge=lfs -text
2079
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_square_source_sink_ep001.gif filter=lfs diff=lfs merge=lfs -text
2080
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_square_source_sink_ep002.gif filter=lfs diff=lfs merge=lfs -text
2081
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_square_source_sink_pair_ep000.gif filter=lfs diff=lfs merge=lfs -text
2082
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_square_source_sink_pair_ep001.gif filter=lfs diff=lfs merge=lfs -text
2083
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_square_source_sink_pair_ep002.gif filter=lfs diff=lfs merge=lfs -text
2084
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_square_turbulent_patch_ep000.gif filter=lfs diff=lfs merge=lfs -text
2085
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_square_turbulent_patch_ep001.gif filter=lfs diff=lfs merge=lfs -text
2086
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_square_turbulent_patch_ep002.gif filter=lfs diff=lfs merge=lfs -text
2087
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_square_uniform_ep000.gif filter=lfs diff=lfs merge=lfs -text
2088
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_square_uniform_ep001.gif filter=lfs diff=lfs merge=lfs -text
2089
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_square_uniform_ep002.gif filter=lfs diff=lfs merge=lfs -text
2090
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_square_vortex_center_ep000.gif filter=lfs diff=lfs merge=lfs -text
2091
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_square_vortex_center_ep001.gif filter=lfs diff=lfs merge=lfs -text
2092
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_square_vortex_center_ep002.gif filter=lfs diff=lfs merge=lfs -text
2093
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_zigzag_double_gyre_ep000.gif filter=lfs diff=lfs merge=lfs -text
2094
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_zigzag_double_gyre_ep001.gif filter=lfs diff=lfs merge=lfs -text
2095
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_zigzag_double_gyre_ep002.gif filter=lfs diff=lfs merge=lfs -text
2096
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_zigzag_gradient_ep000.gif filter=lfs diff=lfs merge=lfs -text
2097
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_zigzag_gradient_ep001.gif filter=lfs diff=lfs merge=lfs -text
2098
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_zigzag_gradient_ep002.gif filter=lfs diff=lfs merge=lfs -text
2099
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_zigzag_noflow_ep000.gif filter=lfs diff=lfs merge=lfs -text
2100
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_zigzag_noflow_ep001.gif filter=lfs diff=lfs merge=lfs -text
2101
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_zigzag_noflow_ep002.gif filter=lfs diff=lfs merge=lfs -text
2102
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_zigzag_random_fourier_ep000.gif filter=lfs diff=lfs merge=lfs -text
2103
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_zigzag_random_fourier_ep001.gif filter=lfs diff=lfs merge=lfs -text
2104
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_zigzag_random_fourier_ep002.gif filter=lfs diff=lfs merge=lfs -text
2105
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_zigzag_shear_ep000.gif filter=lfs diff=lfs merge=lfs -text
2106
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_zigzag_shear_ep001.gif filter=lfs diff=lfs merge=lfs -text
2107
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_zigzag_shear_ep002.gif filter=lfs diff=lfs merge=lfs -text
2108
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_zigzag_source_sink_ep000.gif filter=lfs diff=lfs merge=lfs -text
2109
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_zigzag_source_sink_ep001.gif filter=lfs diff=lfs merge=lfs -text
2110
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_zigzag_source_sink_ep002.gif filter=lfs diff=lfs merge=lfs -text
2111
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_zigzag_source_sink_pair_ep000.gif filter=lfs diff=lfs merge=lfs -text
2112
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_zigzag_source_sink_pair_ep001.gif filter=lfs diff=lfs merge=lfs -text
2113
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_zigzag_source_sink_pair_ep002.gif filter=lfs diff=lfs merge=lfs -text
2114
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_zigzag_turbulent_patch_ep000.gif filter=lfs diff=lfs merge=lfs -text
2115
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_zigzag_turbulent_patch_ep001.gif filter=lfs diff=lfs merge=lfs -text
2116
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_zigzag_turbulent_patch_ep002.gif filter=lfs diff=lfs merge=lfs -text
2117
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_zigzag_uniform_ep000.gif filter=lfs diff=lfs merge=lfs -text
2118
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_zigzag_uniform_ep001.gif filter=lfs diff=lfs merge=lfs -text
2119
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_zigzag_uniform_ep002.gif filter=lfs diff=lfs merge=lfs -text
2120
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_zigzag_vortex_center_ep000.gif filter=lfs diff=lfs merge=lfs -text
2121
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_zigzag_vortex_center_ep001.gif filter=lfs diff=lfs merge=lfs -text
2122
+ experiments/reports/paper_planning/gifs/image_planning_no_flow_los_controller_inferred_twin_waypoint_zigzag_vortex_center_ep002.gif filter=lfs diff=lfs merge=lfs -text
2123
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_reach_target_double_gyre_ep000.gif filter=lfs diff=lfs merge=lfs -text
2124
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_reach_target_double_gyre_ep002.gif filter=lfs diff=lfs merge=lfs -text
2125
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_reach_target_shear_ep002.gif filter=lfs diff=lfs merge=lfs -text
2126
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_reach_target_source_sink_pair_ep000.gif filter=lfs diff=lfs merge=lfs -text
2127
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_reach_target_source_sink_pair_ep002.gif filter=lfs diff=lfs merge=lfs -text
2128
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_reach_target_uniform_ep000.gif filter=lfs diff=lfs merge=lfs -text
2129
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_reach_target_vortex_center_ep002.gif filter=lfs diff=lfs merge=lfs -text
2130
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_square_double_gyre_ep000.gif filter=lfs diff=lfs merge=lfs -text
2131
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_square_double_gyre_ep001.gif filter=lfs diff=lfs merge=lfs -text
2132
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_square_double_gyre_ep002.gif filter=lfs diff=lfs merge=lfs -text
2133
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_square_gradient_ep000.gif filter=lfs diff=lfs merge=lfs -text
2134
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_square_gradient_ep001.gif filter=lfs diff=lfs merge=lfs -text
2135
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_square_gradient_ep002.gif filter=lfs diff=lfs merge=lfs -text
2136
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_square_noflow_ep000.gif filter=lfs diff=lfs merge=lfs -text
2137
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_square_noflow_ep001.gif filter=lfs diff=lfs merge=lfs -text
2138
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_square_noflow_ep002.gif filter=lfs diff=lfs merge=lfs -text
2139
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_square_random_fourier_ep000.gif filter=lfs diff=lfs merge=lfs -text
2140
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_square_random_fourier_ep001.gif filter=lfs diff=lfs merge=lfs -text
2141
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_square_random_fourier_ep002.gif filter=lfs diff=lfs merge=lfs -text
2142
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_square_shear_ep000.gif filter=lfs diff=lfs merge=lfs -text
2143
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_square_shear_ep001.gif filter=lfs diff=lfs merge=lfs -text
2144
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_square_shear_ep002.gif filter=lfs diff=lfs merge=lfs -text
2145
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_square_source_sink_ep000.gif filter=lfs diff=lfs merge=lfs -text
2146
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_square_source_sink_ep001.gif filter=lfs diff=lfs merge=lfs -text
2147
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_square_source_sink_ep002.gif filter=lfs diff=lfs merge=lfs -text
2148
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_square_source_sink_pair_ep000.gif filter=lfs diff=lfs merge=lfs -text
2149
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_square_source_sink_pair_ep001.gif filter=lfs diff=lfs merge=lfs -text
2150
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_square_source_sink_pair_ep002.gif filter=lfs diff=lfs merge=lfs -text
2151
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_square_turbulent_patch_ep000.gif filter=lfs diff=lfs merge=lfs -text
2152
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_square_turbulent_patch_ep001.gif filter=lfs diff=lfs merge=lfs -text
2153
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_square_turbulent_patch_ep002.gif filter=lfs diff=lfs merge=lfs -text
2154
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_square_uniform_ep000.gif filter=lfs diff=lfs merge=lfs -text
2155
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_square_uniform_ep001.gif filter=lfs diff=lfs merge=lfs -text
2156
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_square_uniform_ep002.gif filter=lfs diff=lfs merge=lfs -text
2157
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_square_vortex_center_ep000.gif filter=lfs diff=lfs merge=lfs -text
2158
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_square_vortex_center_ep001.gif filter=lfs diff=lfs merge=lfs -text
2159
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_square_vortex_center_ep002.gif filter=lfs diff=lfs merge=lfs -text
2160
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_zigzag_double_gyre_ep000.gif filter=lfs diff=lfs merge=lfs -text
2161
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_zigzag_double_gyre_ep001.gif filter=lfs diff=lfs merge=lfs -text
2162
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_zigzag_double_gyre_ep002.gif filter=lfs diff=lfs merge=lfs -text
2163
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_zigzag_gradient_ep000.gif filter=lfs diff=lfs merge=lfs -text
2164
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_zigzag_gradient_ep001.gif filter=lfs diff=lfs merge=lfs -text
2165
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_zigzag_gradient_ep002.gif filter=lfs diff=lfs merge=lfs -text
2166
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_zigzag_noflow_ep000.gif filter=lfs diff=lfs merge=lfs -text
2167
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_zigzag_noflow_ep001.gif filter=lfs diff=lfs merge=lfs -text
2168
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_zigzag_noflow_ep002.gif filter=lfs diff=lfs merge=lfs -text
2169
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_zigzag_random_fourier_ep000.gif filter=lfs diff=lfs merge=lfs -text
2170
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_zigzag_random_fourier_ep001.gif filter=lfs diff=lfs merge=lfs -text
2171
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_zigzag_random_fourier_ep002.gif filter=lfs diff=lfs merge=lfs -text
2172
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_zigzag_shear_ep000.gif filter=lfs diff=lfs merge=lfs -text
2173
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_zigzag_shear_ep001.gif filter=lfs diff=lfs merge=lfs -text
2174
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_zigzag_shear_ep002.gif filter=lfs diff=lfs merge=lfs -text
2175
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_zigzag_source_sink_ep000.gif filter=lfs diff=lfs merge=lfs -text
2176
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_zigzag_source_sink_ep001.gif filter=lfs diff=lfs merge=lfs -text
2177
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_zigzag_source_sink_ep002.gif filter=lfs diff=lfs merge=lfs -text
2178
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_zigzag_source_sink_pair_ep000.gif filter=lfs diff=lfs merge=lfs -text
2179
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_zigzag_source_sink_pair_ep001.gif filter=lfs diff=lfs merge=lfs -text
2180
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_zigzag_source_sink_pair_ep002.gif filter=lfs diff=lfs merge=lfs -text
2181
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_zigzag_turbulent_patch_ep000.gif filter=lfs diff=lfs merge=lfs -text
2182
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_zigzag_turbulent_patch_ep001.gif filter=lfs diff=lfs merge=lfs -text
2183
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_zigzag_turbulent_patch_ep002.gif filter=lfs diff=lfs merge=lfs -text
2184
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_zigzag_uniform_ep000.gif filter=lfs diff=lfs merge=lfs -text
2185
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_zigzag_uniform_ep001.gif filter=lfs diff=lfs merge=lfs -text
2186
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_zigzag_uniform_ep002.gif filter=lfs diff=lfs merge=lfs -text
2187
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_zigzag_vortex_center_ep000.gif filter=lfs diff=lfs merge=lfs -text
2188
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_zigzag_vortex_center_ep001.gif filter=lfs diff=lfs merge=lfs -text
2189
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_triangle_waypoint_zigzag_vortex_center_ep002.gif filter=lfs diff=lfs merge=lfs -text
2190
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_reach_target_gradient_ep002.gif filter=lfs diff=lfs merge=lfs -text
2191
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_reach_target_source_sink_ep002.gif filter=lfs diff=lfs merge=lfs -text
2192
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_reach_target_uniform_ep000.gif filter=lfs diff=lfs merge=lfs -text
2193
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_reach_target_vortex_center_ep002.gif filter=lfs diff=lfs merge=lfs -text
2194
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_station_keeping_random_fourier_ep001.gif filter=lfs diff=lfs merge=lfs -text
2195
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_station_keeping_source_sink_pair_ep001.gif filter=lfs diff=lfs merge=lfs -text
2196
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_station_keeping_uniform_ep001.gif filter=lfs diff=lfs merge=lfs -text
2197
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_station_keeping_vortex_center_ep001.gif filter=lfs diff=lfs merge=lfs -text
2198
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_square_double_gyre_ep000.gif filter=lfs diff=lfs merge=lfs -text
2199
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_square_double_gyre_ep001.gif filter=lfs diff=lfs merge=lfs -text
2200
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_square_double_gyre_ep002.gif filter=lfs diff=lfs merge=lfs -text
2201
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_square_gradient_ep000.gif filter=lfs diff=lfs merge=lfs -text
2202
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_square_gradient_ep001.gif filter=lfs diff=lfs merge=lfs -text
2203
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_square_gradient_ep002.gif filter=lfs diff=lfs merge=lfs -text
2204
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_square_noflow_ep000.gif filter=lfs diff=lfs merge=lfs -text
2205
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_square_noflow_ep001.gif filter=lfs diff=lfs merge=lfs -text
2206
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_square_random_fourier_ep001.gif filter=lfs diff=lfs merge=lfs -text
2207
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_square_random_fourier_ep002.gif filter=lfs diff=lfs merge=lfs -text
2208
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_square_shear_ep002.gif filter=lfs diff=lfs merge=lfs -text
2209
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_square_source_sink_ep000.gif filter=lfs diff=lfs merge=lfs -text
2210
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_square_source_sink_ep001.gif filter=lfs diff=lfs merge=lfs -text
2211
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_square_source_sink_ep002.gif filter=lfs diff=lfs merge=lfs -text
2212
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_square_source_sink_pair_ep000.gif filter=lfs diff=lfs merge=lfs -text
2213
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_square_source_sink_pair_ep001.gif filter=lfs diff=lfs merge=lfs -text
2214
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_square_source_sink_pair_ep002.gif filter=lfs diff=lfs merge=lfs -text
2215
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_square_turbulent_patch_ep000.gif filter=lfs diff=lfs merge=lfs -text
2216
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_square_turbulent_patch_ep001.gif filter=lfs diff=lfs merge=lfs -text
2217
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_square_turbulent_patch_ep002.gif filter=lfs diff=lfs merge=lfs -text
2218
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_square_uniform_ep000.gif filter=lfs diff=lfs merge=lfs -text
2219
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_square_uniform_ep001.gif filter=lfs diff=lfs merge=lfs -text
2220
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_square_uniform_ep002.gif filter=lfs diff=lfs merge=lfs -text
2221
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_square_vortex_center_ep000.gif filter=lfs diff=lfs merge=lfs -text
2222
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_square_vortex_center_ep001.gif filter=lfs diff=lfs merge=lfs -text
2223
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_square_vortex_center_ep002.gif filter=lfs diff=lfs merge=lfs -text
2224
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_zigzag_double_gyre_ep000.gif filter=lfs diff=lfs merge=lfs -text
2225
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_zigzag_double_gyre_ep001.gif filter=lfs diff=lfs merge=lfs -text
2226
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_zigzag_double_gyre_ep002.gif filter=lfs diff=lfs merge=lfs -text
2227
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_zigzag_gradient_ep000.gif filter=lfs diff=lfs merge=lfs -text
2228
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_zigzag_gradient_ep001.gif filter=lfs diff=lfs merge=lfs -text
2229
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_zigzag_gradient_ep002.gif filter=lfs diff=lfs merge=lfs -text
2230
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_zigzag_noflow_ep000.gif filter=lfs diff=lfs merge=lfs -text
2231
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_zigzag_noflow_ep001.gif filter=lfs diff=lfs merge=lfs -text
2232
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_zigzag_noflow_ep002.gif filter=lfs diff=lfs merge=lfs -text
2233
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_zigzag_random_fourier_ep000.gif filter=lfs diff=lfs merge=lfs -text
2234
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_zigzag_random_fourier_ep001.gif filter=lfs diff=lfs merge=lfs -text
2235
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_zigzag_random_fourier_ep002.gif filter=lfs diff=lfs merge=lfs -text
2236
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_zigzag_shear_ep000.gif filter=lfs diff=lfs merge=lfs -text
2237
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_zigzag_shear_ep001.gif filter=lfs diff=lfs merge=lfs -text
2238
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_zigzag_shear_ep002.gif filter=lfs diff=lfs merge=lfs -text
2239
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_zigzag_source_sink_ep000.gif filter=lfs diff=lfs merge=lfs -text
2240
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_zigzag_source_sink_ep001.gif filter=lfs diff=lfs merge=lfs -text
2241
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_zigzag_source_sink_ep002.gif filter=lfs diff=lfs merge=lfs -text
2242
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_zigzag_source_sink_pair_ep000.gif filter=lfs diff=lfs merge=lfs -text
2243
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_zigzag_source_sink_pair_ep001.gif filter=lfs diff=lfs merge=lfs -text
2244
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_zigzag_source_sink_pair_ep002.gif filter=lfs diff=lfs merge=lfs -text
2245
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_zigzag_turbulent_patch_ep000.gif filter=lfs diff=lfs merge=lfs -text
2246
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_zigzag_turbulent_patch_ep001.gif filter=lfs diff=lfs merge=lfs -text
2247
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_zigzag_turbulent_patch_ep002.gif filter=lfs diff=lfs merge=lfs -text
2248
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_zigzag_uniform_ep000.gif filter=lfs diff=lfs merge=lfs -text
2249
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_zigzag_uniform_ep001.gif filter=lfs diff=lfs merge=lfs -text
2250
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_zigzag_uniform_ep002.gif filter=lfs diff=lfs merge=lfs -text
2251
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_zigzag_vortex_center_ep000.gif filter=lfs diff=lfs merge=lfs -text
2252
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_zigzag_vortex_center_ep001.gif filter=lfs diff=lfs merge=lfs -text
2253
+ experiments/reports/paper_planning/gifs/image_planning_oracle_flow_los_controller_inferred_twin_waypoint_zigzag_vortex_center_ep002.gif filter=lfs diff=lfs merge=lfs -text
experiments/BASELINES.md CHANGED
@@ -29,9 +29,9 @@ Purpose: compare downstream behavior against hand-designed controllers that do n
29
  | Directory | Report Name | Why It Is Included |
30
  |---|---|---|
31
  | `pid_los_controller` | PID/LOS controller | Simple classical waypoint tracking baseline. |
32
- | `physics_mpc_no_flow` | Physics MPC No-Flow | Nominal dynamics controller that ignores ambient current. |
33
- | `current_estimator_mpc` | Current-Estimator MPC | Strong classical baseline that estimates current from recent drift. |
34
- | `oracle_flow_mpc` | Oracle-Flow MPC | Reference bound using true local flow from the simulator. |
35
 
36
  Comparison outputs:
37
 
 
29
  | Directory | Report Name | Why It Is Included |
30
  |---|---|---|
31
  | `pid_los_controller` | PID/LOS controller | Simple classical waypoint tracking baseline. |
32
+ | `no_flow_los_controller` | No-Flow LOS Controller | Geometric line-of-sight controller that ignores ambient current. |
33
+ | `current_estimator_los_controller` | Current-Estimator LOS Controller | Strong classical baseline that estimates current from recent drift. |
34
+ | `oracle_flow_los_controller` | Oracle-Flow LOS Controller | Geometric line-of-sight controller with true local flow feed-forward. |
35
 
36
  Comparison outputs:
37
 
experiments/EXPERIMENT_MATRIX.md CHANGED
@@ -110,9 +110,9 @@ Traditional non-WM controllers:
110
  | Method | Comparison Role | What It Tests |
111
  |---|---|---|
112
  | `pid_los_controller` | Simple classical controller | Baseline waypoint tracking without learned dynamics. |
113
- | `physics_mpc_no_flow` | Nominal physics MPC | Effect of ignoring hidden current. |
114
- | `current_estimator_mpc` | Current-compensated classical MPC | Strength of a hand-designed drift estimator. |
115
- | `oracle_flow_mpc` | Oracle reference | Reference performance when true local flow is available. |
116
 
117
  Planning tasks:
118
 
 
110
  | Method | Comparison Role | What It Tests |
111
  |---|---|---|
112
  | `pid_los_controller` | Simple classical controller | Baseline waypoint tracking without learned dynamics. |
113
+ | `no_flow_los_controller` | No-flow LOS controller | Effect of ignoring hidden current in a geometric controller. |
114
+ | `current_estimator_los_controller` | Current-estimator LOS controller | Strength of a hand-designed drift estimator in a geometric controller. |
115
+ | `oracle_flow_los_controller` | Oracle-flow LOS controller | Effect of true local flow feed-forward in a geometric controller. |
116
 
117
  Planning tasks:
118
 
experiments/METHOD_AUDIT.md CHANGED
@@ -16,9 +16,9 @@ This document records what each paper-facing method implements and what comparis
16
  | Method | Input | Controller Type | Comparison Purpose |
17
  |---|---|---|---|
18
  | PID/LOS controller | Clean image pose estimate | Line-of-sight waypoint tracking | Simple hand-designed tracking baseline. |
19
- | Physics MPC No-Flow | Clean image pose estimate | MPC with nominal boat dynamics | Measures the cost of ignoring external current. |
20
- | Current-Estimator MPC | Clean image pose estimate and recent drift | MPC with estimated current | Strong classical current-compensation baseline. |
21
- | Oracle-Flow MPC | Clean image pose estimate and simulator local flow | MPC with true local current | Reference bound for downstream planning. |
22
 
23
  ## Architecture Difference Checklist
24
 
 
16
  | Method | Input | Controller Type | Comparison Purpose |
17
  |---|---|---|---|
18
  | PID/LOS controller | Clean image pose estimate | Line-of-sight waypoint tracking | Simple hand-designed tracking baseline. |
19
+ | No-Flow LOS Controller | Clean image pose estimate | MPC with nominal boat dynamics | Measures the cost of ignoring external current. |
20
+ | Current-Estimator LOS Controller | Clean image pose estimate and recent drift | MPC with estimated current | Strong classical current-compensation baseline. |
21
+ | Oracle-Flow LOS Controller | Clean image pose estimate and simulator local flow | MPC with true local current | Reference bound for downstream planning. |
22
 
23
  ## Architecture Difference Checklist
24
 
experiments/README.md CHANGED
@@ -22,9 +22,9 @@ Purpose of Category A: compare world-model architectures under identical image d
22
  Category B traditional controllers:
23
 
24
  - **PID/LOS controller**
25
- - **Physics MPC No-Flow**
26
- - **Current-Estimator MPC**
27
- - **Oracle-Flow MPC**
28
 
29
  Purpose of Category B: compare downstream task behavior against non-neural controllers that do not train a world model.
30
 
 
22
  Category B traditional controllers:
23
 
24
  - **PID/LOS controller**
25
+ - **No-Flow LOS Controller**
26
+ - **Current-Estimator LOS Controller**
27
+ - **Oracle-Flow LOS Controller**
28
 
29
  Purpose of Category B: compare downstream task behavior against non-neural controllers that do not train a world model.
30
 
experiments/TASK_PLAN.md CHANGED
@@ -80,9 +80,9 @@ Compared methods:
80
  | Method | Purpose |
81
  |---|---|
82
  | `pid_los_controller` | Classical line-of-sight waypoint tracking. Tests a simple hand-designed controller. |
83
- | `physics_mpc_no_flow` | Physics MPC without external-current compensation. Tests how much hidden flow hurts a nominal dynamics controller. |
84
- | `current_estimator_mpc` | MPC with recent-drift current estimation. Tests a strong classical current-compensation baseline. |
85
- | `oracle_flow_mpc` | MPC with simulator true local flow. Provides a reference upper bound for classical planning. |
86
 
87
  Planning tasks:
88
 
 
80
  | Method | Purpose |
81
  |---|---|
82
  | `pid_los_controller` | Classical line-of-sight waypoint tracking. Tests a simple hand-designed controller. |
83
+ | `no_flow_los_controller` | No-flow LOS controller without external-current compensation. Tests how much hidden flow hurts a nominal dynamics controller. |
84
+ | `current_estimator_los_controller` | LOS controller with recent-drift current estimation. Tests a strong classical current-compensation baseline. |
85
+ | `oracle_flow_los_controller` | LOS controller with simulator true local flow feed-forward. Tests whether local flow feed-forward helps a simple geometric controller; it is not a full dynamics-MPC upper bound. |
86
 
87
  Planning tasks:
88
 
experiments/current_estimator_los_controller/README.md ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ # Current-Estimator LOS Controller Baseline
2
+
3
+ Traditional line-of-sight controller with an online image-history estimate of recent drift.
experiments/current_estimator_los_controller/__init__.py ADDED
@@ -0,0 +1 @@
 
 
1
+ """Current-estimator line-of-sight controller experiment package."""
experiments/current_estimator_los_controller/checkpoint/.gitkeep ADDED
File without changes
experiments/current_estimator_los_controller/result/.gitkeep ADDED
File without changes
experiments/current_estimator_los_controller/src/__init__.py ADDED
@@ -0,0 +1 @@
 
 
1
+ """Current-estimator line-of-sight controller source package."""
experiments/current_estimator_los_controller/src/config.py ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ """Current-estimator line-of-sight controller config."""
2
+
3
+
4
+ def default_config():
5
+ return {"goal": [8.0, 8.0], "gain": 0.65, "current_gain": 0.5}
experiments/current_estimator_los_controller/src/controller.py ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Line-of-sight controller with online current estimate."""
2
+
3
+ import numpy as np
4
+
5
+ from experiments.shared.src.control.geometric import goal_action
6
+ from experiments.shared.src.vision.pose_from_image import estimate_pose_from_clean_image
7
+
8
+ def plan(state, current_estimate, task, config):
9
+ pose = estimate_pose_from_clean_image(state)
10
+ goal = np.asarray(task["goal"], dtype=np.float32)
11
+ return goal_action(
12
+ pose,
13
+ goal,
14
+ int(config["action_dim"]),
15
+ float(config["gain"]),
16
+ 0.6,
17
+ drift=np.asarray(current_estimate, dtype=np.float32),
18
+ drift_gain=float(config["current_gain"]),
19
+ )
experiments/current_estimator_los_controller/src/estimator.py ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ """Online current estimator."""
2
+
3
+ import numpy as np
4
+
5
+ from experiments.shared.src.vision.pose_from_image import estimate_pose_from_clean_image
6
+
7
+ def estimate_current(history, config):
8
+ poses = np.stack([estimate_pose_from_clean_image(img) for img in history], axis=0)
9
+ return poses[-1, :2] - poses[0, :2]
experiments/current_estimator_los_controller/src/evaluate.py ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ """Current-estimator line-of-sight controller evaluation."""
2
+
3
+ from experiments.current_estimator_los_controller.src.config import default_config
4
+ from experiments.current_estimator_los_controller.src.controller import plan
5
+ from experiments.current_estimator_los_controller.src.estimator import estimate_current
6
+
7
+ def evaluate(config):
8
+ cfg = default_config() | config
9
+ current = estimate_current(config["history"], cfg)
10
+ return plan(config["history"][-1], current, {"goal": cfg["goal"]}, cfg)
experiments/docs/EXPERIMENT_PROTOCOL.md CHANGED
@@ -26,9 +26,9 @@ Purpose: compare downstream behavior against non-neural controllers that do not
26
  | Directory | Report Name | Input | Comparison Purpose |
27
  |---|---|---|---|
28
  | `pid_los_controller` | PID/LOS | Clean image pose estimate | Simple hand-designed waypoint tracking baseline. |
29
- | `physics_mpc_no_flow` | Physics MPC No-Flow | Clean image pose estimate | Measures the cost of ignoring ambient current. |
30
- | `current_estimator_mpc` | Current-Estimator MPC | Clean image pose estimate and recent drift | Strong classical current-compensation baseline. |
31
- | `oracle_flow_mpc` | Oracle-Flow MPC | Clean image pose estimate and simulator local flow | Reference bound for control when true local flow is available. |
32
 
33
  ## Data
34
 
@@ -138,9 +138,9 @@ Traditional non-WM controllers:
138
 
139
  ```text
140
  pid_los_controller
141
- physics_mpc_no_flow
142
- current_estimator_mpc
143
- oracle_flow_mpc
144
  ```
145
 
146
  Tasks:
 
26
  | Directory | Report Name | Input | Comparison Purpose |
27
  |---|---|---|---|
28
  | `pid_los_controller` | PID/LOS | Clean image pose estimate | Simple hand-designed waypoint tracking baseline. |
29
+ | `no_flow_los_controller` | No-Flow LOS Controller | Clean image pose estimate | Measures the cost of ignoring ambient current. |
30
+ | `current_estimator_los_controller` | Current-Estimator LOS Controller | Clean image pose estimate and recent drift | Strong classical current-compensation baseline. |
31
+ | `oracle_flow_los_controller` | Oracle-Flow LOS Controller | Clean image pose estimate and simulator local flow | True-local-flow feed-forward reference for a simple geometric controller, not a full dynamics-MPC upper bound. |
32
 
33
  ## Data
34
 
 
138
 
139
  ```text
140
  pid_los_controller
141
+ no_flow_los_controller
142
+ current_estimator_los_controller
143
+ oracle_flow_los_controller
144
  ```
145
 
146
  Tasks:
experiments/export_paper_artifacts.py ADDED
@@ -0,0 +1,1198 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """Export paper figures, tables, raw data, and provenance files.
3
+
4
+ All values are read from experiments/reports/*.json and GIF frames are
5
+ extracted from experiments/reports/paper_planning/gifs/*.gif.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import csv
11
+ import json
12
+ import math
13
+ import re
14
+ import shutil
15
+ from collections import defaultdict
16
+ from dataclasses import dataclass
17
+ from pathlib import Path
18
+ from typing import Any, Iterable
19
+
20
+ from PIL import Image, ImageDraw, ImageFont, ImageSequence
21
+
22
+
23
+ ROOT = Path(__file__).resolve().parents[1]
24
+ REPORTS = ROOT / "experiments" / "reports"
25
+ PLANNING_DIR = REPORTS / "paper_planning"
26
+ GIF_DIR = PLANNING_DIR / "gifs"
27
+ OUT = REPORTS / "paper_artifacts"
28
+
29
+ PREDICTION_JSON = REPORTS / "paper_prediction.json"
30
+ PROBE_JSON = REPORTS / "paper_flowmo_latent_probes.json"
31
+
32
+ TASK_ORDER = ["reach_target", "station_keeping", "waypoint_square", "waypoint_zigzag"]
33
+ BOAT_ORDER = ["twin", "triangle"]
34
+ FLOW_ORDER = [
35
+ "noflow",
36
+ "uniform",
37
+ "vortex_center",
38
+ "double_gyre",
39
+ "source_sink",
40
+ "source_sink_pair",
41
+ "gradient",
42
+ "shear",
43
+ "turbulent_patch",
44
+ "random_fourier",
45
+ ]
46
+ METHOD_ORDER = [
47
+ "flowmo",
48
+ "leworldmodel",
49
+ "planet",
50
+ "tdmpc2",
51
+ "pid_los_controller",
52
+ "no_flow_los_controller",
53
+ "current_estimator_los_controller",
54
+ "oracle_flow_los_controller",
55
+ ]
56
+ LEARNED_METHODS = ["flowmo", "leworldmodel", "planet", "tdmpc2"]
57
+ TRADITIONAL_METHODS = [
58
+ "pid_los_controller",
59
+ "no_flow_los_controller",
60
+ "current_estimator_los_controller",
61
+ "oracle_flow_los_controller",
62
+ ]
63
+
64
+ METHOD_LABEL = {
65
+ "flowmo": "FlowMo-WM",
66
+ "leworldmodel": "LeWorldModel",
67
+ "planet": "PlaNet/RSSM",
68
+ "tdmpc2": "TD-MPC2",
69
+ "pid_los_controller": "PID/LOS",
70
+ "no_flow_los_controller": "No-Flow LOS",
71
+ "current_estimator_los_controller": "Current-Estimator LOS",
72
+ "oracle_flow_los_controller": "Oracle-Flow LOS",
73
+ }
74
+ METHOD_SHORT = {
75
+ "flowmo": "FlowMo",
76
+ "leworldmodel": "LeWM",
77
+ "planet": "RSSM",
78
+ "tdmpc2": "TD2",
79
+ "pid_los_controller": "PID",
80
+ "no_flow_los_controller": "LOS0",
81
+ "current_estimator_los_controller": "LOSest",
82
+ "oracle_flow_los_controller": "LOSorc",
83
+ }
84
+ TASK_LABEL = {
85
+ "reach_target": "Reach",
86
+ "station_keeping": "Station",
87
+ "waypoint_square": "Square",
88
+ "waypoint_zigzag": "Zigzag",
89
+ }
90
+ BOAT_LABEL = {"twin": "Twin", "triangle": "Triangle"}
91
+ FLOW_LABEL = {
92
+ "noflow": "No flow",
93
+ "uniform": "Uniform",
94
+ "vortex_center": "Vortex",
95
+ "double_gyre": "Double gyre",
96
+ "source_sink": "Source/sink",
97
+ "source_sink_pair": "Src/sink pair",
98
+ "gradient": "Gradient",
99
+ "shear": "Shear",
100
+ "turbulent_patch": "Turbulent",
101
+ "random_fourier": "Fourier",
102
+ }
103
+
104
+ HORIZONS = [1, 3, 6, 8, 10, 20, 30, 40, 60]
105
+ FIG3_TASK_FLOW = {
106
+ "reach_target": "uniform",
107
+ "station_keeping": "vortex_center",
108
+ "waypoint_square": "gradient",
109
+ "waypoint_zigzag": "random_fourier",
110
+ }
111
+ FIG3_EPISODE = 0
112
+ METHOD_COLORS = {
113
+ "flowmo": (31, 119, 180),
114
+ "leworldmodel": (255, 127, 14),
115
+ "planet": (44, 160, 44),
116
+ "tdmpc2": (148, 103, 189),
117
+ "pid_los_controller": (127, 127, 127),
118
+ "no_flow_los_controller": (214, 39, 40),
119
+ "current_estimator_los_controller": (23, 190, 207),
120
+ "oracle_flow_los_controller": (140, 86, 75),
121
+ }
122
+
123
+
124
+ @dataclass(frozen=True)
125
+ class SummaryRecord:
126
+ source_file: str
127
+ item_index: int
128
+ method: str
129
+ task: str
130
+ boat: str
131
+ flow_type: str
132
+ context_mode: str
133
+ episodes: int
134
+ successes: int
135
+ success_rate: float
136
+ final_distance_mean: float
137
+ mean_min_goal_distance: float
138
+ path_length_success_mean: float | None
139
+ energy_success_mean: float | None
140
+ steps_success_mean: float | None
141
+
142
+
143
+ @dataclass(frozen=True)
144
+ class EpisodeRecord:
145
+ source_file: str
146
+ item_index: int
147
+ result_index: int
148
+ method: str
149
+ task: str
150
+ boat: str
151
+ flow_type: str
152
+ context_mode: str
153
+ episode: int
154
+ success: bool
155
+ final_distance: float
156
+ mean_min_goal_distance: float
157
+ energy: float | None
158
+ path_length: float | None
159
+ steps: int | None
160
+
161
+
162
+ def rel(path: Path) -> str:
163
+ return str(path.relative_to(ROOT))
164
+
165
+
166
+ def ensure_dir(path: Path) -> None:
167
+ path.mkdir(parents=True, exist_ok=True)
168
+
169
+
170
+ def read_json(path: Path) -> Any:
171
+ with path.open("r", encoding="utf-8") as f:
172
+ return json.load(f)
173
+
174
+
175
+ def write_text(path: Path, text: str) -> None:
176
+ ensure_dir(path.parent)
177
+ path.write_text(text, encoding="utf-8")
178
+
179
+
180
+ def safe_float(value: Any) -> float | None:
181
+ if value is None:
182
+ return None
183
+ if isinstance(value, float) and math.isnan(value):
184
+ return None
185
+ return float(value)
186
+
187
+
188
+ def fmt(value: float | int | None, digits: int = 3) -> str:
189
+ if value is None:
190
+ return "--"
191
+ if isinstance(value, float) and math.isnan(value):
192
+ return "--"
193
+ return f"{float(value):.{digits}f}"
194
+
195
+
196
+ def pct(value: float | None, digits: int = 1) -> str:
197
+ if value is None:
198
+ return "--"
199
+ return f"{100.0 * float(value):.{digits}f}"
200
+
201
+
202
+ def latex_escape(text: str) -> str:
203
+ repl = {
204
+ "\\": r"\textbackslash{}",
205
+ "&": r"\&",
206
+ "%": r"\%",
207
+ "$": r"\$",
208
+ "#": r"\#",
209
+ "_": r"\_",
210
+ "{": r"\{",
211
+ "}": r"\}",
212
+ "~": r"\textasciitilde{}",
213
+ "^": r"\textasciicircum{}",
214
+ }
215
+ return "".join(repl.get(ch, ch) for ch in text)
216
+
217
+
218
+ def write_table(path: Path, header: list[str], rows: list[list[str]], caption: str, label: str) -> None:
219
+ colspec = "l" * len(header)
220
+ lines = [
221
+ r"\begin{table*}[t]",
222
+ r"\centering",
223
+ rf"\caption{{{caption}}}",
224
+ rf"\label{{{label}}}",
225
+ r"\scriptsize",
226
+ rf"\begin{{tabular}}{{{colspec}}}",
227
+ r"\toprule",
228
+ " & ".join(latex_escape(h) for h in header) + r" \\",
229
+ r"\midrule",
230
+ ]
231
+ for row in rows:
232
+ lines.append(" & ".join(latex_escape(x) for x in row) + r" \\")
233
+ lines += [r"\bottomrule", r"\end{tabular}", r"\end{table*}", ""]
234
+ write_text(path, "\n".join(lines))
235
+
236
+
237
+ def write_rows(path_base: Path, rows: list[dict[str, Any]], fieldnames: list[str]) -> None:
238
+ ensure_dir(path_base.parent)
239
+ for ext, dialect in [(".tsv", "excel-tab"), (".csv", "excel")]:
240
+ with (path_base.with_suffix(ext)).open("w", encoding="utf-8", newline="") as f:
241
+ writer = csv.DictWriter(f, fieldnames=fieldnames, dialect=dialect)
242
+ writer.writeheader()
243
+ for row in rows:
244
+ writer.writerow({k: row.get(k, "") for k in fieldnames})
245
+
246
+
247
+ def font(size: int, bold: bool = False) -> ImageFont.FreeTypeFont | ImageFont.ImageFont:
248
+ candidates = [
249
+ "/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf" if bold else "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf",
250
+ "/usr/share/fonts/dejavu/DejaVuSans-Bold.ttf" if bold else "/usr/share/fonts/dejavu/DejaVuSans.ttf",
251
+ ]
252
+ for path in candidates:
253
+ try:
254
+ return ImageFont.truetype(path, size=size)
255
+ except OSError:
256
+ pass
257
+ return ImageFont.load_default()
258
+
259
+
260
+ def load_planning() -> tuple[list[SummaryRecord], list[EpisodeRecord]]:
261
+ summaries: list[SummaryRecord] = []
262
+ episodes: list[EpisodeRecord] = []
263
+ for path in sorted(PLANNING_DIR.glob("*.json")):
264
+ data = read_json(path)
265
+ if not isinstance(data, list):
266
+ raise ValueError(f"Expected list in {path}")
267
+ for item_index, item in enumerate(data):
268
+ method = item["method"]
269
+ task = item["task"]
270
+ boat = item["boat"]
271
+ flow_type = item["flow_type"]
272
+ for context_mode, metrics in item["by_context"].items():
273
+ summaries.append(
274
+ SummaryRecord(
275
+ source_file=rel(path),
276
+ item_index=item_index,
277
+ method=method,
278
+ task=task,
279
+ boat=boat,
280
+ flow_type=flow_type,
281
+ context_mode=context_mode,
282
+ episodes=int(metrics["episodes"]),
283
+ successes=int(metrics["successes"]),
284
+ success_rate=float(metrics["success_rate"]),
285
+ final_distance_mean=float(metrics["final_distance_mean"]),
286
+ mean_min_goal_distance=float(metrics["mean_min_goal_distance"]),
287
+ path_length_success_mean=safe_float(metrics.get("path_length_success_mean")),
288
+ energy_success_mean=safe_float(metrics.get("energy_success_mean")),
289
+ steps_success_mean=safe_float(metrics.get("steps_success_mean")),
290
+ )
291
+ )
292
+ for result_index, result in enumerate(item["results"]):
293
+ episodes.append(
294
+ EpisodeRecord(
295
+ source_file=rel(path),
296
+ item_index=item_index,
297
+ result_index=result_index,
298
+ method=method,
299
+ task=task,
300
+ boat=boat,
301
+ flow_type=flow_type,
302
+ context_mode=result["context_mode"],
303
+ episode=int(result["episode"]),
304
+ success=bool(result["success"]),
305
+ final_distance=float(result["final_distance"]),
306
+ mean_min_goal_distance=float(result["mean_min_goal_distance"]),
307
+ energy=safe_float(result.get("energy")),
308
+ path_length=safe_float(result.get("path_length")),
309
+ steps=int(result["steps"]) if result.get("steps") is not None else None,
310
+ )
311
+ )
312
+ return summaries, episodes
313
+
314
+
315
+ def inferred_summaries(records: Iterable[SummaryRecord]) -> list[SummaryRecord]:
316
+ return [r for r in records if r.context_mode == "inferred" and r.method in METHOD_ORDER]
317
+
318
+
319
+ def inferred_episodes(records: Iterable[EpisodeRecord]) -> list[EpisodeRecord]:
320
+ return [r for r in records if r.context_mode == "inferred" and r.method in METHOD_ORDER]
321
+
322
+
323
+ def aggregate_success(records: Iterable[SummaryRecord], group_keys: tuple[str, ...]) -> list[dict[str, Any]]:
324
+ acc: dict[tuple[Any, ...], dict[str, Any]] = {}
325
+ sources: dict[tuple[Any, ...], set[str]] = defaultdict(set)
326
+ for r in records:
327
+ key = tuple(getattr(r, k) for k in group_keys)
328
+ entry = acc.setdefault(key, {k: getattr(r, k) for k in group_keys} | {"successes": 0, "episodes": 0})
329
+ entry["successes"] += r.successes
330
+ entry["episodes"] += r.episodes
331
+ sources[key].add(r.source_file)
332
+ rows = []
333
+ for key, entry in acc.items():
334
+ episodes = entry["episodes"]
335
+ success_rate = entry["successes"] / episodes if episodes else math.nan
336
+ rows.append(entry | {"success_rate": success_rate, "source_files": ";".join(sorted(sources[key]))})
337
+ return rows
338
+
339
+
340
+ def task_sort_key(task: str) -> int:
341
+ return TASK_ORDER.index(task) if task in TASK_ORDER else len(TASK_ORDER)
342
+
343
+
344
+ def boat_sort_key(boat: str) -> int:
345
+ return BOAT_ORDER.index(boat) if boat in BOAT_ORDER else len(BOAT_ORDER)
346
+
347
+
348
+ def flow_sort_key(flow: str) -> int:
349
+ return FLOW_ORDER.index(flow) if flow in FLOW_ORDER else len(FLOW_ORDER)
350
+
351
+
352
+ def method_sort_key(method: str) -> int:
353
+ return METHOD_ORDER.index(method) if method in METHOD_ORDER else len(METHOD_ORDER)
354
+
355
+
356
+ def extract_fig3() -> None:
357
+ fig_dir = OUT / "fig3"
358
+ frames_dir = fig_dir / "frames"
359
+ ensure_dir(frames_dir)
360
+ rows: list[dict[str, Any]] = []
361
+ cell_images: dict[tuple[str, str, str], Path] = {}
362
+ frame_names = ["first", "middle", "last"]
363
+
364
+ for task in TASK_ORDER:
365
+ flow = FIG3_TASK_FLOW[task]
366
+ for boat in BOAT_ORDER:
367
+ gif_path = GIF_DIR / f"image_planning_flowmo_inferred_{boat}_{task}_{flow}_ep{FIG3_EPISODE:03d}.gif"
368
+ if not gif_path.exists():
369
+ raise FileNotFoundError(f"Missing GIF for Fig. 3: {gif_path}")
370
+ with Image.open(gif_path) as im:
371
+ n_frames = getattr(im, "n_frames", 1)
372
+ frame_indices = [0, n_frames // 2, n_frames - 1]
373
+ for frame_name, frame_index in zip(frame_names, frame_indices):
374
+ im.seek(frame_index)
375
+ frame = im.convert("RGBA")
376
+ out_name = f"fig3_flowmo_inferred_{boat}_{task}_{flow}_ep{FIG3_EPISODE:03d}_{frame_name}_frame{frame_index:03d}.png"
377
+ out_path = frames_dir / out_name
378
+ frame.save(out_path)
379
+ cell_images[(task, boat, frame_name)] = out_path
380
+ rows.append(
381
+ {
382
+ "task": task,
383
+ "boat": boat,
384
+ "method": "flowmo",
385
+ "context_mode": "inferred",
386
+ "flow_type": flow,
387
+ "episode": FIG3_EPISODE,
388
+ "frame_name": frame_name,
389
+ "frame_index": frame_index,
390
+ "gif_frames": n_frames,
391
+ "source_gif": rel(gif_path),
392
+ "output_png": rel(out_path),
393
+ }
394
+ )
395
+
396
+ write_rows(
397
+ fig_dir / "figure3_frame_manifest",
398
+ rows,
399
+ [
400
+ "task",
401
+ "boat",
402
+ "method",
403
+ "context_mode",
404
+ "flow_type",
405
+ "episode",
406
+ "frame_name",
407
+ "frame_index",
408
+ "gif_frames",
409
+ "source_gif",
410
+ "output_png",
411
+ ],
412
+ )
413
+
414
+ thumb_w, thumb_h = 210, 210
415
+ label_h = 34
416
+ left = 128
417
+ top = 92
418
+ gap = 12
419
+ width = left + 6 * thumb_w + 5 * gap + 26
420
+ height = top + len(TASK_ORDER) * (thumb_h + label_h + gap) + 26
421
+ canvas = Image.new("RGB", (width, height), "white")
422
+ draw = ImageDraw.Draw(canvas)
423
+ title_font = font(26, True)
424
+ head_font = font(18, True)
425
+ small_font = font(14, False)
426
+ draw.text((20, 18), f"Figure 3 placeholder: FlowMo inferred, diverse flows, episode {FIG3_EPISODE}", fill=(20, 25, 30), font=title_font)
427
+
428
+ col_labels = ["Twin first", "Twin mid", "Twin last", "Triangle first", "Triangle mid", "Triangle last"]
429
+ for col, label in enumerate(col_labels):
430
+ x = left + col * (thumb_w + gap)
431
+ draw.text((x + 8, top - 26), label, fill=(30, 30, 30), font=small_font)
432
+ for row, task in enumerate(TASK_ORDER):
433
+ y = top + row * (thumb_h + label_h + gap)
434
+ draw.text((16, y + 80), TASK_LABEL[task], fill=(20, 25, 30), font=head_font)
435
+ draw.text((16, y + 108), FLOW_LABEL[FIG3_TASK_FLOW[task]], fill=(80, 80, 80), font=small_font)
436
+ col = 0
437
+ for boat in BOAT_ORDER:
438
+ for frame_name in frame_names:
439
+ x = left + col * (thumb_w + gap)
440
+ src = cell_images[(task, boat, frame_name)]
441
+ img = Image.open(src).convert("RGB").resize((thumb_w, thumb_h), Image.Resampling.LANCZOS)
442
+ canvas.paste(img, (x, y))
443
+ draw.rectangle([x, y, x + thumb_w, y + thumb_h], outline=(220, 220, 220), width=1)
444
+ draw.text((x + 8, y + thumb_h + 8), f"{BOAT_LABEL[boat]} / {frame_name}", fill=(50, 50, 50), font=small_font)
445
+ col += 1
446
+
447
+ contact = fig_dir / "figure3_placeholder_contact_sheet.png"
448
+ canvas.save(contact)
449
+
450
+ md_lines = [
451
+ "# Figure 3 Provenance",
452
+ "",
453
+ "Purpose: qualitative task rollouts extracted from experiment GIFs.",
454
+ "",
455
+ f"Selected method/context: `flowmo` / `inferred`.",
456
+ f"Selected episode: `{FIG3_EPISODE}`.",
457
+ "",
458
+ "Selected flows by task:",
459
+ ]
460
+ for task in TASK_ORDER:
461
+ md_lines.append(f"- `{task}`: `{FIG3_TASK_FLOW[task]}`")
462
+ md_lines += [
463
+ "",
464
+ "Frame rule: for each source GIF, extracted `first = 0`, `middle = n_frames // 2`, and `last = n_frames - 1`.",
465
+ "",
466
+ "Generated outputs:",
467
+ f"- `{rel(contact)}`",
468
+ f"- `{rel(frames_dir)}/`",
469
+ f"- `{rel(fig_dir / 'figure3_frame_manifest.tsv')}`",
470
+ f"- `{rel(fig_dir / 'figure3_frame_manifest.csv')}`",
471
+ "",
472
+ "Source GIFs:",
473
+ ]
474
+ for source in sorted({row["source_gif"] for row in rows}):
475
+ md_lines.append(f"- `{source}`")
476
+ write_text(fig_dir / "figure3_provenance.md", "\n".join(md_lines) + "\n")
477
+
478
+
479
+ def load_prediction_rows() -> list[dict[str, Any]]:
480
+ data = read_json(PREDICTION_JSON)
481
+ rows: list[dict[str, Any]] = []
482
+ for item_index, item in enumerate(data):
483
+ method = item["method"]
484
+ if method not in LEARNED_METHODS:
485
+ continue
486
+ metrics = item["inferred"]
487
+ for horizon in HORIZONS:
488
+ rows.append(
489
+ {
490
+ "method": method,
491
+ "method_label": METHOD_LABEL[method],
492
+ "context_mode": "inferred",
493
+ "horizon": horizon,
494
+ "position_error": metrics[f"pos{horizon}"],
495
+ "heading_error": metrics[f"heading{horizon}"],
496
+ "source_file": rel(PREDICTION_JSON),
497
+ "json_path_position": f"$[{item_index}].inferred.pos{horizon}",
498
+ "json_path_heading": f"$[{item_index}].inferred.heading{horizon}",
499
+ }
500
+ )
501
+ return rows
502
+
503
+
504
+ def draw_line_panel(
505
+ draw: ImageDraw.ImageDraw,
506
+ box: tuple[int, int, int, int],
507
+ rows: list[dict[str, Any]],
508
+ title: str,
509
+ colors: dict[str, tuple[int, int, int]],
510
+ ) -> None:
511
+ x0, y0, x1, y1 = box
512
+ axis_font = font(15)
513
+ title_font = font(22, True)
514
+ draw.text((x0, y0 - 42), title, fill=(20, 25, 30), font=title_font)
515
+ draw.rectangle([x0, y0, x1, y1], outline=(210, 210, 210), width=1)
516
+ pad_l, pad_b, pad_t, pad_r = 64, 52, 24, 20
517
+ px0, py0, px1, py1 = x0 + pad_l, y0 + pad_t, x1 - pad_r, y1 - pad_b
518
+ max_y = max(float(r["position_error"]) for r in rows) * 1.12
519
+ min_h, max_h = min(HORIZONS), max(HORIZONS)
520
+ for tick in [0.0, 0.25, 0.50, 0.75, 1.0]:
521
+ y = py1 - tick * (py1 - py0)
522
+ val = tick * max_y
523
+ draw.line([px0, y, px1, y], fill=(232, 232, 232), width=1)
524
+ draw.text((x0 + 8, y - 8), f"{val:.2f}", fill=(70, 70, 70), font=axis_font)
525
+ draw.line([px0, py1, px1, py1], fill=(60, 60, 60), width=2)
526
+ draw.line([px0, py0, px0, py1], fill=(60, 60, 60), width=2)
527
+ for h in HORIZONS:
528
+ x = px0 + (h - min_h) / (max_h - min_h) * (px1 - px0)
529
+ draw.line([x, py1, x, py1 + 5], fill=(60, 60, 60), width=1)
530
+ draw.text((x - 10, py1 + 10), str(h), fill=(70, 70, 70), font=axis_font)
531
+ draw.text(((px0 + px1) // 2 - 60, y1 - 28), "rollout step", fill=(60, 60, 60), font=axis_font)
532
+
533
+ by_method: dict[str, list[dict[str, Any]]] = defaultdict(list)
534
+ for row in rows:
535
+ by_method[row["method"]].append(row)
536
+ for method in LEARNED_METHODS:
537
+ pts = []
538
+ for row in sorted(by_method[method], key=lambda x: int(x["horizon"])):
539
+ h = int(row["horizon"])
540
+ x = px0 + (h - min_h) / (max_h - min_h) * (px1 - px0)
541
+ y = py1 - float(row["position_error"]) / max_y * (py1 - py0)
542
+ pts.append((x, y))
543
+ if len(pts) >= 2:
544
+ draw.line(pts, fill=colors[method], width=4)
545
+ for x, y in pts:
546
+ draw.ellipse([x - 4, y - 4, x + 4, y + 4], fill=colors[method])
547
+
548
+ lx, ly = px1 - 185, py0 + 10
549
+ for i, method in enumerate(LEARNED_METHODS):
550
+ yy = ly + i * 24
551
+ draw.line([lx, yy + 8, lx + 24, yy + 8], fill=colors[method], width=4)
552
+ draw.text((lx + 32, yy), METHOD_SHORT[method], fill=(40, 40, 40), font=axis_font)
553
+
554
+
555
+ def draw_success_bar_panel(
556
+ draw: ImageDraw.ImageDraw,
557
+ box: tuple[int, int, int, int],
558
+ rows: list[dict[str, Any]],
559
+ title: str,
560
+ ) -> None:
561
+ x0, y0, x1, y1 = box
562
+ axis_font = font(15)
563
+ small_font = font(13)
564
+ title_font = font(22, True)
565
+ draw.text((x0, y0 - 42), title, fill=(20, 25, 30), font=title_font)
566
+ draw.rectangle([x0, y0, x1, y1], outline=(210, 210, 210), width=1)
567
+ pad_l, pad_b, pad_t, pad_r = 58, 70, 24, 18
568
+ px0, py0, px1, py1 = x0 + pad_l, y0 + pad_t, x1 - pad_r, y1 - pad_b
569
+ for tick in [0, 0.25, 0.50, 0.75, 1.0]:
570
+ y = py1 - tick * (py1 - py0)
571
+ draw.line([px0, y, px1, y], fill=(232, 232, 232), width=1)
572
+ draw.text((x0 + 10, y - 8), f"{int(tick * 100)}", fill=(70, 70, 70), font=axis_font)
573
+ draw.line([px0, py1, px1, py1], fill=(60, 60, 60), width=2)
574
+ draw.line([px0, py0, px0, py1], fill=(60, 60, 60), width=2)
575
+
576
+ rates = {(r["method"], r["boat"]): float(r["success_rate"]) for r in rows}
577
+ group_w = (px1 - px0) / len(METHOD_ORDER)
578
+ bar_w = group_w * 0.30
579
+ boat_colors = {"twin": (54, 119, 191), "triangle": (218, 119, 54)}
580
+ for idx, method in enumerate(METHOD_ORDER):
581
+ cx = px0 + idx * group_w + group_w * 0.5
582
+ for j, boat in enumerate(BOAT_ORDER):
583
+ rate = rates.get((method, boat), 0.0)
584
+ x_left = cx + (j - 0.5) * bar_w - bar_w * 0.5
585
+ x_right = x_left + bar_w
586
+ y_top = py1 - rate * (py1 - py0)
587
+ draw.rectangle([x_left, y_top, x_right, py1], fill=boat_colors[boat], outline=(255, 255, 255))
588
+ draw.text((cx - 24, py1 + 10), METHOD_SHORT[method], fill=(55, 55, 55), font=small_font)
589
+ if method == "tdmpc2":
590
+ split_x = px0 + (idx + 1) * group_w
591
+ draw.line([split_x, py0, split_x, py1 + 30], fill=(80, 80, 80), width=2)
592
+
593
+ lx, ly = px1 - 180, py0 + 12
594
+ for i, boat in enumerate(BOAT_ORDER):
595
+ yy = ly + i * 24
596
+ draw.rectangle([lx, yy, lx + 18, yy + 14], fill=boat_colors[boat])
597
+ draw.text((lx + 26, yy - 2), BOAT_LABEL[boat], fill=(40, 40, 40), font=axis_font)
598
+ draw.text((x0 + 8, y0 + 8), "success rate (%)", fill=(70, 70, 70), font=axis_font)
599
+
600
+
601
+ def draw_success_by_task_panel(
602
+ draw: ImageDraw.ImageDraw,
603
+ box: tuple[int, int, int, int],
604
+ rows: list[dict[str, Any]],
605
+ boat: str,
606
+ title: str,
607
+ show_legend: bool = False,
608
+ ) -> None:
609
+ x0, y0, x1, y1 = box
610
+ axis_font = font(15)
611
+ small_font = font(12)
612
+ title_font = font(21, True)
613
+ draw.text((x0, y0 - 36), title, fill=(20, 25, 30), font=title_font)
614
+ draw.rectangle([x0, y0, x1, y1], outline=(210, 210, 210), width=1)
615
+ pad_l, pad_b, pad_t, pad_r = 58, 58, 26, 16
616
+ px0, py0, px1, py1 = x0 + pad_l, y0 + pad_t, x1 - pad_r, y1 - pad_b
617
+
618
+ for tick in [0, 0.25, 0.50, 0.75, 1.0]:
619
+ y = py1 - tick * (py1 - py0)
620
+ draw.line([px0, y, px1, y], fill=(232, 232, 232), width=1)
621
+ draw.text((x0 + 10, y - 8), f"{int(tick * 100)}", fill=(70, 70, 70), font=axis_font)
622
+ draw.line([px0, py1, px1, py1], fill=(60, 60, 60), width=2)
623
+ draw.line([px0, py0, px0, py1], fill=(60, 60, 60), width=2)
624
+ draw.text((x0 + 8, y0 + 8), "success (%)", fill=(70, 70, 70), font=axis_font)
625
+
626
+ rates = {(r["task"], r["method"]): float(r["success_rate"]) for r in rows if r["boat"] == boat}
627
+ group_w = (px1 - px0) / len(TASK_ORDER)
628
+ bar_w = group_w * 0.70 / len(METHOD_ORDER)
629
+ for task_idx, task in enumerate(TASK_ORDER):
630
+ group_left = px0 + task_idx * group_w + group_w * 0.15
631
+ for method_idx, method in enumerate(METHOD_ORDER):
632
+ rate = rates.get((task, method), 0.0)
633
+ x_left = group_left + method_idx * bar_w
634
+ x_right = x_left + bar_w * 0.88
635
+ y_top = py1 - rate * (py1 - py0)
636
+ draw.rectangle([x_left, y_top, x_right, py1], fill=METHOD_COLORS[method], outline=(255, 255, 255))
637
+ label = TASK_LABEL[task]
638
+ tw = draw.textlength(label, font=small_font)
639
+ draw.text((px0 + task_idx * group_w + (group_w - tw) / 2, py1 + 12), label, fill=(45, 45, 45), font=small_font)
640
+ if task_idx > 0:
641
+ split_x = px0 + task_idx * group_w
642
+ draw.line([split_x, py0, split_x, py1 + 24], fill=(218, 218, 218), width=1)
643
+
644
+ if show_legend:
645
+ lx, ly = x0 + 78, y0 + 36
646
+ for i, method in enumerate(METHOD_ORDER):
647
+ row = i // 4
648
+ col = i % 4
649
+ xx = lx + col * 145
650
+ yy = ly + row * 22
651
+ draw.rectangle([xx, yy, xx + 16, yy + 12], fill=METHOD_COLORS[method])
652
+ draw.text((xx + 22, yy - 3), METHOD_SHORT[method], fill=(40, 40, 40), font=small_font)
653
+
654
+
655
+ def make_fig4(summaries: list[SummaryRecord]) -> None:
656
+ fig_dir = OUT / "fig4"
657
+ ensure_dir(fig_dir)
658
+ prediction_rows = load_prediction_rows()
659
+ write_rows(
660
+ fig_dir / "figure4_prediction_error",
661
+ prediction_rows,
662
+ [
663
+ "method",
664
+ "method_label",
665
+ "context_mode",
666
+ "horizon",
667
+ "position_error",
668
+ "heading_error",
669
+ "source_file",
670
+ "json_path_position",
671
+ "json_path_heading",
672
+ ],
673
+ )
674
+
675
+ success_rows = aggregate_success(inferred_summaries(summaries), ("task", "boat", "method"))
676
+ success_rows.sort(key=lambda r: (task_sort_key(r["task"]), boat_sort_key(r["boat"]), method_sort_key(r["method"])))
677
+ for row in success_rows:
678
+ row["method_label"] = METHOD_LABEL[row["method"]]
679
+ row["task_label"] = TASK_LABEL[row["task"]]
680
+ row["boat_label"] = BOAT_LABEL[row["boat"]]
681
+ write_rows(
682
+ fig_dir / "figure4_success_by_task_boat",
683
+ success_rows,
684
+ ["task", "task_label", "boat", "boat_label", "method", "method_label", "successes", "episodes", "success_rate", "source_files"],
685
+ )
686
+ source_rows = []
687
+ for r in sorted(inferred_summaries(summaries), key=lambda x: (task_sort_key(x.task), boat_sort_key(x.boat), method_sort_key(x.method), flow_sort_key(x.flow_type))):
688
+ source_rows.append(
689
+ {
690
+ "task": r.task,
691
+ "boat": r.boat,
692
+ "method": r.method,
693
+ "flow_type": r.flow_type,
694
+ "successes": r.successes,
695
+ "episodes": r.episodes,
696
+ "success_rate": r.success_rate,
697
+ "source_file": r.source_file,
698
+ "item_index": r.item_index,
699
+ "json_path_successes": f"$[{r.item_index}].by_context.inferred.successes",
700
+ "json_path_episodes": f"$[{r.item_index}].by_context.inferred.episodes",
701
+ }
702
+ )
703
+ write_rows(
704
+ fig_dir / "figure4_success_by_task_boat_source_rows",
705
+ source_rows,
706
+ [
707
+ "task",
708
+ "boat",
709
+ "method",
710
+ "flow_type",
711
+ "successes",
712
+ "episodes",
713
+ "success_rate",
714
+ "source_file",
715
+ "item_index",
716
+ "json_path_successes",
717
+ "json_path_episodes",
718
+ ],
719
+ )
720
+
721
+ canvas = Image.new("RGB", (1800, 1100), "white")
722
+ draw = ImageDraw.Draw(canvas)
723
+ draw_line_panel(draw, (60, 88, 1740, 440), prediction_rows, "Prediction error vs rollout step", METHOD_COLORS)
724
+ draw_success_by_task_panel(draw, (60, 552, 860, 1030), success_rows, "twin", "Planning success by experiment: Twin", show_legend=True)
725
+ draw_success_by_task_panel(draw, (940, 552, 1740, 1030), success_rows, "triangle", "Planning success by experiment: Triangle", show_legend=True)
726
+ out = fig_dir / "figure4_placeholder.png"
727
+ canvas.save(out)
728
+
729
+ md = [
730
+ "# Figure 4 Provenance",
731
+ "",
732
+ "Purpose: quantitative placeholder with prediction error curves and planning success grouped by experiment/task.",
733
+ "",
734
+ "Generated outputs:",
735
+ f"- `{rel(out)}`",
736
+ f"- `{rel(fig_dir / 'figure4_prediction_error.tsv')}`",
737
+ f"- `{rel(fig_dir / 'figure4_prediction_error.csv')}`",
738
+ f"- `{rel(fig_dir / 'figure4_success_by_task_boat.tsv')}`",
739
+ f"- `{rel(fig_dir / 'figure4_success_by_task_boat.csv')}`",
740
+ f"- `{rel(fig_dir / 'figure4_success_by_task_boat_source_rows.tsv')}`",
741
+ f"- `{rel(fig_dir / 'figure4_success_by_task_boat_source_rows.csv')}`",
742
+ "",
743
+ "Panel A source:",
744
+ f"- `{rel(PREDICTION_JSON)}`",
745
+ "- JSON selectors: `$[method_index].inferred.pos{horizon}` and `$[method_index].inferred.heading{horizon}` for horizons 1, 3, 6, 8, 10, 20, 30, 40, 60.",
746
+ "- Included methods: `flowmo`, `leworldmodel`, `planet`, `tdmpc2`.",
747
+ "",
748
+ "Panel B source:",
749
+ f"- `{rel(PLANNING_DIR)}/*.json`",
750
+ "- JSON selectors: `$[item_index].by_context.inferred.successes` and `$[item_index].by_context.inferred.episodes`.",
751
+ "- Aggregation: sum successes and episodes over all flow types for each task, method, and boat.",
752
+ "- Row-level source entries are recorded in `figure4_success_by_task_boat_source_rows.tsv/csv` with `source_file`, `item_index`, and JSON path columns.",
753
+ "- Excluded diagnostic FlowMo contexts: `zero`, `shuffled`.",
754
+ ]
755
+ write_text(fig_dir / "figure4_provenance.md", "\n".join(md) + "\n")
756
+
757
+
758
+ def draw_failure_line_panel(
759
+ draw: ImageDraw.ImageDraw,
760
+ box: tuple[int, int, int, int],
761
+ rows: list[dict[str, Any]],
762
+ boat: str,
763
+ title: str,
764
+ show_legend: bool = False,
765
+ ) -> None:
766
+ x0, y0, x1, y1 = box
767
+ axis_font = font(14)
768
+ small_font = font(12)
769
+ title_font = font(21, True)
770
+ draw.text((x0, y0 - 36), title, fill=(20, 25, 30), font=title_font)
771
+ draw.rectangle([x0, y0, x1, y1], outline=(210, 210, 210), width=1)
772
+ pad_l, pad_b, pad_t, pad_r = 62, 88, 26, 22
773
+ px0, py0, px1, py1 = x0 + pad_l, y0 + pad_t, x1 - pad_r, y1 - pad_b
774
+ boat_rows = [r for r in rows if r["boat"] == boat]
775
+ max_fail = max(float(r["failure_percent"]) for r in boat_rows)
776
+ y_max = max(5.0, math.ceil((max_fail + 3.0) / 5.0) * 5.0)
777
+
778
+ for tick in [0.0, 0.25, 0.50, 0.75, 1.0]:
779
+ y = py1 - tick * (py1 - py0)
780
+ val = tick * y_max
781
+ draw.line([px0, y, px1, y], fill=(232, 232, 232), width=1)
782
+ draw.text((x0 + 8, y - 8), f"{val:.0f}", fill=(70, 70, 70), font=axis_font)
783
+ draw.line([px0, py1, px1, py1], fill=(60, 60, 60), width=2)
784
+ draw.line([px0, py0, px0, py1], fill=(60, 60, 60), width=2)
785
+ draw.text((x0 + 8, y0 + 8), "failure (%)", fill=(70, 70, 70), font=axis_font)
786
+
787
+ flow_x = {}
788
+ for i, flow in enumerate(FLOW_ORDER):
789
+ x = px0 + i / (len(FLOW_ORDER) - 1) * (px1 - px0)
790
+ flow_x[flow] = x
791
+ draw.line([x, py1, x, py1 + 5], fill=(60, 60, 60), width=1)
792
+ label = FLOW_LABEL[flow]
793
+ draw.text((x - 28, py1 + 10), label, fill=(55, 55, 55), font=small_font)
794
+
795
+ failures = {(r["method"], r["flow_type"]): float(r["failure_percent"]) for r in boat_rows}
796
+ for method in METHOD_ORDER:
797
+ pts = []
798
+ for flow in FLOW_ORDER:
799
+ value = failures.get((method, flow), 0.0)
800
+ x = flow_x[flow]
801
+ y = py1 - (value / y_max) * (py1 - py0)
802
+ pts.append((x, y))
803
+ draw.line(pts, fill=METHOD_COLORS[method], width=3)
804
+ for x, y in pts:
805
+ draw.ellipse([x - 3, y - 3, x + 3, y + 3], fill=METHOD_COLORS[method])
806
+
807
+ if show_legend:
808
+ lx, ly = x0 + 80, y0 + 34
809
+ for i, method in enumerate(METHOD_ORDER):
810
+ row = i // 4
811
+ col = i % 4
812
+ xx = lx + col * 145
813
+ yy = ly + row * 22
814
+ draw.line([xx, yy + 7, xx + 22, yy + 7], fill=METHOD_COLORS[method], width=3)
815
+ draw.text((xx + 28, yy - 2), METHOD_SHORT[method], fill=(40, 40, 40), font=small_font)
816
+
817
+
818
+ def make_fig5(summaries: list[SummaryRecord]) -> None:
819
+ fig_dir = OUT / "fig5"
820
+ ensure_dir(fig_dir)
821
+ rows = aggregate_success(inferred_summaries(summaries), ("boat", "flow_type", "method"))
822
+ rows.sort(key=lambda r: (boat_sort_key(r["boat"]), flow_sort_key(r["flow_type"]), method_sort_key(r["method"])))
823
+ for row in rows:
824
+ row["boat_label"] = BOAT_LABEL[row["boat"]]
825
+ row["flow_label"] = FLOW_LABEL[row["flow_type"]]
826
+ row["method_label"] = METHOD_LABEL[row["method"]]
827
+ row["failure_rate"] = 1.0 - float(row["success_rate"])
828
+ row["failure_percent"] = 100.0 * row["failure_rate"]
829
+ row["success_percent"] = 100.0 * float(row["success_rate"])
830
+ write_rows(
831
+ fig_dir / "figure5_failure_by_flow",
832
+ rows,
833
+ [
834
+ "boat",
835
+ "boat_label",
836
+ "flow_type",
837
+ "flow_label",
838
+ "method",
839
+ "method_label",
840
+ "successes",
841
+ "episodes",
842
+ "success_rate",
843
+ "success_percent",
844
+ "failure_rate",
845
+ "failure_percent",
846
+ "source_files",
847
+ ],
848
+ )
849
+ source_rows = []
850
+ for r in sorted(inferred_summaries(summaries), key=lambda x: (boat_sort_key(x.boat), flow_sort_key(x.flow_type), method_sort_key(x.method), task_sort_key(x.task))):
851
+ source_rows.append(
852
+ {
853
+ "boat": r.boat,
854
+ "flow_type": r.flow_type,
855
+ "method": r.method,
856
+ "task": r.task,
857
+ "successes": r.successes,
858
+ "episodes": r.episodes,
859
+ "success_rate": r.success_rate,
860
+ "failure_rate": 1.0 - r.success_rate,
861
+ "source_file": r.source_file,
862
+ "item_index": r.item_index,
863
+ "json_path_successes": f"$[{r.item_index}].by_context.inferred.successes",
864
+ "json_path_episodes": f"$[{r.item_index}].by_context.inferred.episodes",
865
+ }
866
+ )
867
+ write_rows(
868
+ fig_dir / "figure5_failure_by_flow_source_rows",
869
+ source_rows,
870
+ [
871
+ "boat",
872
+ "flow_type",
873
+ "method",
874
+ "task",
875
+ "successes",
876
+ "episodes",
877
+ "success_rate",
878
+ "failure_rate",
879
+ "source_file",
880
+ "item_index",
881
+ "json_path_successes",
882
+ "json_path_episodes",
883
+ ],
884
+ )
885
+
886
+ canvas = Image.new("RGB", (1800, 980), "white")
887
+ draw = ImageDraw.Draw(canvas)
888
+ title_font = font(25, True)
889
+ draw.text((24, 20), "Figure 5 placeholder: failure rate by flow family", fill=(20, 25, 30), font=title_font)
890
+ draw_failure_line_panel(draw, (60, 110, 1740, 480), rows, "twin", "Twin", show_legend=True)
891
+ draw_failure_line_panel(draw, (60, 590, 1740, 900), rows, "triangle", "Triangle", show_legend=False)
892
+ out = fig_dir / "figure5_placeholder_failure_lines.png"
893
+ canvas.save(out)
894
+
895
+ md = [
896
+ "# Figure 5 Provenance",
897
+ "",
898
+ "Purpose: flow-family breakdown of downstream planning failure rates. Failure rate is used because many success rates are 100% or near 100%.",
899
+ "",
900
+ "Generated outputs:",
901
+ f"- `{rel(out)}`",
902
+ f"- `{rel(fig_dir / 'figure5_failure_by_flow.tsv')}`",
903
+ f"- `{rel(fig_dir / 'figure5_failure_by_flow.csv')}`",
904
+ f"- `{rel(fig_dir / 'figure5_failure_by_flow_source_rows.tsv')}`",
905
+ f"- `{rel(fig_dir / 'figure5_failure_by_flow_source_rows.csv')}`",
906
+ "",
907
+ "Source:",
908
+ f"- `{rel(PLANNING_DIR)}/*.json`",
909
+ "- JSON selectors: `$[item_index].by_context.inferred.successes` and `$[item_index].by_context.inferred.episodes`.",
910
+ "- Aggregation: sum successes and episodes over all tasks for each method, boat, and flow type.",
911
+ "- Failure rate: `1 - successes / episodes`.",
912
+ "- Row-level source entries are recorded in `figure5_failure_by_flow_source_rows.tsv/csv` with `source_file`, `item_index`, and JSON path columns.",
913
+ "- Excluded diagnostic FlowMo contexts: `zero`, `shuffled`.",
914
+ ]
915
+ write_text(fig_dir / "figure5_provenance.md", "\n".join(md) + "\n")
916
+
917
+
918
+ def make_table1(summaries: list[SummaryRecord]) -> None:
919
+ table_dir = OUT / "tables"
920
+ ensure_dir(table_dir)
921
+ records = inferred_summaries(summaries)
922
+ by_key = {(r.task, r.boat, r.flow_type, r.method): r for r in records}
923
+ data_rows: list[dict[str, Any]] = []
924
+ latex_rows: list[list[str]] = []
925
+ for task in TASK_ORDER:
926
+ for boat in BOAT_ORDER:
927
+ for flow in FLOW_ORDER:
928
+ row: dict[str, Any] = {
929
+ "task": task,
930
+ "task_label": TASK_LABEL[task],
931
+ "boat": boat,
932
+ "boat_label": BOAT_LABEL[boat],
933
+ "flow_type": flow,
934
+ "flow_label": FLOW_LABEL[flow],
935
+ }
936
+ latex_row = [TASK_LABEL[task], BOAT_LABEL[boat], FLOW_LABEL[flow]]
937
+ for method in METHOD_ORDER:
938
+ rec = by_key.get((task, boat, flow, method))
939
+ if rec is None:
940
+ row[f"{method}_success_rate"] = ""
941
+ row[f"{method}_successes"] = ""
942
+ row[f"{method}_episodes"] = ""
943
+ row[f"{method}_source"] = ""
944
+ latex_row.append("--")
945
+ else:
946
+ row[f"{method}_success_rate"] = rec.success_rate
947
+ row[f"{method}_success_percent"] = 100.0 * rec.success_rate
948
+ row[f"{method}_successes"] = rec.successes
949
+ row[f"{method}_episodes"] = rec.episodes
950
+ row[f"{method}_source"] = rec.source_file
951
+ row[f"{method}_json_path"] = f"$[{rec.item_index}].by_context.inferred.success_rate"
952
+ latex_row.append(pct(rec.success_rate, 0))
953
+ data_rows.append(row)
954
+ latex_rows.append(latex_row)
955
+
956
+ fields = ["task", "task_label", "boat", "boat_label", "flow_type", "flow_label"]
957
+ for method in METHOD_ORDER:
958
+ fields += [
959
+ f"{method}_success_rate",
960
+ f"{method}_success_percent",
961
+ f"{method}_successes",
962
+ f"{method}_episodes",
963
+ f"{method}_source",
964
+ f"{method}_json_path",
965
+ ]
966
+ write_rows(table_dir / "table1_success_by_task_boat_flow", data_rows, fields)
967
+
968
+ header = ["Task", "Boat", "Flow"] + [METHOD_SHORT[m] for m in METHOD_ORDER]
969
+ write_table(
970
+ table_dir / "table1_success_by_task_boat_flow.tex",
971
+ header,
972
+ latex_rows,
973
+ "Planning success rate by task, boat, and flow family. Values are percentages over 50 episodes per setting; FlowMo diagnostic zero/shuffled contexts are excluded.",
974
+ "tab:planning_success_task_boat_flow",
975
+ )
976
+
977
+ md = [
978
+ "# Table 1 Provenance",
979
+ "",
980
+ "Purpose: success rate for every task, boat, flow family, and method.",
981
+ "",
982
+ "Generated outputs:",
983
+ f"- `{rel(table_dir / 'table1_success_by_task_boat_flow.tex')}`",
984
+ f"- `{rel(table_dir / 'table1_success_by_task_boat_flow.tsv')}`",
985
+ f"- `{rel(table_dir / 'table1_success_by_task_boat_flow.csv')}`",
986
+ "",
987
+ "Source:",
988
+ f"- `{rel(PLANNING_DIR)}/*.json`",
989
+ "- JSON selector per cell: `$[item_index].by_context.inferred.success_rate`.",
990
+ "- Companion fields in TSV/CSV include `$[item_index].by_context.inferred.successes` and `episodes`.",
991
+ "- Excluded diagnostic FlowMo contexts: `zero`, `shuffled`.",
992
+ ]
993
+ write_text(table_dir / "table1_provenance.md", "\n".join(md) + "\n")
994
+
995
+
996
+ def make_table2(episodes: list[EpisodeRecord]) -> None:
997
+ table_dir = OUT / "tables"
998
+ ensure_dir(table_dir)
999
+ records = inferred_episodes(episodes)
1000
+ grouped: dict[tuple[str, str, str], list[EpisodeRecord]] = defaultdict(list)
1001
+ sources: dict[tuple[str, str, str], set[str]] = defaultdict(set)
1002
+ for r in records:
1003
+ key = (r.task, r.boat, r.method)
1004
+ grouped[key].append(r)
1005
+ sources[key].add(r.source_file)
1006
+
1007
+ data_rows: list[dict[str, Any]] = []
1008
+ latex_rows: list[list[str]] = []
1009
+ for task in TASK_ORDER:
1010
+ for boat in BOAT_ORDER:
1011
+ for method in METHOD_ORDER:
1012
+ key = (task, boat, method)
1013
+ items = grouped[key]
1014
+ if not items:
1015
+ continue
1016
+ final_distance_mean = sum(r.final_distance for r in items) / len(items)
1017
+ min_goal_distance_mean = sum(r.mean_min_goal_distance for r in items) / len(items)
1018
+ success_items = [r for r in items if r.success and r.energy is not None]
1019
+ energy_success_mean = sum(float(r.energy) for r in success_items) / len(success_items) if success_items else None
1020
+ row = {
1021
+ "task": task,
1022
+ "task_label": TASK_LABEL[task],
1023
+ "boat": boat,
1024
+ "boat_label": BOAT_LABEL[boat],
1025
+ "method": method,
1026
+ "method_label": METHOD_LABEL[method],
1027
+ "episodes": len(items),
1028
+ "successful_energy_episodes": len(success_items),
1029
+ "final_distance_mean": final_distance_mean,
1030
+ "mean_min_goal_distance": min_goal_distance_mean,
1031
+ "energy_success_mean": energy_success_mean if energy_success_mean is not None else "",
1032
+ "source_files": ";".join(sorted(sources[key])),
1033
+ "json_selector": "$[item_index].results[*] filtered by context_mode == inferred",
1034
+ }
1035
+ data_rows.append(row)
1036
+ latex_rows.append(
1037
+ [
1038
+ TASK_LABEL[task],
1039
+ BOAT_LABEL[boat],
1040
+ METHOD_LABEL[method],
1041
+ fmt(final_distance_mean),
1042
+ fmt(energy_success_mean),
1043
+ ]
1044
+ )
1045
+ write_rows(
1046
+ table_dir / "table2_energy_distance_by_task_boat_method",
1047
+ data_rows,
1048
+ [
1049
+ "task",
1050
+ "task_label",
1051
+ "boat",
1052
+ "boat_label",
1053
+ "method",
1054
+ "method_label",
1055
+ "episodes",
1056
+ "successful_energy_episodes",
1057
+ "final_distance_mean",
1058
+ "mean_min_goal_distance",
1059
+ "energy_success_mean",
1060
+ "source_files",
1061
+ "json_selector",
1062
+ ],
1063
+ )
1064
+ write_table(
1065
+ table_dir / "table2_energy_distance_by_task_boat_method.tex",
1066
+ ["Task", "Boat", "Method", "Final dist.", "Energy (succ.)"],
1067
+ latex_rows,
1068
+ "Planning distance and energy by task, boat, and method, aggregated over all flow families. Final distance is averaged over all episodes; energy is averaged over successful episodes.",
1069
+ "tab:planning_energy_distance_task_boat",
1070
+ )
1071
+
1072
+ md = [
1073
+ "# Table 2 Provenance",
1074
+ "",
1075
+ "Purpose: distance and energy metrics by task, boat, and method.",
1076
+ "",
1077
+ "Generated outputs:",
1078
+ f"- `{rel(table_dir / 'table2_energy_distance_by_task_boat_method.tex')}`",
1079
+ f"- `{rel(table_dir / 'table2_energy_distance_by_task_boat_method.tsv')}`",
1080
+ f"- `{rel(table_dir / 'table2_energy_distance_by_task_boat_method.csv')}`",
1081
+ "",
1082
+ "Source:",
1083
+ f"- `{rel(PLANNING_DIR)}/*.json`",
1084
+ "- JSON selector: `$[item_index].results[*]`, filtered to `context_mode == inferred`.",
1085
+ "- Final distance: mean of `final_distance` over all filtered episodes.",
1086
+ "- Energy: mean of `energy` over filtered successful episodes only.",
1087
+ "- The TSV/CSV also includes `mean_min_goal_distance`, computed from the same filtered episodes.",
1088
+ "- Excluded diagnostic FlowMo contexts: `zero`, `shuffled`.",
1089
+ ]
1090
+ write_text(table_dir / "table2_provenance.md", "\n".join(md) + "\n")
1091
+
1092
+
1093
+ def make_probe_table() -> None:
1094
+ table_dir = OUT / "tables"
1095
+ ensure_dir(table_dir)
1096
+ data = read_json(PROBE_JSON)
1097
+ split = data["splits"]["test"]
1098
+ feature_order = ["z", "c", "z_c"]
1099
+ target_order = ["momentum", "local_flow", "episode_drift"]
1100
+ rows: list[dict[str, Any]] = []
1101
+ latex_rows: list[list[str]] = []
1102
+ for target in target_order:
1103
+ latex_row = [target.replace("_", " ")]
1104
+ for feature in feature_order:
1105
+ entry = split[target][feature]
1106
+ rows.append(
1107
+ {
1108
+ "split": "test",
1109
+ "target": target,
1110
+ "feature": feature,
1111
+ "r2_mean": entry["r2_mean"],
1112
+ "rmse": entry["rmse"],
1113
+ "source_file": rel(PROBE_JSON),
1114
+ "json_path_r2": f"$.splits.test.{target}.{feature}.r2_mean",
1115
+ "json_path_rmse": f"$.splits.test.{target}.{feature}.rmse",
1116
+ }
1117
+ )
1118
+ latex_row.append(fmt(entry["r2_mean"], 3))
1119
+ for feature in feature_order:
1120
+ latex_row.append(fmt(split[target][feature]["rmse"], 3))
1121
+ latex_rows.append(latex_row)
1122
+ write_rows(
1123
+ table_dir / "table3_probe_diagnostics",
1124
+ rows,
1125
+ ["split", "target", "feature", "r2_mean", "rmse", "source_file", "json_path_r2", "json_path_rmse"],
1126
+ )
1127
+ write_table(
1128
+ table_dir / "table3_probe_diagnostics.tex",
1129
+ ["Target", "z R2", "c R2", "z+c R2", "z RMSE", "c RMSE", "z+c RMSE"],
1130
+ latex_rows,
1131
+ "Frozen linear probe diagnostics for FlowMo representations on the test split.",
1132
+ "tab:flowmo_probe_diagnostics",
1133
+ )
1134
+ md = [
1135
+ "# Table 3 Provenance",
1136
+ "",
1137
+ "Purpose: frozen linear probe diagnostics for FlowMo latent variables.",
1138
+ "",
1139
+ "Generated outputs:",
1140
+ f"- `{rel(table_dir / 'table3_probe_diagnostics.tex')}`",
1141
+ f"- `{rel(table_dir / 'table3_probe_diagnostics.tsv')}`",
1142
+ f"- `{rel(table_dir / 'table3_probe_diagnostics.csv')}`",
1143
+ "",
1144
+ "Source:",
1145
+ f"- `{rel(PROBE_JSON)}`",
1146
+ "- JSON selectors: `$.splits.test.<target>.<feature>.r2_mean` and `$.splits.test.<target>.<feature>.rmse`.",
1147
+ "- Probe model: frozen FlowMo features with ridge regression, as reported by the JSON metadata.",
1148
+ ]
1149
+ write_text(table_dir / "table3_provenance.md", "\n".join(md) + "\n")
1150
+
1151
+
1152
+ def make_overview() -> None:
1153
+ files = sorted(p for p in OUT.rglob("*") if p.is_file())
1154
+ lines = [
1155
+ "# Paper Artifact Export",
1156
+ "",
1157
+ "Generated from local experiment outputs under `experiments/reports/`.",
1158
+ "",
1159
+ "Important source files:",
1160
+ f"- `{rel(PREDICTION_JSON)}`",
1161
+ f"- `{rel(PROBE_JSON)}`",
1162
+ f"- `{rel(PLANNING_DIR)}/*.json`",
1163
+ f"- `{rel(GIF_DIR)}/*.gif`",
1164
+ "",
1165
+ "Generated files:",
1166
+ ]
1167
+ for p in files:
1168
+ lines.append(f"- `{rel(p)}`")
1169
+ write_text(OUT / "README.md", "\n".join(lines) + "\n")
1170
+
1171
+
1172
+ def validate_inputs() -> None:
1173
+ missing = [p for p in [PREDICTION_JSON, PROBE_JSON, PLANNING_DIR, GIF_DIR] if not p.exists()]
1174
+ if missing:
1175
+ raise FileNotFoundError("Missing required experiment outputs: " + ", ".join(str(p) for p in missing))
1176
+ planning_files = sorted(PLANNING_DIR.glob("*.json"))
1177
+ if len(planning_files) != len(TASK_ORDER) * len(BOAT_ORDER) * len(FLOW_ORDER):
1178
+ raise RuntimeError(f"Expected {len(TASK_ORDER) * len(BOAT_ORDER) * len(FLOW_ORDER)} planning JSON files, found {len(planning_files)}")
1179
+
1180
+
1181
+ def main() -> None:
1182
+ validate_inputs()
1183
+ if OUT.exists():
1184
+ shutil.rmtree(OUT)
1185
+ ensure_dir(OUT)
1186
+ summaries, episodes = load_planning()
1187
+ extract_fig3()
1188
+ make_fig4(summaries)
1189
+ make_fig5(summaries)
1190
+ make_table1(summaries)
1191
+ make_table2(episodes)
1192
+ make_probe_table()
1193
+ make_overview()
1194
+ print(f"Wrote paper artifacts to {OUT}")
1195
+
1196
+
1197
+ if __name__ == "__main__":
1198
+ main()
experiments/no_flow_los_controller/README.md ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ # No-Flow LOS Controller Baseline
2
+
3
+ Traditional line-of-sight controller that estimates pose from the clean image and ignores external flow.
experiments/no_flow_los_controller/__init__.py ADDED
@@ -0,0 +1 @@
 
 
1
+ """No-flow line-of-sight controller experiment package."""
experiments/no_flow_los_controller/checkpoint/.gitkeep ADDED
File without changes
experiments/no_flow_los_controller/result/.gitkeep ADDED
File without changes
experiments/no_flow_los_controller/src/__init__.py ADDED
@@ -0,0 +1 @@
 
 
1
+ """No-flow line-of-sight controller source package."""
experiments/no_flow_los_controller/src/config.py ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ """No-flow line-of-sight controller config."""
2
+
3
+
4
+ def default_config():
5
+ return {"goal": [8.0, 8.0], "gain": 0.65}
experiments/no_flow_los_controller/src/controller.py ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """No-flow line-of-sight controller."""
2
+
3
+ import numpy as np
4
+
5
+ from experiments.shared.src.control.geometric import goal_action
6
+ from experiments.shared.src.vision.pose_from_image import estimate_pose_from_clean_image
7
+
8
+ def plan(state, task, config):
9
+ pose = estimate_pose_from_clean_image(state)
10
+ goal = np.asarray(task["goal"], dtype=np.float32)
11
+ return goal_action(pose, goal, int(config["action_dim"]), float(config["gain"]), 0.6)
experiments/no_flow_los_controller/src/evaluate.py ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ """No-flow line-of-sight controller evaluation."""
2
+
3
+ from experiments.no_flow_los_controller.src.config import default_config
4
+ from experiments.no_flow_los_controller.src.controller import plan
5
+
6
+ def evaluate(config):
7
+ cfg = default_config() | config
8
+ return plan(config["image"], {"goal": cfg["goal"]}, cfg)
experiments/oracle_flow_los_controller/README.md ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ # Oracle-Flow LOS Controller Reference
2
+
3
+ Line-of-sight controller with access to the true local simulator flow for feed-forward compensation.
4
+
5
+ This is an oracle-information reference for a simple geometric controller, not a full dynamics-MPC upper bound.
experiments/oracle_flow_los_controller/__init__.py ADDED
@@ -0,0 +1 @@
 
 
1
+ """Oracle-flow line-of-sight controller experiment package."""
experiments/oracle_flow_los_controller/checkpoint/.gitkeep ADDED
File without changes
experiments/oracle_flow_los_controller/result/.gitkeep ADDED
File without changes
experiments/oracle_flow_los_controller/src/__init__.py ADDED
@@ -0,0 +1 @@
 
 
1
+ """Oracle-flow line-of-sight controller source package."""
experiments/oracle_flow_los_controller/src/config.py ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ """Oracle-flow line-of-sight controller config."""
2
+
3
+
4
+ def default_config():
5
+ return {"goal": [8.0, 8.0], "gain": 0.65, "flow_gain": 1.0}
experiments/oracle_flow_los_controller/src/controller.py ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Oracle-flow line-of-sight controller."""
2
+
3
+ import numpy as np
4
+
5
+ from experiments.shared.src.control.geometric import goal_action
6
+ from experiments.shared.src.vision.pose_from_image import estimate_pose_from_clean_image
7
+
8
+ def plan(state, true_flow, task, config):
9
+ pose = estimate_pose_from_clean_image(state)
10
+ goal = np.asarray(task["goal"], dtype=np.float32)
11
+ return goal_action(
12
+ pose,
13
+ goal,
14
+ int(config["action_dim"]),
15
+ float(config["gain"]),
16
+ 0.6,
17
+ drift=np.asarray(true_flow, dtype=np.float32),
18
+ drift_gain=float(config["flow_gain"]),
19
+ )
experiments/oracle_flow_los_controller/src/evaluate.py ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ """Oracle-flow line-of-sight controller evaluation."""
2
+
3
+ from experiments.oracle_flow_los_controller.src.config import default_config
4
+ from experiments.oracle_flow_los_controller.src.controller import plan
5
+
6
+ def evaluate(config):
7
+ cfg = default_config() | config
8
+ return plan(config["image"], config["true_flow"], {"goal": cfg["goal"]}, cfg)
experiments/plot_task_schematics.py ADDED
@@ -0,0 +1,171 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from __future__ import annotations
2
+
3
+ from pathlib import Path
4
+
5
+ from PIL import Image, ImageDraw
6
+
7
+ from driftwm.utils import ensure_dir
8
+
9
+
10
+ OUT_DIR = Path("experiments/reports/figures/task_schematics")
11
+ WORKSPACE = (0.0, 10.0, 0.0, 10.0)
12
+
13
+ BG = (247, 250, 252)
14
+ BORDER = (45, 62, 80)
15
+ START = (35, 91, 140)
16
+ GOAL = (203, 62, 74)
17
+ ACTIVE = (30, 139, 88)
18
+ PASSIVE = (145, 153, 163)
19
+ FLOW = (68, 135, 205)
20
+ SWITCH = (238, 184, 72)
21
+
22
+
23
+ def w2p(x: float, y: float, size: int = 640, pad: int = 58) -> tuple[int, int]:
24
+ xmin, xmax, ymin, ymax = WORKSPACE
25
+ px = int(pad + (x - xmin) / (xmax - xmin) * (size - 2 * pad))
26
+ py = int(size - pad - (y - ymin) / (ymax - ymin) * (size - 2 * pad))
27
+ return px, py
28
+
29
+
30
+ def draw_arrow(
31
+ draw: ImageDraw.ImageDraw,
32
+ p0: tuple[int, int],
33
+ p1: tuple[int, int],
34
+ color: tuple[int, int, int],
35
+ width: int = 6,
36
+ head: int = 18,
37
+ ) -> None:
38
+ import math
39
+
40
+ draw.line((p0, p1), fill=color, width=width)
41
+ dx = p1[0] - p0[0]
42
+ dy = p1[1] - p0[1]
43
+ angle = math.atan2(dy, dx)
44
+ for delta in (2.55, -2.55):
45
+ a = angle + delta
46
+ q = (int(p1[0] + head * math.cos(a)), int(p1[1] + head * math.sin(a)))
47
+ draw.line((p1, q), fill=color, width=width)
48
+
49
+
50
+ def draw_polyline_arrow(
51
+ draw: ImageDraw.ImageDraw,
52
+ pts: list[tuple[int, int]],
53
+ color: tuple[int, int, int],
54
+ width: int = 6,
55
+ ) -> None:
56
+ if len(pts) < 2:
57
+ return
58
+ draw.line(pts, fill=color, width=width, joint="curve")
59
+ draw_arrow(draw, pts[-2], pts[-1], color, width=width)
60
+
61
+
62
+ def circle(draw: ImageDraw.ImageDraw, center: tuple[int, int], radius: int, color: tuple[int, int, int], width: int = 0) -> None:
63
+ box = (center[0] - radius, center[1] - radius, center[0] + radius, center[1] + radius)
64
+ if width:
65
+ draw.ellipse(box, outline=color, width=width)
66
+ else:
67
+ draw.ellipse(box, fill=color)
68
+
69
+
70
+ def base(size: int = 640) -> tuple[Image.Image, ImageDraw.ImageDraw]:
71
+ img = Image.new("RGB", (size, size), BG)
72
+ draw = ImageDraw.Draw(img)
73
+ draw.rectangle((58, 58, size - 58, size - 58), outline=BORDER, width=3)
74
+ return img, draw
75
+
76
+
77
+ def draw_flow_arrows(draw: ImageDraw.ImageDraw, arrows: list[tuple[tuple[float, float], tuple[float, float]]]) -> None:
78
+ for start, end in arrows:
79
+ draw_arrow(draw, w2p(*start), w2p(*end), FLOW, width=5, head=15)
80
+
81
+
82
+ def save(img: Image.Image, name: str) -> None:
83
+ ensure_dir(OUT_DIR / "clean")
84
+ path = OUT_DIR / "clean" / name
85
+ img.save(path)
86
+ print(path)
87
+
88
+
89
+ def reach_target() -> Image.Image:
90
+ img, draw = base()
91
+ start = w2p(2.0, 2.0)
92
+ goal = w2p(8.0, 8.0)
93
+ draw_arrow(draw, start, goal, ACTIVE)
94
+ circle(draw, start, 13, START)
95
+ circle(draw, goal, 18, GOAL, width=6)
96
+ return img
97
+
98
+
99
+ def station_keeping() -> Image.Image:
100
+ img, draw = base()
101
+ center = w2p(5.0, 5.0)
102
+ circle(draw, center, 72, GOAL, width=6)
103
+ draw.line((center[0] - 22, center[1], center[0] + 22, center[1]), fill=GOAL, width=4)
104
+ draw.line((center[0], center[1] - 22, center[0], center[1] + 22), fill=GOAL, width=4)
105
+ draw_flow_arrows(draw, [((6.8, 6.8), (5.85, 5.95)), ((6.6, 3.3), (5.8, 4.2)), ((3.5, 6.8), (4.25, 5.9))])
106
+ pts = [w2p(4.55, 4.25), w2p(5.2, 4.45), w2p(5.45, 5.15), w2p(4.85, 5.45), w2p(4.65, 4.8), w2p(5.0, 5.02)]
107
+ draw_polyline_arrow(draw, pts, ACTIVE, width=6)
108
+ circle(draw, pts[0], 12, START)
109
+ return img
110
+
111
+
112
+ def waypoint_square() -> Image.Image:
113
+ img, draw = base()
114
+ start = w2p(2.0, 2.0)
115
+ pts = [w2p(2.5, 2.5), w2p(7.5, 2.5), w2p(7.5, 7.5), w2p(2.5, 7.5)]
116
+ draw_polyline_arrow(draw, [start] + pts, ACTIVE, width=6)
117
+ circle(draw, start, 13, START)
118
+ for p in pts:
119
+ circle(draw, p, 13, GOAL)
120
+ return img
121
+
122
+
123
+ def waypoint_zigzag() -> Image.Image:
124
+ img, draw = base()
125
+ start = w2p(2.0, 2.0)
126
+ pts = [w2p(2.5, 7.0), w2p(4.2, 3.0), w2p(5.8, 7.0), w2p(7.5, 3.0)]
127
+ draw_polyline_arrow(draw, [start] + pts, ACTIVE, width=6)
128
+ circle(draw, start, 13, START)
129
+ for p in pts:
130
+ circle(draw, p, 13, GOAL)
131
+ return img
132
+
133
+
134
+ def make_contact_sheet(names: list[str]) -> None:
135
+ ensure_dir(OUT_DIR)
136
+ thumbs = [Image.open(OUT_DIR / "clean" / name).resize((240, 240), Image.Resampling.LANCZOS) for name in names]
137
+ sheet = Image.new("RGB", (2 * 280 + 40, 2 * 300 + 40), (246, 249, 251))
138
+ draw = ImageDraw.Draw(sheet)
139
+ labels = [name.removeprefix("task_").removesuffix(".png") for name in names]
140
+ for i, (thumb, label) in enumerate(zip(thumbs, labels, strict=True)):
141
+ row, col = divmod(i, 2)
142
+ x = 20 + col * 280
143
+ y = 20 + row * 300
144
+ sheet.paste(thumb, (x, y))
145
+ draw.text((x, y + 250), label, fill=(35, 45, 58))
146
+ path = OUT_DIR / "task_schematics_contact_sheet.png"
147
+ sheet.save(path)
148
+ print(path)
149
+
150
+
151
+ def main() -> None:
152
+ tasks = {
153
+ "task_reach_target.png": reach_target(),
154
+ "task_station_keeping.png": station_keeping(),
155
+ "task_waypoint_square.png": waypoint_square(),
156
+ "task_waypoint_zigzag.png": waypoint_zigzag(),
157
+ }
158
+ for name, img in tasks.items():
159
+ save(img, name)
160
+ make_contact_sheet(
161
+ [
162
+ "task_reach_target.png",
163
+ "task_station_keeping.png",
164
+ "task_waypoint_square.png",
165
+ "task_waypoint_zigzag.png",
166
+ ]
167
+ )
168
+
169
+
170
+ if __name__ == "__main__":
171
+ main()
experiments/reports/paper_artifacts/README.md ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Paper Artifact Export
2
+
3
+ Generated from local experiment outputs under `experiments/reports/`.
4
+
5
+ Important source files:
6
+ - `experiments/reports/paper_prediction.json`
7
+ - `experiments/reports/paper_flowmo_latent_probes.json`
8
+ - `experiments/reports/paper_planning/*.json`
9
+ - `experiments/reports/paper_planning/gifs/*.gif`
10
+
11
+ Generated files:
12
+ - `experiments/reports/paper_artifacts/README.md`
13
+ - `experiments/reports/paper_artifacts/fig3/figure3_frame_manifest.csv`
14
+ - `experiments/reports/paper_artifacts/fig3/figure3_frame_manifest.tsv`
15
+ - `experiments/reports/paper_artifacts/fig3/figure3_placeholder_contact_sheet.png`
16
+ - `experiments/reports/paper_artifacts/fig3/figure3_provenance.md`
17
+ - `experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_reach_target_uniform_ep000_first_frame000.png`
18
+ - `experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_reach_target_uniform_ep000_last_frame149.png`
19
+ - `experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_reach_target_uniform_ep000_middle_frame075.png`
20
+ - `experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_station_keeping_vortex_center_ep000_first_frame000.png`
21
+ - `experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_station_keeping_vortex_center_ep000_last_frame097.png`
22
+ - `experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_station_keeping_vortex_center_ep000_middle_frame049.png`
23
+ - `experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_waypoint_square_gradient_ep000_first_frame000.png`
24
+ - `experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_waypoint_square_gradient_ep000_last_frame272.png`
25
+ - `experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_waypoint_square_gradient_ep000_middle_frame136.png`
26
+ - `experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_waypoint_zigzag_random_fourier_ep000_first_frame000.png`
27
+ - `experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_waypoint_zigzag_random_fourier_ep000_last_frame319.png`
28
+ - `experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_waypoint_zigzag_random_fourier_ep000_middle_frame160.png`
29
+ - `experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_twin_reach_target_uniform_ep000_first_frame000.png`
30
+ - `experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_twin_reach_target_uniform_ep000_last_frame419.png`
31
+ - `experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_twin_reach_target_uniform_ep000_middle_frame210.png`
32
+ - `experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_twin_station_keeping_vortex_center_ep000_first_frame000.png`
33
+ - `experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_twin_station_keeping_vortex_center_ep000_last_frame097.png`
34
+ - `experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_twin_station_keeping_vortex_center_ep000_middle_frame049.png`
35
+ - `experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_twin_waypoint_square_gradient_ep000_first_frame000.png`
36
+ - `experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_twin_waypoint_square_gradient_ep000_last_frame351.png`
37
+ - `experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_twin_waypoint_square_gradient_ep000_middle_frame176.png`
38
+ - `experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_twin_waypoint_zigzag_random_fourier_ep000_first_frame000.png`
39
+ - `experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_twin_waypoint_zigzag_random_fourier_ep000_last_frame382.png`
40
+ - `experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_twin_waypoint_zigzag_random_fourier_ep000_middle_frame191.png`
41
+ - `experiments/reports/paper_artifacts/fig4/figure4_placeholder.png`
42
+ - `experiments/reports/paper_artifacts/fig4/figure4_prediction_error.csv`
43
+ - `experiments/reports/paper_artifacts/fig4/figure4_prediction_error.tsv`
44
+ - `experiments/reports/paper_artifacts/fig4/figure4_provenance.md`
45
+ - `experiments/reports/paper_artifacts/fig4/figure4_success_by_task_boat.csv`
46
+ - `experiments/reports/paper_artifacts/fig4/figure4_success_by_task_boat.tsv`
47
+ - `experiments/reports/paper_artifacts/fig4/figure4_success_by_task_boat_source_rows.csv`
48
+ - `experiments/reports/paper_artifacts/fig4/figure4_success_by_task_boat_source_rows.tsv`
49
+ - `experiments/reports/paper_artifacts/fig5/figure5_failure_by_flow.csv`
50
+ - `experiments/reports/paper_artifacts/fig5/figure5_failure_by_flow.tsv`
51
+ - `experiments/reports/paper_artifacts/fig5/figure5_failure_by_flow_source_rows.csv`
52
+ - `experiments/reports/paper_artifacts/fig5/figure5_failure_by_flow_source_rows.tsv`
53
+ - `experiments/reports/paper_artifacts/fig5/figure5_placeholder_failure_lines.png`
54
+ - `experiments/reports/paper_artifacts/fig5/figure5_provenance.md`
55
+ - `experiments/reports/paper_artifacts/tables/table1_provenance.md`
56
+ - `experiments/reports/paper_artifacts/tables/table1_success_by_task_boat_flow.csv`
57
+ - `experiments/reports/paper_artifacts/tables/table1_success_by_task_boat_flow.tex`
58
+ - `experiments/reports/paper_artifacts/tables/table1_success_by_task_boat_flow.tsv`
59
+ - `experiments/reports/paper_artifacts/tables/table2_energy_distance_by_task_boat_method.csv`
60
+ - `experiments/reports/paper_artifacts/tables/table2_energy_distance_by_task_boat_method.tex`
61
+ - `experiments/reports/paper_artifacts/tables/table2_energy_distance_by_task_boat_method.tsv`
62
+ - `experiments/reports/paper_artifacts/tables/table2_provenance.md`
63
+ - `experiments/reports/paper_artifacts/tables/table3_probe_diagnostics.csv`
64
+ - `experiments/reports/paper_artifacts/tables/table3_probe_diagnostics.tex`
65
+ - `experiments/reports/paper_artifacts/tables/table3_probe_diagnostics.tsv`
66
+ - `experiments/reports/paper_artifacts/tables/table3_provenance.md`
experiments/reports/paper_artifacts/fig3/figure3_frame_manifest.csv ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ task,boat,method,context_mode,flow_type,episode,frame_name,frame_index,gif_frames,source_gif,output_png
2
+ reach_target,twin,flowmo,inferred,uniform,0,first,0,420,experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_twin_reach_target_uniform_ep000.gif,experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_twin_reach_target_uniform_ep000_first_frame000.png
3
+ reach_target,twin,flowmo,inferred,uniform,0,middle,210,420,experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_twin_reach_target_uniform_ep000.gif,experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_twin_reach_target_uniform_ep000_middle_frame210.png
4
+ reach_target,twin,flowmo,inferred,uniform,0,last,419,420,experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_twin_reach_target_uniform_ep000.gif,experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_twin_reach_target_uniform_ep000_last_frame419.png
5
+ reach_target,triangle,flowmo,inferred,uniform,0,first,0,150,experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_triangle_reach_target_uniform_ep000.gif,experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_reach_target_uniform_ep000_first_frame000.png
6
+ reach_target,triangle,flowmo,inferred,uniform,0,middle,75,150,experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_triangle_reach_target_uniform_ep000.gif,experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_reach_target_uniform_ep000_middle_frame075.png
7
+ reach_target,triangle,flowmo,inferred,uniform,0,last,149,150,experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_triangle_reach_target_uniform_ep000.gif,experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_reach_target_uniform_ep000_last_frame149.png
8
+ station_keeping,twin,flowmo,inferred,vortex_center,0,first,0,98,experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_twin_station_keeping_vortex_center_ep000.gif,experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_twin_station_keeping_vortex_center_ep000_first_frame000.png
9
+ station_keeping,twin,flowmo,inferred,vortex_center,0,middle,49,98,experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_twin_station_keeping_vortex_center_ep000.gif,experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_twin_station_keeping_vortex_center_ep000_middle_frame049.png
10
+ station_keeping,twin,flowmo,inferred,vortex_center,0,last,97,98,experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_twin_station_keeping_vortex_center_ep000.gif,experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_twin_station_keeping_vortex_center_ep000_last_frame097.png
11
+ station_keeping,triangle,flowmo,inferred,vortex_center,0,first,0,98,experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_triangle_station_keeping_vortex_center_ep000.gif,experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_station_keeping_vortex_center_ep000_first_frame000.png
12
+ station_keeping,triangle,flowmo,inferred,vortex_center,0,middle,49,98,experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_triangle_station_keeping_vortex_center_ep000.gif,experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_station_keeping_vortex_center_ep000_middle_frame049.png
13
+ station_keeping,triangle,flowmo,inferred,vortex_center,0,last,97,98,experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_triangle_station_keeping_vortex_center_ep000.gif,experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_station_keeping_vortex_center_ep000_last_frame097.png
14
+ waypoint_square,twin,flowmo,inferred,gradient,0,first,0,352,experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_twin_waypoint_square_gradient_ep000.gif,experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_twin_waypoint_square_gradient_ep000_first_frame000.png
15
+ waypoint_square,twin,flowmo,inferred,gradient,0,middle,176,352,experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_twin_waypoint_square_gradient_ep000.gif,experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_twin_waypoint_square_gradient_ep000_middle_frame176.png
16
+ waypoint_square,twin,flowmo,inferred,gradient,0,last,351,352,experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_twin_waypoint_square_gradient_ep000.gif,experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_twin_waypoint_square_gradient_ep000_last_frame351.png
17
+ waypoint_square,triangle,flowmo,inferred,gradient,0,first,0,273,experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_triangle_waypoint_square_gradient_ep000.gif,experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_waypoint_square_gradient_ep000_first_frame000.png
18
+ waypoint_square,triangle,flowmo,inferred,gradient,0,middle,136,273,experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_triangle_waypoint_square_gradient_ep000.gif,experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_waypoint_square_gradient_ep000_middle_frame136.png
19
+ waypoint_square,triangle,flowmo,inferred,gradient,0,last,272,273,experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_triangle_waypoint_square_gradient_ep000.gif,experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_waypoint_square_gradient_ep000_last_frame272.png
20
+ waypoint_zigzag,twin,flowmo,inferred,random_fourier,0,first,0,383,experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_twin_waypoint_zigzag_random_fourier_ep000.gif,experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_twin_waypoint_zigzag_random_fourier_ep000_first_frame000.png
21
+ waypoint_zigzag,twin,flowmo,inferred,random_fourier,0,middle,191,383,experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_twin_waypoint_zigzag_random_fourier_ep000.gif,experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_twin_waypoint_zigzag_random_fourier_ep000_middle_frame191.png
22
+ waypoint_zigzag,twin,flowmo,inferred,random_fourier,0,last,382,383,experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_twin_waypoint_zigzag_random_fourier_ep000.gif,experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_twin_waypoint_zigzag_random_fourier_ep000_last_frame382.png
23
+ waypoint_zigzag,triangle,flowmo,inferred,random_fourier,0,first,0,320,experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_triangle_waypoint_zigzag_random_fourier_ep000.gif,experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_waypoint_zigzag_random_fourier_ep000_first_frame000.png
24
+ waypoint_zigzag,triangle,flowmo,inferred,random_fourier,0,middle,160,320,experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_triangle_waypoint_zigzag_random_fourier_ep000.gif,experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_waypoint_zigzag_random_fourier_ep000_middle_frame160.png
25
+ waypoint_zigzag,triangle,flowmo,inferred,random_fourier,0,last,319,320,experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_triangle_waypoint_zigzag_random_fourier_ep000.gif,experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_waypoint_zigzag_random_fourier_ep000_last_frame319.png
experiments/reports/paper_artifacts/fig3/figure3_frame_manifest.tsv ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ task boat method context_mode flow_type episode frame_name frame_index gif_frames source_gif output_png
2
+ reach_target twin flowmo inferred uniform 0 first 0 420 experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_twin_reach_target_uniform_ep000.gif experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_twin_reach_target_uniform_ep000_first_frame000.png
3
+ reach_target twin flowmo inferred uniform 0 middle 210 420 experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_twin_reach_target_uniform_ep000.gif experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_twin_reach_target_uniform_ep000_middle_frame210.png
4
+ reach_target twin flowmo inferred uniform 0 last 419 420 experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_twin_reach_target_uniform_ep000.gif experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_twin_reach_target_uniform_ep000_last_frame419.png
5
+ reach_target triangle flowmo inferred uniform 0 first 0 150 experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_triangle_reach_target_uniform_ep000.gif experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_reach_target_uniform_ep000_first_frame000.png
6
+ reach_target triangle flowmo inferred uniform 0 middle 75 150 experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_triangle_reach_target_uniform_ep000.gif experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_reach_target_uniform_ep000_middle_frame075.png
7
+ reach_target triangle flowmo inferred uniform 0 last 149 150 experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_triangle_reach_target_uniform_ep000.gif experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_reach_target_uniform_ep000_last_frame149.png
8
+ station_keeping twin flowmo inferred vortex_center 0 first 0 98 experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_twin_station_keeping_vortex_center_ep000.gif experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_twin_station_keeping_vortex_center_ep000_first_frame000.png
9
+ station_keeping twin flowmo inferred vortex_center 0 middle 49 98 experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_twin_station_keeping_vortex_center_ep000.gif experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_twin_station_keeping_vortex_center_ep000_middle_frame049.png
10
+ station_keeping twin flowmo inferred vortex_center 0 last 97 98 experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_twin_station_keeping_vortex_center_ep000.gif experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_twin_station_keeping_vortex_center_ep000_last_frame097.png
11
+ station_keeping triangle flowmo inferred vortex_center 0 first 0 98 experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_triangle_station_keeping_vortex_center_ep000.gif experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_station_keeping_vortex_center_ep000_first_frame000.png
12
+ station_keeping triangle flowmo inferred vortex_center 0 middle 49 98 experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_triangle_station_keeping_vortex_center_ep000.gif experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_station_keeping_vortex_center_ep000_middle_frame049.png
13
+ station_keeping triangle flowmo inferred vortex_center 0 last 97 98 experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_triangle_station_keeping_vortex_center_ep000.gif experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_station_keeping_vortex_center_ep000_last_frame097.png
14
+ waypoint_square twin flowmo inferred gradient 0 first 0 352 experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_twin_waypoint_square_gradient_ep000.gif experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_twin_waypoint_square_gradient_ep000_first_frame000.png
15
+ waypoint_square twin flowmo inferred gradient 0 middle 176 352 experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_twin_waypoint_square_gradient_ep000.gif experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_twin_waypoint_square_gradient_ep000_middle_frame176.png
16
+ waypoint_square twin flowmo inferred gradient 0 last 351 352 experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_twin_waypoint_square_gradient_ep000.gif experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_twin_waypoint_square_gradient_ep000_last_frame351.png
17
+ waypoint_square triangle flowmo inferred gradient 0 first 0 273 experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_triangle_waypoint_square_gradient_ep000.gif experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_waypoint_square_gradient_ep000_first_frame000.png
18
+ waypoint_square triangle flowmo inferred gradient 0 middle 136 273 experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_triangle_waypoint_square_gradient_ep000.gif experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_waypoint_square_gradient_ep000_middle_frame136.png
19
+ waypoint_square triangle flowmo inferred gradient 0 last 272 273 experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_triangle_waypoint_square_gradient_ep000.gif experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_waypoint_square_gradient_ep000_last_frame272.png
20
+ waypoint_zigzag twin flowmo inferred random_fourier 0 first 0 383 experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_twin_waypoint_zigzag_random_fourier_ep000.gif experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_twin_waypoint_zigzag_random_fourier_ep000_first_frame000.png
21
+ waypoint_zigzag twin flowmo inferred random_fourier 0 middle 191 383 experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_twin_waypoint_zigzag_random_fourier_ep000.gif experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_twin_waypoint_zigzag_random_fourier_ep000_middle_frame191.png
22
+ waypoint_zigzag twin flowmo inferred random_fourier 0 last 382 383 experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_twin_waypoint_zigzag_random_fourier_ep000.gif experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_twin_waypoint_zigzag_random_fourier_ep000_last_frame382.png
23
+ waypoint_zigzag triangle flowmo inferred random_fourier 0 first 0 320 experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_triangle_waypoint_zigzag_random_fourier_ep000.gif experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_waypoint_zigzag_random_fourier_ep000_first_frame000.png
24
+ waypoint_zigzag triangle flowmo inferred random_fourier 0 middle 160 320 experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_triangle_waypoint_zigzag_random_fourier_ep000.gif experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_waypoint_zigzag_random_fourier_ep000_middle_frame160.png
25
+ waypoint_zigzag triangle flowmo inferred random_fourier 0 last 319 320 experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_triangle_waypoint_zigzag_random_fourier_ep000.gif experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_waypoint_zigzag_random_fourier_ep000_last_frame319.png
experiments/reports/paper_artifacts/fig3/figure3_placeholder_contact_sheet.png ADDED

Git LFS Details

  • SHA256: 0762dba431aa1cc23f2b78e5aae8a680f74ad1507b5f344afa148ca739d7d0ee
  • Pointer size: 131 Bytes
  • Size of remote file: 174 kB
experiments/reports/paper_artifacts/fig3/figure3_provenance.md ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Figure 3 Provenance
2
+
3
+ Purpose: qualitative task rollouts extracted from experiment GIFs.
4
+
5
+ Selected method/context: `flowmo` / `inferred`.
6
+ Selected episode: `0`.
7
+
8
+ Selected flows by task:
9
+ - `reach_target`: `uniform`
10
+ - `station_keeping`: `vortex_center`
11
+ - `waypoint_square`: `gradient`
12
+ - `waypoint_zigzag`: `random_fourier`
13
+
14
+ Frame rule: for each source GIF, extracted `first = 0`, `middle = n_frames // 2`, and `last = n_frames - 1`.
15
+
16
+ Generated outputs:
17
+ - `experiments/reports/paper_artifacts/fig3/figure3_placeholder_contact_sheet.png`
18
+ - `experiments/reports/paper_artifacts/fig3/frames/`
19
+ - `experiments/reports/paper_artifacts/fig3/figure3_frame_manifest.tsv`
20
+ - `experiments/reports/paper_artifacts/fig3/figure3_frame_manifest.csv`
21
+
22
+ Source GIFs:
23
+ - `experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_triangle_reach_target_uniform_ep000.gif`
24
+ - `experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_triangle_station_keeping_vortex_center_ep000.gif`
25
+ - `experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_triangle_waypoint_square_gradient_ep000.gif`
26
+ - `experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_triangle_waypoint_zigzag_random_fourier_ep000.gif`
27
+ - `experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_twin_reach_target_uniform_ep000.gif`
28
+ - `experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_twin_station_keeping_vortex_center_ep000.gif`
29
+ - `experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_twin_waypoint_square_gradient_ep000.gif`
30
+ - `experiments/reports/paper_planning/gifs/image_planning_flowmo_inferred_twin_waypoint_zigzag_random_fourier_ep000.gif`
experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_reach_target_uniform_ep000_first_frame000.png ADDED
experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_reach_target_uniform_ep000_last_frame149.png ADDED
experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_reach_target_uniform_ep000_middle_frame075.png ADDED
experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_station_keeping_vortex_center_ep000_first_frame000.png ADDED
experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_station_keeping_vortex_center_ep000_last_frame097.png ADDED
experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_station_keeping_vortex_center_ep000_middle_frame049.png ADDED
experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_waypoint_square_gradient_ep000_first_frame000.png ADDED
experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_waypoint_square_gradient_ep000_last_frame272.png ADDED
experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_waypoint_square_gradient_ep000_middle_frame136.png ADDED
experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_waypoint_zigzag_random_fourier_ep000_first_frame000.png ADDED
experiments/reports/paper_artifacts/fig3/frames/fig3_flowmo_inferred_triangle_waypoint_zigzag_random_fourier_ep000_last_frame319.png ADDED