| import numpy as np
|
| import pytest
|
|
|
| import openpi.models.tokenizer as _tokenizer
|
| import openpi.transforms as _transforms
|
|
|
|
|
| def test_repack_transform():
|
| transform = _transforms.RepackTransform(
|
| structure={
|
| "a": {"b": "b/c"},
|
| "d": "e/f",
|
| }
|
| )
|
| item = {"b": {"c": 1}, "e": {"f": 2}}
|
| assert transform(item) == {"a": {"b": 1}, "d": 2}
|
|
|
|
|
| def test_delta_actions():
|
| item = {"state": np.array([1, 2, 3]), "actions": np.array([[3, 4, 5], [5, 6, 7]])}
|
|
|
| transform = _transforms.DeltaActions(mask=[False, True])
|
| transformed = transform(item)
|
|
|
| assert np.all(transformed["state"] == np.array([1, 2, 3]))
|
| assert np.all(transformed["actions"] == np.array([[3, 2, 5], [5, 4, 7]]))
|
|
|
|
|
| def test_delta_actions_noop():
|
| item = {"state": np.array([1, 2, 3]), "actions": np.array([[3, 4, 5], [5, 6, 7]])}
|
|
|
|
|
| transform = _transforms.DeltaActions(mask=None)
|
| assert transform(item) is item
|
|
|
|
|
| del item["actions"]
|
| transform = _transforms.DeltaActions(mask=[True, False])
|
| assert transform(item) is item
|
|
|
|
|
| def test_absolute_actions():
|
| item = {"state": np.array([1, 2, 3]), "actions": np.array([[3, 4, 5], [5, 6, 7]])}
|
|
|
| transform = _transforms.AbsoluteActions(mask=[False, True])
|
| transformed = transform(item)
|
|
|
| assert np.all(transformed["state"] == np.array([1, 2, 3]))
|
| assert np.all(transformed["actions"] == np.array([[3, 6, 5], [5, 8, 7]]))
|
|
|
|
|
| def test_absolute_actions_noop():
|
| item = {"state": np.array([1, 2, 3]), "actions": np.array([[3, 4, 5], [5, 6, 7]])}
|
|
|
|
|
| transform = _transforms.AbsoluteActions(mask=None)
|
| assert transform(item) is item
|
|
|
|
|
| del item["actions"]
|
| transform = _transforms.AbsoluteActions(mask=[True, False])
|
| assert transform(item) is item
|
|
|
|
|
| def test_make_bool_mask():
|
| assert _transforms.make_bool_mask(2, -2, 2) == (True, True, False, False, True, True)
|
| assert _transforms.make_bool_mask(2, 0, 2) == (True, True, True, True)
|
|
|
|
|
| def test_tokenize_prompt():
|
| tokenizer = _tokenizer.PaligemmaTokenizer(max_len=12)
|
| transform = _transforms.TokenizePrompt(tokenizer)
|
|
|
| data = transform({"prompt": "Hello, world!"})
|
|
|
| tok_prompt, tok_mask = tokenizer.tokenize("Hello, world!")
|
| assert np.allclose(tok_prompt, data["tokenized_prompt"])
|
| assert np.allclose(tok_mask, data["tokenized_prompt_mask"])
|
|
|
|
|
| def test_tokenize_no_prompt():
|
| transform = _transforms.TokenizePrompt(_tokenizer.PaligemmaTokenizer())
|
|
|
| with pytest.raises(ValueError, match="Prompt is required"):
|
| transform({})
|
|
|
|
|
| def test_transform_dict():
|
|
|
| input = {"a": {"b": 1, "c": 2}}
|
| output = _transforms.transform_dict({"a/b": "a/c", "a/c": None}, input)
|
| assert output == {"a": {"c": 1}}
|
|
|
|
|
| with pytest.raises(ValueError, match="Key 'a/c' already exists in output"):
|
| _transforms.transform_dict({"a/b": "a/c"}, input)
|
|
|
|
|
| input = {"a": {"b": 1, "c": 2}}
|
| output = _transforms.transform_dict({"a": None}, input)
|
| assert output == input
|
|
|
|
|
| input = {"a": {"b": 1, "c": 2}}
|
| output = _transforms.transform_dict({"a.+": None}, input)
|
| assert output == {}
|
|
|
|
|
| input = {"a": {"b": 1, "c": 1}, "b": {"c": 2}}
|
| output = _transforms.transform_dict({"(.+)/c": r"\1/d"}, input)
|
| assert output == {"a": {"b": 1, "d": 1}, "b": {"d": 2}}
|
|
|
|
|
| def test_extract_prompt_from_task():
|
| transform = _transforms.PromptFromLeRobotTask({1: "Hello, world!"})
|
|
|
| data = transform({"task_index": 1})
|
| assert data["prompt"] == "Hello, world!"
|
|
|
| with pytest.raises(ValueError, match="task_index=2 not found in task mapping"):
|
| transform({"task_index": 2})
|
|
|