Move RoboLab episode_length_s to composite task root#931
Conversation
Wire root episode_length_s through graph conversion and set each RoboLab task YAML to match upstream RoboLab benchmark durations. Signed-off-by: Qian Lin <qianl@nvidia.com>
🤖 Isaac Lab-Arena Review BotSummaryThis PR moves Test CoverageGood. The unit tests cover the atomic, sequential, and (new) parallel conversion paths and assert the root value is threaded through; the sim-level graph-conversion test uses the inner/outer pattern and now asserts VerdictShip it — clean, well-tested, and it fixes a real episode-length bug for composite RoboLab tasks. |
Greptile SummaryThis PR moves
Confidence Score: 4/5Safe to merge. The structural move of episode_length_s to the composite root is consistent across all 37 YAML files and the conversion logic correctly guards against double-application. The core plumbing change is correct and well-tested for the happy path. The only gaps are a stale docstring example pointing at the old subtask-params convention and a missing test for the episode_length_s=None default and the subtask-params-over-root precedence path. arena_env_graph_task_conversion_utils.py (stale docstring) and test_arena_env_graph_task_conversion.py (missing default and precedence tests for episode_length_s). Important Files Changed
Flowchart%%{init: {'theme': 'neutral'}}%%
flowchart TD
A["CompositeTaskSpec\nepisode_length_s"] --> B{composition type}
B -- ATOMIC --> C["_build_atomic_task_from_spec\nsubtask + episode_length_s"]
C --> D{episode_length_s\nin subtask params?}
D -- "yes, subtask wins" --> E["atomic task class\nepisode_length_s from params"]
D -- "no, use root" --> F["atomic task class\nepisode_length_s from root"]
B -- PARALLEL --> G["subtasks built\nno episode_length_s"]
G --> H["CompositeTaskBase\nepisode_length_s from root"]
B -- SEQUENTIAL --> I["subtasks built\nno episode_length_s"]
I --> J["SequentialTaskBase\nepisode_length_s from root"]
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
flowchart TD
A["CompositeTaskSpec\nepisode_length_s"] --> B{composition type}
B -- ATOMIC --> C["_build_atomic_task_from_spec\nsubtask + episode_length_s"]
C --> D{episode_length_s\nin subtask params?}
D -- "yes, subtask wins" --> E["atomic task class\nepisode_length_s from params"]
D -- "no, use root" --> F["atomic task class\nepisode_length_s from root"]
B -- PARALLEL --> G["subtasks built\nno episode_length_s"]
G --> H["CompositeTaskBase\nepisode_length_s from root"]
B -- SEQUENTIAL --> I["subtasks built\nno episode_length_s"]
I --> J["SequentialTaskBase\nepisode_length_s from root"]
|
Summary
Set RoboLab task episode limits on the composite root and wire conversion.
Detailed description
episode_length_stoCompositeTaskSpecand pass it into composite/atomic task constructors during graph conversionepisode_length_sout of RoboLab subtask params into each task YAML root, using upstream RoboLab benchmark durations