From eb00b64680c6895f8ffad7d8cd3efdb06e62a830 Mon Sep 17 00:00:00 2001 From: Russ Tedrake Date: Sun, 22 Feb 2026 06:20:17 -0500 Subject: [PATCH 1/2] replacing bazel for pytest --- .bazelignore | 2 - .bazelrc | 77 ---- .bazelversion | 1 - .github/workflows/main.yml | 423 ++++++++---------- .pre-commit-config.yaml | 5 +- AGENTS.md | 4 + BUILD.bazel | 24 - MODULE.bazel | 135 ------ MODULE.bazel.lock | 260 ----------- book/BUILD.bazel | 118 ----- book/clutter/BUILD.bazel | 106 ----- book/clutter/exercises/BUILD.bazel | 60 --- .../test_notebooks_clutter_exercises.py | 6 + book/clutter/test_notebooks_clutter.py | 10 + book/deep_perception.html | 2 +- book/deep_perception/exercises/BUILD.bazel | 18 - ...est_notebooks_deep_perception_exercises.py | 3 + book/figures/BUILD.bazel | 44 -- book/figures/test_notebooks_figures.py | 4 + book/figures/test_scripts_figures.py | 33 ++ book/force.html | 2 +- book/force/BUILD.bazel | 45 -- book/force/exercises/BUILD.bazel | 21 - .../test_notebooks_force_exercises.py | 3 + book/force/test_notebooks_force.py | 6 + book/htmlbook | 2 +- book/intro/BUILD.bazel | 19 - .../04_hardwarestation_and_scenarios.ipynb | 16 +- book/intro/test_notebooks_intro.py | 3 + book/mobile/BUILD.bazel | 69 --- book/mobile/exercises/BUILD.bazel | 18 - book/mobile/exercises/simulation_set_up.ipynb | 4 +- .../test_notebooks_mobile_exercises.py | 3 + book/mobile/scene_synthesizer.ipynb | 2 +- book/mobile/test_notebooks_mobile.py | 8 + book/pick/BUILD.bazel | 83 ---- book/pick/pick.ipynb | 2 +- book/pick/test_notebooks_pick.py | 10 + book/pose.html | 2 +- book/pose/BUILD.bazel | 45 -- book/pose/exercises/BUILD.bazel | 46 -- .../test_notebooks_pose_exercises.py | 5 + book/pose/test_notebooks_pose.py | 5 + book/rl/BUILD.bazel | 41 -- book/rl/exercises/BUILD.bazel | 32 -- .../exercises/test_notebooks_rl_exercises.py | 4 + book/rl/test_notebooks_rl.py | 4 + book/robot.html | 2 +- book/robot/BUILD.bazel | 71 --- book/robot/exercises/BUILD.bazel | 41 -- .../test_notebooks_robot_exercises.py | 5 + book/robot/inspector.ipynb | 4 +- book/robot/test_notebooks_robot.py | 9 + book/segmentation/BUILD.bazel | 30 -- book/segmentation/exercises/BUILD.bazel | 47 -- .../test_notebooks_segmentation_exercises.py | 4 + .../segmentation/test_scripts_segmentation.py | 33 ++ book/template/template_notebook.ipynb | 11 +- book/trajectories/BUILD.bazel | 101 ----- .../exercises/5_plan_place_initials.ipynb | 23 +- book/trajectories/exercises/BUILD.bazel | 45 -- .../kinematic_trajopt_around_shelf_iiwa.ipynb | 2 + .../test_notebooks_trajectories_exercises.py | 5 + book/trajectories/iris_builder.ipynb | 5 +- .../test_notebooks_trajectories.py | 10 + conftest.py | 28 ++ environ.bzl | 70 --- manipulation/BUILD.bazel | 284 ------------ manipulation/envs/BUILD.bazel | 38 -- manipulation/exercises/BUILD.bazel | 20 - manipulation/exercises/clutter/BUILD.bazel | 32 -- .../exercises/deep_perception/BUILD.bazel | 13 - manipulation/exercises/force/BUILD.bazel | 13 - manipulation/exercises/intro/BUILD.bazel | 25 -- manipulation/exercises/mobile/BUILD.bazel | 13 - manipulation/exercises/pick/BUILD.bazel | 50 --- manipulation/exercises/pose/BUILD.bazel | 32 -- manipulation/exercises/rl/BUILD.bazel | 19 - manipulation/exercises/robot/BUILD.bazel | 37 -- .../exercises/segmentation/BUILD.bazel | 20 - .../exercises/trajectories/BUILD.bazel | 31 -- .../trajectories/rrt_planner/BUILD.bazel | 20 - manipulation/models/BUILD.bazel | 25 -- manipulation/models/bunny/BUILD.bazel | 13 - manipulation/station.py | 24 +- manipulation/test/models/BUILD.bazel | 20 - manipulation/test/test_station_camera_ids.py | 14 +- manipulation/utils.py | 2 +- poetry.lock | 115 ++++- pyproject.toml | 28 +- requirements-bazel-linux.txt | 132 ------ requirements-bazel-mac.txt | 132 ------ requirements-bazel.txt | 153 ------- requirements.txt | 153 ------- setup/mac/Brewfile | 3 +- setup/ubuntu/18.04/install_prereqs.sh | 7 - setup/ubuntu/20.04/install_prereqs.sh | 44 -- setup/ubuntu/22.04/install_prereqs.sh | 57 --- setup/ubuntu/24.04/install_prereqs.sh | 57 --- 99 files changed, 571 insertions(+), 3436 deletions(-) delete mode 100644 .bazelignore delete mode 100644 .bazelrc delete mode 100644 .bazelversion create mode 100644 AGENTS.md delete mode 100644 BUILD.bazel delete mode 100644 MODULE.bazel delete mode 100644 MODULE.bazel.lock delete mode 100644 book/BUILD.bazel delete mode 100644 book/clutter/BUILD.bazel delete mode 100644 book/clutter/exercises/BUILD.bazel create mode 100644 book/clutter/exercises/test_notebooks_clutter_exercises.py create mode 100644 book/clutter/test_notebooks_clutter.py delete mode 100644 book/deep_perception/exercises/BUILD.bazel create mode 100644 book/deep_perception/exercises/test_notebooks_deep_perception_exercises.py delete mode 100644 book/figures/BUILD.bazel create mode 100644 book/figures/test_notebooks_figures.py create mode 100644 book/figures/test_scripts_figures.py delete mode 100644 book/force/BUILD.bazel delete mode 100644 book/force/exercises/BUILD.bazel create mode 100644 book/force/exercises/test_notebooks_force_exercises.py create mode 100644 book/force/test_notebooks_force.py delete mode 100644 book/intro/BUILD.bazel create mode 100644 book/intro/test_notebooks_intro.py delete mode 100644 book/mobile/BUILD.bazel delete mode 100644 book/mobile/exercises/BUILD.bazel create mode 100644 book/mobile/exercises/test_notebooks_mobile_exercises.py create mode 100644 book/mobile/test_notebooks_mobile.py delete mode 100644 book/pick/BUILD.bazel create mode 100644 book/pick/test_notebooks_pick.py delete mode 100644 book/pose/BUILD.bazel delete mode 100644 book/pose/exercises/BUILD.bazel create mode 100644 book/pose/exercises/test_notebooks_pose_exercises.py create mode 100644 book/pose/test_notebooks_pose.py delete mode 100644 book/rl/BUILD.bazel delete mode 100644 book/rl/exercises/BUILD.bazel create mode 100644 book/rl/exercises/test_notebooks_rl_exercises.py create mode 100644 book/rl/test_notebooks_rl.py delete mode 100644 book/robot/BUILD.bazel delete mode 100644 book/robot/exercises/BUILD.bazel create mode 100644 book/robot/exercises/test_notebooks_robot_exercises.py create mode 100644 book/robot/test_notebooks_robot.py delete mode 100644 book/segmentation/BUILD.bazel delete mode 100644 book/segmentation/exercises/BUILD.bazel create mode 100644 book/segmentation/exercises/test_notebooks_segmentation_exercises.py create mode 100644 book/segmentation/test_scripts_segmentation.py delete mode 100644 book/trajectories/BUILD.bazel delete mode 100644 book/trajectories/exercises/BUILD.bazel create mode 100644 book/trajectories/exercises/test_notebooks_trajectories_exercises.py create mode 100644 book/trajectories/test_notebooks_trajectories.py create mode 100644 conftest.py delete mode 100644 environ.bzl delete mode 100644 manipulation/BUILD.bazel delete mode 100644 manipulation/envs/BUILD.bazel delete mode 100644 manipulation/exercises/BUILD.bazel delete mode 100644 manipulation/exercises/clutter/BUILD.bazel delete mode 100644 manipulation/exercises/deep_perception/BUILD.bazel delete mode 100644 manipulation/exercises/force/BUILD.bazel delete mode 100644 manipulation/exercises/intro/BUILD.bazel delete mode 100644 manipulation/exercises/mobile/BUILD.bazel delete mode 100644 manipulation/exercises/pick/BUILD.bazel delete mode 100644 manipulation/exercises/pose/BUILD.bazel delete mode 100644 manipulation/exercises/rl/BUILD.bazel delete mode 100644 manipulation/exercises/robot/BUILD.bazel delete mode 100644 manipulation/exercises/segmentation/BUILD.bazel delete mode 100644 manipulation/exercises/trajectories/BUILD.bazel delete mode 100644 manipulation/exercises/trajectories/rrt_planner/BUILD.bazel delete mode 100644 manipulation/models/BUILD.bazel delete mode 100644 manipulation/models/bunny/BUILD.bazel delete mode 100644 manipulation/test/models/BUILD.bazel delete mode 100644 requirements-bazel-linux.txt delete mode 100644 requirements-bazel-mac.txt delete mode 100644 requirements-bazel.txt delete mode 100644 requirements.txt diff --git a/.bazelignore b/.bazelignore deleted file mode 100644 index a415184a..00000000 --- a/.bazelignore +++ /dev/null @@ -1,2 +0,0 @@ -venv -.venv diff --git a/.bazelrc b/.bazelrc deleted file mode 100644 index 8f1a2faf..00000000 --- a/.bazelrc +++ /dev/null @@ -1,77 +0,0 @@ -# Enable bzlmod by default (Bazel's new module system) -# This replaces the WORKSPACE-based dependency management -build --enable_bzlmod -common --enable_bzlmod - -# Automatic platform-specific Python version selection following Drake recommendations -# These configs are automatically applied based on the detected platform - -# macOS: Python 3.13 -build:macos --@rules_python//python/config_settings:python_version=3.13 -build:macos --action_env=PATH=/opt/homebrew/opt/python@3.13/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin - -# Linux: Default to Python 3.12 (Noble), but can be overridden by OS version detection -build:linux --@rules_python//python/config_settings:python_version=3.12 -build:linux --action_env=PATH=/usr/bin:/bin:/usr/sbin:/sbin - -# Manual override configs (for testing or specific use cases) -build:force-python-313 --@rules_python//python/config_settings:python_version=3.13 -build:force-python-312 --@rules_python//python/config_settings:python_version=3.12 -build:force-python-310 --@rules_python//python/config_settings:python_version=3.10 - -# Python version is automatically selected based on what's available on the system -# Following Drake's platform defaults: Jammy=3.10, Noble=3.12, macOS=3.13 - -# Location of the Gurobi license key file, typically named "gurobi.lic". -build --action_env=GRB_LICENSE_FILE - -# Location of the MOSEK license file, typically named "mosek.lic" -build --action_env=MOSEKLM_LICENSE_FILE - -build --coverage_report_generator=//book/htmlbook/tools/coverage:coverage_report_generator -build --coverage_support=//book/htmlbook/tools/coverage:coverage_support -build --enable_platform_specific_config=yes - -build --incompatible_disable_target_provider_fields=yes -build --incompatible_load_python_rules_from_bzl=yes -#build --incompatible_no_rule_outputs_param=yes -build --incompatible_run_shell_command_string=yes -build --incompatible_strict_action_env=yes -build --incompatible_visibility_private_attributes_at_definition=yes - -build --legacy_external_runfiles=no -build --strict_filesets=yes - -build --test_env=DISPLAY -build --test_env=GRB_LICENSE_FILE -build --test_env=LANG=en_US.UTF-8 -build --test_env=LC_ALL=en_US.UTF-8 -build --test_env=MOSEKLM_LICENSE_FILE -build --test_env=MPLBACKEND=Template -build --test_env=MPLCONFIGDIR=/tmp - -# TODO(jamiesnape): Fix "Invalid -W option ignored: invalid module name: -# 'pydrake.common.deprecation' warning and ensure that Drake deprecation -# warnings are promoted to errors. -# build --test_env=PYTHONWARNINGS=error::pydrake.common.deprecation.DrakeDeprecationWarning - -build --test_output=errors -build --test_summary=terse - -build:linux --action_env=PATH=/usr/sbin:/usr/bin:/sbin:/bin - -build:macos --action_env=PATH=/opt/homebrew/opt/python@3.13/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin -build:macos --test_timeout=120,600,1800,7200 - -# Disable python imports from ~/.local (pip -U) during build and test. -# https://github.com/bazelbuild/bazel/issues/4939 -# https://github.com/RobotLocomotion/drake/issues/8475 -build --action_env=PYTHONNOUSERSITE=1 -build --test_env=PYTHONNOUSERSITE=1 - -# Set matplotlib config directory to avoid conflicts (Drake issue #14250) -build --action_env=MPLCONFIGDIR=/tmp -build --action_env=MPLBACKEND=Template - -try-import %workspace%/user.bazelrc -try-import %workspace%/.bazelrc.local diff --git a/.bazelversion b/.bazelversion deleted file mode 100644 index 6b0e58e7..00000000 --- a/.bazelversion +++ /dev/null @@ -1 +0,0 @@ -7.4.1 \ No newline at end of file diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index dd21338f..3e238b85 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -37,21 +37,20 @@ on: - synchronize pull_request_target: types: - - opened - - reopened - - synchronize - labeled push: branches: - master schedule: - cron: '0 8 * * *' + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true jobs: - # First job: Check if we should run tests with solutions check-approval: name: Check PR approval status runs-on: ubuntu-latest - if: github.event_name == 'pull_request_target' || github.event_name == 'push' || github.event_name == 'schedule' outputs: should-run: ${{ steps.check.outputs.should-run }} is-trusted: ${{ steps.check.outputs.is-trusted }} @@ -59,7 +58,6 @@ jobs: - name: Check approval status id: check run: | - # For push events (commits to master) and scheduled runs, always run if [[ "${{ github.event_name }}" != "pull_request_target" ]]; then echo "is-trusted=true" >> $GITHUB_OUTPUT echo "should-run=true" >> $GITHUB_OUTPUT @@ -67,7 +65,6 @@ jobs: exit 0 fi - # Check if this is a trusted contributor if [[ "${{ github.event.pull_request.author_association }}" == "COLLABORATOR" ]] || \ [[ "${{ github.event.pull_request.author_association }}" == "MEMBER" ]] || \ [[ "${{ github.event.pull_request.author_association }}" == "OWNER" ]]; then @@ -84,8 +81,9 @@ jobs: echo "⏳ First-time contributor - waiting for maintainer approval" echo "To approve this PR for CI, add the 'approved-for-ci' label" fi - noble: - name: ubuntu 24.04 noble + + noble-poetry: + name: ubuntu noble using poetry runs-on: ubuntu-24.04 container: ubuntu:24.04 needs: [check-approval] @@ -94,6 +92,7 @@ jobs: github.event.pull_request.head.repo.full_name == github.repository) || (github.event_name == 'pull_request_target' && + github.event.pull_request.head.repo.full_name != github.repository && needs.check-approval.outputs.should-run == 'true') || (github.event_name != 'pull_request' && @@ -103,101 +102,221 @@ jobs: run: | export APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=1 DEBIAN_FRONTEND=noninteractive apt-get update -o APT::Acquire::Retries=4 -qq - apt-get install -o APT::Acquire::Retries=4 -o Dpkg::Use-Pty=0 -qy --no-install-recommends ca-certificates gnupg + apt-get install -o APT::Acquire::Retries=4 -o Dpkg::Use-Pty=0 -qy --no-install-recommends ca-certificates gnupg sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E1DD270288B4E6030699E45FA1715D88E1DF1F24 echo 'deb http://ppa.launchpad.net/git-core/ppa/ubuntu noble main' > /etc/apt/sources.list.d/git.list apt-get update -o APT::Acquire::Retries=4 -qq apt-get install -o APT::Acquire::Retries=4 -o Dpkg::Use-Pty=0 -qy --no-install-recommends git + # Create non-root user for running repository setup / tests + useradd -m -s /bin/bash runner + echo 'runner ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers rm -rf /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin /var/lib/apt/lists/* /var/log/apt/* shell: bash - - # For pull_request_target: carefully checkout PR code excluding .github/ + - name: checkout PR code if: github.event_name == 'pull_request_target' - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: ref: ${{ github.event.pull_request.head.sha }} sparse-checkout: | * !.github sparse-checkout-cone-mode: false - - # For regular events: normal checkout + - name: checkout if: github.event_name != 'pull_request_target' - uses: actions/checkout@v4 - + uses: actions/checkout@v6 + with: + submodules: recursive + - name: checkout solutions + env: + SOLUTIONS_TOKEN: ${{ secrets.SOLUTIONS_TOKEN }} run: | - git clone https://x-access-token:${{ secrets.SOLUTIONS_TOKEN }}@github.com/RobotLocomotion/manipulation-solutions.git solutions + if [[ -z "${SOLUTIONS_TOKEN}" ]]; then + echo "SOLUTIONS_TOKEN not available; skipping solutions checkout" + exit 0 + fi + git clone https://x-access-token:${SOLUTIONS_TOKEN}@github.com/RobotLocomotion/manipulation-solutions.git solutions cd solutions && git checkout $(cat ../solutions_sha.txt) && cd .. shell: bash - - name: setup and build + + - name: install dependencies run: | - ./setup/submodule_checkout + # Fix ownership of the workspace + chown -R runner:runner . + # Switch to runner user for remaining commands + sudo -H -u runner ./setup/submodule_checkout + # Install system packages as root ./setup/ubuntu/24.04/install_prereqs.sh apt-get install -o APT::Acquire::Retries=4 -o Dpkg::Use-Pty=0 -qy --no-install-recommends xvfb + sudo -H -u runner python3 -m pip install --user --break-system-packages poetry==2.1.4 + sudo -H -u runner python3 -m poetry config virtualenvs.in-project true + sudo -H -u runner python3 -m poetry install --all-extras --with dev rm -rf /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin /var/lib/apt/lists/* /var/log/apt/* - # Run bazel operations as root (Python 3.12 via .bazelrc linux config) - bazel fetch //... - bazel run //manipulation:prefetch_remotes shell: bash - # - name: Check disk space - # run: | - # dpkg-query -Wf '${Installed-Size}\t${Package}\n' | sort -nr | head - # df . -h - # du /usr/ -hx -d 4 --threshold=1G | sort -hr | head - # shell: bash + - name: test - run: ./book/htmlbook/workflows/ci/noble/test + run: | + set -euo pipefail + VENV_PYTHON="$(pwd)/.venv/bin/python" + sudo -H -u runner xvfb-run \ + --auto-servernum \ + --server-args='-screen 0 1280x1024x24 -ac +extension GLX +extension RANDR +render -noreset' \ + "$VENV_PYTHON" -m pytest -ra shell: bash - sonoma: - name: macos sonoma 14 - runs-on: macos-14 + # TODO(russt): add noble-pip-core workflow which only runs the tests in manipulation, + # but uses the manipulation module from pip. + noble-pip-all: + name: ubuntu noble using pip all + runs-on: ubuntu-24.04 + container: ubuntu:24.04 + needs: [check-approval] + if: > + ((github.event_name == 'pull_request' && + github.event.pull_request.head.repo.full_name == github.repository) + || + (github.event_name == 'pull_request_target' && + github.event.pull_request.head.repo.full_name != github.repository && + needs.check-approval.outputs.should-run == 'true') + || + (github.event_name != 'pull_request' && + github.event_name != 'pull_request_target')) + && + !contains(github.event.pull_request.labels.*.name, 'requires new pip wheels') + steps: + - name: pre-checkout setup + run: | + export APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=1 DEBIAN_FRONTEND=noninteractive + apt-get update -o APT::Acquire::Retries=4 -qq + apt-get install -o APT::Acquire::Retries=4 -o Dpkg::Use-Pty=0 -qy --no-install-recommends ca-certificates gnupg sudo + apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E1DD270288B4E6030699E45FA1715D88E1DF1F24 + echo 'deb http://ppa.launchpad.net/git-core/ppa/ubuntu noble main' > /etc/apt/sources.list.d/git.list + apt-get update -o APT::Acquire::Retries=4 -qq + apt-get install -o APT::Acquire::Retries=4 -o Dpkg::Use-Pty=0 -qy --no-install-recommends git + # Create non-root user for running repository setup / tests + useradd -m -s /bin/bash runner + echo 'runner ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers + rm -rf /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin /var/lib/apt/lists/* /var/log/apt/* + shell: bash + + - name: checkout PR code + if: github.event_name == 'pull_request_target' + uses: actions/checkout@v6 + with: + ref: ${{ github.event.pull_request.head.sha }} + sparse-checkout: | + * + !.github + sparse-checkout-cone-mode: false + + - name: checkout + if: github.event_name != 'pull_request_target' + uses: actions/checkout@v6 + with: + submodules: recursive + + - name: checkout solutions + env: + SOLUTIONS_TOKEN: ${{ secrets.SOLUTIONS_TOKEN }} + run: | + if [[ -z "${SOLUTIONS_TOKEN}" ]]; then + echo "SOLUTIONS_TOKEN not available; skipping solutions checkout" + exit 0 + fi + git clone https://x-access-token:${SOLUTIONS_TOKEN}@github.com/RobotLocomotion/manipulation-solutions.git solutions + cd solutions && git checkout $(cat ../solutions_sha.txt) && cd .. + shell: bash + + - name: install dependencies + run: | + # Fix ownership of the workspace + chown -R runner:runner . + # Switch to runner user for remaining commands + sudo -H -u runner ./setup/submodule_checkout + # Install system packages as root + ./setup/ubuntu/24.04/install_prereqs.sh + apt-get install -o APT::Acquire::Retries=4 -o Dpkg::Use-Pty=0 -qy --no-install-recommends xvfb + rm -rf ./manipulation # remove local module, force pip module. + sudo -H -u runner python3 -m pip install --user --break-system-packages --upgrade manipulation[all] pytest pytest-timeout + rm -rf /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin /var/lib/apt/lists/* /var/log/apt/* + shell: bash + + - name: test + run: | + set -euo pipefail + find book/htmlbook -type f -name 'test_*.py' -delete # remove htmlbook tests (extra Python requirements) + sudo -H -u runner MANIPULATION_DATA_DIR="$(pwd)/book/data" xvfb-run \ + --auto-servernum \ + --server-args='-screen 0 1280x1024x24 -ac +extension GLX +extension RANDR +render -noreset' \ + python3 -m pytest -ra + shell: bash + + sequoia: + name: macos sequoia 15 + runs-on: macos-15 needs: [check-approval] if: > (github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository) || (github.event_name == 'pull_request_target' && + github.event.pull_request.head.repo.full_name != github.repository && needs.check-approval.outputs.should-run == 'true') || (github.event_name != 'pull_request' && github.event_name != 'pull_request_target') steps: - # For pull_request_target: carefully checkout PR code excluding .github/ - name: checkout PR code if: github.event_name == 'pull_request_target' - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: ref: ${{ github.event.pull_request.head.sha }} sparse-checkout: | * !.github sparse-checkout-cone-mode: false - - # For regular events: normal checkout + - name: checkout if: github.event_name != 'pull_request_target' - uses: actions/checkout@v4 - + uses: actions/checkout@v6 + with: + submodules: recursive + + - name: setup python + uses: actions/setup-python@v5 + with: + python-version: '3.13' + - name: checkout solutions + env: + SOLUTIONS_TOKEN: ${{ secrets.SOLUTIONS_TOKEN }} run: | - git clone https://x-access-token:${{ secrets.SOLUTIONS_TOKEN }}@github.com/RobotLocomotion/manipulation-solutions.git solutions + if [[ -z "${SOLUTIONS_TOKEN}" ]]; then + echo "SOLUTIONS_TOKEN not available; skipping solutions checkout" + exit 0 + fi + git clone https://x-access-token:${SOLUTIONS_TOKEN}@github.com/RobotLocomotion/manipulation-solutions.git solutions cd solutions && git checkout $(cat ../solutions_sha.txt) && cd .. shell: zsh -efuo pipefail {0} - - name: submodule checkout - run: ./setup/submodule_checkout - shell: zsh -efuo pipefail {0} + - name: setup run: | - ./book/htmlbook/workflows/ci/sonoma/setup - bazel run //manipulation:prefetch_remotes + ./setup/submodule_checkout + ./setup/mac/install_prereqs.sh + python -m pip install --user poetry==2.1.4 + python -m poetry config virtualenvs.in-project true + python -m poetry env use "$(python -c 'import sys; print(sys.executable)')" + python -m poetry install --all-extras --with dev shell: zsh -efuo pipefail {0} + - name: test - run: ./book/htmlbook/workflows/ci/sonoma/test + run: | + set -euo pipefail + .venv/bin/python -m pytest -ra shell: zsh -efuo pipefail {0} + lint: runs-on: ubuntu-latest needs: [check-approval] @@ -206,240 +325,64 @@ jobs: github.event.pull_request.head.repo.full_name == github.repository) || (github.event_name == 'pull_request_target' && + github.event.pull_request.head.repo.full_name != github.repository && needs.check-approval.outputs.should-run == 'true') || (github.event_name != 'pull_request' && github.event_name != 'pull_request_target') steps: - # For pull_request_target: carefully checkout PR code excluding .github/ - name: checkout PR code if: github.event_name == 'pull_request_target' - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: ref: ${{ github.event.pull_request.head.sha }} sparse-checkout: | * !.github sparse-checkout-cone-mode: false - - # For regular events: normal checkout + - name: checkout repo if: github.event_name != 'pull_request_target' - uses: actions/checkout@v4 + uses: actions/checkout@v6 + with: + submodules: recursive + - name: setup python uses: actions/setup-python@v5 with: - python-version: '3.10' + python-version: '3.10' + - name: black uses: psf/black@stable with: version: 24.10.0 jupyter: true + - name: isort uses: isort/isort-action@master with: - configuration: "--profile black --check-only" - isort-version: 5.12.0 + configuration: "--profile black --check-only" + isort-version: 5.12.0 + - name: autoflake uses: creyD/autoflake_action@master with: - options: --remove-all-unused-imports --in-place - # Pegging version s.t. https://github.com/creyD/autoflake_action/issues/1 + options: --remove-all-unused-imports --in-place + # Pegging version s.t. https://github.com/creyD/autoflake_action/issues/1 + - name: Install and configure Poetry uses: snok/install-poetry@v1 with: version: 2.1.4 virtualenvs-create: true virtualenvs-in-project: true + - name: build the docs run: | poetry install --only docs source .venv/bin/activate sphinx-build -M html manipulation book/python shell: bash + - name: Test full poetry install run: poetry install - # The following jobs rely on the pip wheels being up to date. They can be disabled for a PR by adding the "requires new pip wheels" label. - docker: - name: dockerfile - runs-on: ubuntu-latest - needs: [check-approval] - if: > - ((github.event_name == 'pull_request' && - github.event.pull_request.head.repo.full_name == github.repository) - || - (github.event_name == 'pull_request_target' && - needs.check-approval.outputs.should-run == 'true') - || - (github.event_name != 'pull_request' && - github.event_name != 'pull_request_target')) - && - !contains(github.event.pull_request.labels.*.name, 'requires new pip wheels') - container: russtedrake/manipulation:latest - steps: - # For pull_request_target: carefully checkout PR code excluding .github/ - - name: checkout PR code - if: github.event_name == 'pull_request_target' - uses: actions/checkout@v4 - with: - ref: ${{ github.event.pull_request.head.sha }} - sparse-checkout: | - * - !.github - sparse-checkout-cone-mode: false - - # For regular events: normal checkout - - name: checkout - if: github.event_name != 'pull_request_target' - uses: actions/checkout@v4 - - - name: checkout solutions - run: | - git clone https://x-access-token:${{ secrets.SOLUTIONS_TOKEN }}@github.com/RobotLocomotion/manipulation-solutions.git solutions - cd solutions && git checkout $(cat ../solutions_sha.txt) && cd .. - shell: bash - - name: setup - run: | - apt-get update -o APT::Acquire::Retries=4 -qq - apt-get install -o APT::Acquire::Retries=4 -o Dpkg::Use-Pty=0 -qy --no-install-recommends python3-pip git xvfb - ./setup/submodule_checkout - - # Note: we **don't** reinstall drake's dependencies here. If we need - # to do that, we should update our docker image. - - # Install manipulation via pip (to mimic student experience) - # Use --break-system-packages to handle externally managed environment - # Only install manipulation[all] to avoid conflicts with system packages - pip install --upgrade manipulation[all] --extra-index-url https://drake-packages.csail.mit.edu/whl/nightly/ --break-system-packages - shell: bash - - name: test - run: | - ./book/htmlbook/workflows/ci/noble/test_wheels - shell: bash - - noble-pip-core: - # This should emulate a student's experience if they are doing exercises - # via pip install manipulation. - name: pip notebooks on noble - runs-on: ubuntu-24.04 - needs: [check-approval] - if: > - ((github.event_name == 'pull_request' && - github.event.pull_request.head.repo.full_name == github.repository) - || - (github.event_name == 'pull_request_target' && - needs.check-approval.outputs.should-run == 'true') - || - (github.event_name != 'pull_request' && - github.event_name != 'pull_request_target')) - && - !contains(github.event.pull_request.labels.*.name, 'requires new pip wheels') - container: ubuntu:24.04 - steps: - - name: pre-checkout setup - run: | - apt-get update -o APT::Acquire::Retries=4 -qq - apt-get install -o APT::Acquire::Retries=4 -o Dpkg::Use-Pty=0 -qy --no-install-recommends python3-pip git xvfb - shell: bash - - # For pull_request_target: carefully checkout PR code excluding .github/ - - name: checkout PR code - if: github.event_name == 'pull_request_target' - uses: actions/checkout@v4 - with: - ref: ${{ github.event.pull_request.head.sha }} - sparse-checkout: | - * - !.github - sparse-checkout-cone-mode: false - - # For regular events: normal checkout - - name: checkout - if: github.event_name != 'pull_request_target' - uses: actions/checkout@v4 - - - name: checkout solutions - run: | - git clone https://x-access-token:${{ secrets.SOLUTIONS_TOKEN }}@github.com/RobotLocomotion/manipulation-solutions.git solutions - cd solutions && git checkout $(cat ../solutions_sha.txt) && cd .. - shell: bash - - name: setup - run: | - ./setup/submodule_checkout - # Install system dependencies for Drake - ./setup/ubuntu/24.04/install_prereqs.sh - - # Install manipulation via pip (to mimic student experience) - # Handle system package conflicts by using --ignore-installed for problematic packages - pip install manipulation jupyter nbconvert ipykernel --extra-index-url https://drake-packages.csail.mit.edu/whl/nightly/ --break-system-packages --ignore-installed traitlets - - shell: bash - - name: test - run: | - # The manipulation library needs be robust against partial - # installations, but the examples will assume a full installation. So - # we test only the manipulation library here. - ./book/htmlbook/workflows/ci/noble/test_wheels --core-library-only - shell: bash - - noble-pip-extra: - # This should emulate a student's experience if they are doing exercises - # via pip install manipulation[all]. - name: pip extra on noble - runs-on: ubuntu-24.04 - needs: [check-approval] - if: > - ((github.event_name == 'pull_request' && - github.event.pull_request.head.repo.full_name == github.repository) - || - (github.event_name == 'pull_request_target' && - needs.check-approval.outputs.should-run == 'true') - || - (github.event_name != 'pull_request' && - github.event_name != 'pull_request_target')) - && - !contains(github.event.pull_request.labels.*.name, 'requires new pip wheels') - container: ubuntu:24.04 - steps: - - name: pre-checkout setup - run: | - apt-get update -o APT::Acquire::Retries=4 -qq - apt-get install -o APT::Acquire::Retries=4 -o Dpkg::Use-Pty=0 -qy --no-install-recommends python3-pip git xvfb - shell: bash - - # For pull_request_target: carefully checkout PR code excluding .github/ - - name: checkout PR code - if: github.event_name == 'pull_request_target' - uses: actions/checkout@v4 - with: - ref: ${{ github.event.pull_request.head.sha }} - sparse-checkout: | - * - !.github - sparse-checkout-cone-mode: false - - # For regular events: normal checkout - - name: checkout - if: github.event_name != 'pull_request_target' - uses: actions/checkout@v4 - - - name: checkout solutions - run: | - git clone https://x-access-token:${{ secrets.SOLUTIONS_TOKEN }}@github.com/RobotLocomotion/manipulation-solutions.git solutions - cd solutions && git checkout $(cat ../solutions_sha.txt) && cd .. - shell: bash - - name: setup - run: | - ./setup/submodule_checkout - # Install system dependencies for Drake - ./setup/ubuntu/24.04/install_prereqs.sh - - # Install manipulation via pip (to mimic student experience) - # Handle system package conflicts by using --ignore-installed for problematic packages - pip install manipulation[all] jupyter nbconvert ipykernel --extra-index-url https://drake-packages.csail.mit.edu/whl/nightly/ --break-system-packages --ignore-installed traitlets - shell: bash - - name: test - run: | - ./book/htmlbook/workflows/ci/noble/test_wheels - shell: bash - diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 57d2004b..97654dda 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -14,9 +14,10 @@ repos: - id: autoflake args: [--remove-all-unused-imports, --in-place] - repo: https://github.com/nbQA-dev/nbQA # for jupyter notebooks - rev: 1.7.1 + rev: 1.9.1 hooks: - - id: nbqa-isort + - id: nbqa-isort + additional_dependencies: [setuptools, isort==5.12.0] # Note: autoflake is not officially supported; see Developers.md - repo: https://github.com/floatingpurr/sync_with_poetry rev: 1.1.0 diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 00000000..c3b1ff60 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,4 @@ +# Repository Agent Notes + +- Always run Python commands (including tests, linting, type checks, scripts, and tooling) using the repository virtual environment at `.venv`. +- Prefer `.venv/bin/python -m ` over system Python or globally installed executables. diff --git a/BUILD.bazel b/BUILD.bazel deleted file mode 100644 index fa0e7730..00000000 --- a/BUILD.bazel +++ /dev/null @@ -1,24 +0,0 @@ -# -*- mode: python -*- -# vi: set ft=python : - -# Copyright 2020-2024 Massachusetts Institute of Technology. -# Licensed under the BSD 3-Clause License. See LICENSE.TXT for details. - -load("//book/htmlbook/tools/html:defs.bzl", "rt_html_test") -load("//book/htmlbook/tools/tidy:def.bzl", "html_tidy_test") - -exports_files( - [ - "LICENSE.TXT", - "pyproject.toml", - "solutions_sha.txt", - ], - visibility = ["//visibility:public"], -) - -# Some methods look for this file to find the root directory. -filegroup( - name = "workspace", - srcs = ["MODULE.bazel"], - visibility = ["//visibility:public"], -) diff --git a/MODULE.bazel b/MODULE.bazel deleted file mode 100644 index acef2f8a..00000000 --- a/MODULE.bazel +++ /dev/null @@ -1,135 +0,0 @@ -module(name = "manipulation") - -# If you don't want to support building on macOS, you may remove the next line. -# Note that it must appear prior to loading "rules_cc", per the documentation: -# https://github.com/bazelbuild/apple_support?tab=readme-ov-file#bazel-7-setup -bazel_dep(name = "apple_support", version = "1.17.1") - -# Add the Bazel rules we need. -bazel_dep(name = "bazel_skylib", version = "1.8.0") -bazel_dep(name = "rules_cc", version = "0.2.0") -bazel_dep(name = "rules_python", version = "0.40.0") - -# Note: This repository uses Drake via pip wheels, not as a Bazel dependency. -# We only use drake_models as a Bazel repository for performance. - -# Drake models repository for the manipulation examples -http_archive = use_repo_rule("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") -http_archive( - name = "drake_models", - urls = [ - "https://github.com/RobotLocomotion/models/archive/2799af70868d0cb4b25e046209fbd5d578b3e1b1.tar.gz", - "https://drake-mirror.csail.mit.edu/github/RobotLocomotion/models/2799af70868d0cb4b25e046209fbd5d578b3e1b1.tar.gz", - "https://s3.amazonaws.com/drake-mirror/github/RobotLocomotion/models/2799af70868d0cb4b25e046209fbd5d578b3e1b1.tar.gz", - ], - sha256 = "fd2dc12d0701f41199eb4ea6bf3e09b5a5041d92f5103e8322013f63a3c380b8", - strip_prefix = "models-2799af70868d0cb4b25e046209fbd5d578b3e1b1", - build_file_content = """ -package(default_visibility = ["//visibility:public"]) - -_SRCS = glob(["**/*"]) - -exports_files(_SRCS) - -filegroup( - name = "drake_models", - srcs = _SRCS, -) - -""", -) - -# Buildifier dependencies -http_file = use_repo_rule("@bazel_tools//tools/build_defs/repo:http.bzl", "http_file") -http_file( - name = "buildifier_linux", - downloaded_file_path = "buildifier", - executable = True, - sha256 = "ec064a5edd2a2a210cf8162305869a27b3ed6c7e50caa70687bc9d72177f61f3", - urls = ["https://github.com/bazelbuild/buildtools/releases/download/1.0.0/buildifier"], -) -http_file( - name = "buildifier_macos", - downloaded_file_path = "buildifier", - executable = True, - sha256 = "6e7545fdfd4b142041b4fefd8f338b31dee556aa37e9fa8e244ee66a765d352f", - urls = ["https://github.com/bazelbuild/buildtools/releases/download/1.0.0/buildifier.mac"], -) - -# Tidy dependencies - local file repositories -local_file = use_repo_rule("//book/htmlbook/tools/repo:local.bzl", "local_file") -local_file( - name = "tidy_linux", - path = "/usr/bin/tidy", - symlinked_file_path = "tidy", -) -local_file( - name = "tidy_macos_i386", - path = "/usr/local/bin/tidy", - symlinked_file_path = "tidy", -) -local_file( - name = "tidy_macos_arm64", - path = "/opt/homebrew/bin/tidy", - symlinked_file_path = "tidy", -) - -# Note: We allow bazel to run as root in containerized environments (CI, -# Docker, Deepnote). This maintains cache consistency since dependencies are -# installed as root in Dockerfile and eliminates the need for complex user -# management in CI workflows. - -python = use_extension("@rules_python//python/extensions:python.bzl", "python") -python.toolchain(python_version = "3.10", ignore_root_user_error = True) -python.toolchain(python_version = "3.12", ignore_root_user_error = True) -python.toolchain(python_version = "3.13", ignore_root_user_error = True) -use_repo(python, "python_3_10", "python_3_12", "python_3_13") - -# Python pip dependencies with automatic platform detection -pip = use_extension("@rules_python//python/extensions:pip.bzl", "pip") - -# Multi-version pip repository using same hub_name -# This allows automatic Python version selection at runtime -pip.parse( - hub_name = "htmlbook_pip", - python_version = "3.10", - requirements_darwin = "//:requirements-bazel-mac.txt", - requirements_linux = "//:requirements-bazel-linux.txt", - requirements_lock = "//:requirements-bazel.txt", - experimental_requirement_cycles = { - "lxml": [ - "lxml", - "lxml-html-clean", - ], - }, -) - -pip.parse( - hub_name = "htmlbook_pip", - python_version = "3.12", - requirements_darwin = "//:requirements-bazel-mac.txt", - requirements_linux = "//:requirements-bazel-linux.txt", - requirements_lock = "//:requirements-bazel.txt", - experimental_requirement_cycles = { - "lxml": [ - "lxml", - "lxml-html-clean", - ], - }, -) - -pip.parse( - hub_name = "htmlbook_pip", - python_version = "3.13", - requirements_darwin = "//:requirements-bazel-mac.txt", - requirements_linux = "//:requirements-bazel-linux.txt", - requirements_lock = "//:requirements-bazel.txt", - experimental_requirement_cycles = { - "lxml": [ - "lxml", - "lxml-html-clean", - ], - }, -) - -use_repo(pip, "htmlbook_pip") diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock deleted file mode 100644 index d62ee563..00000000 --- a/MODULE.bazel.lock +++ /dev/null @@ -1,260 +0,0 @@ -{ - "lockFileVersion": 11, - "registryFileHashes": { - "https://bcr.bazel.build/bazel_registry.json": "8a28e4aff06ee60aed2a8c281907fb8bcbf3b753c91fb5a5c57da3215d5b3497", - "https://bcr.bazel.build/modules/abseil-cpp/20210324.2/MODULE.bazel": "7cd0312e064fde87c8d1cd79ba06c876bd23630c83466e9500321be55c96ace2", - "https://bcr.bazel.build/modules/abseil-cpp/20211102.0/MODULE.bazel": "70390338f7a5106231d20620712f7cccb659cd0e9d073d1991c038eb9fc57589", - "https://bcr.bazel.build/modules/abseil-cpp/20230125.1/MODULE.bazel": "89047429cb0207707b2dface14ba7f8df85273d484c2572755be4bab7ce9c3a0", - "https://bcr.bazel.build/modules/abseil-cpp/20230802.0.bcr.1/MODULE.bazel": "1c8cec495288dccd14fdae6e3f95f772c1c91857047a098fad772034264cc8cb", - "https://bcr.bazel.build/modules/abseil-cpp/20230802.0/MODULE.bazel": "d253ae36a8bd9ee3c5955384096ccb6baf16a1b1e93e858370da0a3b94f77c16", - "https://bcr.bazel.build/modules/abseil-cpp/20230802.1/MODULE.bazel": "fa92e2eb41a04df73cdabeec37107316f7e5272650f81d6cc096418fe647b915", - "https://bcr.bazel.build/modules/abseil-cpp/20240116.1/MODULE.bazel": "37bcdb4440fbb61df6a1c296ae01b327f19e9bb521f9b8e26ec854b6f97309ed", - "https://bcr.bazel.build/modules/abseil-cpp/20240116.1/source.json": "9be551b8d4e3ef76875c0d744b5d6a504a27e3ae67bc6b28f46415fd2d2957da", - "https://bcr.bazel.build/modules/apple_support/1.17.1/MODULE.bazel": "655c922ab1209978a94ef6ca7d9d43e940cd97d9c172fb55f94d91ac53f8610b", - "https://bcr.bazel.build/modules/apple_support/1.17.1/source.json": "6b2b8c74d14e8d485528a938e44bdb72a5ba17632b9e14ef6e68a5ee96c8347f", - "https://bcr.bazel.build/modules/apple_support/1.5.0/MODULE.bazel": "50341a62efbc483e8a2a6aec30994a58749bd7b885e18dd96aa8c33031e558ef", - "https://bcr.bazel.build/modules/bazel_features/1.1.1/MODULE.bazel": "27b8c79ef57efe08efccbd9dd6ef70d61b4798320b8d3c134fd571f78963dbcd", - "https://bcr.bazel.build/modules/bazel_features/1.10.0/MODULE.bazel": "f75e8807570484a99be90abcd52b5e1f390362c258bcb73106f4544957a48101", - "https://bcr.bazel.build/modules/bazel_features/1.11.0/MODULE.bazel": "f9382337dd5a474c3b7d334c2f83e50b6eaedc284253334cf823044a26de03e8", - "https://bcr.bazel.build/modules/bazel_features/1.15.0/MODULE.bazel": "d38ff6e517149dc509406aca0db3ad1efdd890a85e049585b7234d04238e2a4d", - "https://bcr.bazel.build/modules/bazel_features/1.17.0/MODULE.bazel": "039de32d21b816b47bd42c778e0454217e9c9caac4a3cf8e15c7231ee3ddee4d", - "https://bcr.bazel.build/modules/bazel_features/1.18.0/MODULE.bazel": "1be0ae2557ab3a72a57aeb31b29be347bcdc5d2b1eb1e70f39e3851a7e97041a", - "https://bcr.bazel.build/modules/bazel_features/1.19.0/MODULE.bazel": "59adcdf28230d220f0067b1f435b8537dd033bfff8db21335ef9217919c7fb58", - "https://bcr.bazel.build/modules/bazel_features/1.28.0/MODULE.bazel": "4b4200e6cbf8fa335b2c3f43e1d6ef3e240319c33d43d60cc0fbd4b87ece299d", - "https://bcr.bazel.build/modules/bazel_features/1.28.0/source.json": "16a3fc5b4483cb307643791f5a4b7365fa98d2e70da7c378cdbde55f0c0b32cf", - "https://bcr.bazel.build/modules/bazel_features/1.4.1/MODULE.bazel": "e45b6bb2350aff3e442ae1111c555e27eac1d915e77775f6fdc4b351b758b5d7", - "https://bcr.bazel.build/modules/bazel_features/1.9.1/MODULE.bazel": "8f679097876a9b609ad1f60249c49d68bfab783dd9be012faf9d82547b14815a", - "https://bcr.bazel.build/modules/bazel_skylib/1.0.3/MODULE.bazel": "bcb0fd896384802d1ad283b4e4eb4d718eebd8cb820b0a2c3a347fb971afd9d8", - "https://bcr.bazel.build/modules/bazel_skylib/1.1.1/MODULE.bazel": "1add3e7d93ff2e6998f9e118022c84d163917d912f5afafb3058e3d2f1545b5e", - "https://bcr.bazel.build/modules/bazel_skylib/1.2.0/MODULE.bazel": "44fe84260e454ed94ad326352a698422dbe372b21a1ac9f3eab76eb531223686", - "https://bcr.bazel.build/modules/bazel_skylib/1.2.1/MODULE.bazel": "f35baf9da0efe45fa3da1696ae906eea3d615ad41e2e3def4aeb4e8bc0ef9a7a", - "https://bcr.bazel.build/modules/bazel_skylib/1.3.0/MODULE.bazel": "20228b92868bf5cfc41bda7afc8a8ba2a543201851de39d990ec957b513579c5", - "https://bcr.bazel.build/modules/bazel_skylib/1.4.1/MODULE.bazel": "a0dcb779424be33100dcae821e9e27e4f2901d9dfd5333efe5ac6a8d7ab75e1d", - "https://bcr.bazel.build/modules/bazel_skylib/1.4.2/MODULE.bazel": "3bd40978e7a1fac911d5989e6b09d8f64921865a45822d8b09e815eaa726a651", - "https://bcr.bazel.build/modules/bazel_skylib/1.5.0/MODULE.bazel": "32880f5e2945ce6a03d1fbd588e9198c0a959bb42297b2cfaf1685b7bc32e138", - "https://bcr.bazel.build/modules/bazel_skylib/1.6.1/MODULE.bazel": "8fdee2dbaace6c252131c00e1de4b165dc65af02ea278476187765e1a617b917", - "https://bcr.bazel.build/modules/bazel_skylib/1.7.0/MODULE.bazel": "0db596f4563de7938de764cc8deeabec291f55e8ec15299718b93c4423e9796d", - "https://bcr.bazel.build/modules/bazel_skylib/1.7.1/MODULE.bazel": "3120d80c5861aa616222ec015332e5f8d3171e062e3e804a2a0253e1be26e59b", - "https://bcr.bazel.build/modules/bazel_skylib/1.8.0/MODULE.bazel": "2fb3fb53675f6adfc1ca5bfbd5cfb655ae350fba4706d924a8ec7e3ba945671c", - "https://bcr.bazel.build/modules/bazel_skylib/1.8.0/source.json": "5875230cfe587308c40964baa5504351c1f0c576171d7e605dba0ad452d5fcb9", - "https://bcr.bazel.build/modules/buildozer/7.1.2/MODULE.bazel": "2e8dd40ede9c454042645fd8d8d0cd1527966aa5c919de86661e62953cd73d84", - "https://bcr.bazel.build/modules/buildozer/7.1.2/source.json": "c9028a501d2db85793a6996205c8de120944f50a0d570438fcae0457a5f9d1f8", - "https://bcr.bazel.build/modules/google_benchmark/1.8.2/MODULE.bazel": "a70cf1bba851000ba93b58ae2f6d76490a9feb74192e57ab8e8ff13c34ec50cb", - "https://bcr.bazel.build/modules/googletest/1.11.0/MODULE.bazel": "3a83f095183f66345ca86aa13c58b59f9f94a2f81999c093d4eeaa2d262d12f4", - "https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/MODULE.bazel": "22c31a561553727960057361aa33bf20fb2e98584bc4fec007906e27053f80c6", - "https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/source.json": "41e9e129f80d8c8bf103a7acc337b76e54fad1214ac0a7084bf24f4cd924b8b4", - "https://bcr.bazel.build/modules/googletest/1.14.0/MODULE.bazel": "cfbcbf3e6eac06ef9d85900f64424708cc08687d1b527f0ef65aa7517af8118f", - "https://bcr.bazel.build/modules/jsoncpp/1.9.5/MODULE.bazel": "31271aedc59e815656f5736f282bb7509a97c7ecb43e927ac1a37966e0578075", - "https://bcr.bazel.build/modules/jsoncpp/1.9.5/source.json": "4108ee5085dd2885a341c7fab149429db457b3169b86eb081fa245eadf69169d", - "https://bcr.bazel.build/modules/libpfm/4.11.0/MODULE.bazel": "45061ff025b301940f1e30d2c16bea596c25b176c8b6b3087e92615adbd52902", - "https://bcr.bazel.build/modules/platforms/0.0.10/MODULE.bazel": "8cb8efaf200bdeb2150d93e162c40f388529a25852b332cec879373771e48ed5", - "https://bcr.bazel.build/modules/platforms/0.0.10/source.json": "f22828ff4cf021a6b577f1bf6341cb9dcd7965092a439f64fc1bb3b7a5ae4bd5", - "https://bcr.bazel.build/modules/platforms/0.0.4/MODULE.bazel": "9b328e31ee156f53f3c416a64f8491f7eb731742655a47c9eec4703a71644aee", - "https://bcr.bazel.build/modules/platforms/0.0.5/MODULE.bazel": "5733b54ea419d5eaf7997054bb55f6a1d0b5ff8aedf0176fef9eea44f3acda37", - "https://bcr.bazel.build/modules/platforms/0.0.6/MODULE.bazel": "ad6eeef431dc52aefd2d77ed20a4b353f8ebf0f4ecdd26a807d2da5aa8cd0615", - "https://bcr.bazel.build/modules/platforms/0.0.7/MODULE.bazel": "72fd4a0ede9ee5c021f6a8dd92b503e089f46c227ba2813ff183b71616034814", - "https://bcr.bazel.build/modules/platforms/0.0.8/MODULE.bazel": "9f142c03e348f6d263719f5074b21ef3adf0b139ee4c5133e2aa35664da9eb2d", - "https://bcr.bazel.build/modules/platforms/0.0.9/MODULE.bazel": "4a87a60c927b56ddd67db50c89acaa62f4ce2a1d2149ccb63ffd871d5ce29ebc", - "https://bcr.bazel.build/modules/protobuf/21.7/MODULE.bazel": "a5a29bb89544f9b97edce05642fac225a808b5b7be74038ea3640fae2f8e66a7", - "https://bcr.bazel.build/modules/protobuf/27.0/MODULE.bazel": "7873b60be88844a0a1d8f80b9d5d20cfbd8495a689b8763e76c6372998d3f64c", - "https://bcr.bazel.build/modules/protobuf/27.1/MODULE.bazel": "703a7b614728bb06647f965264967a8ef1c39e09e8f167b3ca0bb1fd80449c0d", - "https://bcr.bazel.build/modules/protobuf/29.0-rc2/MODULE.bazel": "6241d35983510143049943fc0d57937937122baf1b287862f9dc8590fc4c37df", - "https://bcr.bazel.build/modules/protobuf/29.0-rc2/source.json": "52101bfd37e38f0d159dee47b71ccbd1f22f7a32192cef5ef2533bb6212f410f", - "https://bcr.bazel.build/modules/protobuf/3.19.0/MODULE.bazel": "6b5fbb433f760a99a22b18b6850ed5784ef0e9928a72668b66e4d7ccd47db9b0", - "https://bcr.bazel.build/modules/protobuf/3.19.6/MODULE.bazel": "9233edc5e1f2ee276a60de3eaa47ac4132302ef9643238f23128fea53ea12858", - "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/MODULE.bazel": "88af1c246226d87e65be78ed49ecd1e6f5e98648558c14ce99176da041dc378e", - "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/source.json": "be4789e951dd5301282729fe3d4938995dc4c1a81c2ff150afc9f1b0504c6022", - "https://bcr.bazel.build/modules/re2/2023-09-01/MODULE.bazel": "cb3d511531b16cfc78a225a9e2136007a48cf8a677e4264baeab57fe78a80206", - "https://bcr.bazel.build/modules/re2/2023-09-01/source.json": "e044ce89c2883cd957a2969a43e79f7752f9656f6b20050b62f90ede21ec6eb4", - "https://bcr.bazel.build/modules/rules_android/0.1.1/MODULE.bazel": "48809ab0091b07ad0182defb787c4c5328bd3a278938415c00a7b69b50c4d3a8", - "https://bcr.bazel.build/modules/rules_android/0.1.1/source.json": "e6986b41626ee10bdc864937ffb6d6bf275bb5b9c65120e6137d56e6331f089e", - "https://bcr.bazel.build/modules/rules_cc/0.0.1/MODULE.bazel": "cb2aa0747f84c6c3a78dad4e2049c154f08ab9d166b1273835a8174940365647", - "https://bcr.bazel.build/modules/rules_cc/0.0.10/MODULE.bazel": "ec1705118f7eaedd6e118508d3d26deba2a4e76476ada7e0e3965211be012002", - "https://bcr.bazel.build/modules/rules_cc/0.0.13/MODULE.bazel": "0e8529ed7b323dad0775ff924d2ae5af7640b23553dfcd4d34344c7e7a867191", - "https://bcr.bazel.build/modules/rules_cc/0.0.14/MODULE.bazel": "5e343a3aac88b8d7af3b1b6d2093b55c347b8eefc2e7d1442f7a02dc8fea48ac", - "https://bcr.bazel.build/modules/rules_cc/0.0.15/MODULE.bazel": "6704c35f7b4a72502ee81f61bf88706b54f06b3cbe5558ac17e2e14666cd5dcc", - "https://bcr.bazel.build/modules/rules_cc/0.0.2/MODULE.bazel": "6915987c90970493ab97393024c156ea8fb9f3bea953b2f3ec05c34f19b5695c", - "https://bcr.bazel.build/modules/rules_cc/0.0.6/MODULE.bazel": "abf360251023dfe3efcef65ab9d56beefa8394d4176dd29529750e1c57eaa33f", - "https://bcr.bazel.build/modules/rules_cc/0.0.8/MODULE.bazel": "964c85c82cfeb6f3855e6a07054fdb159aced38e99a5eecf7bce9d53990afa3e", - "https://bcr.bazel.build/modules/rules_cc/0.0.9/MODULE.bazel": "836e76439f354b89afe6a911a7adf59a6b2518fafb174483ad78a2a2fde7b1c5", - "https://bcr.bazel.build/modules/rules_cc/0.2.0/MODULE.bazel": "b5c17f90458caae90d2ccd114c81970062946f49f355610ed89bebf954f5783c", - "https://bcr.bazel.build/modules/rules_cc/0.2.0/source.json": "5f7f4e578e950adbf194217d4b607237a8197fc53ba46c367b3d61a86ecf35c2", - "https://bcr.bazel.build/modules/rules_foreign_cc/0.9.0/MODULE.bazel": "c9e8c682bf75b0e7c704166d79b599f93b72cfca5ad7477df596947891feeef6", - "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel": "40c97d1144356f52905566c55811f13b299453a14ac7769dfba2ac38192337a8", - "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/source.json": "c8b1e2c717646f1702290959a3302a178fb639d987ab61d548105019f11e527e", - "https://bcr.bazel.build/modules/rules_java/4.0.0/MODULE.bazel": "5a78a7ae82cd1a33cef56dc578c7d2a46ed0dca12643ee45edbb8417899e6f74", - "https://bcr.bazel.build/modules/rules_java/5.3.5/MODULE.bazel": "a4ec4f2db570171e3e5eb753276ee4b389bae16b96207e9d3230895c99644b86", - "https://bcr.bazel.build/modules/rules_java/6.0.0/MODULE.bazel": "8a43b7df601a7ec1af61d79345c17b31ea1fedc6711fd4abfd013ea612978e39", - "https://bcr.bazel.build/modules/rules_java/6.4.0/MODULE.bazel": "e986a9fe25aeaa84ac17ca093ef13a4637f6107375f64667a15999f77db6c8f6", - "https://bcr.bazel.build/modules/rules_java/6.5.2/MODULE.bazel": "1d440d262d0e08453fa0c4d8f699ba81609ed0e9a9a0f02cd10b3e7942e61e31", - "https://bcr.bazel.build/modules/rules_java/7.10.0/MODULE.bazel": "530c3beb3067e870561739f1144329a21c851ff771cd752a49e06e3dc9c2e71a", - "https://bcr.bazel.build/modules/rules_java/7.12.2/MODULE.bazel": "579c505165ee757a4280ef83cda0150eea193eed3bef50b1004ba88b99da6de6", - "https://bcr.bazel.build/modules/rules_java/7.12.2/source.json": "b0890f9cda8ff1b8e691a3ac6037b5c14b7fd4134765a3946b89f31ea02e5884", - "https://bcr.bazel.build/modules/rules_java/7.2.0/MODULE.bazel": "06c0334c9be61e6cef2c8c84a7800cef502063269a5af25ceb100b192453d4ab", - "https://bcr.bazel.build/modules/rules_java/7.3.2/MODULE.bazel": "50dece891cfdf1741ea230d001aa9c14398062f2b7c066470accace78e412bc2", - "https://bcr.bazel.build/modules/rules_java/7.6.1/MODULE.bazel": "2f14b7e8a1aa2f67ae92bc69d1ec0fa8d9f827c4e17ff5e5f02e91caa3b2d0fe", - "https://bcr.bazel.build/modules/rules_java/7.6.5/MODULE.bazel": "481164be5e02e4cab6e77a36927683263be56b7e36fef918b458d7a8a1ebadb1", - "https://bcr.bazel.build/modules/rules_jvm_external/4.4.2/MODULE.bazel": "a56b85e418c83eb1839819f0b515c431010160383306d13ec21959ac412d2fe7", - "https://bcr.bazel.build/modules/rules_jvm_external/5.1/MODULE.bazel": "33f6f999e03183f7d088c9be518a63467dfd0be94a11d0055fe2d210f89aa909", - "https://bcr.bazel.build/modules/rules_jvm_external/5.2/MODULE.bazel": "d9351ba35217ad0de03816ef3ed63f89d411349353077348a45348b096615036", - "https://bcr.bazel.build/modules/rules_jvm_external/5.3/MODULE.bazel": "bf93870767689637164657731849fb887ad086739bd5d360d90007a581d5527d", - "https://bcr.bazel.build/modules/rules_jvm_external/6.1/MODULE.bazel": "75b5fec090dbd46cf9b7d8ea08cf84a0472d92ba3585b476f44c326eda8059c4", - "https://bcr.bazel.build/modules/rules_jvm_external/6.3/MODULE.bazel": "c998e060b85f71e00de5ec552019347c8bca255062c990ac02d051bb80a38df0", - "https://bcr.bazel.build/modules/rules_jvm_external/6.3/source.json": "6f5f5a5a4419ae4e37c35a5bb0a6ae657ed40b7abc5a5189111b47fcebe43197", - "https://bcr.bazel.build/modules/rules_kotlin/1.9.0/MODULE.bazel": "ef85697305025e5a61f395d4eaede272a5393cee479ace6686dba707de804d59", - "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/MODULE.bazel": "d269a01a18ee74d0335450b10f62c9ed81f2321d7958a2934e44272fe82dcef3", - "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/source.json": "2faa4794364282db7c06600b7e5e34867a564ae91bda7cae7c29c64e9466b7d5", - "https://bcr.bazel.build/modules/rules_license/0.0.3/MODULE.bazel": "627e9ab0247f7d1e05736b59dbb1b6871373de5ad31c3011880b4133cafd4bd0", - "https://bcr.bazel.build/modules/rules_license/0.0.7/MODULE.bazel": "088fbeb0b6a419005b89cf93fe62d9517c0a2b8bb56af3244af65ecfe37e7d5d", - "https://bcr.bazel.build/modules/rules_license/1.0.0/MODULE.bazel": "a7fda60eefdf3d8c827262ba499957e4df06f659330bbe6cdbdb975b768bb65c", - "https://bcr.bazel.build/modules/rules_license/1.0.0/source.json": "a52c89e54cc311196e478f8382df91c15f7a2bfdf4c6cd0e2675cc2ff0b56efb", - "https://bcr.bazel.build/modules/rules_pkg/0.7.0/MODULE.bazel": "df99f03fc7934a4737122518bb87e667e62d780b610910f0447665a7e2be62dc", - "https://bcr.bazel.build/modules/rules_pkg/1.0.1/MODULE.bazel": "5b1df97dbc29623bccdf2b0dcd0f5cb08e2f2c9050aab1092fd39a41e82686ff", - "https://bcr.bazel.build/modules/rules_pkg/1.0.1/source.json": "bd82e5d7b9ce2d31e380dd9f50c111d678c3bdaca190cb76b0e1c71b05e1ba8a", - "https://bcr.bazel.build/modules/rules_proto/4.0.0/MODULE.bazel": "a7a7b6ce9bee418c1a760b3d84f83a299ad6952f9903c67f19e4edd964894e06", - "https://bcr.bazel.build/modules/rules_proto/5.3.0-21.7/MODULE.bazel": "e8dff86b0971688790ae75528fe1813f71809b5afd57facb44dad9e8eca631b7", - "https://bcr.bazel.build/modules/rules_proto/6.0.2/MODULE.bazel": "ce916b775a62b90b61888052a416ccdda405212b6aaeb39522f7dc53431a5e73", - "https://bcr.bazel.build/modules/rules_proto/7.0.2/MODULE.bazel": "bf81793bd6d2ad89a37a40693e56c61b0ee30f7a7fdbaf3eabbf5f39de47dea2", - "https://bcr.bazel.build/modules/rules_proto/7.0.2/source.json": "1e5e7260ae32ef4f2b52fd1d0de8d03b606a44c91b694d2f1afb1d3b28a48ce1", - "https://bcr.bazel.build/modules/rules_python/0.10.2/MODULE.bazel": "cc82bc96f2997baa545ab3ce73f196d040ffb8756fd2d66125a530031cd90e5f", - "https://bcr.bazel.build/modules/rules_python/0.22.1/MODULE.bazel": "26114f0c0b5e93018c0c066d6673f1a2c3737c7e90af95eff30cfee38d0bbac7", - "https://bcr.bazel.build/modules/rules_python/0.23.1/MODULE.bazel": "49ffccf0511cb8414de28321f5fcf2a31312b47c40cc21577144b7447f2bf300", - "https://bcr.bazel.build/modules/rules_python/0.25.0/MODULE.bazel": "72f1506841c920a1afec76975b35312410eea3aa7b63267436bfb1dd91d2d382", - "https://bcr.bazel.build/modules/rules_python/0.28.0/MODULE.bazel": "cba2573d870babc976664a912539b320cbaa7114cd3e8f053c720171cde331ed", - "https://bcr.bazel.build/modules/rules_python/0.31.0/MODULE.bazel": "93a43dc47ee570e6ec9f5779b2e64c1476a6ce921c48cc9a1678a91dd5f8fd58", - "https://bcr.bazel.build/modules/rules_python/0.4.0/MODULE.bazel": "9208ee05fd48bf09ac60ed269791cf17fb343db56c8226a720fbb1cdf467166c", - "https://bcr.bazel.build/modules/rules_python/0.40.0/MODULE.bazel": "9d1a3cd88ed7d8e39583d9ffe56ae8a244f67783ae89b60caafc9f5cf318ada7", - "https://bcr.bazel.build/modules/rules_python/0.40.0/source.json": "939d4bd2e3110f27bfb360292986bb79fd8dcefb874358ccd6cdaa7bda029320", - "https://bcr.bazel.build/modules/rules_shell/0.2.0/MODULE.bazel": "fda8a652ab3c7d8fee214de05e7a9916d8b28082234e8d2c0094505c5268ed3c", - "https://bcr.bazel.build/modules/rules_shell/0.2.0/source.json": "7f27af3c28037d9701487c4744b5448d26537cc66cdef0d8df7ae85411f8de95", - "https://bcr.bazel.build/modules/stardoc/0.5.1/MODULE.bazel": "1a05d92974d0c122f5ccf09291442580317cdd859f07a8655f1db9a60374f9f8", - "https://bcr.bazel.build/modules/stardoc/0.5.3/MODULE.bazel": "c7f6948dae6999bf0db32c1858ae345f112cacf98f174c7a8bb707e41b974f1c", - "https://bcr.bazel.build/modules/stardoc/0.5.6/MODULE.bazel": "c43dabc564990eeab55e25ed61c07a1aadafe9ece96a4efabb3f8bf9063b71ef", - "https://bcr.bazel.build/modules/stardoc/0.7.0/MODULE.bazel": "05e3d6d30c099b6770e97da986c53bd31844d7f13d41412480ea265ac9e8079c", - "https://bcr.bazel.build/modules/stardoc/0.7.1/MODULE.bazel": "3548faea4ee5dda5580f9af150e79d0f6aea934fc60c1cc50f4efdd9420759e7", - "https://bcr.bazel.build/modules/stardoc/0.7.1/source.json": "b6500ffcd7b48cd72c29bb67bcac781e12701cc0d6d55d266a652583cfcdab01", - "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "7298990c00040a0e2f121f6c32544bab27d4452f80d9ce51349b1a28f3005c43", - "https://bcr.bazel.build/modules/zlib/1.2.11/MODULE.bazel": "07b389abc85fdbca459b69e2ec656ae5622873af3f845e1c9d80fe179f3effa0", - "https://bcr.bazel.build/modules/zlib/1.2.12/MODULE.bazel": "3b1a8834ada2a883674be8cbd36ede1b6ec481477ada359cd2d3ddc562340b27", - "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.3/MODULE.bazel": "af322bc08976524477c79d1e45e241b6efbeb918c497e8840b8ab116802dda79", - "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.3/source.json": "2be409ac3c7601245958cd4fcdff4288be79ed23bd690b4b951f500d54ee6e7d", - "https://bcr.bazel.build/modules/zlib/1.3.1/MODULE.bazel": "751c9940dcfe869f5f7274e1295422a34623555916eb98c174c1e945594bf198" - }, - "selectedYankedVersions": {}, - "moduleExtensions": { - "@@apple_support~//crosstool:setup.bzl%apple_cc_configure_extension": { - "general": { - "bzlTransitiveDigest": "7ii+gFxWSxHhQPrBxfMEHhtrGvHmBTvsh+KOyGunP/s=", - "usagesDigest": "R8xslr59tZnVLqBbEpbunVi3NfM8lkJZstFJkVyW4qk=", - "recordedFileInputs": {}, - "recordedDirentsInputs": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "local_config_apple_cc_toolchains": { - "bzlFile": "@@apple_support~//crosstool:setup.bzl", - "ruleClassName": "_apple_cc_autoconf_toolchains", - "attributes": {} - }, - "local_config_apple_cc": { - "bzlFile": "@@apple_support~//crosstool:setup.bzl", - "ruleClassName": "_apple_cc_autoconf", - "attributes": {} - } - }, - "recordedRepoMappingEntries": [ - [ - "apple_support~", - "bazel_tools", - "bazel_tools" - ] - ] - } - }, - "@@platforms//host:extension.bzl%host_platform": { - "general": { - "bzlTransitiveDigest": "xelQcPZH8+tmuOHVjL9vDxMnnQNMlwj0SlvgoqBkm4U=", - "usagesDigest": "hgylFkgWSg0ulUwWZzEM1aIftlUnbmw2ynWLdEfHnZc=", - "recordedFileInputs": {}, - "recordedDirentsInputs": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "host_platform": { - "bzlFile": "@@platforms//host:extension.bzl", - "ruleClassName": "host_platform_repo", - "attributes": {} - } - }, - "recordedRepoMappingEntries": [] - } - }, - "@@rules_kotlin~//src/main/starlark/core/repositories:bzlmod_setup.bzl%rules_kotlin_extensions": { - "general": { - "bzlTransitiveDigest": "fus14IFJ/1LGWWGKPH/U18VnJCoMjfDt1ckahqCnM0A=", - "usagesDigest": "aJF6fLy82rR95Ff5CZPAqxNoFgOMLMN5ImfBS0nhnkg=", - "recordedFileInputs": {}, - "recordedDirentsInputs": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "com_github_jetbrains_kotlin_git": { - "bzlFile": "@@rules_kotlin~//src/main/starlark/core/repositories:compiler.bzl", - "ruleClassName": "kotlin_compiler_git_repository", - "attributes": { - "urls": [ - "https://github.com/JetBrains/kotlin/releases/download/v1.9.23/kotlin-compiler-1.9.23.zip" - ], - "sha256": "93137d3aab9afa9b27cb06a824c2324195c6b6f6179d8a8653f440f5bd58be88" - } - }, - "com_github_jetbrains_kotlin": { - "bzlFile": "@@rules_kotlin~//src/main/starlark/core/repositories:compiler.bzl", - "ruleClassName": "kotlin_capabilities_repository", - "attributes": { - "git_repository_name": "com_github_jetbrains_kotlin_git", - "compiler_version": "1.9.23" - } - }, - "com_github_google_ksp": { - "bzlFile": "@@rules_kotlin~//src/main/starlark/core/repositories:ksp.bzl", - "ruleClassName": "ksp_compiler_plugin_repository", - "attributes": { - "urls": [ - "https://github.com/google/ksp/releases/download/1.9.23-1.0.20/artifacts.zip" - ], - "sha256": "ee0618755913ef7fd6511288a232e8fad24838b9af6ea73972a76e81053c8c2d", - "strip_version": "1.9.23-1.0.20" - } - }, - "com_github_pinterest_ktlint": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "sha256": "01b2e0ef893383a50dbeb13970fe7fa3be36ca3e83259e01649945b09d736985", - "urls": [ - "https://github.com/pinterest/ktlint/releases/download/1.3.0/ktlint" - ], - "executable": true - } - }, - "rules_android": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "cd06d15dd8bb59926e4d65f9003bfc20f9da4b2519985c27e190cddc8b7a7806", - "strip_prefix": "rules_android-0.1.1", - "urls": [ - "https://github.com/bazelbuild/rules_android/archive/v0.1.1.zip" - ] - } - } - }, - "recordedRepoMappingEntries": [ - [ - "rules_kotlin~", - "bazel_tools", - "bazel_tools" - ] - ] - } - } - } -} diff --git a/book/BUILD.bazel b/book/BUILD.bazel deleted file mode 100644 index 8758a009..00000000 --- a/book/BUILD.bazel +++ /dev/null @@ -1,118 +0,0 @@ -# -*- mode: python -*- -# vi: set ft=python : - -# Copyright 2020-2024 Massachusetts Institute of Technology. -# Licensed under the BSD 3-Clause License. See LICENSE.TXT for details. - -load("//book/htmlbook/tools/html:defs.bzl", "rt_html_test") -load("//book/htmlbook/tools/tidy:def.bzl", "html_tidy_test") - -filegroup( - name = "html", - srcs = glob([ - "*.html", - "*.html.in", - ]), - visibility = ["//:__subpackages__"], -) - -html_tidy_test( - name = "html_tidy", - srcs = [":html"], - config = ".tidy.config", -) - -rt_html_test( - srcs = ["intro.html"], -) - -rt_html_test( - srcs = ["robot.html"], -) - -rt_html_test( - srcs = ["pick.html"], - data = [ - "//book/data:gripper_position_trajectory.html", - "//book/data:gripper_trajectory.html", - "//book/data:pick.html", - "//book/data:two_link_singularities.html", - "//book/figures:scaling_spatial_velocity.py", - ], -) - -rt_html_test( - srcs = ["pose.html"], - data = [ - "//book/data:depth_camera_diagram.svg", - "//book/data:icp_noise.html", - "//book/data:icp_outliers.html", - "//book/data:icp_partial_view.html", - "//book/data:iterative_closest_point.html", - "//book/data:mustard.html", - ], -) - -rt_html_test( - srcs = ["clutter.html"], - data = [ - "//book/data:falling_bricks_2d.html", - "//book/data:foam_brick_contact_geometry.html", - "//book/data:mustard_bottle_point_clouds.html", - ], -) - -rt_html_test( - srcs = ["segmentation.html"], -) - -rt_html_test( - srcs = ["deep_perception.html"], -) - -rt_html_test( - srcs = ["force.html"], - data = [ - "//book/data:force_flip_up.html", - ], -) - -rt_html_test( - srcs = ["trajectories.html"], - data = [ - "//book/data:iiwa_shelves_configuration_space.html", - "//book/data:shelf_ik_prog.html", - "//book/data:shelf_ik_prog_zoom.html", - ], -) - -rt_html_test( - srcs = ["rl.html"], -) - -rt_html_test( - srcs = ["drake.html"], -) - -rt_html_test( - srcs = ["misc.html"], -) - -rt_html_test( - srcs = ["station.html"], -) - -filegroup( - name = "chapters", - srcs = ["chapters.json"], - visibility = ["//visibility:public"], -) - -filegroup( - name = "deepnote", - srcs = [ - "Deepnote.json", - "Deepnote_workspace.txt", - ], - visibility = ["//visibility:public"], -) \ No newline at end of file diff --git a/book/clutter/BUILD.bazel b/book/clutter/BUILD.bazel deleted file mode 100644 index 76b12f6b..00000000 --- a/book/clutter/BUILD.bazel +++ /dev/null @@ -1,106 +0,0 @@ -# -*- mode: python -*- -# vi: set ft=python : - -# Copyright 2020-2024 Massachusetts Institute of Technology. -# Licensed under the BSD 3-Clause License. See LICENSE.TXT for details. - -load("//book/htmlbook/tools/python:requirements.bzl", "requirement") -load("//book/htmlbook/tools/jupyter:defs.bzl", "rt_ipynb_test") - -rt_ipynb_test( - name = "falling_things", - srcs = ["falling_things.ipynb"], - flaky = True, # occasionally mbp will crash. - data = ["//manipulation/models"], - tags = ["no-sandbox"], # from vtk-test-tags() in drake - deps = [ - "//manipulation", - "//manipulation:scenarios", - "//manipulation:station", - ], -) - -rt_ipynb_test( - name = "contact_inspector", - srcs = ["contact_inspector.ipynb"], - data = ["//manipulation/models"], - deps = [ - "//manipulation", - "//manipulation:scenarios", - ], -) - -rt_ipynb_test( - name = "contact_wrench", - srcs = ["contact_wrench.ipynb"], - deps = [ - "//manipulation", - "//manipulation:scenarios", - ], -) - -rt_ipynb_test( - name = "point_cloud_processing", - srcs = ["point_cloud_processing.ipynb"], - tags = ["no-sandbox"], # from vtk-test-tags() in drake - deps = [ - "//manipulation", - "//manipulation:mustard_depth_camera_example", - ], -) - -rt_ipynb_test( - name = "normal_estimation", - srcs = ["normal_estimation.ipynb"], - data = ["//manipulation/models"], - tags = ["no-sandbox"], # from vtk-test-tags() in drake - deps = [ - "//manipulation", - "//manipulation:mustard_depth_camera_example", - "//manipulation:meshcat_utils", - requirement("scipy"), - ], -) - -rt_ipynb_test( - name = "grasp_selection", - srcs = ["grasp_selection.ipynb"], - flaky = True, # occasionally mbp will crash. - data = ["//manipulation/models"], - tags = ["no-sandbox"], # from vtk-test-tags() in drake - deps = [ - "//manipulation", - "//manipulation:mustard_depth_camera_example", - "//manipulation:scenarios", - ], -) - -rt_ipynb_test( - name = "suction", - srcs = ["suction.ipynb"], - flaky = True, # occasionally mbp will crash. - data = ["//manipulation/models"], - tags = ["no-sandbox"], # from vtk-test-tags() in drake - deps = [ - "//manipulation", - "//manipulation:meshcat_utils", - "//manipulation:scenarios", - "//manipulation:station", - ], -) - - -rt_ipynb_test( - name = "clutter_clearing", - srcs = ["clutter_clearing.ipynb"], - data = ["//manipulation/models"], - tags = ["no-sandbox"], # from vtk-test-tags() in drake - deps = [ - "//manipulation", - "//manipulation:clutter", - "//manipulation:meshcat_utils", - "//manipulation:pick", - "//manipulation:scenarios", - "//manipulation:station", - ], -) \ No newline at end of file diff --git a/book/clutter/exercises/BUILD.bazel b/book/clutter/exercises/BUILD.bazel deleted file mode 100644 index 9873705b..00000000 --- a/book/clutter/exercises/BUILD.bazel +++ /dev/null @@ -1,60 +0,0 @@ -# -*- mode: python -*- -# vi: set ft=python : - -# Copyright 2020-2021 Massachusetts Institute of Technology. -# Licensed under the BSD 3-Clause License. See LICENSE.TXT for details. - -load("//book/htmlbook/tools/python:requirements.bzl", "requirement") -load("//book/htmlbook/tools/jupyter:defs.bzl", "rt_ipynb_test") - -rt_ipynb_test( - name = "static_equilibrium", - srcs = ["static_equilibrium.ipynb"], - deps = [ - "//manipulation", - "//manipulation:scenarios", - ], -) - -rt_ipynb_test( - name = "normal_estimation_depth", - srcs = ["normal_estimation_depth.ipynb"], - tags = ["no-sandbox"], # for rendering, see drake#7004 - deps = [ - "//manipulation", - "//manipulation:meshcat_utils", - "//manipulation:scenarios", - "//manipulation:mustard_depth_camera_example", - "//manipulation/exercises:grader", - "//manipulation/exercises/clutter:test_normal", - ], -) - -rt_ipynb_test( - name = "analytic_antipodal_grasps", - srcs = ["analytic_antipodal_grasps.ipynb"], - deps = [ - "//manipulation", - "//manipulation/exercises:grader", - "//manipulation/exercises/clutter:test_analytic_grasp", - ], -) - -rt_ipynb_test( - name = "grasp_candidate", - srcs = ["grasp_candidate.ipynb"], - tags = ["no-sandbox"], # for rendering, see drake#7004 - data = [ - "//manipulation/models", - ], - deps = [ - "//manipulation", - "//manipulation:meshcat_utils", - "//manipulation:mustard_depth_camera_example", - "//manipulation:scenarios", - "//manipulation/exercises:grader", - "//manipulation/exercises/clutter:test_grasp_candidate", - requirement("scipy"), - ], -) - diff --git a/book/clutter/exercises/test_notebooks_clutter_exercises.py b/book/clutter/exercises/test_notebooks_clutter_exercises.py new file mode 100644 index 00000000..545b2eb4 --- /dev/null +++ b/book/clutter/exercises/test_notebooks_clutter_exercises.py @@ -0,0 +1,6 @@ +from htmlbook.ipynb_test import ipynb_test + +ipynb_test("static_equilibrium.ipynb") +ipynb_test("normal_estimation_depth.ipynb") +ipynb_test("analytic_antipodal_grasps.ipynb") +ipynb_test("grasp_candidate.ipynb") diff --git a/book/clutter/test_notebooks_clutter.py b/book/clutter/test_notebooks_clutter.py new file mode 100644 index 00000000..efdbf8a6 --- /dev/null +++ b/book/clutter/test_notebooks_clutter.py @@ -0,0 +1,10 @@ +from htmlbook.ipynb_test import ipynb_test + +ipynb_test("falling_things.ipynb") +ipynb_test("contact_inspector.ipynb") +ipynb_test("contact_wrench.ipynb") +ipynb_test("point_cloud_processing.ipynb") +ipynb_test("normal_estimation.ipynb") +ipynb_test("grasp_selection.ipynb") +ipynb_test("suction.ipynb") +ipynb_test("clutter_clearing.ipynb") diff --git a/book/deep_perception.html b/book/deep_perception.html index 75b7d1e1..54a330b9 100644 --- a/book/deep_perception.html +++ b/book/deep_perception.html @@ -176,7 +176,7 @@

