diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 690a18b..3974a31 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,12 +10,12 @@ jobs: - name: Run black to test code linting uses: psf/black@stable with: - options: "--check --verbose --exclude 'prpl-mono|\\.venv|outputs'" + options: "--check --verbose --exclude 'third-party|\\.venv|outputs'" jupyter: true - name: Run isort to organize imports uses: isort/isort-action@master with: - configuration: "--skip prpl-mono --skip .venv --skip outputs --check-only" + configuration: "--skip third-party --skip .venv --skip outputs --check-only" linting: runs-on: ubuntu-latest strategy: @@ -36,7 +36,7 @@ jobs: run: uv sync --all-extras --dev - name: Lint run: | - uv run pytest . --pylint -m pylint --pylint-rcfile=.pylintrc --ignore=prpl-mono --ignore=outputs + uv run pytest . --pylint -m pylint --pylint-rcfile=.pylintrc --ignore=third-party --ignore=outputs static-type-checking: runs-on: ubuntu-latest strategy: @@ -57,7 +57,7 @@ jobs: run: uv sync --all-extras --dev - name: Mypy run: | - uv run mypy . --exclude prpl-mono --exclude outputs + uv run mypy . --exclude third-party --exclude outputs unit-tests: runs-on: ubuntu-latest strategy: diff --git a/.gitmodules b/.gitmodules index 35837e0..2514d0a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ -[submodule "prpl-mono"] - path = prpl-mono - url = https://github.com/Jaraxxus-Me/prpl-roboclaude +[submodule "third-party/kindergarden"] + path = third-party/kindergarden + url = https://github.com/Jaraxxus-Me/kindergarden diff --git a/README.md b/README.md index 6eb31dc..5c02084 100644 --- a/README.md +++ b/README.md @@ -136,9 +136,9 @@ All environments are available as Hydra configs via `environment=`. | `obstruction3d_easy` | `kinder/Obstruction3D-o0-v0` | Easy (0 obstructions) | | `obstruction3d_medium` | `kinder/Obstruction3D-o2-v0` | Medium (2 obstructions) | | `obstruction3d_hard` | `kinder/Obstruction3D-o4-v0` | Hard (4 obstructions) | -| `shelf3d_easy` | `kinder/Shelf3D-o1-v0` | Easy (1 cube) | -| `shelf3d_medium` | `kinder/Shelf3D-o3-v0` | Medium (3 cubes) | -| `shelf3d_hard` | `kinder/Shelf3D-o5-v0` | Hard (5 cubes) | +| `shelf3d_easy` | `kinder/KinematicShelf3D-o1-v0` | Easy (1 cube) | +| `shelf3d_medium` | `kinder/KinematicShelf3D-o3-v0` | Medium (3 cubes) | +| `shelf3d_hard` | `kinder/KinematicShelf3D-o5-v0` | Hard (5 cubes) | | `transport3d_easy` | `kinder/Transport3D-o1-v0` | Easy (1 cube) | | `transport3d_hard` | `kinder/Transport3D-o2-v0` | Hard (2 cubes) | | `packing3d_easy` | `kinder/Packing3D-p1-v0` | Easy (1 part) | diff --git a/experiments/conf/environment/shelf3d_easy.yaml b/experiments/conf/environment/shelf3d_easy.yaml index e1a3232..1758b1e 100644 --- a/experiments/conf/environment/shelf3d_easy.yaml +++ b/experiments/conf/environment/shelf3d_easy.yaml @@ -1,2 +1,2 @@ _target_: robocode.environments.kinder_geom3d_env.KinderGeom3DEnv -env_id: kinder/Shelf3D-o1-v0 +env_id: kinder/KinematicShelf3D-o1-v0 diff --git a/experiments/conf/environment/shelf3d_hard.yaml b/experiments/conf/environment/shelf3d_hard.yaml index c9e1636..e3590e4 100644 --- a/experiments/conf/environment/shelf3d_hard.yaml +++ b/experiments/conf/environment/shelf3d_hard.yaml @@ -1,2 +1,2 @@ _target_: robocode.environments.kinder_geom3d_env.KinderGeom3DEnv -env_id: kinder/Shelf3D-o5-v0 +env_id: kinder/KinematicShelf3D-o5-v0 diff --git a/experiments/conf/environment/shelf3d_medium.yaml b/experiments/conf/environment/shelf3d_medium.yaml index a4a2c4d..9681e1b 100644 --- a/experiments/conf/environment/shelf3d_medium.yaml +++ b/experiments/conf/environment/shelf3d_medium.yaml @@ -1,2 +1,2 @@ _target_: robocode.environments.kinder_geom3d_env.KinderGeom3DEnv -env_id: kinder/Shelf3D-o3-v0 +env_id: kinder/KinematicShelf3D-o3-v0 diff --git a/prpl-mono b/prpl-mono deleted file mode 160000 index 650efc5..0000000 --- a/prpl-mono +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 650efc50d947c7f5dbcead2a056c4627b6d099cf diff --git a/pyproject.toml b/pyproject.toml index 53c504c..ca8b2be 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,11 +17,8 @@ dependencies = [ "hydra-core", "hydra-joblib-launcher", "omegaconf", - "relational-structs", - "prpl_utils", - "tomsgeoms2d", - "kinder[all]", - "pybullet_helpers", + "kindergarden[kinematic2d,kinematic3d,dynamic2d,dynamic3d]", + "pybullet", "types-shapely", "scipy-stubs", "imageio", @@ -65,14 +62,10 @@ wrap-descriptions = 88 strict_equality = true disallow_untyped_calls = true warn_unreachable = true -exclude = ["venv/*", ".venv/*", "outputs/*"] +exclude = ["venv/*", ".venv/*", "outputs/*", "third-party/*"] [tool.uv.sources] -relational-structs = { path = "prpl-mono/relational-structs", editable = true } -prpl_utils = { path = "prpl-mono/prpl-utils", editable = true } -tomsgeoms2d = { path = "prpl-mono/toms-geoms-2d", editable = true } -kinder = { path = "prpl-mono/kinder", editable = true } -pybullet_helpers = { path = "prpl-mono/pybullet-helpers", editable = true } +kindergarden = { path = "third-party/kindergarden", editable = true } [[tool.mypy.overrides]] module = [ diff --git a/run_autoformat.sh b/run_autoformat.sh index c7df242..2e8bd2e 100755 --- a/run_autoformat.sh +++ b/run_autoformat.sh @@ -1,4 +1,4 @@ #!/bin/bash -python -m black . --exclude 'prpl-mono|\.venv|outputs|multirun' -docformatter -i -r . --exclude venv .venv prpl-mono outputs multirun -isort . --skip .venv --skip prpl-mono --skip outputs --skip multirun +python -m black . --exclude 'third-party|\.venv|outputs|multirun' +docformatter -i -r . --exclude venv .venv third-party outputs multirun +isort . --skip .venv --skip third-party --skip outputs --skip multirun diff --git a/run_ci_checks.sh b/run_ci_checks.sh index 2bbc355..d9f4070 100755 --- a/run_ci_checks.sh +++ b/run_ci_checks.sh @@ -1,6 +1,6 @@ #!/bin/bash set -e ./run_autoformat.sh -mypy . --exclude prpl-mono --exclude outputs --exclude multirun --exclude 'src/robocode/mcp' -pytest . --pylint -m pylint --pylint-rcfile=.pylintrc --ignore=prpl-mono --ignore=outputs --ignore=multirun +mypy . --exclude third-party --exclude outputs --exclude multirun --exclude 'src/robocode/mcp' +pytest . --pylint -m pylint --pylint-rcfile=.pylintrc --ignore=third-party --ignore=outputs --ignore=multirun pytest tests/ --ignore=tests/mcp diff --git a/src/robocode/environments/kinder_geom2d_env.py b/src/robocode/environments/kinder_geom2d_env.py index 257cac6..47074e8 100644 --- a/src/robocode/environments/kinder_geom2d_env.py +++ b/src/robocode/environments/kinder_geom2d_env.py @@ -71,8 +71,8 @@ def env_description(self) -> str: f"`KinderGeom2DEnv` is a thin wrapper. The underlying environment " f"logic lives in the `kinder` package. To find the source files:\n\n" f"```python\n" - f"import kinder.envs.geom2d\n" - f"print(kinder.envs.geom2d.__path__)\n" + f"import kinder.envs.kinematic2d\n" + f"print(kinder.envs.kinematic2d.__path__)\n" f"```\n\n" f"Key files in that directory:\n" f"- `base_env.py` \u2014 `step()` transition dynamics and collision " diff --git a/src/robocode/environments/kinder_geom3d_env.py b/src/robocode/environments/kinder_geom3d_env.py index 891b0e1..5836b06 100644 --- a/src/robocode/environments/kinder_geom3d_env.py +++ b/src/robocode/environments/kinder_geom3d_env.py @@ -71,8 +71,8 @@ def env_description(self) -> str: f"`KinderGeom3DEnv` is a thin wrapper. The underlying environment " f"logic lives in the `kinder` package. To find the source files:\n\n" f"```python\n" - f"import kinder.envs.geom3d\n" - f"print(kinder.envs.geom3d.__path__)\n" + f"import kinder.envs.kinematic3d\n" + f"print(kinder.envs.kinematic3d.__path__)\n" f"```\n\n" f"Key files in that directory:\n" f"- `base_env.py` \u2014 `step()` transition dynamics and collision " diff --git a/src/robocode/oracles/clutteredstorage2d_medium/obs_helpers.py b/src/robocode/oracles/clutteredstorage2d_medium/obs_helpers.py index 6b29741..aef4289 100644 --- a/src/robocode/oracles/clutteredstorage2d_medium/obs_helpers.py +++ b/src/robocode/oracles/clutteredstorage2d_medium/obs_helpers.py @@ -5,13 +5,13 @@ from dataclasses import dataclass import numpy as np -from kinder.envs.geom2d.object_types import ( +from kinder.envs.kinematic2d.object_types import ( CRVRobotType, DoubleRectType, - Geom2DRobotEnvTypeFeatures, + Kinematic2DRobotEnvTypeFeatures, RectangleType, ) -from kinder.envs.geom2d.utils import create_walls_from_world_boundaries +from kinder.envs.kinematic2d.utils import create_walls_from_world_boundaries from numpy.typing import NDArray from relational_structs import Object, ObjectCentricState @@ -94,9 +94,9 @@ _BLOCK_OBJECTS = {name: Object(name, RectangleType) for name in BLOCK_NAMES} _OBJECT_CENTRIC_TYPE_FEATURES = { - CRVRobotType: Geom2DRobotEnvTypeFeatures[CRVRobotType], - DoubleRectType: Geom2DRobotEnvTypeFeatures[DoubleRectType], - RectangleType: Geom2DRobotEnvTypeFeatures[RectangleType], + CRVRobotType: Kinematic2DRobotEnvTypeFeatures[CRVRobotType], + DoubleRectType: Kinematic2DRobotEnvTypeFeatures[DoubleRectType], + RectangleType: Kinematic2DRobotEnvTypeFeatures[RectangleType], } @@ -463,7 +463,7 @@ def extract_object_centric_state(obs: NDArray) -> ObjectCentricState: min_dy=-0.05, max_dy=0.05, ) - rect_features = Geom2DRobotEnvTypeFeatures[RectangleType] + rect_features = Kinematic2DRobotEnvTypeFeatures[RectangleType] for wall_obj, wall_feat_dict in walls.items(): state_data[wall_obj] = np.array( [float(wall_feat_dict[feat]) for feat in rect_features], diff --git a/src/robocode/oracles/pushpullhook2d/behaviors.py b/src/robocode/oracles/pushpullhook2d/behaviors.py index b774ad2..d1295aa 100644 --- a/src/robocode/oracles/pushpullhook2d/behaviors.py +++ b/src/robocode/oracles/pushpullhook2d/behaviors.py @@ -21,7 +21,7 @@ from typing import Callable import numpy as np -from kinder.envs.geom2d.structs import SE2Pose +from kinder.envs.kinematic2d.structs import SE2Pose from numpy.typing import NDArray from robocode.oracles.pushpullhook2d.act_helpers import ( diff --git a/src/robocode/primitives/crv_motion_planning.py b/src/robocode/primitives/crv_motion_planning.py index 13b6f0a..df54390 100644 --- a/src/robocode/primitives/crv_motion_planning.py +++ b/src/robocode/primitives/crv_motion_planning.py @@ -20,8 +20,8 @@ import numpy as np from kinder.core import RobotActionSpace -from kinder.envs.geom2d.object_types import DoubleRectType, RectangleType -from kinder.envs.geom2d.structs import MultiBody2D, SE2Pose, ZOrder +from kinder.envs.kinematic2d.object_types import DoubleRectType, RectangleType +from kinder.envs.kinematic2d.structs import MultiBody2D, SE2Pose, ZOrder from kinder.envs.utils import ( BLACK, crv_robot_to_multibody2d, diff --git a/src/robocode/primitives/crv_motion_planning_grasp.py b/src/robocode/primitives/crv_motion_planning_grasp.py index 6000bd5..beb87f8 100644 --- a/src/robocode/primitives/crv_motion_planning_grasp.py +++ b/src/robocode/primitives/crv_motion_planning_grasp.py @@ -15,8 +15,8 @@ from dataclasses import dataclass import numpy as np -from kinder.envs.geom2d.object_types import RectangleType -from kinder.envs.geom2d.structs import MultiBody2D, SE2Pose +from kinder.envs.kinematic2d.object_types import RectangleType +from kinder.envs.kinematic2d.structs import MultiBody2D, SE2Pose from kinder.envs.utils import rectangle_object_to_geom, state_2d_has_collision from prpl_utils.utils import get_signed_angle_distance, wrap_angle from relational_structs import Object, ObjectCentricState diff --git a/tests/environments/test_kinder_geom3d_env.py b/tests/environments/test_kinder_geom3d_env.py index c8256db..bf926d3 100644 --- a/tests/environments/test_kinder_geom3d_env.py +++ b/tests/environments/test_kinder_geom3d_env.py @@ -10,9 +10,9 @@ "kinder/Obstruction3D-o0-v0", "kinder/Obstruction3D-o2-v0", "kinder/Obstruction3D-o4-v0", - "kinder/Shelf3D-o1-v0", - "kinder/Shelf3D-o3-v0", - "kinder/Shelf3D-o5-v0", + "kinder/KinematicShelf3D-o1-v0", + "kinder/KinematicShelf3D-o3-v0", + "kinder/KinematicShelf3D-o5-v0", "kinder/Transport3D-o1-v0", "kinder/Transport3D-o2-v0", "kinder/Packing3D-p1-v0", diff --git a/tests/primitives/test_crv_motion_planning.py b/tests/primitives/test_crv_motion_planning.py index 5389c6a..68bddf0 100644 --- a/tests/primitives/test_crv_motion_planning.py +++ b/tests/primitives/test_crv_motion_planning.py @@ -3,9 +3,9 @@ from __future__ import annotations import numpy as np -from kinder.envs.geom2d.object_types import ( +from kinder.envs.kinematic2d.object_types import ( CRVRobotType, - Geom2DRobotEnvTypeFeatures, + Kinematic2DRobotEnvTypeFeatures, RectangleType, ) from relational_structs import Object, ObjectCentricState @@ -26,8 +26,8 @@ _ROBOT = Object("robot", CRVRobotType) _TYPE_FEATURES = { - CRVRobotType: Geom2DRobotEnvTypeFeatures[CRVRobotType], - RectangleType: Geom2DRobotEnvTypeFeatures[RectangleType], + CRVRobotType: Kinematic2DRobotEnvTypeFeatures[CRVRobotType], + RectangleType: Kinematic2DRobotEnvTypeFeatures[RectangleType], } @@ -86,7 +86,7 @@ def _state( for name, (cx, cy, width, height) in (block_specs or {}).items(): data[Object(name, RectangleType)] = _rect_from_center(cx, cy, width, height) - rect_features = Geom2DRobotEnvTypeFeatures[RectangleType] + rect_features = Kinematic2DRobotEnvTypeFeatures[RectangleType] walls = create_walls_from_world_boundaries( WORLD_MIN_X, WORLD_MAX_X, diff --git a/tests/primitives/test_crv_motion_planning_grasp.py b/tests/primitives/test_crv_motion_planning_grasp.py index b513119..8487225 100644 --- a/tests/primitives/test_crv_motion_planning_grasp.py +++ b/tests/primitives/test_crv_motion_planning_grasp.py @@ -3,9 +3,9 @@ from __future__ import annotations import numpy as np -from kinder.envs.geom2d.object_types import ( +from kinder.envs.kinematic2d.object_types import ( CRVRobotType, - Geom2DRobotEnvTypeFeatures, + Kinematic2DRobotEnvTypeFeatures, RectangleType, ) from relational_structs import Object, ObjectCentricState @@ -27,8 +27,8 @@ _ROBOT = Object("robot", CRVRobotType) _TYPE_FEATURES = { - CRVRobotType: Geom2DRobotEnvTypeFeatures[CRVRobotType], - RectangleType: Geom2DRobotEnvTypeFeatures[RectangleType], + CRVRobotType: Kinematic2DRobotEnvTypeFeatures[CRVRobotType], + RectangleType: Kinematic2DRobotEnvTypeFeatures[RectangleType], } @@ -73,7 +73,7 @@ def _state( for name, (cx, cy, width, height) in (extra_blocks or {}).items(): data[Object(name, RectangleType)] = _rect_from_center(cx, cy, width, height) - rect_features = Geom2DRobotEnvTypeFeatures[RectangleType] + rect_features = Kinematic2DRobotEnvTypeFeatures[RectangleType] walls = create_walls_from_world_boundaries( WORLD_MIN_X, WORLD_MAX_X, diff --git a/tests/utils/test_docker_sandbox.py b/tests/utils/test_docker_sandbox.py index 36bdca9..a01bffc 100644 --- a/tests/utils/test_docker_sandbox.py +++ b/tests/utils/test_docker_sandbox.py @@ -152,12 +152,6 @@ def test_find_repo_root_has_pyproject() -> None: assert (root / "pyproject.toml").exists() -def test_find_repo_root_has_prpl_mono() -> None: - """_find_repo_root() returns a directory containing prpl-mono/.""" - root = _find_repo_root() - assert (root / "prpl-mono").is_dir() - - def test_setup_creates_sandbox_dir(tmp_path: Path) -> None: """_setup_sandbox_dir() creates the sandbox directory if absent.""" config = DockerSandboxConfig(sandbox_dir=tmp_path / "sandbox") diff --git a/third-party/kindergarden b/third-party/kindergarden new file mode 160000 index 0000000..e4f2c40 --- /dev/null +++ b/third-party/kindergarden @@ -0,0 +1 @@ +Subproject commit e4f2c402f90a1e31fc61c550b4cff949ee2ccbf3