From 2aa8644797167c8dd3ae481f53e807463faf7afc Mon Sep 17 00:00:00 2001 From: Paul Nechifor Date: Wed, 12 Nov 2025 21:34:57 +0200 Subject: [PATCH 01/19] make dimos pip-installable --- MANIFEST.in | 20 +++++++++ dimos/protocol/rpc/spec.py | 2 + dimos/simulation/mujoco/model.py | 16 ++++--- dimos/utils/data.py | 71 +++++++++++++++++++++++++++++--- docs/package_usage.md | 62 ++++++++++++++++++++++++++++ pyproject.toml | 10 +++-- 6 files changed, 166 insertions(+), 15 deletions(-) create mode 100644 MANIFEST.in create mode 100644 docs/package_usage.md diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000000..36af004287 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,20 @@ +global-exclude *.pyc +global-exclude __pycache__ +global-exclude .DS_Store + +# Exclude test directories +prune tests + +# Exclude web development directories +recursive-exclude dimos/web/command-center-extension * +recursive-exclude dimos/web/websocket_vis/node_modules * + +# Exclude development files +exclude .gitignore +exclude .gitattributes +prune .git +prune .github +prune .mypy_cache +prune .pytest_cache +prune .ruff_cache +prune .vscode diff --git a/dimos/protocol/rpc/spec.py b/dimos/protocol/rpc/spec.py index ee9f99e16b..ed14af872e 100644 --- a/dimos/protocol/rpc/spec.py +++ b/dimos/protocol/rpc/spec.py @@ -46,6 +46,8 @@ def call(self, name: str, arguments: Args, cb: Callable | None) -> Callable[[], def call_sync( self, name: str, arguments: Args, rpc_timeout: float | None = 120.0 ) -> tuple[Any, Callable[[], None]]: + if name == "start": + rpc_timeout = 1200.0 # starting modules can take longer event = threading.Event() def receive_value(val) -> None: diff --git a/dimos/simulation/mujoco/model.py b/dimos/simulation/mujoco/model.py index 1d1f17b116..7f9f93ff14 100644 --- a/dimos/simulation/mujoco/model.py +++ b/dimos/simulation/mujoco/model.py @@ -24,17 +24,21 @@ from dimos.simulation.mujoco.policy import G1OnnxController, Go1OnnxController, OnnxController from dimos.simulation.mujoco.types import InputController +from dimos.utils.data import get_data -DATA_DIR = epath.Path(__file__).parent / "../../../data/mujoco_sim" + +def _get_data_dir() -> epath.Path: + return epath.Path(str(get_data("mujoco_sim"))) def get_assets() -> dict[str, bytes]: + data_dir = _get_data_dir() # Assets used from https://sketchfab.com/3d-models/mersus-office-8714be387bcd406898b2615f7dae3a47 # Created by Ryan Cassidy and Coleman Costello assets: dict[str, bytes] = {} - mjx_env.update_assets(assets, DATA_DIR, "*.xml") - mjx_env.update_assets(assets, DATA_DIR / "scene_office1/textures", "*.png") - mjx_env.update_assets(assets, DATA_DIR / "scene_office1/office_split", "*.obj") + mjx_env.update_assets(assets, data_dir, "*.xml") + mjx_env.update_assets(assets, data_dir / "scene_office1/textures", "*.png") + mjx_env.update_assets(assets, data_dir / "scene_office1/office_split", "*.obj") mjx_env.update_assets(assets, mjx_env.MENAGERIE_PATH / "unitree_go1" / "assets") mjx_env.update_assets(assets, mjx_env.MENAGERIE_PATH / "unitree_g1" / "assets") return assets @@ -60,7 +64,7 @@ def load_model(input_device: InputController, robot: str, scene: str): model.opt.timestep = sim_dt params = { - "policy_path": (DATA_DIR / f"{robot}_policy.onnx").as_posix(), + "policy_path": (_get_data_dir() / f"{robot}_policy.onnx").as_posix(), "default_angles": np.array(model.keyframe("home").qpos[7:]), "n_substeps": n_substeps, "action_scale": 0.5, @@ -82,7 +86,7 @@ def load_model(input_device: InputController, robot: str, scene: str): def get_model_xml(robot: str, scene: str): - xml_file = (DATA_DIR / f"scene_{scene}.xml").as_posix() + xml_file = (_get_data_dir() / f"scene_{scene}.xml").as_posix() tree = ET.parse(xml_file) root = tree.getroot() diff --git a/dimos/utils/data.py b/dimos/utils/data.py index 8b70c2ad27..e6ebe06ffb 100644 --- a/dimos/utils/data.py +++ b/dimos/utils/data.py @@ -13,20 +13,79 @@ # limitations under the License. from functools import cache +import os from pathlib import Path +import platform import subprocess import tarfile +import tempfile + +from dimos.constants import DIMOS_PROJECT_ROOT + + +def _get_user_data_dir() -> Path: + """Get platform-specific user data directory.""" + system = platform.system() + + if system == "Linux": + # Use XDG_DATA_HOME if set, otherwise default to ~/.local/share + xdg_data_home = os.environ.get("XDG_DATA_HOME") + if xdg_data_home: + return Path(xdg_data_home) / "dimos" + return Path.home() / ".local" / "share" / "dimos" + elif system == "Darwin": # macOS + return Path.home() / "Library" / "Application Support" / "dimos" + else: + # Fallback for other systems + return Path.home() / ".dimos" @cache def _get_repo_root() -> Path: + # Check if running from git repo + if (DIMOS_PROJECT_ROOT / ".git").exists(): + return DIMOS_PROJECT_ROOT + + # Running as installed package - clone repo to data dir try: - result = subprocess.run( - ["git", "rev-parse", "--show-toplevel"], capture_output=True, check=True, text=True - ) - return Path(result.stdout.strip()) - except subprocess.CalledProcessError: - raise RuntimeError("Not in a Git repository") + data_dir = _get_user_data_dir() + data_dir.mkdir(parents=True, exist_ok=True) + # Test if writable + test_file = data_dir / ".write_test" + test_file.touch() + test_file.unlink() + except (OSError, PermissionError): + # Fall back to temp dir if data dir not writable + data_dir = Path(tempfile.gettempdir()) / "dimos" + data_dir.mkdir(parents=True, exist_ok=True) + + repo_dir = data_dir / "repo" + + # Clone if not already cloned + if not (repo_dir / ".git").exists(): + try: + subprocess.run( + [ + "git", + "clone", + "--depth", + "1", + "--branch", + "main", + "git@github.com:dimensionalOS/dimos.git", + str(repo_dir), + ], + check=True, + capture_output=True, + text=True, + ) + except subprocess.CalledProcessError as e: + raise RuntimeError( + f"Failed to clone dimos repository: {e.stderr}\n" + f"Make sure you have access to git@github.com:dimensionalOS/dimos.git" + ) + + return repo_dir @cache diff --git a/docs/package_usage.md b/docs/package_usage.md new file mode 100644 index 0000000000..24584a2e79 --- /dev/null +++ b/docs/package_usage.md @@ -0,0 +1,62 @@ +# Package Usage + +## With `uv` + +Init your repo if not already done: + +```bash +uv init +``` + +Install: + +```bash +uv add dimos[dev,cpu,sim] +``` + +Test the Unitree Go2 robot in the simulator: + +```bash +uv run dimos-robot --simulation run unitree-g1 +``` + +Run your actual robot: + +```bash +uv run dimos-robot --robot-ip=192.168.X.XXX run unitree-g1 +``` + +### Without installing + +With `uv` you can run tools without having to explicitly install: + +```bash +uvx --from dimos dimos-robot --robot-ip=192.168.X.XXX run unitree-g1 +``` + +## With `pip` + +Create an environment if not already done: + +```bash +python -m venv .venv +. .venv/bin/activate +``` + +Install: + +```bash +pip install dimos[dev,cpu,sim] +``` + +Test the Unitree Go2 robot in the simulator: + +```bash +dimos-robot --simulation run unitree-g1 +``` + +Run your actual robot: + +```bash +dimos-robot --robot-ip=192.168.X.XXX run unitree-g1 +``` diff --git a/pyproject.toml b/pyproject.toml index 1f59af27dd..aa320b8f20 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,14 +3,18 @@ requires = ["setuptools>=70", "wheel"] build-backend = "setuptools.build_meta" [tool.setuptools] -include-package-data = true +include-package-data = false [tool.setuptools.packages.find] where = ["."] include = ["dimos*"] +exclude = ["dimos.web.websocket_vis.node_modules*"] [tool.setuptools.package-data] -"*" = ["*.html", "*.css", "*.js", "*.json", "*.txt", "*.yaml", "*.yml"] +"dimos" = ["*.html", "*.css", "*.js", "*.json", "*.txt", "*.yaml", "*.yml"] +"dimos.robot.unitree_webrtc.params" = ["*.yaml", "*.yml"] +"dimos.web.dimos_interface" = ["**/*.html", "**/*.css", "**/*.js"] +"dimos.web.templates" = ["*"] [project] name = "dimos" @@ -28,7 +32,7 @@ dependencies = [ "openai", "anthropic>=0.19.0", "cerebras-cloud-sdk", - "numpy>=1.26.4,<2.0.0", + "numpy>=1.26.4", "colorlog==6.9.0", "yapf==0.40.2", "typeguard", From 36e8adc2d7ad3639a4fded5bd75ba6cb4c50b46f Mon Sep 17 00:00:00 2001 From: Paul Nechifor Date: Sat, 22 Nov 2025 05:16:44 +0200 Subject: [PATCH 02/19] log which dir is used --- dimos/utils/data.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/dimos/utils/data.py b/dimos/utils/data.py index e6ebe06ffb..659af8270c 100644 --- a/dimos/utils/data.py +++ b/dimos/utils/data.py @@ -21,6 +21,9 @@ import tempfile from dimos.constants import DIMOS_PROJECT_ROOT +from dimos.utils.logging_config import setup_logger + +logger = setup_logger(__file__) def _get_user_data_dir() -> Path: @@ -54,10 +57,12 @@ def _get_repo_root() -> Path: test_file = data_dir / ".write_test" test_file.touch() test_file.unlink() + logger.info(f"Using local user data directory at '{data_dir}'") except (OSError, PermissionError): # Fall back to temp dir if data dir not writable data_dir = Path(tempfile.gettempdir()) / "dimos" data_dir.mkdir(parents=True, exist_ok=True) + logger.info(f"Using tmp data directory at '{data_dir}'") repo_dir = data_dir / "repo" From 29f8aa3a1b750e86ee90c75bc9941baee60859ef Mon Sep 17 00:00:00 2001 From: Paul Nechifor Date: Sat, 22 Nov 2025 05:30:31 +0200 Subject: [PATCH 03/19] check for git too --- dimos/utils/data.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/dimos/utils/data.py b/dimos/utils/data.py index 659af8270c..817f96bd3f 100644 --- a/dimos/utils/data.py +++ b/dimos/utils/data.py @@ -106,13 +106,26 @@ def _get_lfs_dir() -> Path: def _check_git_lfs_available() -> bool: + missing = [] + + # Check if git is available + try: + subprocess.run(["git", "--version"], capture_output=True, check=True, text=True) + except (subprocess.CalledProcessError, FileNotFoundError): + missing.append("git") + + # Check if git-lfs is available try: - subprocess.run(["git", "lfs", "version"], capture_output=True, check=True, text=True) + subprocess.run(["git-lfs", "version"], capture_output=True, check=True, text=True) except (subprocess.CalledProcessError, FileNotFoundError): + missing.append("git-lfs") + + if missing: raise RuntimeError( - "Git LFS is not installed. Please install git-lfs to use test data utilities.\n" - "Installation instructions: https://git-lfs.github.io/" + f"Missing required tools: {', '.join(missing)}.\n\n" + "Git LFS installation instructions: https://git-lfs.github.io/" ) + return True From 0a3eb65f2468c21a21619779247fd19a9e3878ff Mon Sep 17 00:00:00 2001 From: Paul Nechifor Date: Sat, 22 Nov 2025 05:38:28 +0200 Subject: [PATCH 04/19] use GIT_LFS_SKIP_SMUDGE=1 --- dimos/utils/data.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dimos/utils/data.py b/dimos/utils/data.py index 817f96bd3f..9397ef7a4f 100644 --- a/dimos/utils/data.py +++ b/dimos/utils/data.py @@ -69,6 +69,8 @@ def _get_repo_root() -> Path: # Clone if not already cloned if not (repo_dir / ".git").exists(): try: + env = os.environ.copy() + env["GIT_LFS_SKIP_SMUDGE"] = "1" subprocess.run( [ "git", @@ -83,6 +85,7 @@ def _get_repo_root() -> Path: check=True, capture_output=True, text=True, + env=env, ) except subprocess.CalledProcessError as e: raise RuntimeError( From 38ff65b81115ce6af9bd33ea49e6221a16698611 Mon Sep 17 00:00:00 2001 From: Paul Nechifor Date: Wed, 24 Dec 2025 00:25:58 +0200 Subject: [PATCH 05/19] fix logger --- dimos/robot/unitree_webrtc/mujoco_connection.py | 2 +- dimos/utils/data.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dimos/robot/unitree_webrtc/mujoco_connection.py b/dimos/robot/unitree_webrtc/mujoco_connection.py index d95c616b13..fc3cf3f829 100644 --- a/dimos/robot/unitree_webrtc/mujoco_connection.py +++ b/dimos/robot/unitree_webrtc/mujoco_connection.py @@ -63,7 +63,7 @@ def __init__(self, global_config: GlobalConfig) -> None: # Trigger the download of the mujoco_menajerie package. This is so it # doesn't trigger in the mujoco process where it can time out. - import mujoco_playground + import mujoco_playground # noqa: F401 self.global_config = global_config self.process: subprocess.Popen[bytes] | None = None diff --git a/dimos/utils/data.py b/dimos/utils/data.py index 683ad5fe97..517b4ee162 100644 --- a/dimos/utils/data.py +++ b/dimos/utils/data.py @@ -23,7 +23,7 @@ from dimos.constants import DIMOS_PROJECT_ROOT from dimos.utils.logging_config import setup_logger -logger = setup_logger(__file__) +logger = setup_logger() def _get_user_data_dir() -> Path: From ff0d7602bb977c3b8846bbb054783753aa7d654d Mon Sep 17 00:00:00 2001 From: paul-nechifor <1262969+paul-nechifor@users.noreply.github.com> Date: Tue, 23 Dec 2025 22:26:33 +0000 Subject: [PATCH 06/19] CI code cleanup --- dimos/robot/unitree_webrtc/mujoco_connection.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dimos/robot/unitree_webrtc/mujoco_connection.py b/dimos/robot/unitree_webrtc/mujoco_connection.py index fc3cf3f829..d95c616b13 100644 --- a/dimos/robot/unitree_webrtc/mujoco_connection.py +++ b/dimos/robot/unitree_webrtc/mujoco_connection.py @@ -63,7 +63,7 @@ def __init__(self, global_config: GlobalConfig) -> None: # Trigger the download of the mujoco_menajerie package. This is so it # doesn't trigger in the mujoco process where it can time out. - import mujoco_playground # noqa: F401 + import mujoco_playground self.global_config = global_config self.process: subprocess.Popen[bytes] | None = None From a415c03dee06181bc2c6908052ce64fcd437411c Mon Sep 17 00:00:00 2001 From: Paul Nechifor Date: Wed, 24 Dec 2025 06:42:46 +0200 Subject: [PATCH 07/19] make it work on python 3.12 --- pyproject.toml | 9 +- uv.lock | 356 ++++++++++++++++++------------------------------- 2 files changed, 134 insertions(+), 231 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 6f10f7e362..dfd8d0a37e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,6 +28,8 @@ requires-python = ">=3.10" dependencies = [ # Core requirements "opencv-python", + "numba>=0.60.0", # Python 3.12 support + "llvmlite>=0.42.0", # Required by numba 0.60+ "python-dotenv", "openai", "anthropic>=0.19.0", @@ -329,13 +331,6 @@ extra-build-dependencies = { detectron2 = ["torch"], contact-graspnet-pytorch = default-groups = [] -# Override transitive dependencies that don't support Python 3.12 -override-dependencies = [ - "numba>=0.60.0", # First version supporting Python 3.12 - "llvmlite>=0.42.0", # Required by numba 0.59+ -] - - [tool.uv.sources] rxpy-backpressure = { git = "https://github.com/dimensionalOS/rxpy-backpressure.git" } go2-webrtc-connect = { git = "https://github.com/dimensionalOS/go2_webrtc_connect.git" } diff --git a/uv.lock b/uv.lock index 3d53e00b15..4d0f477487 100644 --- a/uv.lock +++ b/uv.lock @@ -20,12 +20,6 @@ resolution-markers = [ "(python_full_version < '3.11' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.11' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')", ] -[manifest] -overrides = [ - { name = "llvmlite", specifier = ">=0.42.0" }, - { name = "numba", specifier = ">=0.60.0" }, -] - [[package]] name = "absl-py" version = "2.3.1" @@ -41,8 +35,7 @@ version = "1.12.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "huggingface-hub" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, { name = "packaging" }, { name = "psutil" }, { name = "pyyaml" }, @@ -370,10 +363,9 @@ name = "bitsandbytes" version = "0.49.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "packaging" }, - { name = "torch" }, + { name = "numpy", marker = "sys_platform != 'darwin' and sys_platform != 'win32'" }, + { name = "packaging", marker = "sys_platform != 'darwin' and sys_platform != 'win32'" }, + { name = "torch", marker = "sys_platform != 'darwin' and sys_platform != 'win32'" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/d1/4f/9f6d161e9ea68cdd6b85585dee9b383748ca07431e31c4c134111f87489e/bitsandbytes-0.49.0-py3-none-manylinux_2_24_aarch64.whl", hash = "sha256:7e69951b4d207a676986fce967544d9599f23518d0f09d478295996aeff377c2", size = 31065242, upload-time = "2025-12-11T20:50:41.903Z" }, @@ -415,8 +407,7 @@ dependencies = [ { name = "contourpy", version = "1.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "jinja2" }, { name = "narwhals" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, { name = "packaging" }, { name = "pandas" }, { name = "pillow" }, @@ -449,8 +440,7 @@ dependencies = [ { name = "ml-collections" }, { name = "mujoco" }, { name = "mujoco-mjx" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, { name = "optax" }, { name = "orbax-checkpoint" }, { name = "pillow" }, @@ -726,7 +716,7 @@ dependencies = [ { name = "absl-py", marker = "python_full_version < '3.11'" }, { name = "jax", version = "0.6.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "jaxlib", version = "0.6.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", marker = "python_full_version < '3.11'" }, { name = "toolz", marker = "python_full_version < '3.11'" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] @@ -757,7 +747,7 @@ dependencies = [ { name = "absl-py", marker = "python_full_version >= '3.11'" }, { name = "jax", version = "0.8.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "jaxlib", version = "0.8.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", marker = "python_full_version >= '3.11'" }, { name = "toolz", marker = "python_full_version >= '3.11'" }, { name = "typing-extensions", marker = "python_full_version >= '3.11'" }, ] @@ -792,8 +782,7 @@ dependencies = [ { name = "jsonschema" }, { name = "kubernetes" }, { name = "mmh3" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, { name = "onnxruntime" }, { name = "opentelemetry-api" }, { name = "opentelemetry-exporter-otlp-proto-grpc" }, @@ -923,7 +912,7 @@ resolution-markers = [ "(python_full_version < '3.11' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.11' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')", ] dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/66/54/eb9bfc647b19f2009dd5c7f5ec51c4e6ca831725f1aea7a993034f483147/contourpy-1.3.2.tar.gz", hash = "sha256:b6945942715a034c671b7fc54f9588126b0b8bf23db2696e3ca8328f3ff0ab54", size = 13466130, upload-time = "2025-04-15T17:47:53.79Z" } wheels = [ @@ -1004,7 +993,7 @@ resolution-markers = [ "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version == '3.11.*' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')", ] dependencies = [ - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", marker = "python_full_version >= '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" } wheels = [ @@ -1173,8 +1162,7 @@ version = "13.6.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "fastrlock" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/f7/2e/db22c5148884e4e384f6ebbc7971fa3710f3ba67ca492798890a0fdebc45/cupy_cuda12x-13.6.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:9e37f60f27ff9625dfdccc4688a09852707ec613e32ea9404f425dd22a386d14", size = 126341714, upload-time = "2025-08-18T08:24:08.335Z" }, @@ -1283,8 +1271,7 @@ complete = [ { name = "distributed" }, { name = "jinja2" }, { name = "lz4" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, { name = "pandas" }, { name = "pyarrow" }, ] @@ -1393,9 +1380,10 @@ dependencies = [ { name = "langchain-text-splitters" }, { name = "lap" }, { name = "lark" }, + { name = "llvmlite" }, { name = "moondream" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numba" }, + { name = "numpy" }, { name = "ollama" }, { name = "onnx" }, { name = "open-clip-torch" }, @@ -1561,6 +1549,7 @@ requires-dist = [ { name = "langchain-text-splitters", specifier = ">=0.3.11,<1" }, { name = "lap", specifier = ">=0.5.12" }, { name = "lark" }, + { name = "llvmlite", specifier = ">=0.42.0" }, { name = "lvis", marker = "extra == 'cuda'" }, { name = "lxml-stubs", marker = "extra == 'dev'", specifier = ">=0.5.1,<1" }, { name = "matplotlib", marker = "extra == 'manipulation'", specifier = ">=3.7.1" }, @@ -1571,6 +1560,7 @@ requires-dist = [ { name = "mujoco", marker = "extra == 'sim'", specifier = ">=3.3.4" }, { name = "mypy", marker = "extra == 'dev'", specifier = "==1.19.0" }, { name = "nltk", marker = "extra == 'cuda'" }, + { name = "numba", specifier = ">=0.60.0" }, { name = "numpy", specifier = ">=1.26.4" }, { name = "nvidia-nvimgcodec-cu12", extras = ["all"], marker = "extra == 'cuda'" }, { name = "ollama", specifier = ">=0.6.0" }, @@ -1667,8 +1657,7 @@ source = { git = "https://github.com/dimensionalOS/dimos-lcm.git?rev=3aeb7248631 dependencies = [ { name = "foxglove-websocket" }, { name = "lcm" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, ] [[package]] @@ -1961,8 +1950,7 @@ name = "fasttext" version = "0.9.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, { name = "pybind11" }, { name = "setuptools" }, ] @@ -1995,8 +1983,7 @@ version = "1.4.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "matplotlib" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "scipy", version = "1.16.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] @@ -2100,7 +2087,7 @@ resolution-markers = [ dependencies = [ { name = "jax", version = "0.8.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "msgpack", marker = "python_full_version >= '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", marker = "python_full_version >= '3.11'" }, { name = "optax", marker = "python_full_version >= '3.11'" }, { name = "orbax-checkpoint", marker = "python_full_version >= '3.11'" }, { name = "pyyaml", marker = "python_full_version >= '3.11'" }, @@ -2233,8 +2220,7 @@ version = "0.1.5.post20221221" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "iopath" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, { name = "pillow" }, { name = "pyyaml" }, { name = "tabulate" }, @@ -2493,8 +2479,7 @@ name = "h5py" version = "3.15.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, ] sdist = { url = "https://files.pythonhosted.org/packages/4d/6a/0d79de0b025aa85dc8864de8e97659c94cf3d23148394a954dc5ca52f8c8/h5py-3.15.1.tar.gz", hash = "sha256:c86e3ed45c4473564de55aa83b6fc9e5ead86578773dfbd93047380042e26b69", size = 426236, upload-time = "2025-10-16T10:35:27.404Z" } wheels = [ @@ -2725,8 +2710,7 @@ name = "imageio" version = "2.37.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, { name = "pillow" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a3/6f/606be632e37bf8d05b253e8626c2291d74c691ddc7bcdf7d6aaf33b32f6a/imageio-2.37.2.tar.gz", hash = "sha256:0212ef2727ac9caa5ca4b2c75ae89454312f440a756fcfc8ef1993e718f50f8a", size = 389600, upload-time = "2025-11-04T14:29:39.898Z" } @@ -2899,7 +2883,7 @@ resolution-markers = [ dependencies = [ { name = "jaxlib", version = "0.6.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "ml-dtypes", marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", marker = "python_full_version < '3.11'" }, { name = "opt-einsum", marker = "python_full_version < '3.11'" }, { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, ] @@ -2929,7 +2913,7 @@ resolution-markers = [ dependencies = [ { name = "jaxlib", version = "0.8.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "ml-dtypes", marker = "python_full_version >= '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", marker = "python_full_version >= '3.11'" }, { name = "opt-einsum", marker = "python_full_version >= '3.11'" }, { name = "scipy", version = "1.16.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] @@ -2950,7 +2934,7 @@ resolution-markers = [ ] dependencies = [ { name = "ml-dtypes", marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", marker = "python_full_version < '3.11'" }, { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, ] wheels = [ @@ -2994,7 +2978,7 @@ resolution-markers = [ ] dependencies = [ { name = "ml-dtypes", marker = "python_full_version >= '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", marker = "python_full_version >= '3.11'" }, { name = "scipy", version = "1.16.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] wheels = [ @@ -3031,8 +3015,7 @@ dependencies = [ { name = "jax", version = "0.8.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "jaxlib", version = "0.6.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "jaxlib", version = "0.8.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "scipy", version = "1.16.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] @@ -3420,8 +3403,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "chromadb" }, { name = "langchain-core" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, ] sdist = { url = "https://files.pythonhosted.org/packages/dd/94/93ab8f6e96429a60da50eea2d3f3ac988852f6b8da4e817d73ec026a0bd3/langchain_chroma-0.2.6.tar.gz", hash = "sha256:ec5ca0f6f7692ac053741e076ea086c4be0cfcb5846c8693b1bcc3089c88b65e", size = 17296, upload-time = "2025-09-11T19:54:47.991Z" } wheels = [ @@ -3523,8 +3505,7 @@ name = "lap" version = "0.5.12" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, ] sdist = { url = "https://files.pythonhosted.org/packages/6c/cf/ef745c8977cbb26fba5f8433fd4bfd6bf009a90802c0a1cc7139e11f478b/lap-0.5.12.tar.gz", hash = "sha256:570b414ea7ae6c04bd49d0ec8cdac1dc5634737755784d44e37f9f668bab44fd", size = 1520169, upload-time = "2024-11-30T14:27:56.096Z" } wheels = [ @@ -3712,6 +3693,34 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/04/1e/b832de447dee8b582cac175871d2f6c3d5077cc56d5575cadba1fd1cccfa/linkify_it_py-2.0.3-py3-none-any.whl", hash = "sha256:6bcbc417b0ac14323382aef5c5192c0075bf8a9d6b41820a2b66371eac6b6d79", size = 19820, upload-time = "2024-02-04T14:48:02.496Z" }, ] +[[package]] +name = "llvmlite" +version = "0.46.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/74/cd/08ae687ba099c7e3d21fe2ea536500563ef1943c5105bf6ab4ee3829f68e/llvmlite-0.46.0.tar.gz", hash = "sha256:227c9fd6d09dce2783c18b754b7cd9d9b3b3515210c46acc2d3c5badd9870ceb", size = 193456, upload-time = "2025-12-08T18:15:36.295Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3d/a4/3959e1c61c5ca9db7921e5fd115b344c29b9d57a5dadd87bef97963ca1a5/llvmlite-0.46.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4323177e936d61ae0f73e653e2e614284d97d14d5dd12579adc92b6c2b0597b0", size = 37232766, upload-time = "2025-12-08T18:14:34.765Z" }, + { url = "https://files.pythonhosted.org/packages/c2/a5/a4d916f1015106e1da876028606a8e87fd5d5c840f98c87bc2d5153b6a2f/llvmlite-0.46.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0a2d461cb89537b7c20feb04c46c32e12d5ad4f0896c9dfc0f60336219ff248e", size = 56275176, upload-time = "2025-12-08T18:14:37.944Z" }, + { url = "https://files.pythonhosted.org/packages/79/7f/a7f2028805dac8c1a6fae7bda4e739b7ebbcd45b29e15bf6d21556fcd3d5/llvmlite-0.46.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b1f6595a35b7b39c3518b85a28bf18f45e075264e4b2dce3f0c2a4f232b4a910", size = 55128629, upload-time = "2025-12-08T18:14:41.674Z" }, + { url = "https://files.pythonhosted.org/packages/b2/bc/4689e1ba0c073c196b594471eb21be0aa51d9e64b911728aa13cd85ef0ae/llvmlite-0.46.0-cp310-cp310-win_amd64.whl", hash = "sha256:e7a34d4aa6f9a97ee006b504be6d2b8cb7f755b80ab2f344dda1ef992f828559", size = 38138651, upload-time = "2025-12-08T18:14:45.845Z" }, + { url = "https://files.pythonhosted.org/packages/7a/a1/2ad4b2367915faeebe8447f0a057861f646dbf5fbbb3561db42c65659cf3/llvmlite-0.46.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:82f3d39b16f19aa1a56d5fe625883a6ab600d5cc9ea8906cca70ce94cabba067", size = 37232766, upload-time = "2025-12-08T18:14:48.836Z" }, + { url = "https://files.pythonhosted.org/packages/12/b5/99cf8772fdd846c07da4fd70f07812a3c8fd17ea2409522c946bb0f2b277/llvmlite-0.46.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a3df43900119803bbc52720e758c76f316a9a0f34612a886862dfe0a5591a17e", size = 56275175, upload-time = "2025-12-08T18:14:51.604Z" }, + { url = "https://files.pythonhosted.org/packages/38/f2/ed806f9c003563732da156139c45d970ee435bd0bfa5ed8de87ba972b452/llvmlite-0.46.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de183fefc8022d21b0aa37fc3e90410bc3524aed8617f0ff76732fc6c3af5361", size = 55128630, upload-time = "2025-12-08T18:14:55.107Z" }, + { url = "https://files.pythonhosted.org/packages/19/0c/8f5a37a65fc9b7b17408508145edd5f86263ad69c19d3574e818f533a0eb/llvmlite-0.46.0-cp311-cp311-win_amd64.whl", hash = "sha256:e8b10bc585c58bdffec9e0c309bb7d51be1f2f15e169a4b4d42f2389e431eb93", size = 38138652, upload-time = "2025-12-08T18:14:58.171Z" }, + { url = "https://files.pythonhosted.org/packages/2b/f8/4db016a5e547d4e054ff2f3b99203d63a497465f81ab78ec8eb2ff7b2304/llvmlite-0.46.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6b9588ad4c63b4f0175a3984b85494f0c927c6b001e3a246a3a7fb3920d9a137", size = 37232767, upload-time = "2025-12-08T18:15:00.737Z" }, + { url = "https://files.pythonhosted.org/packages/aa/85/4890a7c14b4fa54400945cb52ac3cd88545bbdb973c440f98ca41591cdc5/llvmlite-0.46.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3535bd2bb6a2d7ae4012681ac228e5132cdb75fefb1bcb24e33f2f3e0c865ed4", size = 56275176, upload-time = "2025-12-08T18:15:03.936Z" }, + { url = "https://files.pythonhosted.org/packages/6a/07/3d31d39c1a1a08cd5337e78299fca77e6aebc07c059fbd0033e3edfab45c/llvmlite-0.46.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4cbfd366e60ff87ea6cc62f50bc4cd800ebb13ed4c149466f50cf2163a473d1e", size = 55128630, upload-time = "2025-12-08T18:15:07.196Z" }, + { url = "https://files.pythonhosted.org/packages/2a/6b/d139535d7590a1bba1ceb68751bef22fadaa5b815bbdf0e858e3875726b2/llvmlite-0.46.0-cp312-cp312-win_amd64.whl", hash = "sha256:398b39db462c39563a97b912d4f2866cd37cba60537975a09679b28fbbc0fb38", size = 38138940, upload-time = "2025-12-08T18:15:10.162Z" }, + { url = "https://files.pythonhosted.org/packages/e6/ff/3eba7eb0aed4b6fca37125387cd417e8c458e750621fce56d2c541f67fa8/llvmlite-0.46.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:30b60892d034bc560e0ec6654737aaa74e5ca327bd8114d82136aa071d611172", size = 37232767, upload-time = "2025-12-08T18:15:13.22Z" }, + { url = "https://files.pythonhosted.org/packages/0e/54/737755c0a91558364b9200702c3c9c15d70ed63f9b98a2c32f1c2aa1f3ba/llvmlite-0.46.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6cc19b051753368a9c9f31dc041299059ee91aceec81bd57b0e385e5d5bf1a54", size = 56275176, upload-time = "2025-12-08T18:15:16.339Z" }, + { url = "https://files.pythonhosted.org/packages/e6/91/14f32e1d70905c1c0aa4e6609ab5d705c3183116ca02ac6df2091868413a/llvmlite-0.46.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bca185892908f9ede48c0acd547fe4dc1bafefb8a4967d47db6cf664f9332d12", size = 55128629, upload-time = "2025-12-08T18:15:19.493Z" }, + { url = "https://files.pythonhosted.org/packages/4a/a7/d526ae86708cea531935ae777b6dbcabe7db52718e6401e0fb9c5edea80e/llvmlite-0.46.0-cp313-cp313-win_amd64.whl", hash = "sha256:67438fd30e12349ebb054d86a5a1a57fd5e87d264d2451bcfafbbbaa25b82a35", size = 38138941, upload-time = "2025-12-08T18:15:22.536Z" }, + { url = "https://files.pythonhosted.org/packages/95/ae/af0ffb724814cc2ea64445acad05f71cff5f799bb7efb22e47ee99340dbc/llvmlite-0.46.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:d252edfb9f4ac1fcf20652258e3f102b26b03eef738dc8a6ffdab7d7d341d547", size = 37232768, upload-time = "2025-12-08T18:15:25.055Z" }, + { url = "https://files.pythonhosted.org/packages/c9/19/5018e5352019be753b7b07f7759cdabb69ca5779fea2494be8839270df4c/llvmlite-0.46.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:379fdd1c59badeff8982cb47e4694a6143bec3bb49aa10a466e095410522064d", size = 56275173, upload-time = "2025-12-08T18:15:28.109Z" }, + { url = "https://files.pythonhosted.org/packages/9f/c9/d57877759d707e84c082163c543853245f91b70c804115a5010532890f18/llvmlite-0.46.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2e8cbfff7f6db0fa2c771ad24154e2a7e457c2444d7673e6de06b8b698c3b269", size = 55128628, upload-time = "2025-12-08T18:15:31.098Z" }, + { url = "https://files.pythonhosted.org/packages/30/a8/e61a8c2b3cc7a597073d9cde1fcbb567e9d827f1db30c93cf80422eac70d/llvmlite-0.46.0-cp314-cp314-win_amd64.whl", hash = "sha256:7821eda3ec1f18050f981819756631d60b6d7ab1a6cf806d9efefbe3f4082d61", size = 39153056, upload-time = "2025-12-08T18:15:33.938Z" }, +] + [[package]] name = "locket" version = "1.0.0" @@ -3739,8 +3748,7 @@ dependencies = [ { name = "cython" }, { name = "kiwisolver" }, { name = "matplotlib" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, { name = "opencv-python" }, { name = "pyparsing" }, { name = "python-dateutil" }, @@ -4064,8 +4072,7 @@ dependencies = [ { name = "cycler" }, { name = "fonttools" }, { name = "kiwisolver" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, { name = "packaging" }, { name = "pillow" }, { name = "pyparsing" }, @@ -4180,8 +4187,7 @@ name = "ml-dtypes" version = "0.5.4" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0e/4a/c27b42ed9b1c7d13d9ba8b6905dece787d6259152f2309338aed29b2447b/ml_dtypes-0.5.4.tar.gz", hash = "sha256:8ab06a50fb9bf9666dd0fe5dfb4676fa2b0ac0f31ecff72a6c3af8e22c063453", size = 692314, upload-time = "2025-11-17T22:32:31.031Z" } wheels = [ @@ -4228,8 +4234,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "addict" }, { name = "mmengine" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, { name = "opencv-python" }, { name = "packaging" }, { name = "pillow" }, @@ -4246,8 +4251,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "addict" }, { name = "matplotlib" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, { name = "opencv-python" }, { name = "pyyaml" }, { name = "regex", marker = "sys_platform == 'win32'" }, @@ -4480,8 +4484,7 @@ dependencies = [ { name = "absl-py" }, { name = "etils", extra = ["epath"] }, { name = "glfw" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, { name = "pyopengl" }, ] sdist = { url = "https://files.pythonhosted.org/packages/75/3b/f688fbe34eb609ffdc9dc0f53f7acd3327588f970752780d05a0762d3511/mujoco-3.4.0.tar.gz", hash = "sha256:5a6dc6b7db41eb0ab8724cd477bd0316ba4b53debfc2d80a2d6f444a116fb8d2", size = 826806, upload-time = "2025-12-05T23:13:46.833Z" } @@ -4679,16 +4682,42 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl", hash = "sha256:5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827", size = 23438, upload-time = "2025-12-20T14:08:52.782Z" }, ] +[[package]] +name = "numba" +version = "0.63.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "llvmlite" }, + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/dc/60/0145d479b2209bd8fdae5f44201eceb8ce5a23e0ed54c71f57db24618665/numba-0.63.1.tar.gz", hash = "sha256:b320aa675d0e3b17b40364935ea52a7b1c670c9037c39cf92c49502a75902f4b", size = 2761666, upload-time = "2025-12-10T02:57:39.002Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5e/ce/5283d4ffa568f795bb0fd61ee1f0efc0c6094b94209259167fc8d4276bde/numba-0.63.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c6d6bf5bf00f7db629305caaec82a2ffb8abe2bf45eaad0d0738dc7de4113779", size = 2680810, upload-time = "2025-12-10T02:56:55.269Z" }, + { url = "https://files.pythonhosted.org/packages/0f/72/a8bda517e26d912633b32626333339b7c769ea73a5c688365ea5f88fd07e/numba-0.63.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:08653d0dfc9cc9c4c9a8fba29ceb1f2d5340c3b86c4a7e5e07e42b643bc6a2f4", size = 3739735, upload-time = "2025-12-10T02:56:57.922Z" }, + { url = "https://files.pythonhosted.org/packages/ca/17/1913b7c1173b2db30fb7a9696892a7c4c59aeee777a9af6859e9e01bac51/numba-0.63.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f09eebf5650246ce2a4e9a8d38270e2d4b0b0ae978103bafb38ed7adc5ea906e", size = 3446707, upload-time = "2025-12-10T02:56:59.837Z" }, + { url = "https://files.pythonhosted.org/packages/b4/77/703db56c3061e9fdad5e79c91452947fdeb2ec0bdfe4affe9b144e7025e0/numba-0.63.1-cp310-cp310-win_amd64.whl", hash = "sha256:f8bba17421d865d8c0f7be2142754ebce53e009daba41c44cf6909207d1a8d7d", size = 2747374, upload-time = "2025-12-10T02:57:07.908Z" }, + { url = "https://files.pythonhosted.org/packages/70/90/5f8614c165d2e256fbc6c57028519db6f32e4982475a372bbe550ea0454c/numba-0.63.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b33db00f18ccc790ee9911ce03fcdfe9d5124637d1ecc266f5ae0df06e02fec3", size = 2680501, upload-time = "2025-12-10T02:57:09.797Z" }, + { url = "https://files.pythonhosted.org/packages/dc/9d/d0afc4cf915edd8eadd9b2ab5b696242886ee4f97720d9322650d66a88c6/numba-0.63.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7d31ea186a78a7c0f6b1b2a3fe68057fdb291b045c52d86232b5383b6cf4fc25", size = 3744945, upload-time = "2025-12-10T02:57:11.697Z" }, + { url = "https://files.pythonhosted.org/packages/05/a9/d82f38f2ab73f3be6f838a826b545b80339762ee8969c16a8bf1d39395a8/numba-0.63.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ed3bb2fbdb651d6aac394388130a7001aab6f4541837123a4b4ab8b02716530c", size = 3450827, upload-time = "2025-12-10T02:57:13.709Z" }, + { url = "https://files.pythonhosted.org/packages/18/3f/a9b106e93c5bd7434e65f044bae0d204e20aa7f7f85d72ceb872c7c04216/numba-0.63.1-cp311-cp311-win_amd64.whl", hash = "sha256:1ecbff7688f044b1601be70113e2fb1835367ee0b28ffa8f3adf3a05418c5c87", size = 2747262, upload-time = "2025-12-10T02:57:15.664Z" }, + { url = "https://files.pythonhosted.org/packages/14/9c/c0974cd3d00ff70d30e8ff90522ba5fbb2bcee168a867d2321d8d0457676/numba-0.63.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2819cd52afa5d8d04e057bdfd54367575105f8829350d8fb5e4066fb7591cc71", size = 2680981, upload-time = "2025-12-10T02:57:17.579Z" }, + { url = "https://files.pythonhosted.org/packages/cb/70/ea2bc45205f206b7a24ee68a159f5097c9ca7e6466806e7c213587e0c2b1/numba-0.63.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5cfd45dbd3d409e713b1ccfdc2ee72ca82006860254429f4ef01867fdba5845f", size = 3801656, upload-time = "2025-12-10T02:57:19.106Z" }, + { url = "https://files.pythonhosted.org/packages/0d/82/4f4ba4fd0f99825cbf3cdefd682ca3678be1702b63362011de6e5f71f831/numba-0.63.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:69a599df6976c03b7ecf15d05302696f79f7e6d10d620367407517943355bcb0", size = 3501857, upload-time = "2025-12-10T02:57:20.721Z" }, + { url = "https://files.pythonhosted.org/packages/af/fd/6540456efa90b5f6604a86ff50dabefb187e43557e9081adcad3be44f048/numba-0.63.1-cp312-cp312-win_amd64.whl", hash = "sha256:bbad8c63e4fc7eb3cdb2c2da52178e180419f7969f9a685f283b313a70b92af3", size = 2750282, upload-time = "2025-12-10T02:57:22.474Z" }, + { url = "https://files.pythonhosted.org/packages/57/f7/e19e6eff445bec52dde5bed1ebb162925a8e6f988164f1ae4b3475a73680/numba-0.63.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:0bd4fd820ef7442dcc07da184c3f54bb41d2bdb7b35bacf3448e73d081f730dc", size = 2680954, upload-time = "2025-12-10T02:57:24.145Z" }, + { url = "https://files.pythonhosted.org/packages/e9/6c/1e222edba1e20e6b113912caa9b1665b5809433cbcb042dfd133c6f1fd38/numba-0.63.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:53de693abe4be3bd4dee38e1c55f01c55ff644a6a3696a3670589e6e4c39cde2", size = 3809736, upload-time = "2025-12-10T02:57:25.836Z" }, + { url = "https://files.pythonhosted.org/packages/76/0a/590bad11a8b3feeac30a24d01198d46bdb76ad15c70d3a530691ce3cae58/numba-0.63.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:81227821a72a763c3d4ac290abbb4371d855b59fdf85d5af22a47c0e86bf8c7e", size = 3508854, upload-time = "2025-12-10T02:57:27.438Z" }, + { url = "https://files.pythonhosted.org/packages/4e/f5/3800384a24eed1e4d524669cdbc0b9b8a628800bb1e90d7bd676e5f22581/numba-0.63.1-cp313-cp313-win_amd64.whl", hash = "sha256:eb227b07c2ac37b09432a9bda5142047a2d1055646e089d4a240a2643e508102", size = 2750228, upload-time = "2025-12-10T02:57:30.36Z" }, + { url = "https://files.pythonhosted.org/packages/36/2f/53be2aa8a55ee2608ebe1231789cbb217f6ece7f5e1c685d2f0752e95a5b/numba-0.63.1-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:f180883e5508940cc83de8a8bea37fc6dd20fbe4e5558d4659b8b9bef5ff4731", size = 2681153, upload-time = "2025-12-10T02:57:32.016Z" }, + { url = "https://files.pythonhosted.org/packages/13/91/53e59c86759a0648282368d42ba732c29524a745fd555ed1fb1df83febbe/numba-0.63.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0938764afa82a47c0e895637a6c55547a42c9e1d35cac42285b1fa60a8b02bb", size = 3778718, upload-time = "2025-12-10T02:57:33.764Z" }, + { url = "https://files.pythonhosted.org/packages/6c/0c/2be19eba50b0b7636f6d1f69dfb2825530537708a234ba1ff34afc640138/numba-0.63.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f90a929fa5094e062d4e0368ede1f4497d5e40f800e80aa5222c4734236a2894", size = 3478712, upload-time = "2025-12-10T02:57:35.518Z" }, + { url = "https://files.pythonhosted.org/packages/0d/5f/4d0c9e756732577a52211f31da13a3d943d185f7fb90723f56d79c696caa/numba-0.63.1-cp314-cp314-win_amd64.whl", hash = "sha256:8d6d5ce85f572ed4e1a135dbb8c0114538f9dd0e3657eeb0bb64ab204cbe2a8f", size = 2752161, upload-time = "2025-12-10T02:57:37.12Z" }, +] + [[package]] name = "numpy" version = "2.2.6" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.11' and sys_platform == 'darwin'", - "python_full_version < '3.11' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "python_full_version < '3.11' and sys_platform == 'win32'", - "(python_full_version < '3.11' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.11' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')", -] sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" }, @@ -4747,99 +4776,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" }, ] -[[package]] -name = "numpy" -version = "2.4.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.13' and sys_platform == 'darwin'", - "python_full_version == '3.12.*' and sys_platform == 'darwin'", - "python_full_version >= '3.13' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "python_full_version == '3.12.*' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "python_full_version >= '3.13' and sys_platform == 'win32'", - "(python_full_version >= '3.13' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.13' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')", - "python_full_version == '3.12.*' and sys_platform == 'win32'", - "(python_full_version == '3.12.*' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version == '3.12.*' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')", - "python_full_version == '3.11.*' and sys_platform == 'darwin'", - "python_full_version == '3.11.*' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", - "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version == '3.11.*' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')", -] -sdist = { url = "https://files.pythonhosted.org/packages/a4/7a/6a3d14e205d292b738db449d0de649b373a59edb0d0b4493821d0a3e8718/numpy-2.4.0.tar.gz", hash = "sha256:6e504f7b16118198f138ef31ba24d985b124c2c469fe8467007cf30fd992f934", size = 20685720, upload-time = "2025-12-20T16:18:19.023Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/26/7e/7bae7cbcc2f8132271967aa03e03954fc1e48aa1f3bf32b29ca95fbef352/numpy-2.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:316b2f2584682318539f0bcaca5a496ce9ca78c88066579ebd11fd06f8e4741e", size = 16940166, upload-time = "2025-12-20T16:15:43.434Z" }, - { url = "https://files.pythonhosted.org/packages/0f/27/6c13f5b46776d6246ec884ac5817452672156a506d08a1f2abb39961930a/numpy-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a2718c1de8504121714234b6f8241d0019450353276c88b9453c9c3d92e101db", size = 12641781, upload-time = "2025-12-20T16:15:45.701Z" }, - { url = "https://files.pythonhosted.org/packages/14/1c/83b4998d4860d15283241d9e5215f28b40ac31f497c04b12fa7f428ff370/numpy-2.4.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:21555da4ec4a0c942520ead42c3b0dc9477441e085c42b0fbdd6a084869a6f6b", size = 5470247, upload-time = "2025-12-20T16:15:47.943Z" }, - { url = "https://files.pythonhosted.org/packages/54/08/cbce72c835d937795571b0464b52069f869c9e78b0c076d416c5269d2718/numpy-2.4.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:413aa561266a4be2d06cd2b9665e89d9f54c543f418773076a76adcf2af08bc7", size = 6799807, upload-time = "2025-12-20T16:15:49.795Z" }, - { url = "https://files.pythonhosted.org/packages/ff/be/2e647961cd8c980591d75cdcd9e8f647d69fbe05e2a25613dc0a2ea5fb1a/numpy-2.4.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0feafc9e03128074689183031181fac0897ff169692d8492066e949041096548", size = 14701992, upload-time = "2025-12-20T16:15:51.615Z" }, - { url = "https://files.pythonhosted.org/packages/a2/fb/e1652fb8b6fd91ce6ed429143fe2e01ce714711e03e5b762615e7b36172c/numpy-2.4.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8fdfed3deaf1928fb7667d96e0567cdf58c2b370ea2ee7e586aa383ec2cb346", size = 16646871, upload-time = "2025-12-20T16:15:54.129Z" }, - { url = "https://files.pythonhosted.org/packages/62/23/d841207e63c4322842f7cd042ae981cffe715c73376dcad8235fb31debf1/numpy-2.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e06a922a469cae9a57100864caf4f8a97a1026513793969f8ba5b63137a35d25", size = 16487190, upload-time = "2025-12-20T16:15:56.147Z" }, - { url = "https://files.pythonhosted.org/packages/bc/a0/6a842c8421ebfdec0a230e65f61e0dabda6edbef443d999d79b87c273965/numpy-2.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:927ccf5cd17c48f801f4ed43a7e5673a2724bd2171460be3e3894e6e332ef83a", size = 18580762, upload-time = "2025-12-20T16:15:58.524Z" }, - { url = "https://files.pythonhosted.org/packages/0a/d1/c79e0046641186f2134dde05e6181825b911f8bdcef31b19ddd16e232847/numpy-2.4.0-cp311-cp311-win32.whl", hash = "sha256:882567b7ae57c1b1a0250208cc21a7976d8cbcc49d5a322e607e6f09c9e0bd53", size = 6233359, upload-time = "2025-12-20T16:16:00.938Z" }, - { url = "https://files.pythonhosted.org/packages/fc/f0/74965001d231f28184d6305b8cdc1b6fcd4bf23033f6cb039cfe76c9fca7/numpy-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:8b986403023c8f3bf8f487c2e6186afda156174d31c175f747d8934dfddf3479", size = 12601132, upload-time = "2025-12-20T16:16:02.484Z" }, - { url = "https://files.pythonhosted.org/packages/65/32/55408d0f46dfebce38017f5bd931affa7256ad6beac1a92a012e1fbc67a7/numpy-2.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:3f3096405acc48887458bbf9f6814d43785ac7ba2a57ea6442b581dedbc60ce6", size = 10573977, upload-time = "2025-12-20T16:16:04.77Z" }, - { url = "https://files.pythonhosted.org/packages/8b/ff/f6400ffec95de41c74b8e73df32e3fff1830633193a7b1e409be7fb1bb8c/numpy-2.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2a8b6bb8369abefb8bd1801b054ad50e02b3275c8614dc6e5b0373c305291037", size = 16653117, upload-time = "2025-12-20T16:16:06.709Z" }, - { url = "https://files.pythonhosted.org/packages/fd/28/6c23e97450035072e8d830a3c411bf1abd1f42c611ff9d29e3d8f55c6252/numpy-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2e284ca13d5a8367e43734148622caf0b261b275673823593e3e3634a6490f83", size = 12369711, upload-time = "2025-12-20T16:16:08.758Z" }, - { url = "https://files.pythonhosted.org/packages/bc/af/acbef97b630ab1bb45e6a7d01d1452e4251aa88ce680ac36e56c272120ec/numpy-2.4.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:49ff32b09f5aa0cd30a20c2b39db3e669c845589f2b7fc910365210887e39344", size = 5198355, upload-time = "2025-12-20T16:16:10.902Z" }, - { url = "https://files.pythonhosted.org/packages/c1/c8/4e0d436b66b826f2e53330adaa6311f5cac9871a5b5c31ad773b27f25a74/numpy-2.4.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:36cbfb13c152b1c7c184ddac43765db8ad672567e7bafff2cc755a09917ed2e6", size = 6545298, upload-time = "2025-12-20T16:16:12.607Z" }, - { url = "https://files.pythonhosted.org/packages/ef/27/e1f5d144ab54eac34875e79037011d511ac57b21b220063310cb96c80fbc/numpy-2.4.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:35ddc8f4914466e6fc954c76527aa91aa763682a4f6d73249ef20b418fe6effb", size = 14398387, upload-time = "2025-12-20T16:16:14.257Z" }, - { url = "https://files.pythonhosted.org/packages/67/64/4cb909dd5ab09a9a5d086eff9586e69e827b88a5585517386879474f4cf7/numpy-2.4.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dc578891de1db95b2a35001b695451767b580bb45753717498213c5ff3c41d63", size = 16363091, upload-time = "2025-12-20T16:16:17.32Z" }, - { url = "https://files.pythonhosted.org/packages/9d/9c/8efe24577523ec6809261859737cf117b0eb6fdb655abdfdc81b2e468ce4/numpy-2.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98e81648e0b36e325ab67e46b5400a7a6d4a22b8a7c8e8bbfe20e7db7906bf95", size = 16176394, upload-time = "2025-12-20T16:16:19.524Z" }, - { url = "https://files.pythonhosted.org/packages/61/f0/1687441ece7b47a62e45a1f82015352c240765c707928edd8aef875d5951/numpy-2.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d57b5046c120561ba8fa8e4030fbb8b822f3063910fa901ffadf16e2b7128ad6", size = 18287378, upload-time = "2025-12-20T16:16:22.866Z" }, - { url = "https://files.pythonhosted.org/packages/d3/6f/f868765d44e6fc466467ed810ba9d8d6db1add7d4a748abfa2a4c99a3194/numpy-2.4.0-cp312-cp312-win32.whl", hash = "sha256:92190db305a6f48734d3982f2c60fa30d6b5ee9bff10f2887b930d7b40119f4c", size = 5955432, upload-time = "2025-12-20T16:16:25.06Z" }, - { url = "https://files.pythonhosted.org/packages/d4/b5/94c1e79fcbab38d1ca15e13777477b2914dd2d559b410f96949d6637b085/numpy-2.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:680060061adb2d74ce352628cb798cfdec399068aa7f07ba9fb818b2b3305f98", size = 12306201, upload-time = "2025-12-20T16:16:26.979Z" }, - { url = "https://files.pythonhosted.org/packages/70/09/c39dadf0b13bb0768cd29d6a3aaff1fb7c6905ac40e9aaeca26b1c086e06/numpy-2.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:39699233bc72dd482da1415dcb06076e32f60eddc796a796c5fb6c5efce94667", size = 10308234, upload-time = "2025-12-20T16:16:29.417Z" }, - { url = "https://files.pythonhosted.org/packages/a7/0d/853fd96372eda07c824d24adf02e8bc92bb3731b43a9b2a39161c3667cc4/numpy-2.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a152d86a3ae00ba5f47b3acf3b827509fd0b6cb7d3259665e63dafbad22a75ea", size = 16649088, upload-time = "2025-12-20T16:16:31.421Z" }, - { url = "https://files.pythonhosted.org/packages/e3/37/cc636f1f2a9f585434e20a3e6e63422f70bfe4f7f6698e941db52ea1ac9a/numpy-2.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:39b19251dec4de8ff8496cd0806cbe27bf0684f765abb1f4809554de93785f2d", size = 12364065, upload-time = "2025-12-20T16:16:33.491Z" }, - { url = "https://files.pythonhosted.org/packages/ed/69/0b78f37ca3690969beee54103ce5f6021709134e8020767e93ba691a72f1/numpy-2.4.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:009bd0ea12d3c784b6639a8457537016ce5172109e585338e11334f6a7bb88ee", size = 5192640, upload-time = "2025-12-20T16:16:35.636Z" }, - { url = "https://files.pythonhosted.org/packages/1d/2a/08569f8252abf590294dbb09a430543ec8f8cc710383abfb3e75cc73aeda/numpy-2.4.0-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5fe44e277225fd3dff6882d86d3d447205d43532c3627313d17e754fb3905a0e", size = 6541556, upload-time = "2025-12-20T16:16:37.276Z" }, - { url = "https://files.pythonhosted.org/packages/93/e9/a949885a4e177493d61519377952186b6cbfdf1d6002764c664ba28349b5/numpy-2.4.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f935c4493eda9069851058fa0d9e39dbf6286be690066509305e52912714dbb2", size = 14396562, upload-time = "2025-12-20T16:16:38.953Z" }, - { url = "https://files.pythonhosted.org/packages/99/98/9d4ad53b0e9ef901c2ef1d550d2136f5ac42d3fd2988390a6def32e23e48/numpy-2.4.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8cfa5f29a695cb7438965e6c3e8d06e0416060cf0d709c1b1c1653a939bf5c2a", size = 16351719, upload-time = "2025-12-20T16:16:41.503Z" }, - { url = "https://files.pythonhosted.org/packages/28/de/5f3711a38341d6e8dd619f6353251a0cdd07f3d6d101a8fd46f4ef87f895/numpy-2.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ba0cb30acd3ef11c94dc27fbfba68940652492bc107075e7ffe23057f9425681", size = 16176053, upload-time = "2025-12-20T16:16:44.552Z" }, - { url = "https://files.pythonhosted.org/packages/2a/5b/2a3753dc43916501b4183532e7ace862e13211042bceafa253afb5c71272/numpy-2.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:60e8c196cd82cbbd4f130b5290007e13e6de3eca79f0d4d38014769d96a7c475", size = 18277859, upload-time = "2025-12-20T16:16:47.174Z" }, - { url = "https://files.pythonhosted.org/packages/2c/c5/a18bcdd07a941db3076ef489d036ab16d2bfc2eae0cf27e5a26e29189434/numpy-2.4.0-cp313-cp313-win32.whl", hash = "sha256:5f48cb3e88fbc294dc90e215d86fbaf1c852c63dbdb6c3a3e63f45c4b57f7344", size = 5953849, upload-time = "2025-12-20T16:16:49.554Z" }, - { url = "https://files.pythonhosted.org/packages/4f/f1/719010ff8061da6e8a26e1980cf090412d4f5f8060b31f0c45d77dd67a01/numpy-2.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:a899699294f28f7be8992853c0c60741f16ff199205e2e6cdca155762cbaa59d", size = 12302840, upload-time = "2025-12-20T16:16:51.227Z" }, - { url = "https://files.pythonhosted.org/packages/f5/5a/b3d259083ed8b4d335270c76966cb6cf14a5d1b69e1a608994ac57a659e6/numpy-2.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:9198f447e1dc5647d07c9a6bbe2063cc0132728cc7175b39dbc796da5b54920d", size = 10308509, upload-time = "2025-12-20T16:16:53.313Z" }, - { url = "https://files.pythonhosted.org/packages/31/01/95edcffd1bb6c0633df4e808130545c4f07383ab629ac7e316fb44fff677/numpy-2.4.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74623f2ab5cc3f7c886add4f735d1031a1d2be4a4ae63c0546cfd74e7a31ddf6", size = 12491815, upload-time = "2025-12-20T16:16:55.496Z" }, - { url = "https://files.pythonhosted.org/packages/59/ea/5644b8baa92cc1c7163b4b4458c8679852733fa74ca49c942cfa82ded4e0/numpy-2.4.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:0804a8e4ab070d1d35496e65ffd3cf8114c136a2b81f61dfab0de4b218aacfd5", size = 5320321, upload-time = "2025-12-20T16:16:57.468Z" }, - { url = "https://files.pythonhosted.org/packages/26/4e/e10938106d70bc21319bd6a86ae726da37edc802ce35a3a71ecdf1fdfe7f/numpy-2.4.0-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:02a2038eb27f9443a8b266a66911e926566b5a6ffd1a689b588f7f35b81e7dc3", size = 6641635, upload-time = "2025-12-20T16:16:59.379Z" }, - { url = "https://files.pythonhosted.org/packages/b3/8d/a8828e3eaf5c0b4ab116924df82f24ce3416fa38d0674d8f708ddc6c8aac/numpy-2.4.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1889b3a3f47a7b5bee16bc25a2145bd7cb91897f815ce3499db64c7458b6d91d", size = 14456053, upload-time = "2025-12-20T16:17:01.768Z" }, - { url = "https://files.pythonhosted.org/packages/68/a1/17d97609d87d4520aa5ae2dcfb32305654550ac6a35effb946d303e594ce/numpy-2.4.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85eef4cb5625c47ee6425c58a3502555e10f45ee973da878ac8248ad58c136f3", size = 16401702, upload-time = "2025-12-20T16:17:04.235Z" }, - { url = "https://files.pythonhosted.org/packages/18/32/0f13c1b2d22bea1118356b8b963195446f3af124ed7a5adfa8fdecb1b6ca/numpy-2.4.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6dc8b7e2f4eb184b37655195f421836cfae6f58197b67e3ffc501f1333d993fa", size = 16242493, upload-time = "2025-12-20T16:17:06.856Z" }, - { url = "https://files.pythonhosted.org/packages/ae/23/48f21e3d309fbc137c068a1475358cbd3a901b3987dcfc97a029ab3068e2/numpy-2.4.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:44aba2f0cafd287871a495fb3163408b0bd25bbce135c6f621534a07f4f7875c", size = 18324222, upload-time = "2025-12-20T16:17:09.392Z" }, - { url = "https://files.pythonhosted.org/packages/ac/52/41f3d71296a3dcaa4f456aaa3c6fc8e745b43d0552b6bde56571bb4b4a0f/numpy-2.4.0-cp313-cp313t-win32.whl", hash = "sha256:20c115517513831860c573996e395707aa9fb691eb179200125c250e895fcd93", size = 6076216, upload-time = "2025-12-20T16:17:11.437Z" }, - { url = "https://files.pythonhosted.org/packages/35/ff/46fbfe60ab0710d2a2b16995f708750307d30eccbb4c38371ea9e986866e/numpy-2.4.0-cp313-cp313t-win_amd64.whl", hash = "sha256:b48e35f4ab6f6a7597c46e301126ceba4c44cd3280e3750f85db48b082624fa4", size = 12444263, upload-time = "2025-12-20T16:17:13.182Z" }, - { url = "https://files.pythonhosted.org/packages/a3/e3/9189ab319c01d2ed556c932ccf55064c5d75bb5850d1df7a482ce0badead/numpy-2.4.0-cp313-cp313t-win_arm64.whl", hash = "sha256:4d1cfce39e511069b11e67cd0bd78ceff31443b7c9e5c04db73c7a19f572967c", size = 10378265, upload-time = "2025-12-20T16:17:15.211Z" }, - { url = "https://files.pythonhosted.org/packages/ab/ed/52eac27de39d5e5a6c9aadabe672bc06f55e24a3d9010cd1183948055d76/numpy-2.4.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c95eb6db2884917d86cde0b4d4cf31adf485c8ec36bf8696dd66fa70de96f36b", size = 16647476, upload-time = "2025-12-20T16:17:17.671Z" }, - { url = "https://files.pythonhosted.org/packages/77/c0/990ce1b7fcd4e09aeaa574e2a0a839589e4b08b2ca68070f1acb1fea6736/numpy-2.4.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:65167da969cd1ec3a1df31cb221ca3a19a8aaa25370ecb17d428415e93c1935e", size = 12374563, upload-time = "2025-12-20T16:17:20.216Z" }, - { url = "https://files.pythonhosted.org/packages/37/7c/8c5e389c6ae8f5fd2277a988600d79e9625db3fff011a2d87ac80b881a4c/numpy-2.4.0-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:3de19cfecd1465d0dcf8a5b5ea8b3155b42ed0b639dba4b71e323d74f2a3be5e", size = 5203107, upload-time = "2025-12-20T16:17:22.47Z" }, - { url = "https://files.pythonhosted.org/packages/e6/94/ca5b3bd6a8a70a5eec9a0b8dd7f980c1eff4b8a54970a9a7fef248ef564f/numpy-2.4.0-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:6c05483c3136ac4c91b4e81903cb53a8707d316f488124d0398499a4f8e8ef51", size = 6538067, upload-time = "2025-12-20T16:17:24.001Z" }, - { url = "https://files.pythonhosted.org/packages/79/43/993eb7bb5be6761dde2b3a3a594d689cec83398e3f58f4758010f3b85727/numpy-2.4.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36667db4d6c1cea79c8930ab72fadfb4060feb4bfe724141cd4bd064d2e5f8ce", size = 14411926, upload-time = "2025-12-20T16:17:25.822Z" }, - { url = "https://files.pythonhosted.org/packages/03/75/d4c43b61de473912496317a854dac54f1efec3eeb158438da6884b70bb90/numpy-2.4.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9a818668b674047fd88c4cddada7ab8f1c298812783e8328e956b78dc4807f9f", size = 16354295, upload-time = "2025-12-20T16:17:28.308Z" }, - { url = "https://files.pythonhosted.org/packages/b8/0a/b54615b47ee8736a6461a4bb6749128dd3435c5a759d5663f11f0e9af4ac/numpy-2.4.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1ee32359fb7543b7b7bd0b2f46294db27e29e7bbdf70541e81b190836cd83ded", size = 16190242, upload-time = "2025-12-20T16:17:30.993Z" }, - { url = "https://files.pythonhosted.org/packages/98/ce/ea207769aacad6246525ec6c6bbd66a2bf56c72443dc10e2f90feed29290/numpy-2.4.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e493962256a38f58283de033d8af176c5c91c084ea30f15834f7545451c42059", size = 18280875, upload-time = "2025-12-20T16:17:33.327Z" }, - { url = "https://files.pythonhosted.org/packages/17/ef/ec409437aa962ea372ed601c519a2b141701683ff028f894b7466f0ab42b/numpy-2.4.0-cp314-cp314-win32.whl", hash = "sha256:6bbaebf0d11567fa8926215ae731e1d58e6ec28a8a25235b8a47405d301332db", size = 6002530, upload-time = "2025-12-20T16:17:35.729Z" }, - { url = "https://files.pythonhosted.org/packages/5f/4a/5cb94c787a3ed1ac65e1271b968686521169a7b3ec0b6544bb3ca32960b0/numpy-2.4.0-cp314-cp314-win_amd64.whl", hash = "sha256:3d857f55e7fdf7c38ab96c4558c95b97d1c685be6b05c249f5fdafcbd6f9899e", size = 12435890, upload-time = "2025-12-20T16:17:37.599Z" }, - { url = "https://files.pythonhosted.org/packages/48/a0/04b89db963af9de1104975e2544f30de89adbf75b9e75f7dd2599be12c79/numpy-2.4.0-cp314-cp314-win_arm64.whl", hash = "sha256:bb50ce5fb202a26fd5404620e7ef820ad1ab3558b444cb0b55beb7ef66cd2d63", size = 10591892, upload-time = "2025-12-20T16:17:39.649Z" }, - { url = "https://files.pythonhosted.org/packages/53/e5/d74b5ccf6712c06c7a545025a6a71bfa03bdc7e0568b405b0d655232fd92/numpy-2.4.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:355354388cba60f2132df297e2d53053d4063f79077b67b481d21276d61fc4df", size = 12494312, upload-time = "2025-12-20T16:17:41.714Z" }, - { url = "https://files.pythonhosted.org/packages/c2/08/3ca9cc2ddf54dfee7ae9a6479c071092a228c68aef08252aa08dac2af002/numpy-2.4.0-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:1d8f9fde5f6dc1b6fc34df8162f3b3079365468703fee7f31d4e0cc8c63baed9", size = 5322862, upload-time = "2025-12-20T16:17:44.145Z" }, - { url = "https://files.pythonhosted.org/packages/87/74/0bb63a68394c0c1e52670cfff2e309afa41edbe11b3327d9af29e4383f34/numpy-2.4.0-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:e0434aa22c821f44eeb4c650b81c7fbdd8c0122c6c4b5a576a76d5a35625ecd9", size = 6644986, upload-time = "2025-12-20T16:17:46.203Z" }, - { url = "https://files.pythonhosted.org/packages/06/8f/9264d9bdbcf8236af2823623fe2f3981d740fc3461e2787e231d97c38c28/numpy-2.4.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:40483b2f2d3ba7aad426443767ff5632ec3156ef09742b96913787d13c336471", size = 14457958, upload-time = "2025-12-20T16:17:48.017Z" }, - { url = "https://files.pythonhosted.org/packages/8c/d9/f9a69ae564bbc7236a35aa883319364ef5fd41f72aa320cc1cbe66148fe2/numpy-2.4.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9e6a7664ddd9746e20b7325351fe1a8408d0a2bf9c63b5e898290ddc8f09544", size = 16398394, upload-time = "2025-12-20T16:17:50.409Z" }, - { url = "https://files.pythonhosted.org/packages/34/c7/39241501408dde7f885d241a98caba5421061a2c6d2b2197ac5e3aa842d8/numpy-2.4.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ecb0019d44f4cdb50b676c5d0cb4b1eae8e15d1ed3d3e6639f986fc92b2ec52c", size = 16241044, upload-time = "2025-12-20T16:17:52.661Z" }, - { url = "https://files.pythonhosted.org/packages/7c/95/cae7effd90e065a95e59fe710eeee05d7328ed169776dfdd9f789e032125/numpy-2.4.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d0ffd9e2e4441c96a9c91ec1783285d80bf835b677853fc2770a89d50c1e48ac", size = 18321772, upload-time = "2025-12-20T16:17:54.947Z" }, - { url = "https://files.pythonhosted.org/packages/96/df/3c6c279accd2bfb968a76298e5b276310bd55d243df4fa8ac5816d79347d/numpy-2.4.0-cp314-cp314t-win32.whl", hash = "sha256:77f0d13fa87036d7553bf81f0e1fe3ce68d14c9976c9851744e4d3e91127e95f", size = 6148320, upload-time = "2025-12-20T16:17:57.249Z" }, - { url = "https://files.pythonhosted.org/packages/92/8d/f23033cce252e7a75cae853d17f582e86534c46404dea1c8ee094a9d6d84/numpy-2.4.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b1f5b45829ac1848893f0ddf5cb326110604d6df96cdc255b0bf9edd154104d4", size = 12623460, upload-time = "2025-12-20T16:17:58.963Z" }, - { url = "https://files.pythonhosted.org/packages/a4/4f/1f8475907d1a7c4ef9020edf7f39ea2422ec896849245f00688e4b268a71/numpy-2.4.0-cp314-cp314t-win_arm64.whl", hash = "sha256:23a3e9d1a6f360267e8fbb38ba5db355a6a7e9be71d7fce7ab3125e88bb646c8", size = 10661799, upload-time = "2025-12-20T16:18:01.078Z" }, - { url = "https://files.pythonhosted.org/packages/4b/ef/088e7c7342f300aaf3ee5f2c821c4b9996a1bef2aaf6a49cc8ab4883758e/numpy-2.4.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b54c83f1c0c0f1d748dca0af516062b8829d53d1f0c402be24b4257a9c48ada6", size = 16819003, upload-time = "2025-12-20T16:18:03.41Z" }, - { url = "https://files.pythonhosted.org/packages/ff/ce/a53017b5443b4b84517182d463fc7bcc2adb4faa8b20813f8e5f5aeb5faa/numpy-2.4.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:aabb081ca0ec5d39591fc33018cd4b3f96e1a2dd6756282029986d00a785fba4", size = 12567105, upload-time = "2025-12-20T16:18:05.594Z" }, - { url = "https://files.pythonhosted.org/packages/77/58/5ff91b161f2ec650c88a626c3905d938c89aaadabd0431e6d9c1330c83e2/numpy-2.4.0-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:8eafe7c36c8430b7794edeab3087dec7bf31d634d92f2af9949434b9d1964cba", size = 5395590, upload-time = "2025-12-20T16:18:08.031Z" }, - { url = "https://files.pythonhosted.org/packages/1d/4e/f1a084106df8c2df8132fc437e56987308e0524836aa7733721c8429d4fe/numpy-2.4.0-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:2f585f52b2baf07ff3356158d9268ea095e221371f1074fadea2f42544d58b4d", size = 6709947, upload-time = "2025-12-20T16:18:09.836Z" }, - { url = "https://files.pythonhosted.org/packages/63/09/3d8aeb809c0332c3f642da812ac2e3d74fc9252b3021f8c30c82e99e3f3d/numpy-2.4.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:32ed06d0fe9cae27d8fb5f400c63ccee72370599c75e683a6358dd3a4fb50aaf", size = 14535119, upload-time = "2025-12-20T16:18:12.105Z" }, - { url = "https://files.pythonhosted.org/packages/fd/7f/68f0fc43a2cbdc6bb239160c754d87c922f60fbaa0fa3cd3d312b8a7f5ee/numpy-2.4.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:57c540ed8fb1f05cb997c6761cd56db72395b0d6985e90571ff660452ade4f98", size = 16475815, upload-time = "2025-12-20T16:18:14.433Z" }, - { url = "https://files.pythonhosted.org/packages/11/73/edeacba3167b1ca66d51b1a5a14697c2c40098b5ffa01811c67b1785a5ab/numpy-2.4.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:a39fb973a726e63223287adc6dafe444ce75af952d711e400f3bf2b36ef55a7b", size = 12489376, upload-time = "2025-12-20T16:18:16.524Z" }, -] - [[package]] name = "nvidia-cublas-cu12" version = "12.8.4.1" @@ -5133,8 +5069,7 @@ version = "1.20.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ml-dtypes" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, { name = "protobuf" }, { name = "typing-extensions" }, ] @@ -5171,8 +5106,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "coloredlogs" }, { name = "flatbuffers" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, { name = "packaging" }, { name = "protobuf" }, { name = "sympy" }, @@ -5209,8 +5143,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "coloredlogs" }, { name = "flatbuffers" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, { name = "packaging" }, { name = "protobuf" }, { name = "sympy" }, @@ -5257,8 +5190,7 @@ dependencies = [ { name = "flask" }, { name = "matplotlib" }, { name = "nbformat" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, { name = "pandas" }, { name = "pillow" }, { name = "pyquaternion" }, @@ -5306,8 +5238,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ffmpeg-python" }, { name = "more-itertools" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, { name = "torch" }, { name = "tqdm" }, { name = "transformers" }, @@ -5319,8 +5250,7 @@ name = "opencv-contrib-python" version = "4.10.0.84" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, ] sdist = { url = "https://files.pythonhosted.org/packages/1d/33/7b8ec6c4d45e678b26297e4a5e76464a93033a9adcc8c17eac01097065f6/opencv-contrib-python-4.10.0.84.tar.gz", hash = "sha256:4a3eae0ed9cadf1abe9293a6938a25a540e2fd6d7fc308595caa5896c8b36a0c", size = 150433857, upload-time = "2024-06-17T18:30:50.217Z" } wheels = [ @@ -5337,8 +5267,7 @@ name = "opencv-python" version = "4.11.0.86" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, ] sdist = { url = "https://files.pythonhosted.org/packages/17/06/68c27a523103dad5837dc5b87e71285280c4f098c60e4fe8a8db6486ab09/opencv-python-4.11.0.86.tar.gz", hash = "sha256:03d60ccae62304860d232272e4a4fda93c39d595780cb40b161b310244b736a4", size = 95171956, upload-time = "2025-01-16T13:52:24.737Z" } wheels = [ @@ -5453,8 +5382,7 @@ dependencies = [ { name = "jax", version = "0.8.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "jaxlib", version = "0.6.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "jaxlib", version = "0.8.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, ] sdist = { url = "https://files.pythonhosted.org/packages/6d/3b/90c11f740a3538200b61cd2b7d9346959cb9e31e0bdea3d2f886b7262203/optax-0.2.6.tar.gz", hash = "sha256:ba8d1e12678eba2657484d6feeca4fb281b8066bdfd5efbfc0f41b87663109c0", size = 269660, upload-time = "2025-09-15T22:41:24.76Z" } wheels = [ @@ -5474,8 +5402,7 @@ dependencies = [ { name = "jax", version = "0.8.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "msgpack" }, { name = "nest-asyncio" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, { name = "protobuf" }, { name = "psutil" }, { name = "pyyaml" }, @@ -5593,8 +5520,7 @@ name = "pandas" version = "2.3.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, { name = "python-dateutil" }, { name = "pytz" }, { name = "tzdata" }, @@ -5655,8 +5581,7 @@ name = "pandas-stubs" version = "2.3.3.251201" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, { name = "types-pytz" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ee/a6/491b2af2cb3ee232765a73fb273a44cc1ac33b154f7745b2df2ee1dc4d01/pandas_stubs-2.3.3.251201.tar.gz", hash = "sha256:7a980f4f08cff2a6d7e4c6d6d26f4c5fcdb82a6f6531489b2f75c81567fe4536", size = 107787, upload-time = "2025-12-01T18:29:22.403Z" } @@ -6285,8 +6210,7 @@ name = "pycocotools" version = "2.0.11" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a2/df/32354b5dda963ffdfc8f75c9acf8828ef7890723a4ed57bb3ff2dc1d6f7e/pycocotools-2.0.11.tar.gz", hash = "sha256:34254d76da85576fcaf5c1f3aa9aae16b8cb15418334ba4283b800796bd1993d", size = 25381, upload-time = "2025-12-15T22:31:46.148Z" } wheels = [ @@ -6735,8 +6659,7 @@ name = "pyquaternion" version = "0.9.9" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, ] sdist = { url = "https://files.pythonhosted.org/packages/7d/0d/3d092aa20efaedacb89c3221a92c6491be5b28f618a2c36b52b53e7446c2/pyquaternion-0.9.9.tar.gz", hash = "sha256:b1f61af219cb2fe966b5fb79a192124f2e63a3f7a777ac3cadf2957b1a81bea8", size = 15530, upload-time = "2020-10-05T01:31:30.327Z" } wheels = [ @@ -6761,8 +6684,7 @@ dependencies = [ { name = "imageio" }, { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "networkx", version = "3.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, { name = "pillow" }, { name = "pyglet" }, { name = "pyopengl" }, @@ -6904,8 +6826,7 @@ version = "0.7.0.10" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cython" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/ec/ff/5f095a3f8a4ba918b14f61d6566fd50dcad0beb0f8f8e7f9569f4fc70469/python_fcl-0.7.0.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9a2428768f6d1d3dab1e3f7ccbae3cd5e36287e74e1006773fdc5c1fc908b375", size = 2004230, upload-time = "2025-10-22T06:28:08.625Z" }, @@ -6961,8 +6882,7 @@ name = "pyturbojpeg" version = "1.8.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, ] sdist = { url = "https://files.pythonhosted.org/packages/d2/e8/0cbd6e4f086a3b9261b2539ab5ddb1e3ba0c94d45b47832594d4b4607586/PyTurboJPEG-1.8.2.tar.gz", hash = "sha256:b7d9625bbb2121b923228fc70d0c2b010b386687501f5b50acec4501222e152b", size = 12694, upload-time = "2025-06-22T07:26:45.861Z" } @@ -7565,7 +7485,7 @@ resolution-markers = [ ] dependencies = [ { name = "joblib", marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", marker = "python_full_version < '3.11'" }, { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "threadpoolctl", marker = "python_full_version < '3.11'" }, ] @@ -7623,7 +7543,7 @@ resolution-markers = [ ] dependencies = [ { name = "joblib", marker = "python_full_version >= '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", marker = "python_full_version >= '3.11'" }, { name = "scipy", version = "1.16.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "threadpoolctl", marker = "python_full_version >= '3.11'" }, ] @@ -7678,7 +7598,7 @@ resolution-markers = [ "(python_full_version < '3.11' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.11' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')", ] dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0f/37/6964b830433e654ec7485e45a00fc9a27cf868d622838f6b6d9c5ec0d532/scipy-1.15.3.tar.gz", hash = "sha256:eae3cf522bc7df64b42cad3925c876e1b0b6c35c1337c93e12c0f366f55b0eaf", size = 59419214, upload-time = "2025-05-08T16:13:05.955Z" } wheels = [ @@ -7748,7 +7668,7 @@ resolution-markers = [ "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version == '3.11.*' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')", ] dependencies = [ - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", marker = "python_full_version >= '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0a/ca/d8ace4f98322d01abcd52d381134344bf7b431eba7ed8b42bdea5a3c2ac9/scipy-1.16.3.tar.gz", hash = "sha256:01e87659402762f43bd2fee13370553a17ada367d42e7487800bf2916535aecb", size = 30597883, upload-time = "2025-10-28T17:38:54.068Z" } wheels = [ @@ -7973,8 +7893,7 @@ version = "0.13.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, ] sdist = { url = "https://files.pythonhosted.org/packages/e1/41/9b873a8c055582859b239be17902a85339bec6a30ad162f98c9b0288a2cc/soundfile-0.13.1.tar.gz", hash = "sha256:b2c68dab1e30297317080a5b43df57e302584c49e2942defdde0acccc53f0e5b", size = 46156, upload-time = "2025-01-25T09:17:04.831Z" } wheels = [ @@ -8144,8 +8063,7 @@ dependencies = [ { name = "absl-py" }, { name = "grpcio" }, { name = "markdown" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, { name = "packaging" }, { name = "pillow" }, { name = "protobuf" }, @@ -8172,8 +8090,7 @@ name = "tensorboardx" version = "2.6.4" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, { name = "packaging" }, { name = "protobuf" }, ] @@ -8194,7 +8111,7 @@ resolution-markers = [ ] dependencies = [ { name = "ml-dtypes", marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/9f/ee/05eb424437f4db63331c90e4605025eedc0f71da3faff97161d5d7b405af/tensorstore-0.1.78.tar.gz", hash = "sha256:e26074ffe462394cf54197eb76d6569b500f347573cd74da3f4dd5f510a4ad7c", size = 6913502, upload-time = "2025-10-06T17:44:29.649Z" } wheels = [ @@ -8240,7 +8157,7 @@ resolution-markers = [ ] dependencies = [ { name = "ml-dtypes", marker = "python_full_version >= '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", marker = "python_full_version >= '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/88/18/7b91daa9cf29dbb6bfdd603154f355c9069a9cd8c757038fe52b0f613611/tensorstore-0.1.80.tar.gz", hash = "sha256:4158fe76b96f62d12a37d7868150d836e089b5280b2bdd363c43c5d651f10e26", size = 7090032, upload-time = "2025-12-10T21:35:10.941Z" } wheels = [ @@ -8573,8 +8490,7 @@ name = "torchvision" version = "0.24.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, { name = "pillow" }, { name = "torch" }, ] @@ -8656,8 +8572,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "filelock" }, { name = "huggingface-hub" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, { name = "packaging" }, { name = "pyyaml" }, { name = "regex" }, @@ -8682,8 +8597,7 @@ name = "treescope" version = "0.1.10" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f0/2a/d13d3c38862632742d2fe2f7ae307c431db06538fd05ca03020d207b5dcc/treescope-0.1.10.tar.gz", hash = "sha256:20f74656f34ab2d8716715013e8163a0da79bdc2554c16d5023172c50d27ea95", size = 138870, upload-time = "2025-08-08T05:43:48.048Z" } wheels = [ @@ -8695,8 +8609,7 @@ name = "trimesh" version = "4.10.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, ] sdist = { url = "https://files.pythonhosted.org/packages/83/69/eedfeb084460d429368e03db83ed41b18d6de4fd4945de7eb8874b9fae36/trimesh-4.10.1.tar.gz", hash = "sha256:2067ebb8dcde0d7f00c2a85bfcae4aa891c40898e5f14232592429025ee2c593", size = 831998, upload-time = "2025-12-07T00:39:05.838Z" } wheels = [ @@ -8810,8 +8723,7 @@ name = "types-networkx" version = "3.6.1.20251220" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, ] sdist = { url = "https://files.pythonhosted.org/packages/07/e3/dcc20d645dc0631b0df263959b8dde49dc47ad3c0537d8958bfefe692380/types_networkx-3.6.1.20251220.tar.gz", hash = "sha256:caf95e0d7777b969e50ceeb2c430d9d4dfe6b7bdee43c42dc9879a2d4408a790", size = 73500, upload-time = "2025-12-20T03:07:47.933Z" } wheels = [ @@ -8898,8 +8810,7 @@ name = "types-tensorflow" version = "2.18.0.20251008" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, { name = "types-protobuf" }, { name = "types-requests" }, ] @@ -8965,8 +8876,7 @@ version = "8.3.241" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "matplotlib" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, { name = "opencv-python" }, { name = "pillow" }, { name = "polars" }, @@ -8989,8 +8899,7 @@ name = "ultralytics-thop" version = "2.0.18" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, { name = "torch" }, ] sdist = { url = "https://files.pythonhosted.org/packages/1f/63/21a32e1facfeee245dbdfb7b4669faf7a36ff7c00b50987932bdab126f4b/ultralytics_thop-2.0.18.tar.gz", hash = "sha256:21103bcd39cc9928477dc3d9374561749b66a1781b35f46256c8d8c4ac01d9cf", size = 34557, upload-time = "2025-10-29T16:58:13.526Z" } @@ -9417,8 +9326,7 @@ name = "xformers" version = "0.0.33.post2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy" }, { name = "torch" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0b/69/403e963d35f1b0c52a1b3127e0bc4e94e7e50ecee8c6684a8abe40e6638e/xformers-0.0.33.post2.tar.gz", hash = "sha256:647ddf26578d2b8643230467ef1f0fbfef0bbe556a546bd27a70d4855d3433e1", size = 14783914, upload-time = "2025-12-04T18:52:42.572Z" } From 4117321e6d6e6a9243db19cf582811ecfd3fb294 Mon Sep 17 00:00:00 2001 From: Paul Nechifor Date: Wed, 24 Dec 2025 07:13:30 +0200 Subject: [PATCH 08/19] use dev for now --- dimos/core/__init__.py | 25 ++++++++++++------------- dimos/utils/data.py | 3 ++- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/dimos/core/__init__.py b/dimos/core/__init__.py index c8bb091596..37aa9bc619 100644 --- a/dimos/core/__init__.py +++ b/dimos/core/__init__.py @@ -93,22 +93,21 @@ def deploy( # type: ignore[no-untyped-def] *args, **kwargs, ): - console = Console() - with console.status(f"deploying [green]{actor_class.__name__}\n", spinner="arc"): - actor = dask_client.submit( # type: ignore[no-untyped-call] - actor_class, - *args, - **kwargs, - actor=True, - ).result() + logger.info("Deploying module.", module=actor_class.__name__) + actor = dask_client.submit( # type: ignore[no-untyped-call] + actor_class, + *args, + **kwargs, + actor=True, + ).result() - worker = actor.set_ref(actor).result() - logger.info("Deployed module.", module=actor._cls.__name__, worker_id=worker) + worker = actor.set_ref(actor).result() + logger.info("Deployed module.", module=actor._cls.__name__, worker_id=worker) - # Register actor deployment in shared memory - ActorRegistry.update(str(actor), str(worker)) + # Register actor deployment in shared memory + ActorRegistry.update(str(actor), str(worker)) - return RPCClient(actor, actor_class) + return RPCClient(actor, actor_class) def check_worker_memory() -> None: """Check memory usage of all workers.""" diff --git a/dimos/utils/data.py b/dimos/utils/data.py index 517b4ee162..6f4542355e 100644 --- a/dimos/utils/data.py +++ b/dimos/utils/data.py @@ -78,7 +78,8 @@ def _get_repo_root() -> Path: "--depth", "1", "--branch", - "main", + # TODO: Use "main", + "dev", "git@github.com:dimensionalOS/dimos.git", str(repo_dir), ], From e5de611514322146a7f6a7e0285ce41e7fcbe2a6 Mon Sep 17 00:00:00 2001 From: Paul Nechifor Date: Wed, 24 Dec 2025 07:14:31 +0200 Subject: [PATCH 09/19] increase steps per frame --- dimos/simulation/mujoco/constants.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dimos/simulation/mujoco/constants.py b/dimos/simulation/mujoco/constants.py index 2368768954..84e10c2de0 100644 --- a/dimos/simulation/mujoco/constants.py +++ b/dimos/simulation/mujoco/constants.py @@ -28,7 +28,7 @@ LIDAR_RESOLUTION = 0.05 # Simulation timing constants -STEPS_PER_FRAME = 1 +STEPS_PER_FRAME = 3 VIDEO_FPS = 20 LIDAR_FPS = 2 From 101dd2e617e8d928f31359a68c08c3e1aaff7f94 Mon Sep 17 00:00:00 2001 From: Paul Nechifor Date: Wed, 24 Dec 2025 07:34:10 +0200 Subject: [PATCH 10/19] inline backpressure --- dimos/rxpy_backpressure/__init__.py | 3 + dimos/rxpy_backpressure/backpressure.py | 50 +++++++++++++ dimos/rxpy_backpressure/drop.py | 80 ++++++++++++++++++++ dimos/rxpy_backpressure/function_runner.py | 19 +++++ dimos/rxpy_backpressure/latest.py | 70 ++++++++++++++++++ dimos/rxpy_backpressure/locks.py | 43 +++++++++++ dimos/rxpy_backpressure/observer.py | 31 ++++++++ dimos/rxpy_backpressure/sized_buffer.py | 85 ++++++++++++++++++++++ pyproject.toml | 2 - uv.lock | 7 -- 10 files changed, 381 insertions(+), 9 deletions(-) create mode 100644 dimos/rxpy_backpressure/__init__.py create mode 100644 dimos/rxpy_backpressure/backpressure.py create mode 100644 dimos/rxpy_backpressure/drop.py create mode 100644 dimos/rxpy_backpressure/function_runner.py create mode 100644 dimos/rxpy_backpressure/latest.py create mode 100644 dimos/rxpy_backpressure/locks.py create mode 100644 dimos/rxpy_backpressure/observer.py create mode 100644 dimos/rxpy_backpressure/sized_buffer.py diff --git a/dimos/rxpy_backpressure/__init__.py b/dimos/rxpy_backpressure/__init__.py new file mode 100644 index 0000000000..e4a6d34887 --- /dev/null +++ b/dimos/rxpy_backpressure/__init__.py @@ -0,0 +1,3 @@ +from rxpy_backpressure.backpressure import BackPressure + +__all__ = [BackPressure] diff --git a/dimos/rxpy_backpressure/backpressure.py b/dimos/rxpy_backpressure/backpressure.py new file mode 100644 index 0000000000..efe09aa482 --- /dev/null +++ b/dimos/rxpy_backpressure/backpressure.py @@ -0,0 +1,50 @@ +# Copyright 2025 Dimensional Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from rxpy_backpressure.drop import ( + wrap_observer_with_buffer_strategy, + wrap_observer_with_drop_strategy, +) +from rxpy_backpressure.latest import wrap_observer_with_latest_strategy +from rxpy_backpressure.sized_buffer import wrap_observer_with_sized_buffer_strategy + + +class BackPressure: + """ + Latest strategy will remember the next most recent message to process and will call the observer with it when + the observer has finished processing its current message. + """ + + LATEST = wrap_observer_with_latest_strategy + + """ + Drop strategy accepts a cache size, the strategy will remember the most recent messages and remove older + messages from the cache. The strategy guarantees that the oldest messages in the cache are passed to the + observer first. + :param cache_size: int = 10 is default + """ + DROP = wrap_observer_with_drop_strategy + + """ + Buffer strategy has a unbounded cache and will pass all messages to its consumer in the order it received them + beware of Memory leaks due to a build up of messages. + """ + BUFFER = wrap_observer_with_buffer_strategy + + """ + Sized buffer has a fix sized cache, the strategy will perform opposite of Drop and will refuse new messages + as long as the buffer is full and will accept them only once the buffer has available space. + :param cache_size: int = 50 is default + """ + SIZED_BUFFER = wrap_observer_with_sized_buffer_strategy diff --git a/dimos/rxpy_backpressure/drop.py b/dimos/rxpy_backpressure/drop.py new file mode 100644 index 0000000000..25091772eb --- /dev/null +++ b/dimos/rxpy_backpressure/drop.py @@ -0,0 +1,80 @@ +# Copyright 2025 Dimensional Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import Any, List, Optional + +from rxpy_backpressure.function_runner import thread_function_runner +from rxpy_backpressure.locks import BooleanLock, Lock +from rxpy_backpressure.observer import Observer + + +class DropBackPressureStrategy(Observer): + def __init__(self, wrapped_observer: Observer, cache_size: int): + self.wrapped_observer: Observer = wrapped_observer + self.__function_runner = thread_function_runner + self.__lock: Lock = BooleanLock() + self.__cache_size: int | None = cache_size + self.__message_cache: list = [] + self.__error_cache: list = [] + + def on_next(self, message): + if self.__lock.is_locked(): + self.__update_cache(self.__message_cache, message) + else: + self.__lock.lock() + self.__function_runner(self, self.__on_next, message) + + @staticmethod + def __on_next(self, message: any): + self.wrapped_observer.on_next(message) + if len(self.__message_cache) > 0: + self.__function_runner(self, self.__on_next, self.__message_cache.pop(0)) + else: + self.__lock.unlock() + + def on_error(self, error: any): + if self.__lock.is_locked(): + self.__update_cache(self.__error_cache, error) + else: + self.__lock.lock() + self.__function_runner(self, self.__on_error, error) + + @staticmethod + def __on_error(self, error: any): + self.wrapped_observer.on_error(error) + if len(self.__error_cache) > 0: + self.__function_runner(self, self.__on_error, self.__error_cache.pop(0)) + else: + self.__lock.unlock() + + def __update_cache(self, cache: list, item: Any): + if self.__cache_size is None or len(cache) < self.__cache_size: + cache.append(item) + else: + cache.pop(0) + cache.append(item) + + def on_completed(self): + self.wrapped_observer.on_completed() + + def is_locked(self): + return self.__lock.is_locked() + + +def wrap_observer_with_drop_strategy(observer: Observer, cache_size: int = 10) -> Observer: + return DropBackPressureStrategy(observer, cache_size=cache_size) + + +def wrap_observer_with_buffer_strategy(observer: Observer) -> Observer: + return DropBackPressureStrategy(observer, cache_size=None) diff --git a/dimos/rxpy_backpressure/function_runner.py b/dimos/rxpy_backpressure/function_runner.py new file mode 100644 index 0000000000..13e5a5dbba --- /dev/null +++ b/dimos/rxpy_backpressure/function_runner.py @@ -0,0 +1,19 @@ +# Copyright 2025 Dimensional Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from threading import Thread + + +def thread_function_runner(self, func, message): + Thread(target=func, args=(self, message)).start() diff --git a/dimos/rxpy_backpressure/latest.py b/dimos/rxpy_backpressure/latest.py new file mode 100644 index 0000000000..dcfb9d27ab --- /dev/null +++ b/dimos/rxpy_backpressure/latest.py @@ -0,0 +1,70 @@ +# Copyright 2025 Dimensional Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import Optional + +from rxpy_backpressure.function_runner import thread_function_runner +from rxpy_backpressure.locks import BooleanLock, Lock +from rxpy_backpressure.observer import Observer + + +class LatestBackPressureStrategy(Observer): + def __init__(self, wrapped_observer: Observer): + self.wrapped_observer: Observer = wrapped_observer + self.__function_runner = thread_function_runner + self.__lock: Lock = BooleanLock() + self.__message_cache: Optional = None + self.__error_cache: Optional = None + + def on_next(self, message): + if self.__lock.is_locked(): + self.__message_cache = message + else: + self.__lock.lock() + self.__function_runner(self, self.__on_next, message) + + @staticmethod + def __on_next(self, message: any): + self.wrapped_observer.on_next(message) + if self.__message_cache is not None: + self.__function_runner(self, self.__on_next, self.__message_cache) + self.__message_cache = None + else: + self.__lock.unlock() + + def on_error(self, error: any): + if self.__lock.is_locked(): + self.__error_cache = error + else: + self.__lock.lock() + self.__function_runner(self, self.__on_error, error) + + @staticmethod + def __on_error(self, error: any): + self.wrapped_observer.on_error(error) + if self.__error_cache: + self.__function_runner(self, self.__on_error, self.__error_cache) + self.__error_cache = None + else: + self.__lock.unlock() + + def on_completed(self): + self.wrapped_observer.on_completed() + + def is_locked(self): + return self.__lock.is_locked() + + +def wrap_observer_with_latest_strategy(observer: Observer) -> Observer: + return LatestBackPressureStrategy(observer) diff --git a/dimos/rxpy_backpressure/locks.py b/dimos/rxpy_backpressure/locks.py new file mode 100644 index 0000000000..2376d3723b --- /dev/null +++ b/dimos/rxpy_backpressure/locks.py @@ -0,0 +1,43 @@ +# Copyright 2025 Dimensional Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from abc import abstractmethod + + +class Lock: + @abstractmethod + def is_locked(self) -> bool: + return NotImplemented + + @abstractmethod + def unlock(self): + return NotImplemented + + @abstractmethod + def lock(self): + return NotImplemented + + +class BooleanLock(Lock): + def __init__(self): + self.locked: bool = False + + def is_locked(self) -> bool: + return self.locked + + def unlock(self): + self.locked = False + + def lock(self): + self.locked = True diff --git a/dimos/rxpy_backpressure/observer.py b/dimos/rxpy_backpressure/observer.py new file mode 100644 index 0000000000..f4fd8ea2d3 --- /dev/null +++ b/dimos/rxpy_backpressure/observer.py @@ -0,0 +1,31 @@ +# Copyright 2025 Dimensional Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from abc import ABCMeta, abstractmethod + + +class Observer: + __metaclass__ = ABCMeta + + @abstractmethod + def on_next(self, value): + return NotImplemented + + @abstractmethod + def on_error(self, error): + return NotImplemented + + @abstractmethod + def on_completed(self): + return NotImplemented diff --git a/dimos/rxpy_backpressure/sized_buffer.py b/dimos/rxpy_backpressure/sized_buffer.py new file mode 100644 index 0000000000..495309c3d8 --- /dev/null +++ b/dimos/rxpy_backpressure/sized_buffer.py @@ -0,0 +1,85 @@ +# Copyright 2025 Dimensional Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import Any, List, Optional + +from rxpy_backpressure.function_runner import thread_function_runner +from rxpy_backpressure.locks import BooleanLock, Lock +from rxpy_backpressure.observer import Observer +from utils.logging import Logger +from utils.stats import Counter + + +class SizedBufferBackPressureStrategy(Observer): + counter: Counter = Counter() + + def __init__(self, wrapped_observer: Observer, cache_size: int): + self.wrapped_observer: Observer = wrapped_observer + self.__function_runner = thread_function_runner + self.__lock: Lock = BooleanLock() + self.__cache_size: int | None = cache_size + self.__message_cache: list = [] + self.__error_cache: list = [] + self.__logger = Logger() + + @counter.processed_event + @counter.time + def on_next(self, message): + if self.__lock.is_locked(): + if not self.__update_cache(self.__message_cache, message): + self.__logger.warning("value not added, buffer full") + else: + self.__lock.lock() + self.__function_runner(self, self.__on_next, message) + + @staticmethod + def __on_next(self, message: any): + self.wrapped_observer.on_next(message) + if len(self.__message_cache) > 0: + self.__function_runner(self, self.__on_next, self.__message_cache.pop(0)) + else: + self.__lock.unlock() + + def on_error(self, error: any): + if self.__lock.is_locked(): + if not self.__update_cache(self.__error_cache, error): + self.__logger.warning("value not added, buffer full") + else: + self.__lock.lock() + self.__function_runner(self, self.__on_error, error) + + @staticmethod + def __on_error(self, error: any): + self.wrapped_observer.on_error(error) + if len(self.__error_cache) > 0: + self.__function_runner(self, self.__on_error, self.__error_cache.pop(0)) + else: + self.__lock.unlock() + + @counter.dropped_event + def __update_cache(self, cache: list, item: Any) -> bool: + if self.__cache_size is None or len(cache) < self.__cache_size: + cache.append(item) + return True + return False + + def on_completed(self): + self.wrapped_observer.on_completed() + + def is_locked(self): + return self.__lock.is_locked() + + +def wrap_observer_with_sized_buffer_strategy(observer: Observer, cache_size: int = 50) -> Observer: + return SizedBufferBackPressureStrategy(observer, cache_size=cache_size) diff --git a/pyproject.toml b/pyproject.toml index dfd8d0a37e..bd8e729c60 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -48,7 +48,6 @@ dependencies = [ "Flask>=2.2", "python-multipart==0.0.20", "reactivex", - "rxpy-backpressure", "asyncio==3.4.3", "go2-webrtc-connect", "tensorzero==2025.7.5", @@ -332,7 +331,6 @@ extra-build-dependencies = { detectron2 = ["torch"], contact-graspnet-pytorch = default-groups = [] [tool.uv.sources] -rxpy-backpressure = { git = "https://github.com/dimensionalOS/rxpy-backpressure.git" } go2-webrtc-connect = { git = "https://github.com/dimensionalOS/go2_webrtc_connect.git" } clip = { git = "https://github.com/openai/CLIP.git" } dimos-lcm = { git = "https://github.com/dimensionalOS/dimos-lcm.git", rev = "3aeb724863144a8ba6cf72c9f42761d1007deda4" } diff --git a/uv.lock b/uv.lock index 4d0f477487..e79e3028e8 100644 --- a/uv.lock +++ b/uv.lock @@ -1405,7 +1405,6 @@ dependencies = [ { name = "pyturbojpeg" }, { name = "reactivex" }, { name = "requests" }, - { name = "rxpy-backpressure" }, { name = "scikit-learn", version = "1.7.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "scikit-learn", version = "1.8.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, @@ -1606,7 +1605,6 @@ requires-dist = [ { name = "requests-mock", marker = "extra == 'dev'", specifier = "==1.12.1" }, { name = "rtree", marker = "extra == 'manipulation'" }, { name = "ruff", marker = "extra == 'dev'", specifier = "==0.14.3" }, - { name = "rxpy-backpressure", git = "https://github.com/dimensionalOS/rxpy-backpressure.git" }, { name = "scikit-learn" }, { name = "scipy", specifier = ">=1.15.1" }, { name = "sentence-transformers" }, @@ -7442,11 +7440,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/73/4de6579bac8e979fca0a77e54dec1f1e011a0d268165eb8a9bc0982a6564/ruff-0.14.3-py3-none-win_arm64.whl", hash = "sha256:26eb477ede6d399d898791d01961e16b86f02bc2486d0d1a7a9bb2379d055dc1", size = 12590017, upload-time = "2025-10-31T00:26:24.52Z" }, ] -[[package]] -name = "rxpy-backpressure" -version = "1.0.0" -source = { git = "https://github.com/dimensionalOS/rxpy-backpressure.git#e3a696950c0483ad3f405616a3a60b8b7c60e1a8" } - [[package]] name = "safetensors" version = "0.7.0" From 458120b4cc48865232d380315396aac0987bfb9b Mon Sep 17 00:00:00 2001 From: Paul Nechifor Date: Wed, 24 Dec 2025 07:34:47 +0200 Subject: [PATCH 11/19] fix imports --- dimos/rxpy_backpressure/drop.py | 2 +- dimos/rxpy_backpressure/sized_buffer.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dimos/rxpy_backpressure/drop.py b/dimos/rxpy_backpressure/drop.py index 25091772eb..198e998838 100644 --- a/dimos/rxpy_backpressure/drop.py +++ b/dimos/rxpy_backpressure/drop.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -from typing import Any, List, Optional +from typing import Any from rxpy_backpressure.function_runner import thread_function_runner from rxpy_backpressure.locks import BooleanLock, Lock diff --git a/dimos/rxpy_backpressure/sized_buffer.py b/dimos/rxpy_backpressure/sized_buffer.py index 495309c3d8..7a75cb4e23 100644 --- a/dimos/rxpy_backpressure/sized_buffer.py +++ b/dimos/rxpy_backpressure/sized_buffer.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -from typing import Any, List, Optional +from typing import Any from rxpy_backpressure.function_runner import thread_function_runner from rxpy_backpressure.locks import BooleanLock, Lock From 9b484e5a10a362264249e2e9f2a7bdb5afe21b5d Mon Sep 17 00:00:00 2001 From: Paul Nechifor Date: Wed, 24 Dec 2025 07:51:18 +0200 Subject: [PATCH 12/19] remove go2-webrtc-connect clone --- pyproject.toml | 1 - uv.lock | 32 ++++++++++++++------------------ 2 files changed, 14 insertions(+), 19 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index bd8e729c60..8103d51b28 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -331,7 +331,6 @@ extra-build-dependencies = { detectron2 = ["torch"], contact-graspnet-pytorch = default-groups = [] [tool.uv.sources] -go2-webrtc-connect = { git = "https://github.com/dimensionalOS/go2_webrtc_connect.git" } clip = { git = "https://github.com/openai/CLIP.git" } dimos-lcm = { git = "https://github.com/dimensionalOS/dimos-lcm.git", rev = "3aeb724863144a8ba6cf72c9f42761d1007deda4" } contact-graspnet-pytorch = { git = "https://github.com/dimensionalOS/contact_graspnet_pytorch.git" } diff --git a/uv.lock b/uv.lock index e79e3028e8..2d340d0fd9 100644 --- a/uv.lock +++ b/uv.lock @@ -68,11 +68,15 @@ wheels = [ [[package]] name = "aioice" version = "0.9.0" -source = { git = "https://github.com/legion1581/aioice.git?rev=go2#ff5755a1e37127411b5fc797c105804db8437445" } +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "dnspython" }, { name = "ifaddr" }, ] +sdist = { url = "https://files.pythonhosted.org/packages/33/b6/e2b0e48ccb5b04fe29265e93f14a0915f416e359c897ae87d570566c430b/aioice-0.9.0.tar.gz", hash = "sha256:fc2401b1c4b6e19372eaaeaa28fd1bd9cbf6b0e412e48625297c53b495eebd1e", size = 40324, upload-time = "2023-04-01T14:17:34.853Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b6/35/d21e48d3ba25d32aba5d142d54c4491376c659dd74d052a30dd25198007b/aioice-0.9.0-py3-none-any.whl", hash = "sha256:b609597a3a5a611e0004ff04772e16aceb881d51c25c0afc4ceac05d5e50024e", size = 24177, upload-time = "2023-04-01T14:17:33.538Z" }, +] [[package]] name = "aiortc" @@ -1534,7 +1538,7 @@ requires-dist = [ { name = "flask", specifier = ">=2.2" }, { name = "ftfy", marker = "extra == 'cuda'" }, { name = "gdown", specifier = "==5.2.0" }, - { name = "go2-webrtc-connect", git = "https://github.com/dimensionalOS/go2_webrtc_connect.git" }, + { name = "go2-webrtc-connect" }, { name = "googlemaps", specifier = ">=4.10.0" }, { name = "h5py", marker = "extra == 'manipulation'", specifier = ">=3.7.0" }, { name = "ipykernel" }, @@ -2261,21 +2265,22 @@ wheels = [ [[package]] name = "go2-webrtc-connect" -version = "0.0.1" -source = { git = "https://github.com/dimensionalOS/go2_webrtc_connect.git#ba8b343fca482e55dc126e9254b81437b6f800d0" } +version = "0.2.1" +source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "aioice" }, { name = "aiortc" }, { name = "flask-socketio" }, { name = "lz4" }, - { name = "opencv-python" }, - { name = "pyaudio" }, + { name = "numpy" }, + { name = "packaging" }, { name = "pycryptodome" }, - { name = "pydub" }, { name = "requests" }, - { name = "sounddevice" }, { name = "wasmtime" }, ] +sdist = { url = "https://files.pythonhosted.org/packages/9e/8d/482ed17c425360ce755554132220b60d2ff185d2eb84b276d9de45bcea62/go2_webrtc_connect-0.2.1.tar.gz", hash = "sha256:9fddf74f6e75963af0d0ecf86dfa10fce8d2a11a3f7a46f0f28e686e35b0e058", size = 31733, upload-time = "2025-08-22T13:21:51.473Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/16/4f59c951a9d1616e684950067ed874f8ed65d6f0dd3d2dda9ac58a928551/go2_webrtc_connect-0.2.1-py3-none-any.whl", hash = "sha256:520f13cee82cd6a74c7de4ec4c3513deab658eff1c92cf03fdf6d28cd8dd03c6", size = 38447, upload-time = "2025-08-22T13:21:49.24Z" }, +] [[package]] name = "google-auth" @@ -6452,15 +6457,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7e/32/a7125fb28c4261a627f999d5fb4afff25b523800faed2c30979949d6facd/pydot-4.0.1-py3-none-any.whl", hash = "sha256:869c0efadd2708c0be1f916eb669f3d664ca684bc57ffb7ecc08e70d5e93fee6", size = 37087, upload-time = "2025-06-17T20:09:55.25Z" }, ] -[[package]] -name = "pydub" -version = "0.25.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fe/9a/e6bca0eed82db26562c73b5076539a4a08d3cffd19c3cc5913a3e61145fd/pydub-0.25.1.tar.gz", hash = "sha256:980a33ce9949cab2a569606b65674d748ecbca4f0796887fd6f46173a7b0d30f", size = 38326, upload-time = "2021-03-10T02:09:54.659Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a6/53/d78dc063216e62fc55f6b2eebb447f6a4b0a59f55c8406376f76bf959b08/pydub-0.25.1-py2.py3-none-any.whl", hash = "sha256:65617e33033874b59d87db603aa1ed450633288aefead953b30bded59cb599a6", size = 32327, upload-time = "2021-03-10T02:09:53.503Z" }, -] - [[package]] name = "pyee" version = "13.0.0" From 4db2fd329a1b1ce50bfe738a6e276645bf889079 Mon Sep 17 00:00:00 2001 From: Paul Nechifor Date: Wed, 24 Dec 2025 14:25:24 +0200 Subject: [PATCH 13/19] fix rxpy backpressure --- dimos/rxpy_backpressure/__init__.py | 2 +- dimos/rxpy_backpressure/backpressure.py | 27 +------ dimos/rxpy_backpressure/drop.py | 21 +----- dimos/rxpy_backpressure/function_runner.py | 15 +--- dimos/rxpy_backpressure/latest.py | 21 +----- dimos/rxpy_backpressure/locks.py | 15 +--- dimos/rxpy_backpressure/observer.py | 15 +--- dimos/rxpy_backpressure/sized_buffer.py | 85 ---------------------- dimos/utils/reactive.py | 2 +- 9 files changed, 16 insertions(+), 187 deletions(-) delete mode 100644 dimos/rxpy_backpressure/sized_buffer.py diff --git a/dimos/rxpy_backpressure/__init__.py b/dimos/rxpy_backpressure/__init__.py index e4a6d34887..ff3b1f37c0 100644 --- a/dimos/rxpy_backpressure/__init__.py +++ b/dimos/rxpy_backpressure/__init__.py @@ -1,3 +1,3 @@ -from rxpy_backpressure.backpressure import BackPressure +from dimos.rxpy_backpressure.backpressure import BackPressure __all__ = [BackPressure] diff --git a/dimos/rxpy_backpressure/backpressure.py b/dimos/rxpy_backpressure/backpressure.py index efe09aa482..bf84fa95bd 100644 --- a/dimos/rxpy_backpressure/backpressure.py +++ b/dimos/rxpy_backpressure/backpressure.py @@ -1,23 +1,9 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from rxpy_backpressure.drop import ( +# Copyright (c) rxpy_backpressure +from dimos.rxpy_backpressure.drop import ( wrap_observer_with_buffer_strategy, wrap_observer_with_drop_strategy, ) -from rxpy_backpressure.latest import wrap_observer_with_latest_strategy -from rxpy_backpressure.sized_buffer import wrap_observer_with_sized_buffer_strategy +from dimos.rxpy_backpressure.latest import wrap_observer_with_latest_strategy class BackPressure: @@ -41,10 +27,3 @@ class BackPressure: beware of Memory leaks due to a build up of messages. """ BUFFER = wrap_observer_with_buffer_strategy - - """ - Sized buffer has a fix sized cache, the strategy will perform opposite of Drop and will refuse new messages - as long as the buffer is full and will accept them only once the buffer has available space. - :param cache_size: int = 50 is default - """ - SIZED_BUFFER = wrap_observer_with_sized_buffer_strategy diff --git a/dimos/rxpy_backpressure/drop.py b/dimos/rxpy_backpressure/drop.py index 198e998838..6273042f42 100644 --- a/dimos/rxpy_backpressure/drop.py +++ b/dimos/rxpy_backpressure/drop.py @@ -1,22 +1,9 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - +# Copyright (c) rxpy_backpressure from typing import Any -from rxpy_backpressure.function_runner import thread_function_runner -from rxpy_backpressure.locks import BooleanLock, Lock -from rxpy_backpressure.observer import Observer +from dimos.rxpy_backpressure.function_runner import thread_function_runner +from dimos.rxpy_backpressure.locks import BooleanLock, Lock +from dimos.rxpy_backpressure.observer import Observer class DropBackPressureStrategy(Observer): diff --git a/dimos/rxpy_backpressure/function_runner.py b/dimos/rxpy_backpressure/function_runner.py index 13e5a5dbba..7779016d41 100644 --- a/dimos/rxpy_backpressure/function_runner.py +++ b/dimos/rxpy_backpressure/function_runner.py @@ -1,17 +1,4 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - +# Copyright (c) rxpy_backpressure from threading import Thread diff --git a/dimos/rxpy_backpressure/latest.py b/dimos/rxpy_backpressure/latest.py index dcfb9d27ab..73a4ebc8d9 100644 --- a/dimos/rxpy_backpressure/latest.py +++ b/dimos/rxpy_backpressure/latest.py @@ -1,22 +1,9 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - +# Copyright (c) rxpy_backpressure from typing import Optional -from rxpy_backpressure.function_runner import thread_function_runner -from rxpy_backpressure.locks import BooleanLock, Lock -from rxpy_backpressure.observer import Observer +from dimos.rxpy_backpressure.function_runner import thread_function_runner +from dimos.rxpy_backpressure.locks import BooleanLock, Lock +from dimos.rxpy_backpressure.observer import Observer class LatestBackPressureStrategy(Observer): diff --git a/dimos/rxpy_backpressure/locks.py b/dimos/rxpy_backpressure/locks.py index 2376d3723b..62c58c25b2 100644 --- a/dimos/rxpy_backpressure/locks.py +++ b/dimos/rxpy_backpressure/locks.py @@ -1,17 +1,4 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - +# Copyright (c) rxpy_backpressure from abc import abstractmethod diff --git a/dimos/rxpy_backpressure/observer.py b/dimos/rxpy_backpressure/observer.py index f4fd8ea2d3..7cf023c04f 100644 --- a/dimos/rxpy_backpressure/observer.py +++ b/dimos/rxpy_backpressure/observer.py @@ -1,17 +1,4 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - +# Copyright (c) rxpy_backpressure from abc import ABCMeta, abstractmethod diff --git a/dimos/rxpy_backpressure/sized_buffer.py b/dimos/rxpy_backpressure/sized_buffer.py deleted file mode 100644 index 7a75cb4e23..0000000000 --- a/dimos/rxpy_backpressure/sized_buffer.py +++ /dev/null @@ -1,85 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from typing import Any - -from rxpy_backpressure.function_runner import thread_function_runner -from rxpy_backpressure.locks import BooleanLock, Lock -from rxpy_backpressure.observer import Observer -from utils.logging import Logger -from utils.stats import Counter - - -class SizedBufferBackPressureStrategy(Observer): - counter: Counter = Counter() - - def __init__(self, wrapped_observer: Observer, cache_size: int): - self.wrapped_observer: Observer = wrapped_observer - self.__function_runner = thread_function_runner - self.__lock: Lock = BooleanLock() - self.__cache_size: int | None = cache_size - self.__message_cache: list = [] - self.__error_cache: list = [] - self.__logger = Logger() - - @counter.processed_event - @counter.time - def on_next(self, message): - if self.__lock.is_locked(): - if not self.__update_cache(self.__message_cache, message): - self.__logger.warning("value not added, buffer full") - else: - self.__lock.lock() - self.__function_runner(self, self.__on_next, message) - - @staticmethod - def __on_next(self, message: any): - self.wrapped_observer.on_next(message) - if len(self.__message_cache) > 0: - self.__function_runner(self, self.__on_next, self.__message_cache.pop(0)) - else: - self.__lock.unlock() - - def on_error(self, error: any): - if self.__lock.is_locked(): - if not self.__update_cache(self.__error_cache, error): - self.__logger.warning("value not added, buffer full") - else: - self.__lock.lock() - self.__function_runner(self, self.__on_error, error) - - @staticmethod - def __on_error(self, error: any): - self.wrapped_observer.on_error(error) - if len(self.__error_cache) > 0: - self.__function_runner(self, self.__on_error, self.__error_cache.pop(0)) - else: - self.__lock.unlock() - - @counter.dropped_event - def __update_cache(self, cache: list, item: Any) -> bool: - if self.__cache_size is None or len(cache) < self.__cache_size: - cache.append(item) - return True - return False - - def on_completed(self): - self.wrapped_observer.on_completed() - - def is_locked(self): - return self.__lock.is_locked() - - -def wrap_observer_with_sized_buffer_strategy(observer: Observer, cache_size: int = 50) -> Observer: - return SizedBufferBackPressureStrategy(observer, cache_size=cache_size) diff --git a/dimos/utils/reactive.py b/dimos/utils/reactive.py index 30acd8a241..1587a201d4 100644 --- a/dimos/utils/reactive.py +++ b/dimos/utils/reactive.py @@ -21,7 +21,7 @@ from reactivex.disposable import Disposable from reactivex.observable import Observable from reactivex.scheduler import ThreadPoolScheduler -from rxpy_backpressure import BackPressure # type: ignore[import-untyped] +from dimos.rxpy_backpressure import BackPressure # type: ignore[import-untyped] from dimos.utils.threadpool import get_scheduler From 1d06d459faec0cdc359c3108655d372a7e9d24e6 Mon Sep 17 00:00:00 2001 From: Paul Nechifor Date: Thu, 25 Dec 2025 02:17:10 +0200 Subject: [PATCH 14/19] ignore rxpy_backpressure --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 8103d51b28..fa64a14b47 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -286,7 +286,7 @@ python_version = "3.12" incremental = true strict = true warn_unused_ignores = false -exclude = "^dimos/models/Detic(/|$)|.*/test_.|.*/conftest.py*" +exclude = "^dimos/models/Detic(/|$)|^dimos/rxpy_backpressure(/|$)|.*/test_.|.*/conftest.py*" [[tool.mypy.overrides]] module = [ From 0ecec75a136351993889b701c70e19c7791f3c3e Mon Sep 17 00:00:00 2001 From: Paul Nechifor Date: Thu, 25 Dec 2025 02:27:29 +0200 Subject: [PATCH 15/19] skip rxpy_backpressure errors --- .pre-commit-config.yaml | 2 +- dimos/rxpy_backpressure/LICENSE.txt | 21 +++++++++++++++++++++ dimos/stream/audio/node_volume_monitor.py | 2 +- pyproject.toml | 4 ++++ 4 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 dimos/rxpy_backpressure/LICENSE.txt diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 40b1877835..d263ea1631 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -9,7 +9,7 @@ repos: - id: remove-crlf - id: insert-license files: \.py$ - exclude: __init__\.py$ + exclude: (__init__\.py$)|(dimos/rxpy_backpressure/) args: # use if you want to remove licences from all files # (for globally changing wording or something) diff --git a/dimos/rxpy_backpressure/LICENSE.txt b/dimos/rxpy_backpressure/LICENSE.txt new file mode 100644 index 0000000000..8e1d704dc7 --- /dev/null +++ b/dimos/rxpy_backpressure/LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Mark Haynes + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/dimos/stream/audio/node_volume_monitor.py b/dimos/stream/audio/node_volume_monitor.py index 8c485f9376..001c5762af 100644 --- a/dimos/stream/audio/node_volume_monitor.py +++ b/dimos/stream/audio/node_volume_monitor.py @@ -169,7 +169,7 @@ def monitor( if __name__ == "__main__": from audio.node_simulated import SimulatedAudioSource # type: ignore[import-not-found] - from utils import keepalive # type: ignore[import-untyped] + from utils import keepalive # type: ignore[import-not-found] # Use the monitor function to create and connect the nodes volume_monitor = monitor(SimulatedAudioSource().emit_audio()) diff --git a/pyproject.toml b/pyproject.toml index fa64a14b47..9a6505bf01 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -302,6 +302,10 @@ module = [ ] ignore_missing_imports = true +[[tool.mypy.overrides]] +module = ["dimos.rxpy_backpressure", "dimos.rxpy_backpressure.*"] +follow_imports = "skip" + [tool.pytest.ini_options] testpaths = ["dimos"] markers = [ From 766a746283a4d0abc0093c79ffe4878f026671d6 Mon Sep 17 00:00:00 2001 From: Paul Nechifor Date: Thu, 25 Dec 2025 04:02:13 +0200 Subject: [PATCH 16/19] add new readme --- README_installation.md | 112 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 README_installation.md diff --git a/README_installation.md b/README_installation.md new file mode 100644 index 0000000000..23f0493b7f --- /dev/null +++ b/README_installation.md @@ -0,0 +1,112 @@ +# DimOS + +## Instalation + +Clone the repo: + +```bash +git clone --single-branch git@github.com:dimensionalOS/dimos.git +cd dimos +``` + +### System dependencies + +Tested on Ubuntu 22.04/24.04. + +```bash +sudo apt update +sudo apt install git-lfs python3-venv python3-pyaudio portaudio19-dev libturbojpeg0-dev +``` + +### Python dependencies + +Install `uv` by [following their instructions](https://docs.astral.sh/uv/getting-started/installation/) or just run: + +```bash +curl -LsSf https://astral.sh/uv/install.sh | sh +``` + +Install Python dependencies: + +```bash +uv sync +``` + +Depending on what you want to test you might want to install more optional dependencies as well (recommended): + +```bash +uv sync --extra dev --extra cpu --extra sim --extra drone +``` + +### Install Foxglove Studio (robot visualization and control) + +(This will be obsolete once we finish our migration to opensource [Rerun](https://rerun.io/).) + +Download and install [Foxglove Studio](https://foxglove.dev/download): + +```bash +wget https://get.foxglove.dev/desktop/latest/foxglove-studio-latest-linux-amd64.deb +sudo apt install ./foxglove-studio-*.deb +``` + +[Register an account](https://app.foxglove.dev/signup) to use it. + +Open Foxglove Studio: + +```bash +foxglove-studio +``` + +Click on "Open connection". In the popup window leave the WebSocket URL as `ws://localhost:8765` and click on "Open". + +You need to load our dashboard. In the top right, click on the "Default" dropdown, and then "Import from file...". Go to the `dimos` repo and select `assets/foxglove_dashboards/unitree.json`. + +### Test the install + +Run the Python tests: + +```bash +uv run pytest dimos +``` + +They should all pass in about 3 minutes. + +### Test a robot replay + +Run the system by playing back recorded data from a robot: + +```bash +uv run dimos --replay run unitree-go2-basic +``` + +You can visualize the robot data in Foxglove Studio. + +### Run a simulation + +```bash +uv run dimos --simulation run unitree-go2-basic +``` + +This will open a MuJoCo simulation window. You can also visualize data in Foxglove. + +If you want to also teleoperate the simulated robot run: + +```bash +uv run dimos --simulation run unitree-go2-basic --extra-module keyboard_teleop +``` + +This will also open a Keyboard Teleop window. Focus on the window and use WASD to control the robot. + +### Command center + +You can also control the robot from the `command-center` extension to Foxglove. + +First, pull the LFS file: + +```bash +git lfs pull --include="assets/dimensional.command-center-extension-0.0.1.foxe" +``` + +To install it, drag that file over the Foxglove Studio window. The extension will be installed automatically. Then, click on the "Add panel" icon on the top right and add "command-center". + +You can now click on the map to give it a travel goal, or click on "Start Keyboard Control" to teleoperate it. From 54f1005f39f499efa45d7eb8762d5195621bd28e Mon Sep 17 00:00:00 2001 From: Paul Nechifor Date: Thu, 25 Dec 2025 04:22:02 +0200 Subject: [PATCH 17/19] fix linting --- dimos/mapping/test_voxels.py | 4 +--- dimos/mapping/voxels.py | 8 +------- dimos/robot/unitree/connection/go2.py | 1 - dimos/utils/metrics.py | 2 +- dimos/utils/reactive.py | 2 +- 5 files changed, 4 insertions(+), 13 deletions(-) diff --git a/dimos/mapping/test_voxels.py b/dimos/mapping/test_voxels.py index bbb63b1c10..f904533b4d 100644 --- a/dimos/mapping/test_voxels.py +++ b/dimos/mapping/test_voxels.py @@ -16,14 +16,12 @@ import time import numpy as np -import open3d as o3d # type: ignore[import-untyped] import pytest -from dimos.core import LCMTransport, Transport +from dimos.core import LCMTransport from dimos.mapping.voxels import VoxelGridMapper from dimos.msgs.nav_msgs.OccupancyGrid import OccupancyGrid from dimos.msgs.sensor_msgs import PointCloud2 -from dimos.robot.unitree_webrtc.type.lidar import LidarMessage from dimos.utils.data import get_data from dimos.utils.testing.moment import OutputMoment from dimos.utils.testing.replay import TimedSensorReplay diff --git a/dimos/mapping/voxels.py b/dimos/mapping/voxels.py index b5d1d235ff..40169f1983 100644 --- a/dimos/mapping/voxels.py +++ b/dimos/mapping/voxels.py @@ -12,9 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -from collections.abc import Callable from dataclasses import dataclass, field -import functools import time import numpy as np @@ -23,17 +21,13 @@ from reactivex import interval from reactivex.disposable import Disposable -from dimos.core import DimosCluster, In, LCMTransport, Module, Out, rpc -from dimos.core.global_config import GlobalConfig +from dimos.core import In, Module, Out, rpc from dimos.core.module import ModuleConfig from dimos.mapping.pointclouds.occupancy import height_cost_occupancy from dimos.msgs.nav_msgs import OccupancyGrid from dimos.msgs.sensor_msgs import PointCloud2 -from dimos.robot.unitree.connection.go2 import Go2ConnectionProtocol from dimos.robot.unitree_webrtc.type.lidar import LidarMessage -from dimos.spec.map import Global3DMap, GlobalCostmap from dimos.utils.decorators import simple_mcache -from dimos.utils.metrics import timed @dataclass diff --git a/dimos/robot/unitree/connection/go2.py b/dimos/robot/unitree/connection/go2.py index 5fda73fba7..b13c271d3f 100644 --- a/dimos/robot/unitree/connection/go2.py +++ b/dimos/robot/unitree/connection/go2.py @@ -31,7 +31,6 @@ Vector3, ) from dimos.msgs.sensor_msgs import CameraInfo, Image, PointCloud2 -from dimos.msgs.std_msgs import Header from dimos.robot.unitree.connection.connection import UnitreeWebRTCConnection from dimos.robot.unitree_webrtc.type.lidar import LidarMessage from dimos.utils.data import get_data diff --git a/dimos/utils/metrics.py b/dimos/utils/metrics.py index 733399952b..3f21e704db 100644 --- a/dimos/utils/metrics.py +++ b/dimos/utils/metrics.py @@ -19,7 +19,7 @@ from dimos_lcm.std_msgs import Float32 # type: ignore[import-untyped] -from dimos.core import DimosCluster, In, LCMTransport, Module, Out, Transport, rpc +from dimos.core import LCMTransport, Transport F = TypeVar("F", bound=Callable[..., Any]) diff --git a/dimos/utils/reactive.py b/dimos/utils/reactive.py index 1587a201d4..2cb933fcbc 100644 --- a/dimos/utils/reactive.py +++ b/dimos/utils/reactive.py @@ -21,8 +21,8 @@ from reactivex.disposable import Disposable from reactivex.observable import Observable from reactivex.scheduler import ThreadPoolScheduler -from dimos.rxpy_backpressure import BackPressure # type: ignore[import-untyped] +from dimos.rxpy_backpressure import BackPressure # type: ignore[import-untyped] from dimos.utils.threadpool import get_scheduler T = TypeVar("T") From 628f1d5fe96d26d72da2aa37da0081a886811644 Mon Sep 17 00:00:00 2001 From: Paul Nechifor Date: Thu, 25 Dec 2025 04:37:46 +0200 Subject: [PATCH 18/19] update readme --- README_installation.md | 36 ++++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/README_installation.md b/README_installation.md index 23f0493b7f..ccdcb1a550 100644 --- a/README_installation.md +++ b/README_installation.md @@ -1,11 +1,11 @@ # DimOS -## Instalation +## Installation Clone the repo: ```bash -git clone --single-branch git@github.com:dimensionalOS/dimos.git +git clone -b main --single-branch git@github.com:dimensionalOS/dimos.git cd dimos ``` @@ -40,7 +40,7 @@ uv sync --extra dev --extra cpu --extra sim --extra drone ### Install Foxglove Studio (robot visualization and control) -(This will be obsolete once we finish our migration to opensource [Rerun](https://rerun.io/).) +> **Note:** This will be obsolete once we finish our migration to open source [Rerun](https://rerun.io/). Download and install [Foxglove Studio](https://foxglove.dev/download): @@ -57,9 +57,12 @@ Open Foxglove Studio: foxglove-studio ``` -Click on "Open connection". In the popup window leave the WebSocket URL as `ws://localhost:8765` and click on "Open". +To connect and load our dashboard: -You need to load our dashboard. In the top right, click on the "Default" dropdown, and then "Import from file...". Go to the `dimos` repo and select `assets/foxglove_dashboards/unitree.json`. +1. Click on "Open connection" +2. In the popup window, leave the WebSocket URL as `ws://localhost:8765` and click "Open" +3. In the top right, click on the "Default" dropdown, then "Import from file..." +4. Navigate to the `dimos` repo and select `assets/foxglove_dashboards/unitree.json` ### Test the install @@ -73,7 +76,7 @@ They should all pass in about 3 minutes. ### Test a robot replay -Run the system by playing back recorded data from a robot: +Run the system by playing back recorded data from a robot (the replay data is automatically downloaded via Git LFS): ```bash uv run dimos --replay run unitree-go2-basic @@ -110,3 +113,24 @@ git lfs pull --include="assets/dimensional.command-center-extension-0.0.1.foxe" To install it, drag that file over the Foxglove Studio window. The extension will be installed automatically. Then, click on the "Add panel" icon on the top right and add "command-center". You can now click on the map to give it a travel goal, or click on "Start Keyboard Control" to teleoperate it. + +### Using `dimos` in your code + +If you want to use dimos in your own project (not the cloned repo), you can install it as a dependency: + +```bash +uv add dimos +``` + +Note, a few dependencies do not have PyPI packages and need to be installed from their Git repositories. These are only required for specific features: + +- **CLIP** and **detectron2**: Required for the Detic open-vocabulary object detector +- **contact_graspnet_pytorch**: Required for robotic grasp prediction + +You can install them with: + +```bash +uv add git+https://github.com/openai/CLIP.git +uv add git+https://github.com/dimensionalOS/contact_graspnet_pytorch.git +uv add git+https://github.com/facebookresearch/detectron2.git +``` From d94d65ed6363decb5530c5b4171bbb07cfbfeb3e Mon Sep 17 00:00:00 2001 From: Paul Nechifor Date: Tue, 30 Dec 2025 03:55:08 +0200 Subject: [PATCH 19/19] use unitree-webrtc-connect-leshy --- pyproject.toml | 2 +- uv.lock | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index c29995a9c1..95d59e6599 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -49,7 +49,7 @@ dependencies = [ "python-multipart==0.0.20", "reactivex", "asyncio==3.4.3", - "unitree_webrtc_connect>=2.0.3", + "unitree-webrtc-connect-leshy>=2.0.4", "tensorzero==2025.7.5", "structlog>=25.5.0,<26", diff --git a/uv.lock b/uv.lock index 4d25d315f1..c368556573 100644 --- a/uv.lock +++ b/uv.lock @@ -359,10 +359,10 @@ name = "bitsandbytes" version = "0.49.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "packaging" }, - { name = "torch" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11' and sys_platform != 'darwin' and sys_platform != 'win32'" }, + { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11' and sys_platform != 'darwin' and sys_platform != 'win32'" }, + { name = "packaging", marker = "sys_platform != 'darwin' and sys_platform != 'win32'" }, + { name = "torch", marker = "sys_platform != 'darwin' and sys_platform != 'win32'" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/d1/4f/9f6d161e9ea68cdd6b85585dee9b383748ca07431e31c4c134111f87489e/bitsandbytes-0.49.0-py3-none-manylinux_2_24_aarch64.whl", hash = "sha256:7e69951b4d207a676986fce967544d9599f23518d0f09d478295996aeff377c2", size = 31065242, upload-time = "2025-12-11T20:50:41.903Z" }, @@ -1524,7 +1524,7 @@ dependencies = [ { name = "typeguard" }, { name = "typer" }, { name = "ultralytics" }, - { name = "unitree-webrtc-connect" }, + { name = "unitree-webrtc-connect-leshy" }, { name = "uvicorn" }, { name = "wasmtime" }, { name = "xarm-python-sdk" }, @@ -1745,7 +1745,7 @@ requires-dist = [ { name = "types-tensorflow", marker = "extra == 'dev'", specifier = ">=2.18.0.20251008,<3" }, { name = "types-tqdm", marker = "extra == 'dev'", specifier = ">=4.67.0.20250809,<5" }, { name = "ultralytics", specifier = ">=8.3.70" }, - { name = "unitree-webrtc-connect", specifier = ">=2.0.3" }, + { name = "unitree-webrtc-connect-leshy", specifier = ">=2.0.4" }, { name = "uvicorn", specifier = ">=0.34.0" }, { name = "wasmtime" }, { name = "xarm-python-sdk", specifier = ">=1.17.0" }, @@ -9139,8 +9139,8 @@ wheels = [ ] [[package]] -name = "unitree-webrtc-connect" -version = "2.0.3" +name = "unitree-webrtc-connect-leshy" +version = "2.0.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiortc" }, @@ -9157,9 +9157,9 @@ dependencies = [ { name = "sounddevice" }, { name = "wasmtime" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8f/49/0bf005d4d0e6c3fe10768fb5df980e81e14fcaa5e40dcf6c6468f0a4785b/unitree_webrtc_connect-2.0.3.tar.gz", hash = "sha256:b1e11333487bc6bbae19ecd58d896d03bef7ccf70c3b44c529b72c5516e76805", size = 34143, upload-time = "2025-12-02T02:00:03.361Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/1c/877fa100fbbbf60880ad799368e0365b5c8d7107b1850504b1d705aad434/unitree_webrtc_connect_leshy-2.0.4.tar.gz", hash = "sha256:10c0bd7e5449cf05d031dbe259d6787e729bbc601d25fec7c02f3b9edbb1556c", size = 34364, upload-time = "2025-12-29T21:41:10.422Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/90/a4/7bf3a2eed033f249f86e5b1546753d488be7db1a4865535d425b5866d056/unitree_webrtc_connect-2.0.3-py3-none-any.whl", hash = "sha256:e1a43cd7daecce97fc7e4a1c6b6858759dacd8147f5402486ee6808da43a9256", size = 39738, upload-time = "2025-12-02T02:00:02.183Z" }, + { url = "https://files.pythonhosted.org/packages/49/84/3486e84ee07502a76911e83c40066d551a053c1df6994860cd2b45144710/unitree_webrtc_connect_leshy-2.0.4-py3-none-any.whl", hash = "sha256:4403bd844993f37aaea4de076d079b76ba1479301fc68d0bc0c3a835c8905df6", size = 39987, upload-time = "2025-12-29T21:41:08.834Z" }, ] [[package]]