Robotic Manipulation<

Pose estimation benchmarks

-

Benchmark for 6D Object Pose Estimation (BOP)Hodan20.

+

Benchmark for 6D Object Pose Estimation (BOP)Hodan20.

diff --git a/book/deep_perception/exercises/BUILD.bazel b/book/deep_perception/exercises/BUILD.bazel deleted file mode 100644 index a010408c..00000000 --- a/book/deep_perception/exercises/BUILD.bazel +++ /dev/null @@ -1,18 +0,0 @@ -# -*- mode: python -*- -# vi: set ft=python : - -# Copyright 2020-2021 Massachusetts Institute of Technology. -# Licensed under the BSD 3-Clause License. See LICENSE.TXT for details. - -load("//book/htmlbook/tools/python:requirements.bzl", "requirement") -load("//book/htmlbook/tools/jupyter:defs.bzl", "rt_ipynb_test") - -rt_ipynb_test( - name = "contrastive", - srcs = ["contrastive.ipynb"], - deps = [ - "//manipulation/exercises:grader", - "//manipulation/exercises/deep_perception:test_contrastive", - requirement("drake"), - ], -) diff --git a/book/deep_perception/exercises/test_notebooks_deep_perception_exercises.py b/book/deep_perception/exercises/test_notebooks_deep_perception_exercises.py new file mode 100644 index 00000000..984cc1aa --- /dev/null +++ b/book/deep_perception/exercises/test_notebooks_deep_perception_exercises.py @@ -0,0 +1,3 @@ +from htmlbook.ipynb_test import ipynb_test + +ipynb_test("contrastive.ipynb") diff --git a/book/figures/BUILD.bazel b/book/figures/BUILD.bazel deleted file mode 100644 index b6d576e3..00000000 --- a/book/figures/BUILD.bazel +++ /dev/null @@ -1,44 +0,0 @@ -# -*- mode: python -*- -# vi: set ft=python : - -# Copyright 2020-2024 Massachusetts Institute of Technology. -# Licensed under the BSD 3-Clause License. See LICENSE.TXT for details. - -load("//book/htmlbook/tools/python:requirements.bzl", "requirement") -load("//book/htmlbook/tools/jupyter:defs.bzl", "rt_ipynb_test") -load("//book/htmlbook/tools/python:defs.bzl", "rt_py_test") - -rt_ipynb_test( - name = "grasp_frames", - srcs = ["grasp_frames.ipynb"], - deps = ["//manipulation:scenarios"], -) - -rt_ipynb_test( - name = "nonlinear_pose_estimation", - srcs = ["nonlinear_pose_estimation.ipynb"], - deps = ["//manipulation"], -) - -rt_py_test( - name = "scaling_spatial_velocity", - srcs = ["scaling_spatial_velocity.py"], - deps = [ - requirement("drake"), - ], -) - -rt_py_test( - name = "two_link_singularities", - srcs = ["two_link_singularities.py"], - data = ["//manipulation/models"], - deps = [ - "//manipulation", - ], -) - -# Export some files so that I can link to them from the text. -exports_files( - ["scaling_spatial_velocity.py"], - visibility = ["//visibility:public"], -) diff --git a/book/figures/test_notebooks_figures.py b/book/figures/test_notebooks_figures.py new file mode 100644 index 00000000..d07f78ba --- /dev/null +++ b/book/figures/test_notebooks_figures.py @@ -0,0 +1,4 @@ +from htmlbook.ipynb_test import ipynb_test + +ipynb_test("grasp_frames.ipynb") +ipynb_test("nonlinear_pose_estimation.ipynb") diff --git a/book/figures/test_scripts_figures.py b/book/figures/test_scripts_figures.py new file mode 100644 index 00000000..994a8293 --- /dev/null +++ b/book/figures/test_scripts_figures.py @@ -0,0 +1,33 @@ +from __future__ import annotations + +import contextlib +import os +import runpy +import tempfile +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[2] + + +@contextlib.contextmanager +def _chdir(path: Path): + old = Path.cwd() + os.chdir(path) + try: + yield + finally: + os.chdir(old) + + +def _run(script_rel: str) -> None: + with tempfile.TemporaryDirectory(prefix="script_cwd_") as temp_cwd: + with _chdir(Path(temp_cwd)): + runpy.run_path(str(ROOT / script_rel), run_name="__main__") + + +def test_scaling_spatial_velocity_script() -> None: + _run("book/figures/scaling_spatial_velocity.py") + + +def test_two_link_singularities_script() -> None: + _run("book/figures/two_link_singularities.py") diff --git a/book/force.html b/book/force.html index 066d9e5b..71f22234 100644 --- a/book/force.html +++ b/book/force.html @@ -951,7 +951,7 @@

