| 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}) |
|
|