From 75dcfd4886ba38cdb566b9de7c844fa0cb77ee91 Mon Sep 17 00:00:00 2001 From: Steven Palma Date: Wed, 3 Sep 2025 18:20:35 +0200 Subject: [PATCH] chore(processor): rename merge_features -> combine_feature_dicts (#1856) --- examples/phone_to_so100/evaluate.py | 4 ++-- examples/phone_to_so100/record.py | 4 ++-- src/lerobot/datasets/utils.py | 2 +- tests/datasets/test_dataset_utils.py | 12 ++++++------ 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/examples/phone_to_so100/evaluate.py b/examples/phone_to_so100/evaluate.py index 0951abc71..0620ef8b0 100644 --- a/examples/phone_to_so100/evaluate.py +++ b/examples/phone_to_so100/evaluate.py @@ -17,7 +17,7 @@ from lerobot.cameras.opencv.configuration_opencv import OpenCVCameraConfig from lerobot.datasets.lerobot_dataset import LeRobotDataset from lerobot.datasets.pipeline_features import aggregate_pipeline_dataset_features -from lerobot.datasets.utils import merge_features +from lerobot.datasets.utils import combine_feature_dicts from lerobot.model.kinematics import RobotKinematics from lerobot.policies.act.modeling_act import ACTPolicy from lerobot.policies.factory import make_pre_post_processors @@ -103,7 +103,7 @@ obs_ee = aggregate_pipeline_dataset_features( patterns=["observation.state.ee"], ) # Get all ee observation features -dataset_features = merge_features(obs_ee, action_ee_and_gripper) +dataset_features = combine_feature_dicts(obs_ee, action_ee_and_gripper) print("All dataset features: ", dataset_features) diff --git a/examples/phone_to_so100/record.py b/examples/phone_to_so100/record.py index d952f7e52..6a17e7a41 100644 --- a/examples/phone_to_so100/record.py +++ b/examples/phone_to_so100/record.py @@ -18,7 +18,7 @@ from lerobot.cameras.opencv.configuration_opencv import OpenCVCameraConfig from lerobot.datasets.lerobot_dataset import LeRobotDataset from lerobot.datasets.pipeline_features import aggregate_pipeline_dataset_features -from lerobot.datasets.utils import merge_features +from lerobot.datasets.utils import combine_feature_dicts from lerobot.model.kinematics import RobotKinematics from lerobot.processor import DataProcessorPipeline from lerobot.processor.converters import ( @@ -142,7 +142,7 @@ observation_ee = aggregate_pipeline_dataset_features( patterns=["observation.state.ee"], ) -dataset_features = merge_features(action_ee, gripper, observation_ee) +dataset_features = combine_feature_dicts(action_ee, gripper, observation_ee) print("All dataset features: ", dataset_features) diff --git a/src/lerobot/datasets/utils.py b/src/lerobot/datasets/utils.py index db60e63b3..148726aba 100644 --- a/src/lerobot/datasets/utils.py +++ b/src/lerobot/datasets/utils.py @@ -470,7 +470,7 @@ def dataset_to_policy_features(features: dict[str, dict]) -> dict[str, PolicyFea return policy_features -def merge_features(*dicts: dict) -> dict: +def combine_feature_dicts(*dicts: dict) -> dict: """ Merge LeRobot grouped feature dicts. diff --git a/tests/datasets/test_dataset_utils.py b/tests/datasets/test_dataset_utils.py index ae09fb262..f1ffd800a 100644 --- a/tests/datasets/test_dataset_utils.py +++ b/tests/datasets/test_dataset_utils.py @@ -20,7 +20,7 @@ from datasets import Dataset from huggingface_hub import DatasetCard from lerobot.datasets.push_dataset_to_hub.utils import calculate_episode_data_index -from lerobot.datasets.utils import create_lerobot_dataset_card, hf_transform_to_torch, merge_features +from lerobot.datasets.utils import combine_feature_dicts, create_lerobot_dataset_card, hf_transform_to_torch def test_default_parameters(): @@ -72,7 +72,7 @@ def test_merge_simple_vectors(): } } - out = merge_features(g1, g2) + out = combine_feature_dicts(g1, g2) assert "action" in out assert out["action"]["dtype"] == "float32" @@ -87,7 +87,7 @@ def test_merge_multiple_groups_order_and_dedup(): g2 = {"action": {"dtype": "float32", "shape": (2,), "names": ["b", "c"]}} g3 = {"action": {"dtype": "float32", "shape": (3,), "names": ["a", "c", "d"]}} - out = merge_features(g1, g2, g3) + out = combine_feature_dicts(g1, g2, g3) assert out["action"]["names"] == ["a", "b", "c", "d"] assert out["action"]["shape"] == (4,) @@ -110,7 +110,7 @@ def test_non_vector_last_wins_for_images(): } } - out = merge_features(g1, g2) + out = combine_feature_dicts(g1, g2) assert out["observation.images.front"]["shape"] == (3, 720, 1280) assert out["observation.images.front"]["dtype"] == "image" @@ -120,13 +120,13 @@ def test_dtype_mismatch_raises(): g2 = {"action": {"dtype": "float64", "shape": (1,), "names": ["b"]}} with pytest.raises(ValueError, match="dtype mismatch for 'action'"): - _ = merge_features(g1, g2) + _ = combine_feature_dicts(g1, g2) def test_non_dict_passthrough_last_wins(): g1 = {"misc": 123} g2 = {"misc": 456} - out = merge_features(g1, g2) + out = combine_feature_dicts(g1, g2) # For non-dict entries the last one wins assert out["misc"] == 456