Manipulator Control

and command some Cartesian forces through $\tau_{ff}$ if we desire them. (If you are interested in the driver details, then I would recommend the documentation for the - Franka Control + Franka Control Interface which is much easier to find and read, and is very similar to functionality provided by the iiwa driver.)

diff --git a/book/force/BUILD.bazel b/book/force/BUILD.bazel deleted file mode 100644 index 74a3a2b9..00000000 --- a/book/force/BUILD.bazel +++ /dev/null @@ -1,45 +0,0 @@ -# -*- mode: python -*- -# vi: set ft=python : - -# Copyright 2020-2024 Massachusetts Institute of Technology. -# Licensed under the BSD 3-Clause License. See LICENSE.TXT for details. - -load("//book/htmlbook/tools/jupyter:defs.bzl", "rt_ipynb_test") - -rt_ipynb_test( - name = "point_finger", - srcs = ["point_finger.ipynb"], - tags = ["requires-network"], # For gurobi - data = ["//manipulation/models"], - deps = [ - "//manipulation", - "//manipulation:meshcat_utils", - "//manipulation:scenarios", - ], -) - -rt_ipynb_test( - name = "tracking", - srcs = ["tracking.ipynb"], - deps = [ - "//manipulation", - ] -) - -rt_ipynb_test( - name = "writing", - srcs = ["writing.ipynb"], - deps = [ - "//manipulation", - "//manipulation:meshcat_utils", - "//manipulation:scenarios", - ], -) - -rt_ipynb_test( - name = "bounce", - srcs = ["bounce.ipynb"], - deps = [ - "//manipulation", - ], -) \ No newline at end of file diff --git a/book/force/exercises/BUILD.bazel b/book/force/exercises/BUILD.bazel deleted file mode 100644 index fabcb28e..00000000 --- a/book/force/exercises/BUILD.bazel +++ /dev/null @@ -1,21 +0,0 @@ -# -*- mode: python -*- -# vi: set ft=python : - -# Copyright 2020-2021 Massachusetts Institute of Technology. -# Licensed under the BSD 3-Clause License. See LICENSE.TXT for details. - -load("//book/htmlbook/tools/jupyter:defs.bzl", "rt_ipynb_test") - -rt_ipynb_test( - name = "hybrid_force_position", - srcs = ["hybrid_force_position.ipynb"], - data = [ - "//manipulation/models", - ], - deps = [ - "//manipulation", - "//manipulation:station", - "//manipulation/exercises:grader", - "//manipulation/exercises/force:test_hybrid", - ], -) diff --git a/book/force/exercises/test_notebooks_force_exercises.py b/book/force/exercises/test_notebooks_force_exercises.py new file mode 100644 index 00000000..b05f1724 --- /dev/null +++ b/book/force/exercises/test_notebooks_force_exercises.py @@ -0,0 +1,3 @@ +from htmlbook.ipynb_test import ipynb_test + +ipynb_test("hybrid_force_position.ipynb") diff --git a/book/force/test_notebooks_force.py b/book/force/test_notebooks_force.py new file mode 100644 index 00000000..8bd552e9 --- /dev/null +++ b/book/force/test_notebooks_force.py @@ -0,0 +1,6 @@ +from htmlbook.ipynb_test import ipynb_test + +ipynb_test("point_finger.ipynb") +ipynb_test("tracking.ipynb") +ipynb_test("writing.ipynb") +ipynb_test("bounce.ipynb") diff --git a/book/htmlbook b/book/htmlbook index 4963d0da..32e5b9c5 160000 --- a/book/htmlbook +++ b/book/htmlbook @@ -1 +1 @@ -Subproject commit 4963d0da4d9ebfa8445d333af64d5decec65ea40 +Subproject commit 32e5b9c5f5ad2f81a2892d192be7992ca12133fb diff --git a/book/intro/BUILD.bazel b/book/intro/BUILD.bazel deleted file mode 100644 index a74f9a5a..00000000 --- a/book/intro/BUILD.bazel +++ /dev/null @@ -1,19 +0,0 @@ -# -*- mode: python -*- -# vi: set ft=python : - -# Copyright 2020-2024 Massachusetts Institute of Technology. -# Licensed under the BSD 3-Clause License. See LICENSE.TXT for details. - -load("//book/htmlbook/tools/python:requirements.bzl", "requirement") -load("//book/htmlbook/tools/jupyter:defs.bzl", "rt_ipynb_test") - -rt_ipynb_test( - name = "intro", - srcs = ["intro.ipynb"], - deps = [ - "//manipulation", - "//manipulation:meshcat_utils", - "//manipulation:systems", - "//manipulation:station", - ], -) diff --git a/book/intro/exercises/04_hardwarestation_and_scenarios.ipynb b/book/intro/exercises/04_hardwarestation_and_scenarios.ipynb index a6c9ec97..2f8a9131 100644 --- a/book/intro/exercises/04_hardwarestation_and_scenarios.ipynb +++ b/book/intro/exercises/04_hardwarestation_and_scenarios.ipynb @@ -63,13 +63,7 @@ "from pathlib import Path\n", "\n", "import numpy as np\n", - "from pydrake.all import (\n", - " Diagram,\n", - " DiagramBuilder,\n", - " RigidTransform,\n", - " Simulator,\n", - " StartMeshcat,\n", - ")\n", + "from pydrake.all import Diagram, DiagramBuilder, RigidTransform, Simulator, StartMeshcat\n", "\n", "from manipulation.exercises.grader import Grader\n", "from manipulation.exercises.intro.test_hardwarestation_and_scenarios import (\n", @@ -78,11 +72,7 @@ " TestHardwareStationFullSystem,\n", ")\n", "from manipulation.letter_generation import create_sdf_asset_from_letter\n", - "from manipulation.station import (\n", - " LoadScenario,\n", - " MakeHardwareStation,\n", - " RobotDiagram,\n", - ")\n", + "from manipulation.station import LoadScenario, MakeHardwareStation, RobotDiagram\n", "from manipulation.utils import RenderDiagram, running_as_notebook" ] }, @@ -278,7 +268,7 @@ "**YOUR TASK:** Create a new scenario with two IIWA14 robots, each welded to the world at different positions.\n", "\n", "\n", - "**Key concept:** Scenario files make it simple and flexible to modify your scene\u2014adding robots, changing positions, or updating configurations can be done with just a few lines.\n", + "**Key concept:** Scenario files make it simple and flexible to modify your scene—adding robots, changing positions, or updating configurations can be done with just a few lines.\n", "\n", "\n", "**Reference:** To understand how to write scenario directives and use the functions above, we recommend looking at the [Bimanual Manipulation Example](https://deepnote.com/workspace/Manipulation-ac8201a1-470a-4c77-afd0-2cc45bc229ff/project/8f86172b-b597-4ceb-9bad-92d11ac7a6cc/notebook/bimanual-3df3abe2b1b949eb9daaf3748b16a218).\n" diff --git a/book/intro/test_notebooks_intro.py b/book/intro/test_notebooks_intro.py new file mode 100644 index 00000000..69e79e3d --- /dev/null +++ b/book/intro/test_notebooks_intro.py @@ -0,0 +1,3 @@ +from htmlbook.ipynb_test import ipynb_test + +ipynb_test("intro.ipynb") diff --git a/book/mobile/BUILD.bazel b/book/mobile/BUILD.bazel deleted file mode 100644 index d23b820c..00000000 --- a/book/mobile/BUILD.bazel +++ /dev/null @@ -1,69 +0,0 @@ -# -*- mode: python -*- -# vi: set ft=python : - -# Copyright 2020-2024 Massachusetts Institute of Technology. -# Licensed under the BSD 3-Clause License. See LICENSE.TXT for details. - -load("//book/htmlbook/tools/python:requirements.bzl", "requirement") -load("//book/htmlbook/tools/jupyter:defs.bzl", "rt_ipynb_test") - -rt_ipynb_test( - name = "mecanum", - srcs = ["mecanum.ipynb"], - data = ["//manipulation/models"], - deps = [ - "//manipulation", - "//manipulation:meshcat_utils", - ], -) - -rt_ipynb_test( - name = "mobile_iiwa", - srcs = ["mobile_iiwa.ipynb"], - deps = [ - "//manipulation", - "//manipulation:station", - ], -) - -rt_ipynb_test( - name = "rainbow", - srcs = ["rainbow.ipynb"], - tags = ["requires-network", "no-sandbox"], - deps = [ - "//manipulation", - "//manipulation:remotes", - ], -) - -rt_ipynb_test( - name = "scene_synthesizer", - srcs = ["scene_synthesizer.ipynb"], - tags = ["requires-network", "no-sandbox"], # for rainbow - deps = [ - "//manipulation", - "//manipulation:remotes", - requirement("scene_synthesizer"), - requirement("scipy"), # scene_synthesizer needs scipy, but does not declare it as a dependency - ], -) - -rt_ipynb_test( - name = "spot", - srcs = ["spot.ipynb"], - tags = ["requires-network", "no-sandbox"], - deps = [ - "//manipulation", - "//manipulation:remotes", - "//manipulation:station", - ], -) - -rt_ipynb_test( - name = "pr2", - srcs = ["pr2.ipynb"], - deps = [ - "//manipulation", - "//manipulation:station", - ], -) diff --git a/book/mobile/exercises/BUILD.bazel b/book/mobile/exercises/BUILD.bazel deleted file mode 100644 index e0869c85..00000000 --- a/book/mobile/exercises/BUILD.bazel +++ /dev/null @@ -1,18 +0,0 @@ -# -*- mode: python -*- -# vi: set ft=python : - -# Copyright 2020-2021 Massachusetts Institute of Technology. -# Licensed under the BSD 3-Clause License. See LICENSE.TXT for details. - -load("//book/htmlbook/tools/jupyter:defs.bzl", "rt_ipynb_test") - -rt_ipynb_test( - name = "mobile_base_ik", - srcs = ["mobile_base_ik.ipynb"], - deps = [ - "//manipulation", - "//manipulation:scenarios", - "//manipulation/exercises:grader", - "//manipulation/exercises/mobile:test_mobile_base_ik", - ], -) \ No newline at end of file diff --git a/book/mobile/exercises/simulation_set_up.ipynb b/book/mobile/exercises/simulation_set_up.ipynb index e14a8c68..dec1ffac 100644 --- a/book/mobile/exercises/simulation_set_up.ipynb +++ b/book/mobile/exercises/simulation_set_up.ipynb @@ -330,12 +330,12 @@ " RollPitchYaw(np.asarray([45, 30, 0]) * np.pi / 180), p=[0, 0, 0.8]\n", " )\n", " X_WorldCracker = X_WorldTable.multiply(X_TableCracker)\n", - " plant.SetDefaultFreeBodyPose(cracker_box, X_WorldCracker)\n", + " plant.SetDefaultFloatingBaseBodyPose(cracker_box, X_WorldCracker)\n", "\n", " sugar_box = plant.GetBodyByName(\"base_link_sugar\")\n", " X_TableSugar = RigidTransform(p=[0, -0.25, 0.8])\n", " X_WorldSugar = X_WorldTable.multiply(X_TableSugar)\n", - " plant.SetDefaultFreeBodyPose(sugar_box, X_WorldSugar)\n", + " plant.SetDefaultFloatingBaseBodyPose(sugar_box, X_WorldSugar)\n", "\n", " # Add visualization to see the geometries.\n", " AddDefaultVisualization(builder=builder, meshcat=meshcat)\n", diff --git a/book/mobile/exercises/test_notebooks_mobile_exercises.py b/book/mobile/exercises/test_notebooks_mobile_exercises.py new file mode 100644 index 00000000..176491f1 --- /dev/null +++ b/book/mobile/exercises/test_notebooks_mobile_exercises.py @@ -0,0 +1,3 @@ +from htmlbook.ipynb_test import ipynb_test + +ipynb_test("mobile_base_ik.ipynb") diff --git a/book/mobile/scene_synthesizer.ipynb b/book/mobile/scene_synthesizer.ipynb index d25fcecc..9cbaea06 100644 --- a/book/mobile/scene_synthesizer.ipynb +++ b/book/mobile/scene_synthesizer.ipynb @@ -84,7 +84,7 @@ " 0\n", " ]\n", " plant = visualizer.parser().plant()\n", - " plant.SetDefaultFreeBodyPose(plant.GetBodyByName(\"base\", rby1_id), X_WRby1)\n", + " plant.SetDefaultFloatingBaseBodyPose(plant.GetBodyByName(\"base\", rby1_id), X_WRby1)\n", " visualizer.Run(loop_once=True)\n", "\n", "\n", diff --git a/book/mobile/test_notebooks_mobile.py b/book/mobile/test_notebooks_mobile.py new file mode 100644 index 00000000..f2c92ad8 --- /dev/null +++ b/book/mobile/test_notebooks_mobile.py @@ -0,0 +1,8 @@ +from htmlbook.ipynb_test import ipynb_test + +ipynb_test("mecanum.ipynb") +ipynb_test("mobile_iiwa.ipynb") +ipynb_test("rainbow.ipynb") +ipynb_test("scene_synthesizer.ipynb") +ipynb_test("spot.ipynb") +ipynb_test("pr2.ipynb") diff --git a/book/pick/BUILD.bazel b/book/pick/BUILD.bazel deleted file mode 100644 index 1a3f5f43..00000000 --- a/book/pick/BUILD.bazel +++ /dev/null @@ -1,83 +0,0 @@ -# -*- mode: python -*- -# vi: set ft=python : - -# Copyright 2020-2024 Massachusetts Institute of Technology. -# Licensed under the BSD 3-Clause License. See LICENSE.TXT for details. - -load("//book/htmlbook/tools/python:requirements.bzl", "requirement") -load("//book/htmlbook/tools/jupyter:defs.bzl", "rt_ipynb_test") - -rt_ipynb_test( - name = "pick", - srcs = ["pick.ipynb"], - deps = [ - "//manipulation", - "//manipulation:station", - ], -) - -rt_ipynb_test( - name = "kinematic_tree", - srcs = ["kinematic_tree.ipynb"], - data = ["//manipulation/models"], - deps = [ - "//manipulation", - ], -) - -rt_ipynb_test( - name = "forward_kinematics", - srcs = ["forward_kinematics.ipynb"], - deps = [ - "//manipulation", - "//manipulation:scenarios", - ], -) - -rt_ipynb_test( - name = "qdot_vs_v", - data = ["@drake_models"], - srcs = ["qdot_vs_v.ipynb"], - deps = [ - requirement("drake"), - ] -) - -rt_ipynb_test( - name = "jacobian", - srcs = ["jacobian.ipynb"], - data = ["//manipulation/models"], - deps = [ - "//manipulation", - ], -) - -rt_ipynb_test( - name = "grasp", - srcs = ["grasp.ipynb"], - deps = [ - "//manipulation", - "//manipulation:scenarios", - ], -) - -rt_ipynb_test( - name = "pseudoinverse", - srcs = ["pseudoinverse.ipynb"], - deps = [ - "//manipulation", - "//manipulation:station", - ], -) - -rt_ipynb_test( - name = "qp_diff_ik", - srcs = ["qp_diff_ik.ipynb"], - tags = ["requires-network"], # For gurobi - data = ["//manipulation/models:two_link_iiwa14.urdf"], - deps = [ - "//manipulation", - "//manipulation:meshcat_utils", - "//manipulation:scenarios", - ], -) diff --git a/book/pick/pick.ipynb b/book/pick/pick.ipynb index 5dcea93d..efae8cc0 100644 --- a/book/pick/pick.ipynb +++ b/book/pick/pick.ipynb @@ -656,7 +656,7 @@ "scenario = LoadScenario(data=scenario_data)\n", "station = builder.AddSystem(MakeHardwareStation(scenario, meshcat=meshcat))\n", "plant = station.GetSubsystemByName(\"plant\")\n", - "plant.SetDefaultFreeBodyPose(plant.GetBodyByName(\"base_link\"), X_O[\"initial\"])\n", + "plant.SetDefaultFloatingBaseBodyPose(plant.GetBodyByName(\"base_link\"), X_O[\"initial\"])\n", "\n", "# Find the initial pose of the gripper and object (as set in the default Context)\n", "temp_context = station.CreateDefaultContext()\n", diff --git a/book/pick/test_notebooks_pick.py b/book/pick/test_notebooks_pick.py new file mode 100644 index 00000000..1651b3d8 --- /dev/null +++ b/book/pick/test_notebooks_pick.py @@ -0,0 +1,10 @@ +from htmlbook.ipynb_test import ipynb_test + +ipynb_test("pick.ipynb") +ipynb_test("kinematic_tree.ipynb") +ipynb_test("forward_kinematics.ipynb") +ipynb_test("qdot_vs_v.ipynb") +ipynb_test("jacobian.ipynb") +ipynb_test("grasp.ipynb") +ipynb_test("pseudoinverse.ipynb") +ipynb_test("qp_diff_ik.ipynb") diff --git a/book/pose.html b/book/pose.html index 8f6c4870..7266e166 100644 --- a/book/pose.html +++ b/book/pose.html @@ -120,7 +120,7 @@

Robotic Manipulation<

Primarily RGB-D (ToF vs projected texture stereo vs ...) cameras and Lidar

-

The cameras we are using in this course are Intel RealSense D415.

+

The cameras we are using in this course are Intel RealSense D415.

Monocular depth.

diff --git a/book/pose/BUILD.bazel b/book/pose/BUILD.bazel deleted file mode 100644 index dc67906f..00000000 --- a/book/pose/BUILD.bazel +++ /dev/null @@ -1,45 +0,0 @@ -# -*- mode: python -*- -# vi: set ft=python : - -# Copyright 2020-2024 Massachusetts Institute of Technology. -# Licensed under the BSD 3-Clause License. See LICENSE.TXT for details. - -load("//book/htmlbook/tools/python:requirements.bzl", "requirement") -load("//book/htmlbook/tools/jupyter:defs.bzl", "rt_ipynb_test") - -rt_ipynb_test( - name = "camera_sim", - srcs = ["camera_sim.ipynb"], - data = ["//manipulation/models"], - tags = ["no-sandbox"], # from vtk-test-tags() in drake - deps = [ - "//manipulation", - "//manipulation:scenarios", - "//manipulation:station", - ], -) - -rt_ipynb_test( - name = "icp", - srcs = ["icp.ipynb"], - deps = [ - "//manipulation", - requirement("scipy"), - ], -) - -rt_ipynb_test( - name = "pose", - srcs = ["pose.ipynb"], - data = ["//manipulation/models"], - tags = ["no-sandbox"], # from vtk-test-tags() in drake - deps = [ - "//manipulation", - "//manipulation:icp", - "//manipulation:mustard_depth_camera_example", - "//manipulation:meshcat_utils", - "//manipulation:pick", - "//manipulation:scenarios", - "//manipulation:station", - ], -) \ No newline at end of file diff --git a/book/pose/exercises/BUILD.bazel b/book/pose/exercises/BUILD.bazel deleted file mode 100644 index 05108298..00000000 --- a/book/pose/exercises/BUILD.bazel +++ /dev/null @@ -1,46 +0,0 @@ -# -*- mode: python -*- -# vi: set ft=python : - -# Copyright 2020-2021 Massachusetts Institute of Technology. -# Licensed under the BSD 3-Clause License. See LICENSE.TXT for details. - -load("//book/htmlbook/tools/python:requirements.bzl", "requirement") -load("//book/htmlbook/tools/jupyter:defs.bzl", "rt_ipynb_test") - -rt_ipynb_test( - name = "bunny_icp", - srcs = ["bunny_icp.ipynb"], - data = ["//manipulation/models/bunny:bunny.npy"], - deps = [ - "//manipulation", - "//manipulation/exercises:grader", - "//manipulation/exercises/pose:test_icp", - requirement("scipy"), - ], -) - -rt_ipynb_test( - name = "ransac", - srcs = ["ransac.ipynb"], - data = ["//manipulation/models/bunny:bunny.npy"], - deps = [ - "//manipulation", - "//manipulation/exercises:grader", - "//manipulation/exercises/pose:test_ransac", - ], -) - -rt_ipynb_test( - name = "pose_estimation_icp", - srcs = ["pose_estimation_icp.ipynb"], - timeout = "moderate", - tags = ["no-sandbox"], # for rendering, see drake#7004 - deps = [ - "//manipulation", - "//manipulation:icp", - "//manipulation:scenarios", - "//manipulation:station", - "//manipulation/exercises:grader", - "//manipulation/exercises/pose:test_pose_estimation", - ], -) diff --git a/book/pose/exercises/test_notebooks_pose_exercises.py b/book/pose/exercises/test_notebooks_pose_exercises.py new file mode 100644 index 00000000..4e0fde6d --- /dev/null +++ b/book/pose/exercises/test_notebooks_pose_exercises.py @@ -0,0 +1,5 @@ +from htmlbook.ipynb_test import ipynb_test + +ipynb_test("bunny_icp.ipynb") +ipynb_test("ransac.ipynb") +ipynb_test("pose_estimation_icp.ipynb") diff --git a/book/pose/test_notebooks_pose.py b/book/pose/test_notebooks_pose.py new file mode 100644 index 00000000..2bedd8da --- /dev/null +++ b/book/pose/test_notebooks_pose.py @@ -0,0 +1,5 @@ +from htmlbook.ipynb_test import ipynb_test + +ipynb_test("camera_sim.ipynb") +ipynb_test("icp.ipynb") +ipynb_test("pose.ipynb") diff --git a/book/rl/BUILD.bazel b/book/rl/BUILD.bazel deleted file mode 100644 index 033561fa..00000000 --- a/book/rl/BUILD.bazel +++ /dev/null @@ -1,41 +0,0 @@ -# -*- mode: python -*- -# vi: set ft=python : - -# Copyright 2020-2024 Massachusetts Institute of Technology. -# Licensed under the BSD 3-Clause License. See LICENSE.TXT for details. - -load("//book/htmlbook/tools/python:requirements.bzl", "requirement") -load("//book/htmlbook/tools/jupyter:defs.bzl", "rt_ipynb_test") -load("//book/htmlbook/tools/python:defs.bzl", "rt_py_test") - -rt_ipynb_test( - name = "black_box", - srcs = ["black_box.ipynb"], - deps = [ - "//manipulation", - "//manipulation:meshcat_utils", - ], -) - -rt_ipynb_test( - name = "box_flipup", - srcs = ["box_flipup.ipynb"], - data = ["//book/data:box_flipup_ppo_state.zip"], - deps = [ - "//manipulation", - "//manipulation:meshcat_utils", - "//manipulation/envs:box_flipup", - requirement("psutil"), - requirement("stable_baselines3"), - ], -) - -#rt_py_test( -# name = "train_boxflipup", -# srcs = ["train_boxflipup.py"], -# args = ["--test"], -# imports = [".."], -# deps = [ -# "//manipulation/envs:box_flipup", -# ], -#) diff --git a/book/rl/exercises/BUILD.bazel b/book/rl/exercises/BUILD.bazel deleted file mode 100644 index 1c65f92f..00000000 --- a/book/rl/exercises/BUILD.bazel +++ /dev/null @@ -1,32 +0,0 @@ -# -*- mode: python -*- -# vi: set ft=python : - -# Copyright 2020-2021 Massachusetts Institute of Technology. -# Licensed under the BSD 3-Clause License. See LICENSE.TXT for details. - -load("//book/htmlbook/tools/python:requirements.bzl", "requirement") -load("//book/htmlbook/tools/jupyter:defs.bzl", "rt_ipynb_test") - -rt_ipynb_test( - name = "stochastic_optimization", - srcs = ["stochastic_optimization.ipynb"], - deps = [ - "//manipulation", - "//manipulation/exercises:grader", - "//manipulation/exercises/rl:test_stochastic_optimization", - ], -) - -rt_ipynb_test( - name = "policy_gradient", - srcs = ["policy_gradient.ipynb"], - data = ["//manipulation/models"], - deps = [ - "//manipulation", - "//manipulation/envs:planar_gripper_pushing_a_box", - "//manipulation/exercises:grader", - "//manipulation/exercises/rl:test_vpg", - requirement("scipy"), - requirement("torch"), - ], -) diff --git a/book/rl/exercises/test_notebooks_rl_exercises.py b/book/rl/exercises/test_notebooks_rl_exercises.py new file mode 100644 index 00000000..ab887876 --- /dev/null +++ b/book/rl/exercises/test_notebooks_rl_exercises.py @@ -0,0 +1,4 @@ +from htmlbook.ipynb_test import ipynb_test + +ipynb_test("stochastic_optimization.ipynb") +ipynb_test("policy_gradient.ipynb") diff --git a/book/rl/test_notebooks_rl.py b/book/rl/test_notebooks_rl.py new file mode 100644 index 00000000..a987b89d --- /dev/null +++ b/book/rl/test_notebooks_rl.py @@ -0,0 +1,4 @@ +from htmlbook.ipynb_test import ipynb_test + +ipynb_test("black_box.ipynb") +ipynb_test("box_flipup.ipynb") diff --git a/book/robot.html b/book/robot.html index c51ebb5f..c491bbd1 100644 --- a/book/robot.html +++ b/book/robot.html @@ -597,7 +597,7 @@

Robotic Manipulation< -
Dexterous hands. Left: the Shadow Dexterous Hand. Right: the Allegro Hand.
+
Dexterous hands. Left: the Shadow Dexterous Hand. Right: the Allegro Hand.

Of course, our fascination with the human hand is well placed, and we diff --git a/book/robot/BUILD.bazel b/book/robot/BUILD.bazel deleted file mode 100644 index b5944cdf..00000000 --- a/book/robot/BUILD.bazel +++ /dev/null @@ -1,71 +0,0 @@ -# -*- mode: python -*- -# vi: set ft=python : - -# Copyright 2020-2024 Massachusetts Institute of Technology. -# Licensed under the BSD 3-Clause License. See LICENSE.TXT for details. - -load("//book/htmlbook/tools/jupyter:defs.bzl", "rt_ipynb_test") - -rt_ipynb_test( - name = "inspector", - srcs = ["inspector.ipynb"], - deps = [ - "//manipulation", - "//manipulation:make_drake_compatible_model", - ], -) - -rt_ipynb_test( - name = "menagerie", - srcs = ["menagerie.ipynb"], - tags = ["requires-network", "no-sandbox"], - deps = [ - "//manipulation", - "//manipulation:make_drake_compatible_model", - "//manipulation:remotes", - ], -) - -rt_ipynb_test( - name = "gymnasium_robotics", - srcs = ["gymnasium_robotics.ipynb"], - tags = ["requires-network", "no-sandbox"], - deps = [ - "//manipulation", - "//manipulation:make_drake_compatible_model", - "//manipulation:remotes", - ], -) - -rt_ipynb_test( - name = "simulation", - srcs = ["simulation.ipynb"], - deps = ["//manipulation"], -) - -rt_ipynb_test( - name = "bimanual", - srcs = ["bimanual.ipynb"], - deps = [ - "//manipulation", - "//manipulation:station", - ], -) - -rt_ipynb_test( - name = "iiwa_with_allegro", - srcs = ["iiwa_with_allegro.ipynb"], - deps = [ - "//manipulation", - "//manipulation:station", - ], -) - -rt_ipynb_test( - name = "rubiks_cube", - data = ["//manipulation/models"], - srcs = ["rubiks_cube.ipynb"], - deps = [ - "//manipulation", - ], -) diff --git a/book/robot/exercises/BUILD.bazel b/book/robot/exercises/BUILD.bazel deleted file mode 100644 index 1c814143..00000000 --- a/book/robot/exercises/BUILD.bazel +++ /dev/null @@ -1,41 +0,0 @@ -# -*- mode: python -*- -# vi: set ft=python : - -# Copyright 2020-2021 Massachusetts Institute of Technology. -# Licensed under the BSD 3-Clause License. See LICENSE.TXT for details. - -load("//book/htmlbook/tools/jupyter:defs.bzl", "rt_ipynb_test") - -rt_ipynb_test( - name = "03_direct_joint_control", - srcs = ["03_direct_joint_control.ipynb"], - deps = [ - "//manipulation", - "//manipulation/exercises:grader", - "//manipulation/exercises/robot:test_direct_joint_control", - "//manipulation:meshcat_utils", - "//manipulation:station", - ], -) - -rt_ipynb_test( - name = "02_hardware_station_io", - srcs = ["02_hardware_station_io.ipynb"], - deps = [ - "//manipulation", - "//manipulation/exercises:grader", - "//manipulation/exercises/robot:test_hardware_station_io", - "//manipulation:station", - ], -) - -rt_ipynb_test( - name = "01_reflected_inertia", - srcs = ["01_reflected_inertia.ipynb"], - deps = [ - "//manipulation", - "//manipulation/exercises:grader", - "//manipulation/exercises/robot:test_reflected_inertia", - "//manipulation/exercises/robot:test_survey", - ], -) diff --git a/book/robot/exercises/test_notebooks_robot_exercises.py b/book/robot/exercises/test_notebooks_robot_exercises.py new file mode 100644 index 00000000..3ea91b4a --- /dev/null +++ b/book/robot/exercises/test_notebooks_robot_exercises.py @@ -0,0 +1,5 @@ +from htmlbook.ipynb_test import ipynb_test + +ipynb_test("03_direct_joint_control.ipynb") +ipynb_test("02_hardware_station_io.ipynb") +ipynb_test("01_reflected_inertia.ipynb") diff --git a/book/robot/inspector.ipynb b/book/robot/inspector.ipynb index 3a4ac127..7aa7e7ca 100644 --- a/book/robot/inspector.ipynb +++ b/book/robot/inspector.ipynb @@ -86,7 +86,9 @@ " elif description == \"Franka Emika Panda\":\n", " return \"package://drake_models/franka_description/urdf/panda_arm_hand.urdf\"\n", " elif description == \"UR3e\":\n", - " return \"package://drake_models/ur_description/urdf/ur3e_cylinders_collision.urdf\"\n", + " return (\n", + " \"package://drake_models/ur_description/urdf/ur3e_cylinders_collision.urdf\"\n", + " )\n", " raise Exception(\"Unknown model\")\n", "\n", "\n", diff --git a/book/robot/test_notebooks_robot.py b/book/robot/test_notebooks_robot.py new file mode 100644 index 00000000..68852d20 --- /dev/null +++ b/book/robot/test_notebooks_robot.py @@ -0,0 +1,9 @@ +from htmlbook.ipynb_test import ipynb_test + +ipynb_test("inspector.ipynb") +ipynb_test("menagerie.ipynb") +ipynb_test("gymnasium_robotics.ipynb") +ipynb_test("simulation.ipynb") +ipynb_test("bimanual.ipynb") +ipynb_test("iiwa_with_allegro.ipynb") +ipynb_test("rubiks_cube.ipynb") diff --git a/book/segmentation/BUILD.bazel b/book/segmentation/BUILD.bazel deleted file mode 100644 index 0bb74c77..00000000 --- a/book/segmentation/BUILD.bazel +++ /dev/null @@ -1,30 +0,0 @@ -# -*- mode: python -*- -# vi: set ft=python : - -# Copyright 2020-2024 Massachusetts Institute of Technology. -# Licensed under the BSD 3-Clause License. See LICENSE.TXT for details. - -load("//book/htmlbook/tools/jupyter:defs.bzl", "rt_ipynb_test") -load("//book/htmlbook/tools/python:defs.bzl", "rt_py_test") - -# TODO(russt): move clutter_maskrcnn_data to huggingface? -#rt_ipynb_test( -# name = "segmentation_inference", -# srcs = ["segmentation_inference.ipynb"], -# deps = ["//manipulation"], -# data = ["//book/data:clutter_maskrcnn_data"], -#) - -rt_py_test( - name = "segmentation_data", - srcs = ["segmentation_data.py"], - data = ["//manipulation/models"], - timeout = "moderate", - args = ["--test"], - imports = [".."], - tags = ["no-sandbox"], # for rendering, see drake#7004 - deps = [ - "//manipulation", - "//manipulation:scenarios", - ], -) diff --git a/book/segmentation/exercises/BUILD.bazel b/book/segmentation/exercises/BUILD.bazel deleted file mode 100644 index 675ed979..00000000 --- a/book/segmentation/exercises/BUILD.bazel +++ /dev/null @@ -1,47 +0,0 @@ -# -*- mode: python -*- -# vi: set ft=python : - -# Copyright 2020-2021 Massachusetts Institute of Technology. -# Licensed under the BSD 3-Clause License. See LICENSE.TXT for details. - -load("//book/htmlbook/tools/python:requirements.bzl", "requirement") -load("//book/htmlbook/tools/jupyter:defs.bzl", "rt_ipynb_test") - -rt_ipynb_test( - name = "label_generation", - srcs = ["label_generation.ipynb"], - data = ["//manipulation/models"], - # This is failing on mac CI. I don't understand why. - target_compatible_with = [ - "@platforms//cpu:x86_64", - "@platforms//os:linux", - ], - tags = ["no-sandbox"], # for rendering, see drake#7004 - deps = [ - "//manipulation", - "//manipulation:mustard_depth_camera_example", - "//manipulation:scenarios", - "//manipulation/exercises:grader", - "//manipulation/exercises/segmentation:test_mask", - ], -) - -rt_ipynb_test( - name = "segmentation_and_grasp", - srcs = ["segmentation_and_grasp.ipynb"], - data = [ - "//manipulation/models", - "//book/data:prediction_0.npz", - "//book/data:prediction_1.npz", - ], - tags = ["no-sandbox"], # for rendering, see drake#7004 - deps = [ - "//manipulation", - "//manipulation:scenarios", - "//manipulation:clutter", - "//manipulation/exercises:grader", - "//manipulation/exercises/segmentation:test_segmentation_and_grasp", - requirement("torch"), - requirement("torchvision"), - ], -) \ No newline at end of file diff --git a/book/segmentation/exercises/test_notebooks_segmentation_exercises.py b/book/segmentation/exercises/test_notebooks_segmentation_exercises.py new file mode 100644 index 00000000..cf4ec86a --- /dev/null +++ b/book/segmentation/exercises/test_notebooks_segmentation_exercises.py @@ -0,0 +1,4 @@ +from htmlbook.ipynb_test import ipynb_test + +ipynb_test("label_generation.ipynb") +ipynb_test("segmentation_and_grasp.ipynb") diff --git a/book/segmentation/test_scripts_segmentation.py b/book/segmentation/test_scripts_segmentation.py new file mode 100644 index 00000000..56adf94e --- /dev/null +++ b/book/segmentation/test_scripts_segmentation.py @@ -0,0 +1,33 @@ +from __future__ import annotations + +import os +import subprocess +import sys +import tempfile +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[2] + + +def test_segmentation_data_script() -> None: + cmd = [ + sys.executable, + str(ROOT / "book/segmentation/segmentation_data.py"), + "--test", + ] + env = os.environ.copy() + env.setdefault("OMP_NUM_THREADS", "1") + env.setdefault("OPENBLAS_NUM_THREADS", "1") + env.setdefault("MKL_NUM_THREADS", "1") + env.setdefault("NUMEXPR_NUM_THREADS", "1") + with tempfile.TemporaryDirectory(prefix="segmentation_script_") as run_cwd: + result = subprocess.run( + cmd, cwd=run_cwd, env=env, capture_output=True, text=True + ) + if result.returncode != 0: + message = [f"segmentation_data.py failed with exit code {result.returncode}"] + if result.stdout: + message.append(f"STDOUT:\n{result.stdout}") + if result.stderr: + message.append(f"STDERR:\n{result.stderr}") + raise AssertionError("\n\n".join(message)) diff --git a/book/template/template_notebook.ipynb b/book/template/template_notebook.ipynb index 9579d6a5..04271cb1 100644 --- a/book/template/template_notebook.ipynb +++ b/book/template/template_notebook.ipynb @@ -74,16 +74,9 @@ "metadata": {}, "outputs": [], "source": [ - "from pydrake.all import (\n", - " DiagramBuilder,\n", - " Simulator,\n", - " StartMeshcat,\n", - ")\n", + "from pydrake.all import DiagramBuilder, Simulator, StartMeshcat\n", "\n", - "from manipulation.station import (\n", - " LoadScenario,\n", - " MakeHardwareStation,\n", - ")" + "from manipulation.station import LoadScenario, MakeHardwareStation" ] }, { diff --git a/book/trajectories/BUILD.bazel b/book/trajectories/BUILD.bazel deleted file mode 100644 index 9373cc78..00000000 --- a/book/trajectories/BUILD.bazel +++ /dev/null @@ -1,101 +0,0 @@ -# -*- mode: python -*- -# vi: set ft=python : - -# Copyright 2020-2024 Massachusetts Institute of Technology. -# Licensed under the BSD 3-Clause License. See LICENSE.TXT for details. - -load("//book/htmlbook/tools/python:requirements.bzl", "requirement") -load("//book/htmlbook/tools/jupyter:defs.bzl", "rt_ipynb_test") - -rt_ipynb_test( - name = "interactive_ik", - srcs = ["interactive_ik.ipynb"], - deps = [ - "//manipulation", - "//manipulation:meshcat_utils", - "//manipulation:scenarios", - ], -) - -rt_ipynb_test( - name = "cspace", - srcs = ["cspace.ipynb"], - data = ["//manipulation/models"], - deps = [ - "//manipulation", - "//manipulation:scenarios", - ], -) - -rt_ipynb_test( - name = "gcs_derivatives", - srcs = ["gcs_derivatives.ipynb"], - deps = [ - requirement("drake"), - requirement("ipython"), - ], -) - -rt_ipynb_test( - name = "gcs_simple_2d_cspace", - srcs = ["gcs_simple_2d_cspace.ipynb"], - data = ["//manipulation/models"], - deps = [ - "//manipulation", - requirement("scipy"), - ], - tags = ["requires-network"], # For gurobi -) - -# See https://github.com/RobotLocomotion/drake/issues/21343 -#rt_ipynb_test( -# name = "iris_in_configuration_space", -# srcs = ["iris_in_configuration_space.ipynb"], -# tags = ["requires-network"], # For gurobi -# data = ["//manipulation/models"], -# deps = [ -# "//manipulation", -# "//manipulation:meshcat_utils", -# "//manipulation:scenarios", -# ], -#) - -rt_ipynb_test( - name = "iris_builder", - srcs = ["iris_builder.ipynb"], - deps = [ - "//manipulation", - requirement("scipy"), - ], - data = ["//book/data:iiwa_shelve_and_bins_science_robotics.yaml"], - tags = ["requires-network"], # For gurobi -) - -rt_ipynb_test( - name = "kinematic_trajectory_optimization", - srcs = ["kinematic_trajectory_optimization.ipynb"], - deps = [ - "//manipulation", - "//manipulation:meshcat_utils", - "//manipulation:scenarios", - ], -) - -rt_ipynb_test( - name = "optimization_landscape", - srcs = ["optimization_landscape.ipynb"], - deps = [ - "//manipulation", - "//manipulation:meshcat_utils", - "//manipulation:scenarios", - ], -) - -rt_ipynb_test( - name = "rrt", - srcs = ["rrt.ipynb"], - deps = [ - "//manipulation", - "//manipulation:scenarios", - ], -) \ No newline at end of file diff --git a/book/trajectories/exercises/5_plan_place_initials.ipynb b/book/trajectories/exercises/5_plan_place_initials.ipynb index 6cd492b0..2ce10988 100644 --- a/book/trajectories/exercises/5_plan_place_initials.ipynb +++ b/book/trajectories/exercises/5_plan_place_initials.ipynb @@ -72,10 +72,7 @@ " ConfigurationSpace,\n", " Range,\n", ")\n", - "from manipulation.exercises.trajectories.rrt_planner.rrt_planning import (\n", - " RRT,\n", - " TreeNode,\n", - ")\n", + "from manipulation.exercises.trajectories.rrt_planner.rrt_planning import RRT, TreeNode\n", "from manipulation.letter_generation import create_sdf_asset_from_letter\n", "from manipulation.meshcat_utils import AddMeshcatTriad\n", "from manipulation.station import LoadScenario, MakeHardwareStation" @@ -1442,8 +1439,8 @@ " path_reset: list[np.ndarray],\n", ") -> tuple[\"PiecewisePolynomial\", \"PiecewisePolynomial\"]:\n", " \"\"\"Sequence:\n", - " pick \u2192 q_grasp (OPEN) \u2192 pause 0.5 \u2192 CLOSE (no motion) \u2192 pause 0.5 \u2192 q_approach \u2192\n", - " place \u2192 pause 0.5 \u2192 OPEN (no motion) \u2192 pause 0.5 \u2192 reset\n", + " pick → q_grasp (OPEN) → pause 0.5 → CLOSE (no motion) → pause 0.5 → q_approach →\n", + " place → pause 0.5 → OPEN (no motion) → pause 0.5 → reset\n", " \"\"\"\n", " times: list[float] = []\n", " Q: list[np.ndarray] = []\n", @@ -1484,7 +1481,7 @@ " # 9) path_reset\n", " t = _append_path(times, Q, t, path_reset)\n", "\n", - " # Build Drake trajectories (7\u00d7N for iiwa, 1\u00d7K for WSG)\n", + " # Build Drake trajectories (7×N for iiwa, 1×K for WSG)\n", " q_samples = np.stack(Q, axis=1)\n", " traj_q = PiecewisePolynomial.FirstOrderHold(times, q_samples)\n", "\n", @@ -1589,16 +1586,16 @@ " return path\n", "\n", " for t = 1 to passes:\n", - " choose indices i < j with j \u2265 i + min_separation // if not possible, break\n", - " q_a \u2190 path[i]\n", - " q_b \u2190 path[j]\n", + " choose indices i < j with j ≥ i + min_separation // if not possible, break\n", + " q_a ← path[i]\n", + " q_b ← path[j]\n", "\n", - " edge \u2190 direct_path_wo_collision(q_a, q_b) // try a direct, collision-free connection\n", + " edge ← direct_path_wo_collision(q_a, q_b) // try a direct, collision-free connection\n", "\n", " if edge successfully reaches q_b:\n", - " path \u2190 ReplaceSubpath(path, i, j, edge) // splice shortcut in\n", + " path ← ReplaceSubpath(path, i, j, edge) // splice shortcut in\n", "\n", - " path \u2190 Clean(path) // e.g., drop immediate duplicates, minor tidying\n", + " path ← Clean(path) // e.g., drop immediate duplicates, minor tidying\n", " return path\n" ] }, diff --git a/book/trajectories/exercises/BUILD.bazel b/book/trajectories/exercises/BUILD.bazel deleted file mode 100644 index c91bc548..00000000 --- a/book/trajectories/exercises/BUILD.bazel +++ /dev/null @@ -1,45 +0,0 @@ -# -*- mode: python -*- -# vi: set ft=python : - -# Copyright 2020-2021 Massachusetts Institute of Technology. -# Licensed under the BSD 3-Clause License. See LICENSE.TXT for details. - -load("//book/htmlbook/tools/python:requirements.bzl", "requirement") -load("//book/htmlbook/tools/jupyter:defs.bzl", "rt_ipynb_test") - -rt_ipynb_test( - name = "door_opening", - srcs = ["door_opening.ipynb"], - tags = ["requires-network"], # For gurobi - deps = [ - "//manipulation", - "//manipulation:meshcat_utils", - "//manipulation:station", - "//manipulation/exercises:grader", - "//manipulation/exercises/trajectories:test_door_opening", - ], -) - -rt_ipynb_test( - name = "rrt_planning", - srcs = ["rrt_planning.ipynb"], - deps = [ - "//manipulation", - "//manipulation:meshcat_utils", - "//manipulation:station", - "//manipulation/exercises:grader", - "//manipulation/exercises/trajectories:test_rrt_planning", - "//manipulation/exercises/trajectories/rrt_planner", - ], -) - -rt_ipynb_test( - name = "taskspace_iris", - srcs = ["taskspace_iris.ipynb"], - deps = [ - "//manipulation", - "//manipulation/exercises:grader", - "//manipulation/exercises/trajectories:test_taskspace_iris", - requirement("scipy"), - ], -) diff --git a/book/trajectories/exercises/kinematic_trajopt_around_shelf_iiwa.ipynb b/book/trajectories/exercises/kinematic_trajopt_around_shelf_iiwa.ipynb index e9fd2b72..99090f1e 100644 --- a/book/trajectories/exercises/kinematic_trajopt_around_shelf_iiwa.ipynb +++ b/book/trajectories/exercises/kinematic_trajopt_around_shelf_iiwa.ipynb @@ -294,6 +294,8 @@ "outputs": [], "source": [ "# This function will publish your trajectory on meshcat so you can see it\n", + "\n", + "\n", "def push_traj_to_meshcat(\n", " traj: BsplineTrajectory,\n", " plant: MultibodyPlant,\n", diff --git a/book/trajectories/exercises/test_notebooks_trajectories_exercises.py b/book/trajectories/exercises/test_notebooks_trajectories_exercises.py new file mode 100644 index 00000000..f795c098 --- /dev/null +++ b/book/trajectories/exercises/test_notebooks_trajectories_exercises.py @@ -0,0 +1,5 @@ +from htmlbook.ipynb_test import ipynb_test + +ipynb_test("door_opening.ipynb") +ipynb_test("rrt_planning.ipynb") +ipynb_test("taskspace_iris.ipynb") diff --git a/book/trajectories/iris_builder.ipynb b/book/trajectories/iris_builder.ipynb index 359d8b79..44445c13 100644 --- a/book/trajectories/iris_builder.ipynb +++ b/book/trajectories/iris_builder.ipynb @@ -46,7 +46,7 @@ ")\n", "from pydrake.geometry.optimization import (\n", " HPolyhedron,\n", - " IrisInConfigurationSpace,\n", + " IrisNp,\n", " IrisOptions,\n", " LoadIrisRegionsYamlFile,\n", " SaveIrisRegionsYamlFile,\n", @@ -188,7 +188,8 @@ " iris_options.configuration_obstacles = None\n", " display(f\"Computing region for seed: {name}\")\n", " start_time = time.time()\n", - " hpoly = IrisInConfigurationSpace(plant, plant_context, iris_options)\n", + " # TODO(russt): Update this to use IrisNp2.\n", + " hpoly = IrisNp(plant, plant_context, iris_options)\n", " display(\n", " f\"Finished seed {name}; Computation time: {(time.time() - start_time):.2f} seconds\"\n", " )\n", diff --git a/book/trajectories/test_notebooks_trajectories.py b/book/trajectories/test_notebooks_trajectories.py new file mode 100644 index 00000000..cf5467bc --- /dev/null +++ b/book/trajectories/test_notebooks_trajectories.py @@ -0,0 +1,10 @@ +from htmlbook.ipynb_test import ipynb_test + +ipynb_test("interactive_ik.ipynb") +ipynb_test("cspace.ipynb") +ipynb_test("gcs_derivatives.ipynb") +ipynb_test("gcs_simple_2d_cspace.ipynb") +ipynb_test("iris_builder.ipynb") +ipynb_test("kinematic_trajectory_optimization.ipynb") +ipynb_test("optimization_landscape.ipynb") +ipynb_test("rrt.ipynb") diff --git a/conftest.py b/conftest.py new file mode 100644 index 00000000..25275c64 --- /dev/null +++ b/conftest.py @@ -0,0 +1,28 @@ +from __future__ import annotations + +import os +import sys +from pathlib import Path + +REPO_ROOT = Path(__file__).resolve().parent + + +def pytest_configure() -> None: + os.environ.setdefault("MPLBACKEND", "Agg") + os.environ.setdefault("MPLCONFIGDIR", "/tmp/matplotlib") + os.environ.setdefault("XDG_CACHE_HOME", "/tmp") + Path("/tmp/matplotlib").mkdir(parents=True, exist_ok=True) + if str(REPO_ROOT) not in sys.path: + sys.path.insert(0, str(REPO_ROOT)) + if str(REPO_ROOT / "book") not in sys.path: + sys.path.insert(0, str(REPO_ROOT / "book")) + + +def pytest_ignore_collect(collection_path, config): # type: ignore[no-untyped-def] + solutions_dir = REPO_ROOT / "solutions" + if solutions_dir.exists(): + return None + try: + return Path(collection_path).resolve().is_relative_to(solutions_dir) + except Exception: + return None diff --git a/environ.bzl b/environ.bzl deleted file mode 100644 index a72b4489..00000000 --- a/environ.bzl +++ /dev/null @@ -1,70 +0,0 @@ -# -*- mode: python -*- -# vi: set ft=python : - -# Copyright (c) 2018, Toyota Research Institute. -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# * Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# * Neither the name of the copyright holder nor the names of its contributors -# may be used to endorse or promote products derived from this software -# without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. - -# Write out a repository that contains: -# - An empty BUILD file, to define a package. -# - An environ.bzl file with variable assignments for each ENV_NAMES item. -def _impl(repository_ctx): - vars = repository_ctx.attr._vars - bzl_content = [] - for key in vars: - value = repository_ctx.os.environ.get(key, "") - bzl_content.append("{}='{}'\n".format(key, value)) - repository_ctx.file( - "BUILD.bazel", - content = "\n", - executable = False, - ) - repository_ctx.file( - "environ.bzl", - content = "".join(bzl_content), - executable = False, - ) - -def environ_repository(name = None, vars = []): - """Provide specific environment variables for use in a WORKSPACE file. - The `vars` are the environment variables to provide. - - Example: - environ_repository(name = "foo", vars = ["BAR", "BAZ"]) - load("@foo//:environ.bzl", "BAR", "BAZ") - print(BAR) - """ - rule = repository_rule( - implementation = _impl, - attrs = { - "_vars": attr.string_list(default = vars), - }, - local = True, - environ = vars, - ) - rule(name = name) diff --git a/manipulation/BUILD.bazel b/manipulation/BUILD.bazel deleted file mode 100644 index e493ee8c..00000000 --- a/manipulation/BUILD.bazel +++ /dev/null @@ -1,284 +0,0 @@ -# -*- mode: python -*- -# vi: set ft=python : - -# Copyright 2020-2024 Massachusetts Institute of Technology. -# Licensed under the BSD 3-Clause License. See LICENSE.TXT for details. - -load("//book/htmlbook/tools/python:requirements.bzl", "requirement") -load( - "//book/htmlbook/tools/python:defs.bzl", - "rt_py_library", - "rt_py_test", - "rt_py_binary", -) - -rt_py_library( - name="manipulation", - srcs=[ - "__init__.py", - "utils.py", - ], - data=[ - "@drake_models", - ], - imports=[".."], - visibility=["//visibility:public"], - deps=[ - requirement("drake"), - requirement("ipython"), - requirement("mpld3"), - requirement("pyvirtualdisplay"), - ], -) - -rt_py_library( - name="meshcat_utils", - srcs=["meshcat_utils.py"], - imports=[".."], - visibility=["//visibility:public"], -) - -rt_py_library( - name="make_drake_compatible_model", - srcs=["make_drake_compatible_model.py"], - imports=[".."], - visibility=["//visibility:public"], - deps=[ - requirement("drake"), - requirement("lxml"), - ], - optional_deps=[ - requirement("pycollada"), - requirement("trimesh"), - ], -) - -rt_py_library( - name="mustard_depth_camera_example", - srcs=["mustard_depth_camera_example.py"], - imports=[".."], - visibility=["//visibility:public"], - deps=[ - "scenarios", - ], -) - -rt_py_library( - name="scenarios", - data=["//manipulation/models"], - deps=[ - "//manipulation", - "//manipulation:systems", - ], - srcs=["scenarios.py"], - imports=[".."], - visibility=["//visibility:public"], -) - -rt_py_library( - name="remotes", - srcs=["remotes.py"], - imports=[".."], - deps=[ - "make_drake_compatible_model", - requirement("drake"), - ], - visibility=["//visibility:public"], -) - -rt_py_binary( - name="prefetch_remotes", - tags=["requires-network", "no-sandbox"], - srcs=["prefetch_remotes.py"], - deps=["remotes"], -) - -rt_py_library( - name="directives_tree", - deps=[ - "//manipulation", - ], - srcs=["directives_tree.py"], - imports=[".."], - visibility=["//visibility:public"], -) - -rt_py_library( - name="station", - deps=[ - "//manipulation", - "scenarios", - "systems", - "directives_tree", - ], - srcs=["station.py"], - imports=[".."], - visibility=["//visibility:public"], -) - -rt_py_library( - name="systems", - srcs=["systems.py"], - imports=[".."], - visibility=["//visibility:public"], -) - -rt_py_library( - name="pick", - srcs=["pick.py"], - imports=[".."], - visibility=["//visibility:public"], -) - -# TODO(russt): Rename this to pose.py -rt_py_library( - name="icp", - srcs=["icp.py"], - imports=[".."], - deps=[ - requirement("scipy"), # TODO(russt): remove this dep? - ], - visibility=["//visibility:public"], -) - -rt_py_library( - name="clutter", - srcs=["clutter.py"], - imports=[".."], - visibility=["//visibility:public"], -) - -rt_py_library( - name="letter_generation", - srcs=[ - "letter_generation.py", - "create_sdf_from_mesh.py", - ], - imports=[".."], - deps=[ - "manipulation", - requirement("lxml"), - ], - optional_deps=[ - requirement("trimesh"), - requirement("shapely"), - requirement("coacd"), - requirement("vhacdx"), - requirement("mapbox_earcut"), - requirement("manifold3d"), - ], - visibility=["//visibility:public"], -) - -rt_py_test( - name="test_create_sdf_from_mesh", - srcs=[ - "test/test_create_sdf_from_mesh.py", - "//manipulation:create_sdf_from_mesh.py", - ], - imports=[".."], - deps=[ - "manipulation", - requirement("lxml"), - ], - optional_deps=[ - requirement("trimesh"), - requirement("vhacdx"), - ], -) - -rt_py_test( - name="test_gym", - data=["//manipulation:models"], - srcs=["test/test_gym.py"], - imports=[".."], - deps=[ - "//manipulation/envs:box_flipup", - "manipulation", - "scenarios", - ], - optional_deps=[ - requirement("stable_baselines3"), - ], -) - -rt_py_test( - name="test_make_drake_compatible_model", - srcs=["test/test_make_drake_compatible_model.py"], - imports=[".."], - tags=["requires-network", "no-sandbox"], - timeout="moderate", # TODO(russt): consider moving the menagerie work to the prefetch_remotes - data=[ - "//manipulation/test/models:models", - ], - deps=[ - "manipulation", - "//manipulation:make_drake_compatible_model", - "//manipulation:remotes", - ], -) - -rt_py_test( - name="test_meshcat_utils", - srcs=["test/test_meshcat_utils.py"], - tags=["requires-network"], # For gurobi - imports=[".."], - deps=[ - "manipulation", - "//manipulation:meshcat_utils", - ], -) - -rt_py_test( - name="test_model_directives", - srcs=["test/test_model_directives.py"], - data=["//manipulation:models"], - imports=[".."], - deps=["manipulation"], -) - -rt_py_test( - name="test_directives_tree", - srcs=["test/test_directives_tree.py"], - data=["//manipulation:station"], - imports=[".."], - deps=["manipulation"], -) - -rt_py_test( - name="test_inverse_dynamics_driver", - srcs=["test/test_inverse_dynamics_driver.py"], - data=["//manipulation:station"], - imports=[".."], - deps=["manipulation"], -) - -rt_py_test( - name="test_hardware_station_interface", - srcs=["test/test_hardware_station_interface.py"], - data=["//manipulation:station"], - imports=[".."], - deps=["manipulation"], -) - -rt_py_test( - name="test_utils", - srcs=["test/test_utils.py"], - imports=[".."], - deps=[ - "manipulation", - "mustard_depth_camera_example", - ], -) - -rt_py_test( - name="test_letter_generation", - srcs=[ - "test/test_letter_generation.py", - ], - imports=[".."], - deps=[ - "manipulation", - "letter_generation", - ], -) diff --git a/manipulation/envs/BUILD.bazel b/manipulation/envs/BUILD.bazel deleted file mode 100644 index 7586d414..00000000 --- a/manipulation/envs/BUILD.bazel +++ /dev/null @@ -1,38 +0,0 @@ -# -*- mode: python -*- -# vi: set ft=python : - -# Copyright 2020-2024 Massachusetts Institute of Technology. -# Licensed under the BSD 3-Clause License. See LICENSE.TXT for details. - -load("//book/htmlbook/tools/python:requirements.bzl", "requirement") -load("//book/htmlbook/tools/python:defs.bzl", "rt_py_library", "rt_py_test") - -rt_py_library( - name = "box_flipup", - srcs = ["box_flipup.py"], - data = [ - "//manipulation/models", - ], - imports = [".."], - visibility = ["//visibility:public"], - deps = [ - "//manipulation", - "//manipulation:scenarios", - requirement("gymnasium"), - ] -) - -rt_py_library( - name = "planar_gripper_pushing_a_box", - srcs = ["planar_gripper_pushing_a_box.py"], - data = [ - "//manipulation/models", - ], - imports = [".."], - visibility = ["//visibility:public"], - deps = [ - "//manipulation", - "//manipulation:scenarios", - requirement("gymnasium"), - ] -) diff --git a/manipulation/exercises/BUILD.bazel b/manipulation/exercises/BUILD.bazel deleted file mode 100644 index 0853c56f..00000000 --- a/manipulation/exercises/BUILD.bazel +++ /dev/null @@ -1,20 +0,0 @@ -# -*- mode: python -*- -# vi: set ft=python : - -# Copyright 2020-2024 Massachusetts Institute of Technology. -# Licensed under the BSD 3-Clause License. See LICENSE.TXT for details. - -load("//book/htmlbook/tools/python:requirements.bzl", "requirement") -load("//book/htmlbook/tools/python:defs.bzl", "rt_py_library") - -rt_py_library( - name = "grader", - srcs = ["grader.py"], - deps = [ - requirement("gradescope_utils"), - requirement("timeout_decorator"), - requirement("nbconvert"), - requirement("nbformat"), - ], - visibility = ["//visibility:public"], -) diff --git a/manipulation/exercises/clutter/BUILD.bazel b/manipulation/exercises/clutter/BUILD.bazel deleted file mode 100644 index 533ac45e..00000000 --- a/manipulation/exercises/clutter/BUILD.bazel +++ /dev/null @@ -1,32 +0,0 @@ -# -*- mode: python -*- -# vi: set ft=python : - -# Copyright 2020-2024 Massachusetts Institute of Technology. -# Licensed under the BSD 3-Clause License. See LICENSE.TXT for details. - -load("//book/htmlbook/tools/python:defs.bzl", "rt_py_library") - -rt_py_library( - name = "test_analytic_grasp", - srcs = ["test_analytic_grasp.py"], - visibility = ["//visibility:public"], -) - -rt_py_library( - name = "test_grasp_candidate", - srcs = ["test_grasp_candidate.py"], - visibility = ["//visibility:public"], -) - -rt_py_library( - name = "test_normal", - data = ["normal_solution.npy"], - srcs = ["test_normal.py"], - visibility = ["//visibility:public"], -) - -rt_py_library( - name = "test_grasp_letters", - srcs = ["test_grasp_letters.py"], - visibility = ["//visibility:public"], -) diff --git a/manipulation/exercises/deep_perception/BUILD.bazel b/manipulation/exercises/deep_perception/BUILD.bazel deleted file mode 100644 index 99459c33..00000000 --- a/manipulation/exercises/deep_perception/BUILD.bazel +++ /dev/null @@ -1,13 +0,0 @@ -# -*- mode: python -*- -# vi: set ft=python : - -# Copyright 2020-2024 Massachusetts Institute of Technology. -# Licensed under the BSD 3-Clause License. See LICENSE.TXT for details. - -load("//book/htmlbook/tools/python:defs.bzl", "rt_py_library") - -rt_py_library( - name = "test_contrastive", - srcs = ["test_contrastive.py"], - visibility = ["//visibility:public"], -) diff --git a/manipulation/exercises/force/BUILD.bazel b/manipulation/exercises/force/BUILD.bazel deleted file mode 100644 index 53f18d62..00000000 --- a/manipulation/exercises/force/BUILD.bazel +++ /dev/null @@ -1,13 +0,0 @@ -# -*- mode: python -*- -# vi: set ft=python : - -# Copyright 2020-2024 Massachusetts Institute of Technology. -# Licensed under the BSD 3-Clause License. See LICENSE.TXT for details. - -load("//book/htmlbook/tools/python:defs.bzl", "rt_py_library") - -rt_py_library( - name = "test_hybrid", - srcs = ["test_hybrid.py"], - visibility = ["//visibility:public"], -) diff --git a/manipulation/exercises/intro/BUILD.bazel b/manipulation/exercises/intro/BUILD.bazel deleted file mode 100644 index 3c9eed4d..00000000 --- a/manipulation/exercises/intro/BUILD.bazel +++ /dev/null @@ -1,25 +0,0 @@ -# -*- mode: python -*- -# vi: set ft=python : - -# Copyright 2025-2026 Massachusetts Institute of Technology. -# Licensed under the BSD 3-Clause License. See LICENSE.TXT for details. - -load("//book/htmlbook/tools/python:defs.bzl", "rt_py_library") - -rt_py_library( - name = "test_intro_fundamentals", - srcs = ["test_intro_fundamentals.py"], - visibility = ["//visibility:public"], -) - -rt_py_library( - name = "test_physics_simulation_and_robots", - srcs = ["test_physics_simulation_and_robots.py"], - visibility = ["//visibility:public"], -) - -rt_py_library( - name = "test_hardwarestation_and_scenarios", - srcs = ["test_hardwarestation_and_scenarios.py"], - visibility = ["//visibility:public"], -) diff --git a/manipulation/exercises/mobile/BUILD.bazel b/manipulation/exercises/mobile/BUILD.bazel deleted file mode 100644 index 2261f7ec..00000000 --- a/manipulation/exercises/mobile/BUILD.bazel +++ /dev/null @@ -1,13 +0,0 @@ -# -*- mode: python -*- -# vi: set ft=python : - -# Copyright 2020-2024 Massachusetts Institute of Technology. -# Licensed under the BSD 3-Clause License. See LICENSE.TXT for details. - -load("//book/htmlbook/tools/python:defs.bzl", "rt_py_library") - -rt_py_library( - name = "test_mobile_base_ik", - srcs = ["test_mobile_base_ik.py"], - visibility = ["//visibility:public"], -) \ No newline at end of file diff --git a/manipulation/exercises/pick/BUILD.bazel b/manipulation/exercises/pick/BUILD.bazel deleted file mode 100644 index af5dcd7d..00000000 --- a/manipulation/exercises/pick/BUILD.bazel +++ /dev/null @@ -1,50 +0,0 @@ -# -*- mode: python -*- -# vi: set ft=python : - -# Copyright 2020-2024 Massachusetts Institute of Technology. -# Licensed under the BSD 3-Clause License. See LICENSE.TXT for details. - -load("//book/htmlbook/tools/python:defs.bzl", "rt_py_library") - -rt_py_library( - name = "test_differential_ik", - srcs = ["test_differential_ik.py"], - visibility = ["//visibility:public"], -) - -rt_py_library( - name = "test_simple_qp", - srcs = ["test_simple_qp.py"], - visibility = ["//visibility:public"], -) - -rt_py_library( - name = "test_planar_manipulator", - srcs = ["test_planar_manipulator.py"], - visibility = ["//visibility:public"], -) - -rt_py_library( - name = "plot_planar_manipulator", - srcs = ["plot_planar_manipulator.py"], - visibility = ["//visibility:public"], -) - -rt_py_library( - name = "test_robot_painter", - srcs = ["test_robot_painter.py"], - visibility = ["//visibility:public"], -) - -rt_py_library( - name = "test_rigid_transforms", - srcs = ["test_rigid_transforms.py"], - visibility = ["//visibility:public"], -) - - -rt_py_library( - name="test_pickplace_initials", - srcs=["test_pickplace_initials.py"], - visibility = ["//visibility:public"], -) diff --git a/manipulation/exercises/pose/BUILD.bazel b/manipulation/exercises/pose/BUILD.bazel deleted file mode 100644 index cadde1f5..00000000 --- a/manipulation/exercises/pose/BUILD.bazel +++ /dev/null @@ -1,32 +0,0 @@ -# -*- mode: python -*- -# vi: set ft=python : - -# Copyright 2020-2024 Massachusetts Institute of Technology. -# Licensed under the BSD 3-Clause License. See LICENSE.TXT for details. - -load("//book/htmlbook/tools/python:defs.bzl", "rt_py_library") - -rt_py_library( - name = "test_pose_estimation", - srcs = ["test_pose_estimation.py"], - visibility = ["//visibility:public"], - deps = ["//manipulation"], -) - -rt_py_library( - name = "test_icp", - srcs = ["test_icp.py"], - visibility = ["//visibility:public"], -) - -rt_py_library( - name = "test_ransac", - srcs = ["test_ransac.py"], - visibility = ["//visibility:public"], -) - -rt_py_library( - name = "test_pickplace_initials_with_geometry", - srcs = ["test_pickplace_initials_with_geometry.py"], - visibility = ["//visibility:public"], -) diff --git a/manipulation/exercises/rl/BUILD.bazel b/manipulation/exercises/rl/BUILD.bazel deleted file mode 100644 index 0af01442..00000000 --- a/manipulation/exercises/rl/BUILD.bazel +++ /dev/null @@ -1,19 +0,0 @@ -# -*- mode: python -*- -# vi: set ft=python : - -# Copyright 2020-2024 Massachusetts Institute of Technology. -# Licensed under the BSD 3-Clause License. See LICENSE.TXT for details. - -load("//book/htmlbook/tools/python:defs.bzl", "rt_py_library") - -rt_py_library( - name = "test_stochastic_optimization", - srcs = ["test_stochastic_optimization.py"], - visibility = ["//visibility:public"], -) - -rt_py_library( - name = "test_vpg", - srcs = ["test_vpg.py"], - visibility = ["//visibility:public"], -) diff --git a/manipulation/exercises/robot/BUILD.bazel b/manipulation/exercises/robot/BUILD.bazel deleted file mode 100644 index fadfa18a..00000000 --- a/manipulation/exercises/robot/BUILD.bazel +++ /dev/null @@ -1,37 +0,0 @@ -# -*- mode: python -*- -# vi: set ft=python : - -# Copyright 2020-2024 Massachusetts Institute of Technology. -# Licensed under the BSD 3-Clause License. See LICENSE.TXT for details. - -load("//book/htmlbook/tools/python:defs.bzl", "rt_py_library") - -rt_py_library( - name = "test_reflected_inertia", - srcs = ["test_reflected_inertia.py"], - visibility = ["//visibility:public"], -) - -rt_py_library( - name = "test_hardware_station_io", - srcs = ["test_hardware_station_io.py"], - visibility = ["//visibility:public"], -) - -rt_py_library( - name = "test_direct_joint_control", - srcs = ["test_direct_joint_control.py"], - visibility = ["//visibility:public"], -) - -rt_py_library( - name = "test_survey", - srcs = ["test_survey.py"], - visibility = ["//visibility:public"], -) - -rt_py_library( - name = "test_pid", - srcs = ["test_pid.py"], - visibility = ["//visibility:public"], -) diff --git a/manipulation/exercises/segmentation/BUILD.bazel b/manipulation/exercises/segmentation/BUILD.bazel deleted file mode 100644 index 7c90d183..00000000 --- a/manipulation/exercises/segmentation/BUILD.bazel +++ /dev/null @@ -1,20 +0,0 @@ -# -*- mode: python -*- -# vi: set ft=python : - -# Copyright 2020-2024 Massachusetts Institute of Technology. -# Licensed under the BSD 3-Clause License. See LICENSE.TXT for details. - -load("//book/htmlbook/tools/python:defs.bzl", "rt_py_library") - -rt_py_library( - name = "test_mask", - srcs = ["test_mask.py"], - visibility = ["//visibility:public"], -) - -rt_py_library( - name = "test_segmentation_and_grasp", - data = ["//book/data:segmentation_and_grasp_soln.npz"], - srcs = ["test_segmentation_and_grasp.py"], - visibility = ["//visibility:public"], -) \ No newline at end of file diff --git a/manipulation/exercises/trajectories/BUILD.bazel b/manipulation/exercises/trajectories/BUILD.bazel deleted file mode 100644 index fc12528b..00000000 --- a/manipulation/exercises/trajectories/BUILD.bazel +++ /dev/null @@ -1,31 +0,0 @@ -# -*- mode: python -*- -# vi: set ft=python : - -# Copyright 2020-2024 Massachusetts Institute of Technology. -# Licensed under the BSD 3-Clause License. See LICENSE.TXT for details. - -load("//book/htmlbook/tools/python:defs.bzl", "rt_py_library") - -rt_py_library( - name = "test_door_opening", - srcs = ["test_door_opening.py"], - visibility = ["//visibility:public"], -) - -rt_py_library( - name = "test_rrt_planning", - srcs = ["test_rrt_planning.py"], - visibility = ["//visibility:public"], -) - -rt_py_library( - name = "test_taskspace_iris", - srcs = ["test_taskspace_iris.py"], - visibility = ["//visibility:public"], -) - -rt_py_library( - name = "test_plan_place_initials", - srcs = ["test_plan_place_initials.py"], - visibility = ["//visibility:public"], -) diff --git a/manipulation/exercises/trajectories/rrt_planner/BUILD.bazel b/manipulation/exercises/trajectories/rrt_planner/BUILD.bazel deleted file mode 100644 index 9352f91e..00000000 --- a/manipulation/exercises/trajectories/rrt_planner/BUILD.bazel +++ /dev/null @@ -1,20 +0,0 @@ -# -*- mode: python -*- -# vi: set ft=python : - -# Copyright 2020-2024 Massachusetts Institute of Technology. -# Licensed under the BSD 3-Clause License. See LICENSE.TXT for details. - -load("//book/htmlbook/tools/python:defs.bzl", "rt_py_library") - -rt_py_library( - name = "rrt_planner", - srcs = [ - "__init__.py", - "geometry.py", - "iiwa_rrt_problem.py", - "robot.py", - "rrt_planning.py", - ], - imports = [".."], - visibility = ["//visibility:public"], -) diff --git a/manipulation/models/BUILD.bazel b/manipulation/models/BUILD.bazel deleted file mode 100644 index 8f293893..00000000 --- a/manipulation/models/BUILD.bazel +++ /dev/null @@ -1,25 +0,0 @@ -# -*- mode: python -*- -# vi: set ft=python : - -# Copyright 2020-2024 Massachusetts Institute of Technology. -# Licensed under the BSD 3-Clause License. See LICENSE.TXT for details. - -filegroup( - name = "models", - srcs = glob([ - "**/*.sdf", - "**/*.urdf", - "**/*.yaml", - "**/*.xml", - "**/*.obj", - ]), - visibility = ["//visibility:public"], -) - -exports_files( - glob([ - "**/*.sdf", - "**/*.urdf", - ]), - visibility = ["//visibility:public"], -) diff --git a/manipulation/models/bunny/BUILD.bazel b/manipulation/models/bunny/BUILD.bazel deleted file mode 100644 index ab2956fe..00000000 --- a/manipulation/models/bunny/BUILD.bazel +++ /dev/null @@ -1,13 +0,0 @@ -# -*- mode: python -*- -# vi: set ft=python : - -# Copyright 2020-2024 Massachusetts Institute of Technology. -# Licensed under the BSD 3-Clause License. See LICENSE.TXT for details. - -exports_files( - [ - "bunny.npy", - "bun_zipper_res2.ply", - ], - visibility = ["//:__subpackages__"], -) diff --git a/manipulation/station.py b/manipulation/station.py index 7f3e4fbe..e29189ae 100644 --- a/manipulation/station.py +++ b/manipulation/station.py @@ -1326,6 +1326,7 @@ def _ApplyCameraLcmIdInterface( ) -> None: lcm = lcm_buses.Find("Driver for " + camera_config.name, camera_config.lcm_bus) + print(camera_config.name, camera_id) camera_data_receiver = builder.AddSystem(LcmImageArrayToImages()) camera_data_receiver.set_name(camera_config.name + ".data_receiver") camera_data_subscriber = builder.AddSystem( @@ -1408,20 +1409,21 @@ def _MakeHardwareStationInterface( lcm_buses = ApplyLcmBusConfig(lcm_buses=scenario.lcm_buses, builder=builder) # Add drivers. - _ApplyDriverConfigsInterface( - driver_configs=scenario.model_drivers, - lcm_buses=lcm_buses, - builder=builder, - ) - - if meshcat is not None: - _WireDriverStatusReceiversToToPose( - model_instance_names=scenario.model_drivers.keys(), + if scenario.model_drivers: + _ApplyDriverConfigsInterface( + driver_configs=scenario.model_drivers, + lcm_buses=lcm_buses, builder=builder, - plant=plant, - to_pose=to_pose, ) + if meshcat is not None: + _WireDriverStatusReceiversToToPose( + model_instance_names=scenario.model_drivers.keys(), + builder=builder, + plant=plant, + to_pose=to_pose, + ) + # Add camera ids for camera_name, camera_id in scenario.camera_ids.items(): _ApplyCameraLcmIdInterface( diff --git a/manipulation/test/models/BUILD.bazel b/manipulation/test/models/BUILD.bazel deleted file mode 100644 index 16287f7b..00000000 --- a/manipulation/test/models/BUILD.bazel +++ /dev/null @@ -1,20 +0,0 @@ -# -*- mode: python -*- -# vi: set ft=python : - -# Copyright 2020-2024 Massachusetts Institute of Technology. -# Licensed under the BSD 3-Clause License. See LICENSE.TXT for details. - -filegroup( - name = "models", - srcs = glob([ - "**/*.sdf", - "**/*.urdf", - "**/*.yaml", - "**/*.xml", - "**/*.obj", - "**/*.dae", - "**/*.stl", - "assets/*", - ]), - visibility = ["//visibility:public"], -) diff --git a/manipulation/test/test_station_camera_ids.py b/manipulation/test/test_station_camera_ids.py index b4d41606..e7945432 100644 --- a/manipulation/test/test_station_camera_ids.py +++ b/manipulation/test/test_station_camera_ids.py @@ -46,9 +46,17 @@ def test_load_scenario_with_camera_ids(self): self.assertTrue(station.HasSubsystemNamed("camera0.data_subscriber")) self.assertTrue(station.HasSubsystemNamed("camera0.data_receiver")) - in_system, out_system = next(iter(station.connection_map().items())) - self.assertIsInstance(in_system[0], LcmImageArrayToImages) - self.assertIsInstance(out_system[0], LcmSubscriberSystem) + connection_map = station.connection_map() + has_camera_connection = any( + isinstance(in_sys[0], LcmImageArrayToImages) + and isinstance(out_sys[0], LcmSubscriberSystem) + for in_sys, out_sys in connection_map.items() + ) + self.assertTrue( + has_camera_connection, + "Expected at least one connection from LcmImageArrayToImages to " + "LcmSubscriberSystem in connection_map", + ) if __name__ == "__main__": diff --git a/manipulation/utils.py b/manipulation/utils.py index 394d4fcb..2b5c68a8 100644 --- a/manipulation/utils.py +++ b/manipulation/utils.py @@ -67,7 +67,7 @@ def FindDataResource(filename: str): if running_as_test: raise FileNotFoundError( f"{path} was not found locally; it is required for testing." - ) # because the urlretrieve defeats bazel's hermetic testing. + ) # Keep tests deterministic and independent of network access. print(f"{path} was not found locally; downloading it now...") urlretrieve(f"https://manipulation.csail.mit.edu/data/{filename}", path) return path diff --git a/poetry.lock b/poetry.lock index 27261f00..1f237e2b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.1.4 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.3.2 and should not be changed by hand. [[package]] name = "alabaster" @@ -115,7 +115,7 @@ files = [ {file = "beautifulsoup4-4.13.5-py3-none-any.whl", hash = "sha256:642085eaa22233aceadff9c69651bc51e8bf3f874fb6d7104ece2beb24b47c4a"}, {file = "beautifulsoup4-4.13.5.tar.gz", hash = "sha256:5e70131382930e7c3de33450a2f54a63d5e4b19386eab43a5b34d594268f3695"}, ] -markers = {main = "sys_platform == \"darwin\" or sys_platform == \"linux\""} +markers = {main = "extra == \"grader\" and (sys_platform == \"darwin\" or sys_platform == \"linux\")"} [package.dependencies] soupsieve = ">1.2" @@ -761,22 +761,24 @@ files = [ [[package]] name = "drake" -version = "1.43.0" +version = "1.50.0" description = "Model-based design and verification for robotics" optional = false python-versions = ">=3.10" groups = ["main", "docs"] files = [ - {file = "drake-1.43.0-cp310-cp310-manylinux_2_34_x86_64.whl", hash = "sha256:6311032ee16308694f08e16973d9af04ea3d10b38404fb4fb2214c60672913b0"}, - {file = "drake-1.43.0-cp311-cp311-manylinux_2_34_x86_64.whl", hash = "sha256:a4c8436f759e86739c4a27439e821f1951e06f38a4e2590101bcb2786e19ffe9"}, - {file = "drake-1.43.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:491318cdad1bba249d7e30e98b1da22c98b83ea5b173dd44da05e4d75db1dd13"}, - {file = "drake-1.43.0-cp312-cp312-manylinux_2_34_x86_64.whl", hash = "sha256:8990aed4c94e68c59e1432d57aab34ca36d555c76259fb3e29f5503a402cdc2f"}, - {file = "drake-1.43.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:2d2fdc09ff754bfb3997df4ead13c860476d091093c74c860d556acf34d41bda"}, - {file = "drake-1.43.0-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:f51bfbf0145802ade8fb8fb03a3a0b69dd6d46654e93c44b1f9c036e339d2772"}, + {file = "drake-1.50.0-cp310-cp310-manylinux_2_34_x86_64.whl", hash = "sha256:7933e33a93336c5b1a5c4570b31aa75fcd81059c6481e4e8b4230d6b502347ce"}, + {file = "drake-1.50.0-cp311-cp311-manylinux_2_34_x86_64.whl", hash = "sha256:cf1b3a0023e10ff2a466d0b8a363ce19ca3f2b4d56566df231cb54530769f1f6"}, + {file = "drake-1.50.0-cp312-cp312-manylinux_2_34_x86_64.whl", hash = "sha256:913be925530b7167f51a3223b9c4f99a17b9cd02b5a04fc2bda095ea57eaf22c"}, + {file = "drake-1.50.0-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:88a8bb9f60833f082931ca467c545cd75074b28225958bda5e1e5db0a7d7d2dd"}, + {file = "drake-1.50.0-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:ab7c3a5a2f53708dee2102f988c694b8626f4e52f66a36b1f4c322a3b0ed096d"}, + {file = "drake-1.50.0-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:eebed80dc9c2ea147475d2b70ba62422da8fe87d1745b910ed7a4beb2d2f5ce8"}, + {file = "drake-1.50.0-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:3f6db3abb15801a1c0830d80c2efb9df55541dd76e167f159e29d5fa2a559a6b"}, ] [package.dependencies] matplotlib = "*" +Mosek = {version = "11.1.2", markers = "python_version < \"3.15\" and platform_machine != \"aarch64\""} numpy = "*" pydot = "*" PyYAML = "*" @@ -1165,6 +1167,18 @@ files = [ {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, ] +[[package]] +name = "iniconfig" +version = "2.3.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.10" +groups = ["dev"] +files = [ + {file = "iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12"}, + {file = "iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730"}, +] + [[package]] name = "ipython" version = "8.37.0" @@ -1293,7 +1307,7 @@ files = [ [package.dependencies] attrs = ">=22.2.0" -jsonschema-specifications = ">=2023.03.6" +jsonschema-specifications = ">=2023.3.6" referencing = ">=0.28.4" rpds-py = ">=0.7.1" @@ -1994,6 +2008,24 @@ files = [ [package.dependencies] typing-extensions = {version = "*", markers = "python_version < \"3.11\""} +[[package]] +name = "mosek" +version = "11.1.2" +description = "Python API for Mosek" +optional = false +python-versions = "<3.15,>=3.9" +groups = ["main", "docs"] +markers = "python_version < \"3.15\" and platform_machine != \"aarch64\"" +files = [ + {file = "mosek-11.1.2-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:c56a776188951b9028b47f9e814eb21ac0c8b44b564baf8c584277c9f61a4277"}, + {file = "mosek-11.1.2-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:5c3566d2a603d94a1773bcd27097c8390dba1d9a1543534f3527deb56f1d0a55"}, + {file = "mosek-11.1.2-cp39-abi3-manylinux_2_27_aarch64.whl", hash = "sha256:67c13d56a9b7adf2670e4ed6fb62aa92560ae2ff1050f6e756d0d3f82c42c19f"}, + {file = "mosek-11.1.2-cp39-abi3-win_amd64.whl", hash = "sha256:ad81cfd53af508db89241c7869ddce7ceaae13ef057f7b98007d57dccbb63c92"}, +] + +[package.dependencies] +numpy = "*" + [[package]] name = "mpld3" version = "0.5.11" @@ -2863,6 +2895,22 @@ docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.1.3)", "sphinx-a test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.4)", "pytest-cov (>=6)", "pytest-mock (>=3.14)"] type = ["mypy (>=1.14.1)"] +[[package]] +name = "pluggy" +version = "1.6.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746"}, + {file = "pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["coverage", "pytest", "pytest-benchmark"] + [[package]] name = "pre-commit" version = "3.8.0" @@ -3036,6 +3084,45 @@ files = [ [package.extras] diagrams = ["jinja2", "railroad-diagrams"] +[[package]] +name = "pytest" +version = "9.0.2" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.10" +groups = ["dev"] +files = [ + {file = "pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b"}, + {file = "pytest-9.0.2.tar.gz", hash = "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11"}, +] + +[package.dependencies] +colorama = {version = ">=0.4", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1", markers = "python_version < \"3.11\""} +iniconfig = ">=1.0.1" +packaging = ">=22" +pluggy = ">=1.5,<2" +pygments = ">=2.7.2" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} + +[package.extras] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pytest-timeout" +version = "2.4.0" +description = "pytest plugin to abort hanging tests" +optional = false +python-versions = ">=3.7" +groups = ["dev"] +files = [ + {file = "pytest_timeout-2.4.0-py3-none-any.whl", hash = "sha256:c42667e5cdadb151aeb5b26d114aff6bdf5a907f176a007a30b940d3d865b5c2"}, + {file = "pytest_timeout-2.4.0.tar.gz", hash = "sha256:7e68e90b01f9eff71332b25001f85c75495fc4e3a836701876183c4bcfd0540a"}, +] + +[package.dependencies] +pytest = ">=7.0.0" + [[package]] name = "python-dateutil" version = "2.9.0.post0" @@ -3802,7 +3889,7 @@ files = [ {file = "soupsieve-2.8-py3-none-any.whl", hash = "sha256:0cc76456a30e20f5d7f2e14a98a4ae2ee4e5abdc7c5ea0aafe795f344bc7984c"}, {file = "soupsieve-2.8.tar.gz", hash = "sha256:e2dd4a40a628cb5f28f6d4b0db8800b8f581b65bb380b97de22ba5ca8d72572f"}, ] -markers = {main = "sys_platform == \"darwin\" or sys_platform == \"linux\""} +markers = {main = "extra == \"grader\" and (sys_platform == \"darwin\" or sys_platform == \"linux\")"} [[package]] name = "sphinx" @@ -4387,6 +4474,7 @@ files = [ {file = "trimesh-4.7.4-py3-none-any.whl", hash = "sha256:47af90235f7006316c37584b43d5f6c109a5069b252d7ab2bf8e6ed7c9fd953b"}, {file = "trimesh-4.7.4.tar.gz", hash = "sha256:8d242dfabd9bc4e99a4f0c75bf8c0a41fbb252924e3484b53a8b0096accb49e1"}, ] +markers = {main = "extra == \"all\" or extra == \"mesh\" or extra == \"letter\""} [package.dependencies] charset-normalizer = {version = "*", optional = true, markers = "extra == \"easy\""} @@ -4452,7 +4540,7 @@ files = [ {file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"}, {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"}, ] -markers = {main = "(sys_platform == \"darwin\" or sys_platform == \"linux\" or python_version <= \"3.12\" or extra == \"rl\" or extra == \"all\" or extra == \"torch\") and (sys_platform == \"darwin\" or sys_platform == \"linux\" or python_version < \"3.12\" or extra == \"grader\" or extra == \"all\" or extra == \"rl\" or extra == \"torch\")", docs = "python_version < \"3.12\""} +markers = {main = "(extra == \"grader\" or extra == \"rl\" or extra == \"all\" or extra == \"torch\" or python_version < \"3.12\") and (sys_platform == \"darwin\" or sys_platform == \"linux\" or python_version <= \"3.12\" or extra == \"rl\" or extra == \"all\" or extra == \"torch\")", docs = "python_version < \"3.12\""} [[package]] name = "tzdata" @@ -4543,6 +4631,7 @@ files = [ {file = "vhacdx-0.0.8.post2-cp39-cp39-win_amd64.whl", hash = "sha256:93041cf52887f144ad3d297a43631fcf4359dc7589c52d9a1be408d668e420e4"}, {file = "vhacdx-0.0.8.post2.tar.gz", hash = "sha256:aa27c5ef19ed4aba428fa9408dccc37f2b7a6bbfaddc48b06a8cea9faaf93156"}, ] +markers = {main = "extra == \"all\" or extra == \"mesh\""} [package.dependencies] numpy = "*" @@ -4778,4 +4867,4 @@ torch = ["torch", "torchvision"] [metadata] lock-version = "2.1" python-versions = ">=3.10,<4.0" -content-hash = "613bf787884590d7cf1f95914504abc8e027d715d56f9322c5dd8861741de751" +content-hash = "8270e1ed0c2a175a4ab0c7ce565a6ab877794fe33645ada3fc6b8714b029c1ff" diff --git a/pyproject.toml b/pyproject.toml index fe5e2fb4..403945e5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -50,13 +50,12 @@ priority = "explicit" python = ">=3.10,<4.0" # Support Python 3.10 (Jammy CI), Python 3.12 (Noble CI), and 3.13 (macOS) cloudpickle = { version="2.2.1", optional=true} # needs to be pinned for stored files to remain compatible. #drake = { version = ">=0.0.20250131 <0.1", source = "drake-nightly" } -drake = ">=1.41.0" +drake = ">=1.45.0" gradescope-utils = { version=">=0.4.0", optional=true} gymnasium = { version=">0.26", optional=true } ipython = ">=7.8.0" # TODO: make this optional? ipywidgets = { version=">=8", optional=true } lxml = {version = ">=4.9.2", extras = ["html_clean"] } -# Note: matplotlib gets additional handling in PoetryExport.py for bazel. matplotlib = ">=3.7.0" # old versions don't build in XCode mpld3 = { version=">=0.5.6", optional=false } # TODO: make this optional nbconvert = [ @@ -132,7 +131,7 @@ optional = true # needed to import for a file that sphinx autodoc is trying to index. None of # these should be marked as optional. #drake = { version = ">=0.0.20250118 <0.1", source = "drake-nightly" } -drake = ">=1.41.0" +drake = ">=1.45.0" ipython = ">=7.8.0" lxml = {version = ">=4.9.2", extras = ["html_clean"] } mpld3 = { version=">=0.5.6", optional=false } @@ -150,13 +149,11 @@ black = { version = ">=23.*", extras = ["jupyter"] } mysql-connector-python = { version=">=8.0.23" } packaging = ">=24.2" pip-requirements-parser = ">=32.0" +pytest = ">=8.0" +pytest-timeout = ">=2.3.1" pre-commit = "^3.4.0" requests = { version=">=2.25.1" } -[tool.poetry.requires-plugins] -poetry-plugin-export = ">=1.8" -poetry-pre-commit-plugin = ">=0.2" - [tool.black] include = '\.ipynb?$|\.pyi?$' exclude = ''' @@ -191,5 +188,20 @@ remove-all-unused-imports = true remove-duplicate-keys = true remove-unused-variables = true +[tool.pytest.ini_options] +minversion = "8.0" +addopts = "-ra" +testpaths = [ + "book", + "manipulation/test", + "solutions", +] +python_files = [ + "test_*.py", +] +markers = [ + "notebook: notebook execution tests", +] + [tool.pyright] -include = ["manipulation"] \ No newline at end of file +include = ["manipulation"] diff --git a/requirements-bazel-linux.txt b/requirements-bazel-linux.txt deleted file mode 100644 index cdd40623..00000000 --- a/requirements-bazel-linux.txt +++ /dev/null @@ -1,132 +0,0 @@ ---find-links https://download.pytorch.org/whl/torch_stable.html -anyio==4.10.0 ; python_version >= "3.10" and python_version < "4.0" -asttokens==3.0.0 ; python_version >= "3.10" and python_version < "4.0" -attrs==25.3.0 ; python_version >= "3.10" and python_version < "4.0" -bayesian-optimization==1.4.0 ; python_version >= "3.10" and python_version < "4.0" -beautifulsoup4==4.13.5 ; python_version >= "3.10" and python_version < "4.0" -black==25.1.0 ; python_version >= "3.10" and python_version < "4.0" -bleach==6.2.0 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -certifi==2025.8.3 ; python_version >= "3.10" and python_version < "4.0" -cfgv==3.4.0 ; python_version >= "3.10" and python_version < "4.0" -charset-normalizer==3.4.3 ; python_version >= "3.10" and python_version < "4.0" -click==8.2.1 ; python_version >= "3.10" and python_version < "4.0" -cloudpickle==2.2.1 ; python_version >= "3.10" and python_version < "4.0" -cma==4.3.0 ; python_version >= "3.10" and python_version < "4.0" -coacd==1.0.7 ; python_version >= "3.10" and python_version < "4.0" -colorlog==6.9.0 ; python_version >= "3.10" and python_version < "4.0" -comm==0.2.3 ; python_version >= "3.10" and python_version < "4.0" -config-path==1.0.5 ; python_version >= "3.10" and python_version < "4.0" -contourpy==1.3.2 ; python_version >= "3.10" and python_version < "4.0" -cycler==0.12.1 ; python_version >= "3.10" and python_version < "4.0" -cython==3.1.3 ; python_version >= "3.10" and python_version < "4.0" -decorator==5.2.1 ; python_version >= "3.10" and python_version < "4.0" -defusedxml==0.7.1 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -directsearch==1.0 ; python_version >= "3.10" and python_version < "4.0" -distlib==0.4.0 ; python_version >= "3.10" and python_version < "4.0" -drake==1.43.0 ; python_version >= "3.10" and python_version < "4.0" -executing==2.2.0 ; python_version >= "3.10" and python_version < "4.0" -farama-notifications==0.0.4 ; python_version >= "3.10" and python_version < "4.0" -fastjsonschema==2.21.2 ; python_version >= "3.10" and python_version < "4.0" -filelock==3.19.1 ; python_version >= "3.10" and python_version < "4.0" -fonttools==4.59.2 ; python_version >= "3.10" and python_version < "4.0" -fsspec==2025.7.0 ; python_version >= "3.10" and python_version < "4.0" -gradescope-utils==0.5.0 ; python_version >= "3.10" and python_version < "4.0" -gymnasium==1.2.0 ; python_version >= "3.10" and python_version < "4.0" -h11==0.16.0 ; python_version >= "3.10" and python_version < "4.0" -httpcore==1.0.9 ; python_version >= "3.10" and python_version < "4.0" -httpx==0.28.1 ; python_version >= "3.10" and python_version < "4.0" -identify==2.6.13 ; python_version >= "3.10" and python_version < "4.0" -idna==3.10 ; python_version >= "3.10" and python_version < "4.0" -ipython==8.37.0 ; python_version >= "3.10" and python_version < "4.0" -ipywidgets==8.1.7 ; python_version >= "3.10" and python_version < "4.0" -jedi==0.19.2 ; python_version >= "3.10" and python_version < "4.0" -jinja2==3.1.6 ; python_version >= "3.10" and python_version < "4.0" -joblib==1.5.2 ; python_version >= "3.10" and python_version < "4.0" -jsonschema-specifications==2025.4.1 ; python_version >= "3.10" and python_version < "4.0" -jsonschema==4.25.1 ; python_version >= "3.10" and python_version < "4.0" -jupyter-client==8.6.3 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -jupyter-core==5.8.1 ; python_version >= "3.10" and python_version < "4.0" -jupyterlab-pygments==0.3.0 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -jupyterlab-widgets==3.0.15 ; python_version >= "3.10" and python_version < "4.0" -kiwisolver==1.4.9 ; python_version >= "3.10" and python_version < "4.0" -lxml-html-clean==0.4.2 ; python_version >= "3.10" and python_version < "4.0" -lxml==6.0.1 ; python_version >= "3.10" and python_version < "4.0" -manifold3d==3.2.1 ; python_version >= "3.10" and python_version < "4.0" -mapbox-earcut==1.0.3 ; python_version >= "3.10" and python_version < "4.0" -markupsafe==3.0.2 ; python_version >= "3.10" and python_version < "4.0" -matplotlib-inline==0.1.7 ; python_version >= "3.10" and python_version < "4.0" -matplotlib==3.10.6 ; python_version >= "3.10" and python_version < "4.0" -mistune==3.1.4 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -mpld3==0.5.11 ; python_version >= "3.10" and python_version < "4.0" -mpmath==1.3.0 ; python_version >= "3.10" and python_version < "4.0" -mypy-extensions==1.1.0 ; python_version >= "3.10" and python_version < "4.0" -mysql-connector-python==9.4.0 ; python_version >= "3.10" and python_version < "4.0" -nbclient==0.10.2 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -nbconvert==7.14.2 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -nbformat==5.10.4 ; python_version >= "3.10" and python_version < "4.0" -networkx==3.4.2 ; python_version >= "3.10" and python_version < "4.0" -nevergrad==1.0.12 ; python_version >= "3.10" and python_version < "4.0" -nodeenv==1.9.1 ; python_version >= "3.10" and python_version < "4.0" -numpy==2.2.6 ; python_version >= "3.10" and python_version < "4.0" -packaging==25.0 ; python_version >= "3.10" and python_version < "4.0" -pandas==2.3.2 ; python_version >= "3.10" and python_version < "4.0" -pandocfilters==1.5.1 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -parso==0.8.5 ; python_version >= "3.10" and python_version < "4.0" -pathspec==0.12.1 ; python_version >= "3.10" and python_version < "4.0" -pexpect==4.9.0 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux" or sys_platform != "darwin" and sys_platform != "linux" and sys_platform != "win32" and sys_platform != "emscripten") -pillow==11.3.0 ; python_version >= "3.10" and python_version < "4.0" -pip-requirements-parser==32.0.1 ; python_version >= "3.10" and python_version < "4.0" -platformdirs==4.4.0 ; python_version >= "3.10" and python_version < "4.0" -pre-commit==3.8.0 ; python_version >= "3.10" and python_version < "4.0" -prompt-toolkit==3.0.52 ; python_version >= "3.10" and python_version < "4.0" -psutil==7.0.0 ; python_version >= "3.10" and python_version < "4.0" -ptyprocess==0.7.0 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux" or sys_platform != "darwin" and sys_platform != "linux" and sys_platform != "win32" and sys_platform != "emscripten") -pure-eval==0.2.3 ; python_version >= "3.10" and python_version < "4.0" -pycollada==0.9.2 ; python_version >= "3.10" and python_version < "4.0" -pydot==4.0.1 ; python_version >= "3.10" and python_version < "4.0" -pygments==2.19.2 ; python_version >= "3.10" and python_version < "4.0" -pyparsing==3.2.3 ; python_version >= "3.10" and python_version < "4.0" -python-dateutil==2.9.0.post0 ; python_version >= "3.10" and python_version < "4.0" -python-fcl==0.7.0.8 ; python_version >= "3.10" and python_version < "4.0" -pytz==2025.2 ; python_version >= "3.10" and python_version < "4.0" -pyvirtualdisplay==3.0 ; python_version >= "3.10" and python_version < "4.0" -pyyaml==6.0.2 ; python_version >= "3.10" and python_version < "4.0" -pyzmq==27.0.2 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -referencing==0.36.2 ; python_version >= "3.10" and python_version < "4.0" -requests==2.32.5 ; python_version >= "3.10" and python_version < "4.0" -rpds-py==0.27.1 ; python_version >= "3.10" and python_version < "4.0" -rtree==1.4.1 ; python_version >= "3.10" and python_version < "4.0" -scene-synthesizer==1.15.0 ; python_version >= "3.10" and python_version < "4.0" -scikit-learn==1.7.1 ; python_version >= "3.10" and python_version < "4.0" -scipy==1.15.3 ; python_version >= "3.10" and python_version < "4.0" -setuptools-scm==9.2.0 ; python_version >= "3.10" and python_version < "4.0" -setuptools==70.3.0 ; python_version >= "3.10" and python_version < "4.0" -shapely==2.1.1 ; python_version >= "3.10" and python_version < "4.0" -six==1.17.0 ; python_version >= "3.10" and python_version < "4.0" -sniffio==1.3.1 ; python_version >= "3.10" and python_version < "4.0" -soupsieve==2.8 ; python_version >= "3.10" and python_version < "4.0" -stable-baselines3==2.7.0 ; python_version >= "3.10" and python_version < "4.0" -stack-data==0.6.3 ; python_version >= "3.10" and python_version < "4.0" -svg-path==7.0 ; python_version >= "3.10" and python_version < "4.0" -sympy==1.14.0 ; python_version >= "3.10" and python_version < "4.0" -threadpoolctl==3.6.0 ; python_version >= "3.10" and python_version < "4.0" -timeout-decorator==0.5.0 ; python_version >= "3.10" and python_version < "4.0" -tinycss2==1.4.0 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -tokenize-rt==6.2.0 ; python_version >= "3.10" and python_version < "4.0" -torch==2.7.1 ; python_version >= "3.10" and python_version < "4.0" -torchvision==0.22.1 ; python_version >= "3.10" and python_version < "4.0" -tornado==6.5.2 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -tqdm==4.67.1 ; python_version >= "3.10" and python_version < "4.0" -traitlets==5.14.3 ; python_version >= "3.10" and python_version < "4.0" -triangle==20250106 ; python_version >= "3.10" and python_version < "4.0" -trimesh==4.7.4 ; python_version >= "3.10" and python_version < "4.0" -typing-extensions==4.15.0 ; python_version >= "3.10" and python_version < "4.0" -tzdata==2025.2 ; python_version >= "3.10" and python_version < "4.0" -urllib3==2.5.0 ; python_version >= "3.10" and python_version < "4.0" -vhacdx==0.0.8.post2 ; python_version >= "3.10" and python_version < "4.0" -virtualenv==20.34.0 ; python_version >= "3.10" and python_version < "4.0" -wcwidth==0.2.13 ; python_version >= "3.10" and python_version < "4.0" -webencodings==0.5.1 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -widgetsnbextension==4.0.14 ; python_version >= "3.10" and python_version < "4.0" -xxhash==3.5.0 ; python_version >= "3.10" and python_version < "4.0" -yourdfpy==0.0.58 ; python_version >= "3.10" and python_version < "4.0" diff --git a/requirements-bazel-mac.txt b/requirements-bazel-mac.txt deleted file mode 100644 index cdd40623..00000000 --- a/requirements-bazel-mac.txt +++ /dev/null @@ -1,132 +0,0 @@ ---find-links https://download.pytorch.org/whl/torch_stable.html -anyio==4.10.0 ; python_version >= "3.10" and python_version < "4.0" -asttokens==3.0.0 ; python_version >= "3.10" and python_version < "4.0" -attrs==25.3.0 ; python_version >= "3.10" and python_version < "4.0" -bayesian-optimization==1.4.0 ; python_version >= "3.10" and python_version < "4.0" -beautifulsoup4==4.13.5 ; python_version >= "3.10" and python_version < "4.0" -black==25.1.0 ; python_version >= "3.10" and python_version < "4.0" -bleach==6.2.0 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -certifi==2025.8.3 ; python_version >= "3.10" and python_version < "4.0" -cfgv==3.4.0 ; python_version >= "3.10" and python_version < "4.0" -charset-normalizer==3.4.3 ; python_version >= "3.10" and python_version < "4.0" -click==8.2.1 ; python_version >= "3.10" and python_version < "4.0" -cloudpickle==2.2.1 ; python_version >= "3.10" and python_version < "4.0" -cma==4.3.0 ; python_version >= "3.10" and python_version < "4.0" -coacd==1.0.7 ; python_version >= "3.10" and python_version < "4.0" -colorlog==6.9.0 ; python_version >= "3.10" and python_version < "4.0" -comm==0.2.3 ; python_version >= "3.10" and python_version < "4.0" -config-path==1.0.5 ; python_version >= "3.10" and python_version < "4.0" -contourpy==1.3.2 ; python_version >= "3.10" and python_version < "4.0" -cycler==0.12.1 ; python_version >= "3.10" and python_version < "4.0" -cython==3.1.3 ; python_version >= "3.10" and python_version < "4.0" -decorator==5.2.1 ; python_version >= "3.10" and python_version < "4.0" -defusedxml==0.7.1 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -directsearch==1.0 ; python_version >= "3.10" and python_version < "4.0" -distlib==0.4.0 ; python_version >= "3.10" and python_version < "4.0" -drake==1.43.0 ; python_version >= "3.10" and python_version < "4.0" -executing==2.2.0 ; python_version >= "3.10" and python_version < "4.0" -farama-notifications==0.0.4 ; python_version >= "3.10" and python_version < "4.0" -fastjsonschema==2.21.2 ; python_version >= "3.10" and python_version < "4.0" -filelock==3.19.1 ; python_version >= "3.10" and python_version < "4.0" -fonttools==4.59.2 ; python_version >= "3.10" and python_version < "4.0" -fsspec==2025.7.0 ; python_version >= "3.10" and python_version < "4.0" -gradescope-utils==0.5.0 ; python_version >= "3.10" and python_version < "4.0" -gymnasium==1.2.0 ; python_version >= "3.10" and python_version < "4.0" -h11==0.16.0 ; python_version >= "3.10" and python_version < "4.0" -httpcore==1.0.9 ; python_version >= "3.10" and python_version < "4.0" -httpx==0.28.1 ; python_version >= "3.10" and python_version < "4.0" -identify==2.6.13 ; python_version >= "3.10" and python_version < "4.0" -idna==3.10 ; python_version >= "3.10" and python_version < "4.0" -ipython==8.37.0 ; python_version >= "3.10" and python_version < "4.0" -ipywidgets==8.1.7 ; python_version >= "3.10" and python_version < "4.0" -jedi==0.19.2 ; python_version >= "3.10" and python_version < "4.0" -jinja2==3.1.6 ; python_version >= "3.10" and python_version < "4.0" -joblib==1.5.2 ; python_version >= "3.10" and python_version < "4.0" -jsonschema-specifications==2025.4.1 ; python_version >= "3.10" and python_version < "4.0" -jsonschema==4.25.1 ; python_version >= "3.10" and python_version < "4.0" -jupyter-client==8.6.3 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -jupyter-core==5.8.1 ; python_version >= "3.10" and python_version < "4.0" -jupyterlab-pygments==0.3.0 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -jupyterlab-widgets==3.0.15 ; python_version >= "3.10" and python_version < "4.0" -kiwisolver==1.4.9 ; python_version >= "3.10" and python_version < "4.0" -lxml-html-clean==0.4.2 ; python_version >= "3.10" and python_version < "4.0" -lxml==6.0.1 ; python_version >= "3.10" and python_version < "4.0" -manifold3d==3.2.1 ; python_version >= "3.10" and python_version < "4.0" -mapbox-earcut==1.0.3 ; python_version >= "3.10" and python_version < "4.0" -markupsafe==3.0.2 ; python_version >= "3.10" and python_version < "4.0" -matplotlib-inline==0.1.7 ; python_version >= "3.10" and python_version < "4.0" -matplotlib==3.10.6 ; python_version >= "3.10" and python_version < "4.0" -mistune==3.1.4 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -mpld3==0.5.11 ; python_version >= "3.10" and python_version < "4.0" -mpmath==1.3.0 ; python_version >= "3.10" and python_version < "4.0" -mypy-extensions==1.1.0 ; python_version >= "3.10" and python_version < "4.0" -mysql-connector-python==9.4.0 ; python_version >= "3.10" and python_version < "4.0" -nbclient==0.10.2 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -nbconvert==7.14.2 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -nbformat==5.10.4 ; python_version >= "3.10" and python_version < "4.0" -networkx==3.4.2 ; python_version >= "3.10" and python_version < "4.0" -nevergrad==1.0.12 ; python_version >= "3.10" and python_version < "4.0" -nodeenv==1.9.1 ; python_version >= "3.10" and python_version < "4.0" -numpy==2.2.6 ; python_version >= "3.10" and python_version < "4.0" -packaging==25.0 ; python_version >= "3.10" and python_version < "4.0" -pandas==2.3.2 ; python_version >= "3.10" and python_version < "4.0" -pandocfilters==1.5.1 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -parso==0.8.5 ; python_version >= "3.10" and python_version < "4.0" -pathspec==0.12.1 ; python_version >= "3.10" and python_version < "4.0" -pexpect==4.9.0 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux" or sys_platform != "darwin" and sys_platform != "linux" and sys_platform != "win32" and sys_platform != "emscripten") -pillow==11.3.0 ; python_version >= "3.10" and python_version < "4.0" -pip-requirements-parser==32.0.1 ; python_version >= "3.10" and python_version < "4.0" -platformdirs==4.4.0 ; python_version >= "3.10" and python_version < "4.0" -pre-commit==3.8.0 ; python_version >= "3.10" and python_version < "4.0" -prompt-toolkit==3.0.52 ; python_version >= "3.10" and python_version < "4.0" -psutil==7.0.0 ; python_version >= "3.10" and python_version < "4.0" -ptyprocess==0.7.0 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux" or sys_platform != "darwin" and sys_platform != "linux" and sys_platform != "win32" and sys_platform != "emscripten") -pure-eval==0.2.3 ; python_version >= "3.10" and python_version < "4.0" -pycollada==0.9.2 ; python_version >= "3.10" and python_version < "4.0" -pydot==4.0.1 ; python_version >= "3.10" and python_version < "4.0" -pygments==2.19.2 ; python_version >= "3.10" and python_version < "4.0" -pyparsing==3.2.3 ; python_version >= "3.10" and python_version < "4.0" -python-dateutil==2.9.0.post0 ; python_version >= "3.10" and python_version < "4.0" -python-fcl==0.7.0.8 ; python_version >= "3.10" and python_version < "4.0" -pytz==2025.2 ; python_version >= "3.10" and python_version < "4.0" -pyvirtualdisplay==3.0 ; python_version >= "3.10" and python_version < "4.0" -pyyaml==6.0.2 ; python_version >= "3.10" and python_version < "4.0" -pyzmq==27.0.2 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -referencing==0.36.2 ; python_version >= "3.10" and python_version < "4.0" -requests==2.32.5 ; python_version >= "3.10" and python_version < "4.0" -rpds-py==0.27.1 ; python_version >= "3.10" and python_version < "4.0" -rtree==1.4.1 ; python_version >= "3.10" and python_version < "4.0" -scene-synthesizer==1.15.0 ; python_version >= "3.10" and python_version < "4.0" -scikit-learn==1.7.1 ; python_version >= "3.10" and python_version < "4.0" -scipy==1.15.3 ; python_version >= "3.10" and python_version < "4.0" -setuptools-scm==9.2.0 ; python_version >= "3.10" and python_version < "4.0" -setuptools==70.3.0 ; python_version >= "3.10" and python_version < "4.0" -shapely==2.1.1 ; python_version >= "3.10" and python_version < "4.0" -six==1.17.0 ; python_version >= "3.10" and python_version < "4.0" -sniffio==1.3.1 ; python_version >= "3.10" and python_version < "4.0" -soupsieve==2.8 ; python_version >= "3.10" and python_version < "4.0" -stable-baselines3==2.7.0 ; python_version >= "3.10" and python_version < "4.0" -stack-data==0.6.3 ; python_version >= "3.10" and python_version < "4.0" -svg-path==7.0 ; python_version >= "3.10" and python_version < "4.0" -sympy==1.14.0 ; python_version >= "3.10" and python_version < "4.0" -threadpoolctl==3.6.0 ; python_version >= "3.10" and python_version < "4.0" -timeout-decorator==0.5.0 ; python_version >= "3.10" and python_version < "4.0" -tinycss2==1.4.0 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -tokenize-rt==6.2.0 ; python_version >= "3.10" and python_version < "4.0" -torch==2.7.1 ; python_version >= "3.10" and python_version < "4.0" -torchvision==0.22.1 ; python_version >= "3.10" and python_version < "4.0" -tornado==6.5.2 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -tqdm==4.67.1 ; python_version >= "3.10" and python_version < "4.0" -traitlets==5.14.3 ; python_version >= "3.10" and python_version < "4.0" -triangle==20250106 ; python_version >= "3.10" and python_version < "4.0" -trimesh==4.7.4 ; python_version >= "3.10" and python_version < "4.0" -typing-extensions==4.15.0 ; python_version >= "3.10" and python_version < "4.0" -tzdata==2025.2 ; python_version >= "3.10" and python_version < "4.0" -urllib3==2.5.0 ; python_version >= "3.10" and python_version < "4.0" -vhacdx==0.0.8.post2 ; python_version >= "3.10" and python_version < "4.0" -virtualenv==20.34.0 ; python_version >= "3.10" and python_version < "4.0" -wcwidth==0.2.13 ; python_version >= "3.10" and python_version < "4.0" -webencodings==0.5.1 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -widgetsnbextension==4.0.14 ; python_version >= "3.10" and python_version < "4.0" -xxhash==3.5.0 ; python_version >= "3.10" and python_version < "4.0" -yourdfpy==0.0.58 ; python_version >= "3.10" and python_version < "4.0" diff --git a/requirements-bazel.txt b/requirements-bazel.txt deleted file mode 100644 index d28f354d..00000000 --- a/requirements-bazel.txt +++ /dev/null @@ -1,153 +0,0 @@ ---find-links https://download.pytorch.org/whl/torch_stable.html -anyio==4.10.0 ; python_version >= "3.10" and python_version < "4.0" -asttokens==3.0.0 ; python_version >= "3.10" and python_version < "4.0" -attrs==25.3.0 ; python_version >= "3.10" and python_version < "4.0" -bayesian-optimization==1.4.0 ; python_version >= "3.10" and python_version < "4.0" -beautifulsoup4==4.13.5 ; python_version >= "3.10" and python_version < "4.0" -black==25.1.0 ; python_version >= "3.10" and python_version < "4.0" -bleach==6.2.0 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -certifi==2025.8.3 ; python_version >= "3.10" and python_version < "4.0" -cffi==1.17.1 ; python_version >= "3.10" and python_version < "4.0" and implementation_name == "pypy" and (sys_platform == "darwin" or sys_platform == "linux") -cfgv==3.4.0 ; python_version >= "3.10" and python_version < "4.0" -charset-normalizer==3.4.3 ; python_version >= "3.10" and python_version < "4.0" -click==8.2.1 ; python_version >= "3.10" and python_version < "4.0" -cloudpickle==2.2.1 ; python_version >= "3.10" and python_version < "4.0" -cma==4.3.0 ; python_version >= "3.10" and python_version < "4.0" -coacd==1.0.7 ; python_version >= "3.10" and python_version < "4.0" -colorama==0.4.6 ; python_version >= "3.10" and python_version < "4.0" and (platform_system == "Windows" or sys_platform == "win32") -colorlog==6.9.0 ; python_version >= "3.10" and python_version < "4.0" -comm==0.2.3 ; python_version >= "3.10" and python_version < "4.0" -config-path==1.0.5 ; python_version >= "3.10" and python_version < "4.0" -contourpy==1.3.2 ; python_version >= "3.10" and python_version < "4.0" -cycler==0.12.1 ; python_version >= "3.10" and python_version < "4.0" -cython==3.1.3 ; python_version >= "3.10" and python_version < "4.0" -decorator==5.2.1 ; python_version >= "3.10" and python_version < "4.0" -defusedxml==0.7.1 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -directsearch==1.0 ; python_version >= "3.10" and python_version < "4.0" -distlib==0.4.0 ; python_version >= "3.10" and python_version < "4.0" -drake==1.43.0 ; python_version >= "3.10" and python_version < "4.0" -embreex==2.17.7.post6 ; python_version >= "3.10" and python_version < "4.0" and platform_machine == "x86_64" -exceptiongroup==1.3.0 ; python_version == "3.10" -executing==2.2.0 ; python_version >= "3.10" and python_version < "4.0" -farama-notifications==0.0.4 ; python_version >= "3.10" and python_version < "4.0" -fastjsonschema==2.21.2 ; python_version >= "3.10" and python_version < "4.0" -filelock==3.19.1 ; python_version >= "3.10" and python_version < "4.0" -fonttools==4.59.2 ; python_version >= "3.10" and python_version < "4.0" -fsspec==2025.7.0 ; python_version >= "3.10" and python_version < "4.0" -gradescope-utils==0.5.0 ; python_version >= "3.10" and python_version < "4.0" -gymnasium==1.2.0 ; python_version >= "3.10" and python_version < "4.0" -h11==0.16.0 ; python_version >= "3.10" and python_version < "4.0" -httpcore==1.0.9 ; python_version >= "3.10" and python_version < "4.0" -httpx==0.28.1 ; python_version >= "3.10" and python_version < "4.0" -identify==2.6.13 ; python_version >= "3.10" and python_version < "4.0" -idna==3.10 ; python_version >= "3.10" and python_version < "4.0" -ipython==8.37.0 ; python_version >= "3.10" and python_version < "4.0" -ipywidgets==8.1.7 ; python_version >= "3.10" and python_version < "4.0" -jedi==0.19.2 ; python_version >= "3.10" and python_version < "4.0" -jinja2==3.1.6 ; python_version >= "3.10" and python_version < "4.0" -joblib==1.5.2 ; python_version >= "3.10" and python_version < "4.0" -jsonschema-specifications==2025.4.1 ; python_version >= "3.10" and python_version < "4.0" -jsonschema==4.25.1 ; python_version >= "3.10" and python_version < "4.0" -jupyter-client==8.6.3 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -jupyter-core==5.8.1 ; python_version >= "3.10" and python_version < "4.0" -jupyterlab-pygments==0.3.0 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -jupyterlab-widgets==3.0.15 ; python_version >= "3.10" and python_version < "4.0" -kiwisolver==1.4.9 ; python_version >= "3.10" and python_version < "4.0" -lxml-html-clean==0.4.2 ; python_version >= "3.10" and python_version < "4.0" -lxml==6.0.1 ; python_version >= "3.10" and python_version < "4.0" -manifold3d==3.2.1 ; python_version >= "3.10" and python_version < "4.0" -mapbox-earcut==1.0.3 ; python_version >= "3.10" and python_version < "4.0" -markupsafe==3.0.2 ; python_version >= "3.10" and python_version < "4.0" -matplotlib-inline==0.1.7 ; python_version >= "3.10" and python_version < "4.0" -matplotlib==3.10.6 ; python_version >= "3.10" and python_version < "4.0" -mistune==3.1.4 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -mpld3==0.5.11 ; python_version >= "3.10" and python_version < "4.0" -mpmath==1.3.0 ; python_version >= "3.10" and python_version < "4.0" -mypy-extensions==1.1.0 ; python_version >= "3.10" and python_version < "4.0" -mysql-connector-python==9.4.0 ; python_version >= "3.10" and python_version < "4.0" -nbclient==0.10.2 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -nbconvert==7.14.2 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -nbformat==5.10.4 ; python_version >= "3.10" and python_version < "4.0" -networkx==3.4.2 ; python_version >= "3.10" and python_version < "4.0" -nevergrad==1.0.12 ; python_version >= "3.10" and python_version < "4.0" -nodeenv==1.9.1 ; python_version >= "3.10" and python_version < "4.0" -numpy==2.2.6 ; python_version >= "3.10" and python_version < "4.0" -nvidia-cublas-cu12==12.6.4.1 ; python_version >= "3.10" and python_version < "4.0" and platform_system == "Linux" and platform_machine == "x86_64" -nvidia-cuda-cupti-cu12==12.6.80 ; python_version >= "3.10" and python_version < "4.0" and platform_system == "Linux" and platform_machine == "x86_64" -nvidia-cuda-nvrtc-cu12==12.6.77 ; python_version >= "3.10" and python_version < "4.0" and platform_system == "Linux" and platform_machine == "x86_64" -nvidia-cuda-runtime-cu12==12.6.77 ; python_version >= "3.10" and python_version < "4.0" and platform_system == "Linux" and platform_machine == "x86_64" -nvidia-cudnn-cu12==9.5.1.17 ; python_version >= "3.10" and python_version < "4.0" and platform_system == "Linux" and platform_machine == "x86_64" -nvidia-cufft-cu12==11.3.0.4 ; python_version >= "3.10" and python_version < "4.0" and platform_system == "Linux" and platform_machine == "x86_64" -nvidia-cufile-cu12==1.11.1.6 ; python_version >= "3.10" and python_version < "4.0" and platform_system == "Linux" and platform_machine == "x86_64" -nvidia-curand-cu12==10.3.7.77 ; python_version >= "3.10" and python_version < "4.0" and platform_system == "Linux" and platform_machine == "x86_64" -nvidia-cusolver-cu12==11.7.1.2 ; python_version >= "3.10" and python_version < "4.0" and platform_system == "Linux" and platform_machine == "x86_64" -nvidia-cusparse-cu12==12.5.4.2 ; python_version >= "3.10" and python_version < "4.0" and platform_system == "Linux" and platform_machine == "x86_64" -nvidia-cusparselt-cu12==0.6.3 ; python_version >= "3.10" and python_version < "4.0" and platform_system == "Linux" and platform_machine == "x86_64" -nvidia-nccl-cu12==2.26.2 ; python_version >= "3.10" and python_version < "4.0" and platform_system == "Linux" and platform_machine == "x86_64" -nvidia-nvjitlink-cu12==12.6.85 ; python_version >= "3.10" and python_version < "4.0" and platform_system == "Linux" and platform_machine == "x86_64" -nvidia-nvtx-cu12==12.6.77 ; python_version >= "3.10" and python_version < "4.0" and platform_system == "Linux" and platform_machine == "x86_64" -packaging==25.0 ; python_version >= "3.10" and python_version < "4.0" -pandas==2.3.2 ; python_version >= "3.10" and python_version < "4.0" -pandocfilters==1.5.1 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -parso==0.8.5 ; python_version >= "3.10" and python_version < "4.0" -pathspec==0.12.1 ; python_version >= "3.10" and python_version < "4.0" -pexpect==4.9.0 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux" or sys_platform != "darwin" and sys_platform != "linux" and sys_platform != "win32" and sys_platform != "emscripten") -pillow==11.3.0 ; python_version >= "3.10" and python_version < "4.0" -pip-requirements-parser==32.0.1 ; python_version >= "3.10" and python_version < "4.0" -platformdirs==4.4.0 ; python_version >= "3.10" and python_version < "4.0" -pre-commit==3.8.0 ; python_version >= "3.10" and python_version < "4.0" -prompt-toolkit==3.0.52 ; python_version >= "3.10" and python_version < "4.0" -psutil==7.0.0 ; python_version >= "3.10" and python_version < "4.0" -ptyprocess==0.7.0 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux" or sys_platform != "darwin" and sys_platform != "linux" and sys_platform != "win32" and sys_platform != "emscripten") -pure-eval==0.2.3 ; python_version >= "3.10" and python_version < "4.0" -pycollada==0.9.2 ; python_version >= "3.10" and python_version < "4.0" -pycparser==2.22 ; python_version >= "3.10" and python_version < "4.0" and implementation_name == "pypy" and (sys_platform == "darwin" or sys_platform == "linux") -pydot==4.0.1 ; python_version >= "3.10" and python_version < "4.0" -pygments==2.19.2 ; python_version >= "3.10" and python_version < "4.0" -pyparsing==3.2.3 ; python_version >= "3.10" and python_version < "4.0" -python-dateutil==2.9.0.post0 ; python_version >= "3.10" and python_version < "4.0" -python-fcl==0.7.0.8 ; python_version >= "3.10" and python_version < "4.0" -pytz==2025.2 ; python_version >= "3.10" and python_version < "4.0" -pyvirtualdisplay==3.0 ; python_version >= "3.10" and python_version < "4.0" -pyyaml==6.0.2 ; python_version >= "3.10" and python_version < "4.0" -pyzmq==27.0.2 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -referencing==0.36.2 ; python_version >= "3.10" and python_version < "4.0" -requests==2.32.5 ; python_version >= "3.10" and python_version < "4.0" -rpds-py==0.27.1 ; python_version >= "3.10" and python_version < "4.0" -rtree==1.4.1 ; python_version >= "3.10" and python_version < "4.0" -scene-synthesizer==1.15.0 ; python_version >= "3.10" and python_version < "4.0" -scikit-learn==1.7.1 ; python_version >= "3.10" and python_version < "4.0" -scipy==1.15.3 ; python_version >= "3.10" and python_version < "4.0" -setuptools-scm==9.2.0 ; python_version >= "3.10" and python_version < "4.0" -setuptools==70.3.0 ; python_version >= "3.10" and python_version < "4.0" -shapely==2.1.1 ; python_version >= "3.10" and python_version < "4.0" -six==1.17.0 ; python_version >= "3.10" and python_version < "4.0" -sniffio==1.3.1 ; python_version >= "3.10" and python_version < "4.0" -soupsieve==2.8 ; python_version >= "3.10" and python_version < "4.0" -stable-baselines3==2.7.0 ; python_version >= "3.10" and python_version < "4.0" -stack-data==0.6.3 ; python_version >= "3.10" and python_version < "4.0" -svg-path==7.0 ; python_version >= "3.10" and python_version < "4.0" -sympy==1.14.0 ; python_version >= "3.10" and python_version < "4.0" -threadpoolctl==3.6.0 ; python_version >= "3.10" and python_version < "4.0" -timeout-decorator==0.5.0 ; python_version >= "3.10" and python_version < "4.0" -tinycss2==1.4.0 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -tokenize-rt==6.2.0 ; python_version >= "3.10" and python_version < "4.0" -tomli==2.2.1 ; python_version == "3.10" -torch==2.7.1 ; python_version >= "3.10" and python_version < "4.0" -torchvision==0.22.1 ; python_version >= "3.10" and python_version < "4.0" -tornado==6.5.2 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -tqdm==4.67.1 ; python_version >= "3.10" and python_version < "4.0" -traitlets==5.14.3 ; python_version >= "3.10" and python_version < "4.0" -triangle==20250106 ; python_version >= "3.10" and python_version < "4.0" -trimesh==4.7.4 ; python_version >= "3.10" and python_version < "4.0" -triton==3.3.1 ; python_version >= "3.10" and python_version < "4.0" and platform_system == "Linux" and platform_machine == "x86_64" -typing-extensions==4.15.0 ; python_version >= "3.10" and python_version < "4.0" -tzdata==2025.2 ; python_version >= "3.10" and python_version < "4.0" -urllib3==2.5.0 ; python_version >= "3.10" and python_version < "4.0" -vhacdx==0.0.8.post2 ; python_version >= "3.10" and python_version < "4.0" -virtualenv==20.34.0 ; python_version >= "3.10" and python_version < "4.0" -wcwidth==0.2.13 ; python_version >= "3.10" and python_version < "4.0" -webencodings==0.5.1 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -widgetsnbextension==4.0.14 ; python_version >= "3.10" and python_version < "4.0" -xxhash==3.5.0 ; python_version >= "3.10" and python_version < "4.0" -yourdfpy==0.0.58 ; python_version >= "3.10" and python_version < "4.0" diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index d28f354d..00000000 --- a/requirements.txt +++ /dev/null @@ -1,153 +0,0 @@ ---find-links https://download.pytorch.org/whl/torch_stable.html -anyio==4.10.0 ; python_version >= "3.10" and python_version < "4.0" -asttokens==3.0.0 ; python_version >= "3.10" and python_version < "4.0" -attrs==25.3.0 ; python_version >= "3.10" and python_version < "4.0" -bayesian-optimization==1.4.0 ; python_version >= "3.10" and python_version < "4.0" -beautifulsoup4==4.13.5 ; python_version >= "3.10" and python_version < "4.0" -black==25.1.0 ; python_version >= "3.10" and python_version < "4.0" -bleach==6.2.0 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -certifi==2025.8.3 ; python_version >= "3.10" and python_version < "4.0" -cffi==1.17.1 ; python_version >= "3.10" and python_version < "4.0" and implementation_name == "pypy" and (sys_platform == "darwin" or sys_platform == "linux") -cfgv==3.4.0 ; python_version >= "3.10" and python_version < "4.0" -charset-normalizer==3.4.3 ; python_version >= "3.10" and python_version < "4.0" -click==8.2.1 ; python_version >= "3.10" and python_version < "4.0" -cloudpickle==2.2.1 ; python_version >= "3.10" and python_version < "4.0" -cma==4.3.0 ; python_version >= "3.10" and python_version < "4.0" -coacd==1.0.7 ; python_version >= "3.10" and python_version < "4.0" -colorama==0.4.6 ; python_version >= "3.10" and python_version < "4.0" and (platform_system == "Windows" or sys_platform == "win32") -colorlog==6.9.0 ; python_version >= "3.10" and python_version < "4.0" -comm==0.2.3 ; python_version >= "3.10" and python_version < "4.0" -config-path==1.0.5 ; python_version >= "3.10" and python_version < "4.0" -contourpy==1.3.2 ; python_version >= "3.10" and python_version < "4.0" -cycler==0.12.1 ; python_version >= "3.10" and python_version < "4.0" -cython==3.1.3 ; python_version >= "3.10" and python_version < "4.0" -decorator==5.2.1 ; python_version >= "3.10" and python_version < "4.0" -defusedxml==0.7.1 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -directsearch==1.0 ; python_version >= "3.10" and python_version < "4.0" -distlib==0.4.0 ; python_version >= "3.10" and python_version < "4.0" -drake==1.43.0 ; python_version >= "3.10" and python_version < "4.0" -embreex==2.17.7.post6 ; python_version >= "3.10" and python_version < "4.0" and platform_machine == "x86_64" -exceptiongroup==1.3.0 ; python_version == "3.10" -executing==2.2.0 ; python_version >= "3.10" and python_version < "4.0" -farama-notifications==0.0.4 ; python_version >= "3.10" and python_version < "4.0" -fastjsonschema==2.21.2 ; python_version >= "3.10" and python_version < "4.0" -filelock==3.19.1 ; python_version >= "3.10" and python_version < "4.0" -fonttools==4.59.2 ; python_version >= "3.10" and python_version < "4.0" -fsspec==2025.7.0 ; python_version >= "3.10" and python_version < "4.0" -gradescope-utils==0.5.0 ; python_version >= "3.10" and python_version < "4.0" -gymnasium==1.2.0 ; python_version >= "3.10" and python_version < "4.0" -h11==0.16.0 ; python_version >= "3.10" and python_version < "4.0" -httpcore==1.0.9 ; python_version >= "3.10" and python_version < "4.0" -httpx==0.28.1 ; python_version >= "3.10" and python_version < "4.0" -identify==2.6.13 ; python_version >= "3.10" and python_version < "4.0" -idna==3.10 ; python_version >= "3.10" and python_version < "4.0" -ipython==8.37.0 ; python_version >= "3.10" and python_version < "4.0" -ipywidgets==8.1.7 ; python_version >= "3.10" and python_version < "4.0" -jedi==0.19.2 ; python_version >= "3.10" and python_version < "4.0" -jinja2==3.1.6 ; python_version >= "3.10" and python_version < "4.0" -joblib==1.5.2 ; python_version >= "3.10" and python_version < "4.0" -jsonschema-specifications==2025.4.1 ; python_version >= "3.10" and python_version < "4.0" -jsonschema==4.25.1 ; python_version >= "3.10" and python_version < "4.0" -jupyter-client==8.6.3 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -jupyter-core==5.8.1 ; python_version >= "3.10" and python_version < "4.0" -jupyterlab-pygments==0.3.0 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -jupyterlab-widgets==3.0.15 ; python_version >= "3.10" and python_version < "4.0" -kiwisolver==1.4.9 ; python_version >= "3.10" and python_version < "4.0" -lxml-html-clean==0.4.2 ; python_version >= "3.10" and python_version < "4.0" -lxml==6.0.1 ; python_version >= "3.10" and python_version < "4.0" -manifold3d==3.2.1 ; python_version >= "3.10" and python_version < "4.0" -mapbox-earcut==1.0.3 ; python_version >= "3.10" and python_version < "4.0" -markupsafe==3.0.2 ; python_version >= "3.10" and python_version < "4.0" -matplotlib-inline==0.1.7 ; python_version >= "3.10" and python_version < "4.0" -matplotlib==3.10.6 ; python_version >= "3.10" and python_version < "4.0" -mistune==3.1.4 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -mpld3==0.5.11 ; python_version >= "3.10" and python_version < "4.0" -mpmath==1.3.0 ; python_version >= "3.10" and python_version < "4.0" -mypy-extensions==1.1.0 ; python_version >= "3.10" and python_version < "4.0" -mysql-connector-python==9.4.0 ; python_version >= "3.10" and python_version < "4.0" -nbclient==0.10.2 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -nbconvert==7.14.2 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -nbformat==5.10.4 ; python_version >= "3.10" and python_version < "4.0" -networkx==3.4.2 ; python_version >= "3.10" and python_version < "4.0" -nevergrad==1.0.12 ; python_version >= "3.10" and python_version < "4.0" -nodeenv==1.9.1 ; python_version >= "3.10" and python_version < "4.0" -numpy==2.2.6 ; python_version >= "3.10" and python_version < "4.0" -nvidia-cublas-cu12==12.6.4.1 ; python_version >= "3.10" and python_version < "4.0" and platform_system == "Linux" and platform_machine == "x86_64" -nvidia-cuda-cupti-cu12==12.6.80 ; python_version >= "3.10" and python_version < "4.0" and platform_system == "Linux" and platform_machine == "x86_64" -nvidia-cuda-nvrtc-cu12==12.6.77 ; python_version >= "3.10" and python_version < "4.0" and platform_system == "Linux" and platform_machine == "x86_64" -nvidia-cuda-runtime-cu12==12.6.77 ; python_version >= "3.10" and python_version < "4.0" and platform_system == "Linux" and platform_machine == "x86_64" -nvidia-cudnn-cu12==9.5.1.17 ; python_version >= "3.10" and python_version < "4.0" and platform_system == "Linux" and platform_machine == "x86_64" -nvidia-cufft-cu12==11.3.0.4 ; python_version >= "3.10" and python_version < "4.0" and platform_system == "Linux" and platform_machine == "x86_64" -nvidia-cufile-cu12==1.11.1.6 ; python_version >= "3.10" and python_version < "4.0" and platform_system == "Linux" and platform_machine == "x86_64" -nvidia-curand-cu12==10.3.7.77 ; python_version >= "3.10" and python_version < "4.0" and platform_system == "Linux" and platform_machine == "x86_64" -nvidia-cusolver-cu12==11.7.1.2 ; python_version >= "3.10" and python_version < "4.0" and platform_system == "Linux" and platform_machine == "x86_64" -nvidia-cusparse-cu12==12.5.4.2 ; python_version >= "3.10" and python_version < "4.0" and platform_system == "Linux" and platform_machine == "x86_64" -nvidia-cusparselt-cu12==0.6.3 ; python_version >= "3.10" and python_version < "4.0" and platform_system == "Linux" and platform_machine == "x86_64" -nvidia-nccl-cu12==2.26.2 ; python_version >= "3.10" and python_version < "4.0" and platform_system == "Linux" and platform_machine == "x86_64" -nvidia-nvjitlink-cu12==12.6.85 ; python_version >= "3.10" and python_version < "4.0" and platform_system == "Linux" and platform_machine == "x86_64" -nvidia-nvtx-cu12==12.6.77 ; python_version >= "3.10" and python_version < "4.0" and platform_system == "Linux" and platform_machine == "x86_64" -packaging==25.0 ; python_version >= "3.10" and python_version < "4.0" -pandas==2.3.2 ; python_version >= "3.10" and python_version < "4.0" -pandocfilters==1.5.1 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -parso==0.8.5 ; python_version >= "3.10" and python_version < "4.0" -pathspec==0.12.1 ; python_version >= "3.10" and python_version < "4.0" -pexpect==4.9.0 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux" or sys_platform != "darwin" and sys_platform != "linux" and sys_platform != "win32" and sys_platform != "emscripten") -pillow==11.3.0 ; python_version >= "3.10" and python_version < "4.0" -pip-requirements-parser==32.0.1 ; python_version >= "3.10" and python_version < "4.0" -platformdirs==4.4.0 ; python_version >= "3.10" and python_version < "4.0" -pre-commit==3.8.0 ; python_version >= "3.10" and python_version < "4.0" -prompt-toolkit==3.0.52 ; python_version >= "3.10" and python_version < "4.0" -psutil==7.0.0 ; python_version >= "3.10" and python_version < "4.0" -ptyprocess==0.7.0 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux" or sys_platform != "darwin" and sys_platform != "linux" and sys_platform != "win32" and sys_platform != "emscripten") -pure-eval==0.2.3 ; python_version >= "3.10" and python_version < "4.0" -pycollada==0.9.2 ; python_version >= "3.10" and python_version < "4.0" -pycparser==2.22 ; python_version >= "3.10" and python_version < "4.0" and implementation_name == "pypy" and (sys_platform == "darwin" or sys_platform == "linux") -pydot==4.0.1 ; python_version >= "3.10" and python_version < "4.0" -pygments==2.19.2 ; python_version >= "3.10" and python_version < "4.0" -pyparsing==3.2.3 ; python_version >= "3.10" and python_version < "4.0" -python-dateutil==2.9.0.post0 ; python_version >= "3.10" and python_version < "4.0" -python-fcl==0.7.0.8 ; python_version >= "3.10" and python_version < "4.0" -pytz==2025.2 ; python_version >= "3.10" and python_version < "4.0" -pyvirtualdisplay==3.0 ; python_version >= "3.10" and python_version < "4.0" -pyyaml==6.0.2 ; python_version >= "3.10" and python_version < "4.0" -pyzmq==27.0.2 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -referencing==0.36.2 ; python_version >= "3.10" and python_version < "4.0" -requests==2.32.5 ; python_version >= "3.10" and python_version < "4.0" -rpds-py==0.27.1 ; python_version >= "3.10" and python_version < "4.0" -rtree==1.4.1 ; python_version >= "3.10" and python_version < "4.0" -scene-synthesizer==1.15.0 ; python_version >= "3.10" and python_version < "4.0" -scikit-learn==1.7.1 ; python_version >= "3.10" and python_version < "4.0" -scipy==1.15.3 ; python_version >= "3.10" and python_version < "4.0" -setuptools-scm==9.2.0 ; python_version >= "3.10" and python_version < "4.0" -setuptools==70.3.0 ; python_version >= "3.10" and python_version < "4.0" -shapely==2.1.1 ; python_version >= "3.10" and python_version < "4.0" -six==1.17.0 ; python_version >= "3.10" and python_version < "4.0" -sniffio==1.3.1 ; python_version >= "3.10" and python_version < "4.0" -soupsieve==2.8 ; python_version >= "3.10" and python_version < "4.0" -stable-baselines3==2.7.0 ; python_version >= "3.10" and python_version < "4.0" -stack-data==0.6.3 ; python_version >= "3.10" and python_version < "4.0" -svg-path==7.0 ; python_version >= "3.10" and python_version < "4.0" -sympy==1.14.0 ; python_version >= "3.10" and python_version < "4.0" -threadpoolctl==3.6.0 ; python_version >= "3.10" and python_version < "4.0" -timeout-decorator==0.5.0 ; python_version >= "3.10" and python_version < "4.0" -tinycss2==1.4.0 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -tokenize-rt==6.2.0 ; python_version >= "3.10" and python_version < "4.0" -tomli==2.2.1 ; python_version == "3.10" -torch==2.7.1 ; python_version >= "3.10" and python_version < "4.0" -torchvision==0.22.1 ; python_version >= "3.10" and python_version < "4.0" -tornado==6.5.2 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -tqdm==4.67.1 ; python_version >= "3.10" and python_version < "4.0" -traitlets==5.14.3 ; python_version >= "3.10" and python_version < "4.0" -triangle==20250106 ; python_version >= "3.10" and python_version < "4.0" -trimesh==4.7.4 ; python_version >= "3.10" and python_version < "4.0" -triton==3.3.1 ; python_version >= "3.10" and python_version < "4.0" and platform_system == "Linux" and platform_machine == "x86_64" -typing-extensions==4.15.0 ; python_version >= "3.10" and python_version < "4.0" -tzdata==2025.2 ; python_version >= "3.10" and python_version < "4.0" -urllib3==2.5.0 ; python_version >= "3.10" and python_version < "4.0" -vhacdx==0.0.8.post2 ; python_version >= "3.10" and python_version < "4.0" -virtualenv==20.34.0 ; python_version >= "3.10" and python_version < "4.0" -wcwidth==0.2.13 ; python_version >= "3.10" and python_version < "4.0" -webencodings==0.5.1 ; python_version >= "3.10" and python_version < "4.0" and (sys_platform == "darwin" or sys_platform == "linux") -widgetsnbextension==4.0.14 ; python_version >= "3.10" and python_version < "4.0" -xxhash==3.5.0 ; python_version >= "3.10" and python_version < "4.0" -yourdfpy==0.0.58 ; python_version >= "3.10" and python_version < "4.0" diff --git a/setup/mac/Brewfile b/setup/mac/Brewfile index 99bc786d..bbb85180 100644 --- a/setup/mac/Brewfile +++ b/setup/mac/Brewfile @@ -1,7 +1,6 @@ # -*- mode: ruby -*- # vi: set ft=ruby : -brew 'bazelisk' brew "python@3.13" brew "tidy-html5" -brew "gprof2dot" # Supplies dot for pydot \ No newline at end of file +brew "gprof2dot" # Supplies dot for pydot diff --git a/setup/ubuntu/18.04/install_prereqs.sh b/setup/ubuntu/18.04/install_prereqs.sh index c42a038d..4648c5f2 100755 --- a/setup/ubuntu/18.04/install_prereqs.sh +++ b/setup/ubuntu/18.04/install_prereqs.sh @@ -53,17 +53,10 @@ fi apt-get install -o APT::Acquire::Retries=4 -o Dpkg::Use-Pty=0 -qy \ --no-install-recommends ca-certificates gnupg -APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=1 apt-key adv \ - -q --fetch-keys https://bazel.build/bazel-release.pub.gpg - -echo 'deb [arch=amd64] https://storage.googleapis.com/bazel-apt stable jdk1.8' \ - > /etc/apt/sources.list.d/bazel.list - apt-get update -qq || (sleep 15; apt-get update -qq) apt-get install -o APT::Acquire::Retries=4 -o Dpkg::Use-Pty=0 -qy \ --no-install-recommends $(cat <&2 fi - -dpkg_install_from_wget() { - package="$1" - version="$2" - url="$3" - checksum="$4" - - # Skip the install if we're already at the exact version. - installed=$(dpkg-query --showformat='${Version}\n' --show "${package}" 2>/dev/null || true) - if [[ "${installed}" == "${version}" ]]; then - echo "${package} is already at the desired version ${version}" - return - fi - - # If installing our desired version would be a downgrade, ask the user first. - if dpkg --compare-versions "${installed}" gt "${version}"; then - echo "This system has ${package} version ${installed} installed." - echo "Drake suggests downgrading to version ${version}, our supported version." - read -r -p 'Do you want to downgrade? [Y/n] ' reply - if [[ ! "${reply}" =~ ^([yY][eE][sS]|[yY])*$ ]]; then - echo "Skipping ${package} ${version} installation." - return - fi - fi - - # Download and verify. - tmpdeb="/tmp/${package}_${version}-amd64.deb" - wget -q -O "${tmpdeb}" "${url}" - if echo "${checksum} ${tmpdeb}" | sha256sum -c -; then - echo # Blank line between checkout output and dpkg output. - else - echo "ERROR: The ${package} deb does NOT have the expected SHA256. Not installing." >&2 - exit 2 - fi - - # Install. - dpkg -i "${tmpdeb}" - rm "${tmpdeb}" -} - -dpkg_install_from_wget \ - bazel 5.0.0 \ - https://releases.bazel.build/5.0.0/release/bazel_5.0.0-linux-x86_64.deb \ - e3361645ccd731abc424bb3a322d8e6f513b7258f5ca11ff04d6067aff5d09b1 diff --git a/setup/ubuntu/22.04/install_prereqs.sh b/setup/ubuntu/22.04/install_prereqs.sh index 7aed7256..786af402 100755 --- a/setup/ubuntu/22.04/install_prereqs.sh +++ b/setup/ubuntu/22.04/install_prereqs.sh @@ -80,60 +80,3 @@ locale-gen en_US.UTF-8 if [[ -z "${LANG:-}" && -z "${LC_ALL:-}" ]]; then echo 'WARNING: LANG and LC_ALL environment variables are NOT set. Please export LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8.' >&2 fi - -# This should match drake/setup/ubuntu/source_distribution/install_bazelisk.sh -dpkg_install_from_wget() { - package="$1" - version="$2" - url="$3" - checksum="$4" - - # Skip the install if we're already at the exact version. - installed=$(dpkg-query --showformat='${Version}\n' --show "${package}" 2>/dev/null || true) - if [[ "${installed}" == "${version}" ]]; then - echo "${package} is already at the desired version ${version}" - return - fi - - # If installing our desired version would be a downgrade, ask the user first. - if dpkg --compare-versions "${installed}" gt "${version}"; then - echo "This system has ${package} version ${installed} installed." - echo "Drake suggests downgrading to version ${version}, our supported version." - read -r -p 'Do you want to downgrade? [Y/n] ' reply - if [[ ! "${reply}" =~ ^([yY][eE][sS]|[yY])*$ ]]; then - echo "Skipping ${package} ${version} installation." - return - fi - fi - - # Download and verify. - tmpdeb="/tmp/${package}_${version}-amd64.deb" - wget -O "${tmpdeb}" "${url}" - if echo "${checksum} ${tmpdeb}" | sha256sum -c -; then - echo # Blank line between checkout output and dpkg output. - else - echo "ERROR: The ${package} deb does NOT have the expected SHA256. Not installing." >&2 - exit 2 - fi - - # Install. - dpkg -i "${tmpdeb}" - rm "${tmpdeb}" -} - -# If bazel.deb is already installed, we'll need to remove it first because -# the Debian package of bazelisk will take over the `/usr/bin/bazel` path. -apt-get remove bazel || true - -# Install bazelisk. -if [[ $(arch) = "aarch64" ]]; then - dpkg_install_from_wget \ - bazelisk 1.25.0 \ - https://github.com/bazelbuild/bazelisk/releases/download/v1.25.0/bazelisk-arm64.deb \ - 6370ee55d7bb45b3511b7a1c1c93c565a5f5afcd24555820231c9c48beac95f3 -else - dpkg_install_from_wget \ - bazelisk 1.25.0 \ - https://github.com/bazelbuild/bazelisk/releases/download/v1.25.0/bazelisk-amd64.deb \ - f16dc348190990eb2e8950e773bc91dcdc7632517e5b63bdc4dd58f90062920c -fi diff --git a/setup/ubuntu/24.04/install_prereqs.sh b/setup/ubuntu/24.04/install_prereqs.sh index ada14017..82cd11c2 100755 --- a/setup/ubuntu/24.04/install_prereqs.sh +++ b/setup/ubuntu/24.04/install_prereqs.sh @@ -102,60 +102,3 @@ locale-gen en_US.UTF-8 if [[ -z "${LANG:-}" && -z "${LC_ALL:-}" ]]; then echo 'WARNING: LANG and LC_ALL environment variables are NOT set. Please export LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8.' >&2 fi - -# This should match drake/setup/ubuntu/source_distribution/install_bazelisk.sh -dpkg_install_from_wget() { - package="$1" - version="$2" - url="$3" - checksum="$4" - - # Skip the install if we're already at the exact version. - installed=$(dpkg-query --showformat='${Version}\n' --show "${package}" 2>/dev/null || true) - if [[ "${installed}" == "${version}" ]]; then - echo "${package} is already at the desired version ${version}" - return - fi - - # If installing our desired version would be a downgrade, ask the user first. - if dpkg --compare-versions "${installed}" gt "${version}"; then - echo "This system has ${package} version ${installed} installed." - echo "Drake suggests downgrading to version ${version}, our supported version." - read -r -p 'Do you want to downgrade? [Y/n] ' reply - if [[ ! "${reply}" =~ ^([yY][eE][sS]|[yY])*$ ]]; then - echo "Skipping ${package} ${version} installation." - return - fi - fi - - # Download and verify. - tmpdeb="/tmp/${package}_${version}-amd64.deb" - wget -O "${tmpdeb}" "${url}" - if echo "${checksum} ${tmpdeb}" | sha256sum -c -; then - echo # Blank line between checkout output and dpkg output. - else - echo "ERROR: The ${package} deb does NOT have the expected SHA256. Not installing." >&2 - exit 2 - fi - - # Install. - dpkg -i "${tmpdeb}" - rm "${tmpdeb}" -} - -# If bazel.deb is already installed, we'll need to remove it first because -# the Debian package of bazelisk will take over the `/usr/bin/bazel` path. -apt-get remove bazel || true - -# Install bazelisk. -if [[ $(arch) = "aarch64" ]]; then - dpkg_install_from_wget \ - bazelisk 1.25.0 \ - https://github.com/bazelbuild/bazelisk/releases/download/v1.25.0/bazelisk-arm64.deb \ - 6370ee55d7bb45b3511b7a1c1c93c565a5f5afcd24555820231c9c48beac95f3 -else - dpkg_install_from_wget \ - bazelisk 1.25.0 \ - https://github.com/bazelbuild/bazelisk/releases/download/v1.25.0/bazelisk-amd64.deb \ - f16dc348190990eb2e8950e773bc91dcdc7632517e5b63bdc4dd58f90062920c -fi From 7b32de043d8236d660d9b5930e8098f9166eca81 Mon Sep 17 00:00:00 2001 From: Russ Tedrake Date: Sun, 22 Feb 2026 09:14:23 -0500 Subject: [PATCH 2/2] disable test_with_meshcat due to Drake #24118 --- manipulation/test/test_hardware_station_interface.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/manipulation/test/test_hardware_station_interface.py b/manipulation/test/test_hardware_station_interface.py index f4114093..34497600 100644 --- a/manipulation/test/test_hardware_station_interface.py +++ b/manipulation/test/test_hardware_station_interface.py @@ -1,3 +1,4 @@ +import sys import unittest from pydrake.all import StartMeshcat @@ -5,6 +6,10 @@ from manipulation.station import LoadScenario, MakeHardwareStation, Scenario +@unittest.skipIf( + sys.platform == "darwin", + "Disabled on macOS pending Drake issue: https://github.com/RobotLocomotion/drake/issues/24118", +) class HardwareStationInterfaceTest(unittest.TestCase): def get_scenario(self) -> Scenario: scenario_data = """