diff --git a/README.md b/README.md index 8490e3a9b..615dbc923 100644 --- a/README.md +++ b/README.md @@ -80,8 +80,13 @@ Start with the `Quick Demo` below to run the primary training command. The recom ```bash -# 0. If uv is not installed +# 0. Install uv if needed +# Linux / macOS: curl -LsSf https://astral.sh/uv/install.sh | sh +# +# Windows: +# powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" +# choco install make -y # 1. Clone the repository git clone https://github.com/unilabsim/UniLab.git @@ -90,7 +95,7 @@ cd UniLab # 2. Install dependencies # Pick the setup command for your platform. -# Linux CUDA or macOS +# Linux CUDA, macOS, or Windows make setup # Linux AMD / ROCm @@ -101,7 +106,7 @@ make setup # Without shell completion setup: # uv sync --extra mujoco --extra motrix -# If `make` is not installed: +# If `make` is not installed or unavailable: # uv sync --extra mujoco --extra motrix && uv run --no-sync unilab-complete install # 3. Pre-trained checkpoint playback (downloads from Hugging Face on first run) diff --git a/README_zh.md b/README_zh.md index 776f3c11d..c2509f17a 100644 --- a/README_zh.md +++ b/README_zh.md @@ -81,7 +81,12 @@ ```bash # 0. 如果还没有安装 uv +# Linux / macOS: curl -LsSf https://astral.sh/uv/install.sh | sh +# +# Windows: +# powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" +# choco install make -y # 1. 克隆仓库 git clone https://github.com/unilabsim/UniLab.git @@ -90,7 +95,7 @@ cd UniLab # 2. 安装依赖 # 请按你的平台选择对应的安装命令。 -# Linux CUDA 或 macOS +# Linux CUDA、macOS 或 Windows make setup # Linux AMD / ROCm @@ -101,7 +106,7 @@ make setup # 不使用 shell completion 设置时: # uv sync --extra mujoco --extra motrix -# 如果没有安装 `make`: +# 如果没有安装或无法使用 `make`: # uv sync --extra mujoco --extra motrix && uv run --no-sync unilab-complete install # 3. 预训练 checkpoint 回放(首次运行会从 Hugging Face 下载) diff --git a/pyproject.toml b/pyproject.toml index 74f7153c0..3f96ec735 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,6 +34,7 @@ dependencies = [ "onnxruntime>=1.20 ; python_version >= '3.11'", "huggingface_hub>=0.25", "ninja ; sys_platform == 'linux'", + "imageio-ffmpeg>=0.6.0", ] [project.scripts] @@ -62,7 +63,7 @@ explicit = true [tool.uv.sources] torch = [ - { index = "pytorch-cu128", marker = "sys_platform=='linux'" }, + { index = "pytorch-cu128", marker = "sys_platform=='linux' or sys_platform=='win32'" }, ] [tool.uv] diff --git a/scripts/train_appo.py b/scripts/train_appo.py index 277f89088..9ea6b9b5c 100644 --- a/scripts/train_appo.py +++ b/scripts/train_appo.py @@ -351,7 +351,7 @@ def forward(self, obs: torch.Tensor) -> torch.Tensor: on_plan=log_playback_plan, ) if play_video_path is not None: - print(f"Saving video to {play_video_path} with mediapy...") + print(f"Saving video to {play_video_path} ...") print("Done.") return play_video_path diff --git a/scripts/train_mlx_ppo.py b/scripts/train_mlx_ppo.py index 1dde4847e..92cfd3d1d 100644 --- a/scripts/train_mlx_ppo.py +++ b/scripts/train_mlx_ppo.py @@ -325,28 +325,23 @@ def _play_step(current_obs): return mx.nan_to_num(raw_obs, nan=0.0, posinf=0.0, neginf=0.0) output_dir = run_dir if run_dir is not None else task_log_root - try: - play_video_path = env.run_playback_mode( - play_render_mode=getattr(cfg.training, "play_render_mode", "auto"), - play_steps=getattr(cfg.training, "play_steps", None), - output_video=output_dir / "play_video.mp4", - initialize=lambda: obs, - step=_play_step, - camera_kwargs={ - "cam_distance": getattr(cfg.training, "cam_distance", 2.0), - "cam_elevation": getattr(cfg.training, "cam_elevation", -20.0), - "cam_azimuth": getattr(cfg.training, "cam_azimuth", 90.0), - "cam_lookat": getattr(cfg.training, "cam_lookat", None), - "cam_tracking": getattr(cfg.training, "cam_tracking", False), - "cam_tracking_env_idx": getattr(cfg.training, "cam_tracking_env_idx", 0), - "cam_tracking_extra_envs": getattr(cfg.training, "cam_tracking_extra_envs", 2), - }, - on_plan=lambda plan: log_playback_plan(plan, prefix="[MLX PPO] "), - ) - except ImportError: - print("mediapy is required for play video export. Install with `pip install mediapy`.") - env.close() - return None + play_video_path = env.run_playback_mode( + play_render_mode=getattr(cfg.training, "play_render_mode", "auto"), + play_steps=getattr(cfg.training, "play_steps", None), + output_video=output_dir / "play_video.mp4", + initialize=lambda: obs, + step=_play_step, + camera_kwargs={ + "cam_distance": getattr(cfg.training, "cam_distance", 2.0), + "cam_elevation": getattr(cfg.training, "cam_elevation", -20.0), + "cam_azimuth": getattr(cfg.training, "cam_azimuth", 90.0), + "cam_lookat": getattr(cfg.training, "cam_lookat", None), + "cam_tracking": getattr(cfg.training, "cam_tracking", False), + "cam_tracking_env_idx": getattr(cfg.training, "cam_tracking_env_idx", 0), + "cam_tracking_extra_envs": getattr(cfg.training, "cam_tracking_extra_envs", 2), + }, + on_plan=lambda plan: log_playback_plan(plan, prefix="[MLX PPO] "), + ) if play_video_path is not None: print(f"[MLX PPO] Play video saved: {play_video_path}") else: diff --git a/src/unilab/algos/torch/appo/learner.py b/src/unilab/algos/torch/appo/learner.py index 45754a218..1cf6aa520 100644 --- a/src/unilab/algos/torch/appo/learner.py +++ b/src/unilab/algos/torch/appo/learner.py @@ -21,6 +21,8 @@ from rsl_rl.utils import resolve_optimizer from tensordict import TensorDict +from unilab.algos.torch.common.compile import get_torch_compile_for_cuda + _LOG_2_PI = math.log(2.0 * math.pi) _NORMAL_ENTROPY_OFFSET = 0.5 * (1.0 + _LOG_2_PI) @@ -209,7 +211,7 @@ def __init__( self._update_counter = 0 self.last_update_metrics: dict[str, float] = {} self.enable_compile = ( - bool(enable_compile) and self._device_type == "cuda" and hasattr(torch, "compile") + bool(enable_compile) and get_torch_compile_for_cuda(device, warn=True) is not None ) # Optimizer @@ -221,8 +223,8 @@ def __init__( self._compile_training_methods() def _compile_training_methods(self) -> None: - compile_fn = getattr(torch, "compile", None) - if compile_fn is None or self._device_type != "cuda": + compile_fn = get_torch_compile_for_cuda(self._device_type, warn=True) + if compile_fn is None: return self._minibatch_loss_fn = compile_fn( diff --git a/src/unilab/algos/torch/common/compile.py b/src/unilab/algos/torch/common/compile.py new file mode 100644 index 000000000..c2521f320 --- /dev/null +++ b/src/unilab/algos/torch/common/compile.py @@ -0,0 +1,48 @@ +from __future__ import annotations + +import importlib.util +import sys +from collections.abc import Callable +from typing import Any, cast + +import torch + +_WARNED_REASONS: set[str] = set() + + +def _warn_once(reason: str) -> None: + if reason in _WARNED_REASONS: + return + _WARNED_REASONS.add(reason) + message = f"WARNING: torch.compile is unavailable for CUDA; using eager mode ({reason})." + try: + from rich.console import Console + + Console(stderr=True).print(message, style="yellow") + except Exception: # pragma: no cover - best-effort diagnostic only + print(message, file=sys.stderr) + + +def get_torch_compile_for_cuda( + device: torch.device | str, *, warn: bool = False +) -> Callable[..., Any] | None: + """Return ``torch.compile`` when CUDA Inductor dependencies are available.""" + compile_fn = getattr(torch, "compile", None) + if torch.device(device).type != "cuda": + return None + if compile_fn is None: + if warn: + _warn_once("torch.compile is not present in this PyTorch build") + return None + if ( + getattr(compile_fn, "__module__", "") == "torch" + and importlib.util.find_spec("triton") is None + ): + if warn: + _warn_once( + "Triton is not installed; this environment cannot use CUDA Inductor. " + "PyTorch's Windows torch.compile documentation currently covers " + "CPU/XPU Inductor, not the CUDA/Triton path" + ) + return None + return cast(Callable[..., Any], compile_fn) diff --git a/src/unilab/algos/torch/fast_sac/learner.py b/src/unilab/algos/torch/fast_sac/learner.py index 66616cf97..7792bdb36 100644 --- a/src/unilab/algos/torch/fast_sac/learner.py +++ b/src/unilab/algos/torch/fast_sac/learner.py @@ -19,6 +19,7 @@ import torch.nn.functional as F import torch.optim as optim +from unilab.algos.torch.common.compile import get_torch_compile_for_cuda from unilab.base.augmentation import SymmetryAugmentation # --------------------------------------------------------------------------- @@ -406,7 +407,7 @@ def __init__( self.use_autotune = use_autotune self.use_amp = bool(use_amp) and self._device_type in ("cuda", "xpu") self.use_compile = ( - bool(use_compile) and self._device_type == "cuda" and hasattr(torch, "compile") + bool(use_compile) and get_torch_compile_for_cuda(self.device, warn=True) is not None ) self.amp_dtype = amp_dtype self._amp_dtype = self._resolve_amp_dtype(amp_dtype, self._device_type) @@ -520,8 +521,8 @@ def _should_use_grad_scaler( return bool(use_amp) and device_type == "cuda" and amp_dtype == torch.float16 def _compile_training_methods(self) -> None: - compile_fn = getattr(torch, "compile", None) - if compile_fn is None or torch.device(self.device).type != "cuda": + compile_fn = get_torch_compile_for_cuda(self.device, warn=True) + if compile_fn is None: return compile_kwargs = {"options": {"triton.cudagraphs": False}} diff --git a/src/unilab/algos/torch/flash_sac/learner.py b/src/unilab/algos/torch/flash_sac/learner.py index f2e156980..f28abee1e 100644 --- a/src/unilab/algos/torch/flash_sac/learner.py +++ b/src/unilab/algos/torch/flash_sac/learner.py @@ -10,6 +10,7 @@ import torch.nn as nn import torch.optim as optim +from unilab.algos.torch.common.compile import get_torch_compile_for_cuda from unilab.algos.torch.common.normalization import EmpiricalNormalization from unilab.algos.torch.flash_sac.network import ( FlashSACActor, @@ -182,7 +183,7 @@ def __init__( self.amp_dtype = amp_dtype self._amp_dtype = self._resolve_amp_dtype(amp_dtype, self.device.type) self.use_compile = bool( - use_compile and hasattr(torch, "compile") and self.device.type == "cuda" + use_compile and get_torch_compile_for_cuda(self.device, warn=True) is not None ) self.actor = FlashSACActor( @@ -256,8 +257,8 @@ def __init__( self._compile_training_methods() def _compile_training_methods(self) -> None: - compile_fn = getattr(torch, "compile", None) - if compile_fn is None or self.device.type != "cuda": + compile_fn = get_torch_compile_for_cuda(self.device, warn=True) + if compile_fn is None: return compile_kwargs = {"options": {"triton.cudagraphs": False}} diff --git a/src/unilab/algos/torch/hora/appo.py b/src/unilab/algos/torch/hora/appo.py index 477ccd5ca..86b10700a 100644 --- a/src/unilab/algos/torch/hora/appo.py +++ b/src/unilab/algos/torch/hora/appo.py @@ -240,7 +240,7 @@ def step_play_obs(obs_np: np.ndarray) -> np.ndarray: ), ) if play_video_path is not None: - print(f"Saving video to {play_video_path} with mediapy...") + print(f"Saving video to {play_video_path} ...") print("Done.") return play_video_path diff --git a/src/unilab/algos/torch/rsl_rl_ppo.py b/src/unilab/algos/torch/rsl_rl_ppo.py index 903841fa5..67ca1b17d 100644 --- a/src/unilab/algos/torch/rsl_rl_ppo.py +++ b/src/unilab/algos/torch/rsl_rl_ppo.py @@ -7,6 +7,8 @@ from rsl_rl.algorithms import PPO from tensordict import TensorDict +from unilab.algos.torch.common.compile import get_torch_compile_for_cuda + _LOG_2_PI = math.log(2.0 * math.pi) _NORMAL_ENTROPY_OFFSET = 0.5 * (1.0 + _LOG_2_PI) @@ -24,17 +26,15 @@ def __init__( ) -> None: super().__init__(*args, **kwargs) self.enable_compile = ( - bool(enable_compile) - and torch.device(self.device).type == "cuda" - and hasattr(torch, "compile") + bool(enable_compile) and get_torch_compile_for_cuda(self.device, warn=True) is not None ) self._minibatch_loss_fn = self._minibatch_loss_tensors if self.enable_compile: self._compile_training_methods() def _compile_training_methods(self) -> None: - compile_fn = getattr(torch, "compile", None) - if compile_fn is None or torch.device(self.device).type != "cuda": + compile_fn = get_torch_compile_for_cuda(self.device, warn=True) + if compile_fn is None: return self._minibatch_loss_fn = compile_fn( diff --git a/src/unilab/assets/hub.py b/src/unilab/assets/hub.py index c5e5c3f9e..07628e2ba 100644 --- a/src/unilab/assets/hub.py +++ b/src/unilab/assets/hub.py @@ -12,7 +12,9 @@ from __future__ import annotations import logging +import ntpath import os +import posixpath from collections.abc import Sequence from pathlib import Path @@ -89,22 +91,23 @@ def resolve_checkpoint_file( def _resolve_single(path_str: str, *, repo_id: str = _HF_MOTIONS_REPO_ID) -> str: """Resolve one asset file path, downloading if absent.""" path = Path(path_str) + is_absolute_input = path.is_absolute() or ntpath.isabs(path_str) or posixpath.isabs(path_str) # Already exists locally — fast path. if path.exists(): return str(path) # Try interpreting as ASSETS_ROOT_PATH-relative. - if not path.is_absolute(): + if not is_absolute_input: local = ASSETS_ROOT_PATH / path if local.exists(): return str(local) - relative = path_str + relative = _hf_relative_path(path_str) else: # Extract the portion relative to ASSETS_ROOT_PATH so we can # request the matching file from the HF repo. try: - relative = str(path.relative_to(ASSETS_ROOT_PATH)) + relative = path.relative_to(ASSETS_ROOT_PATH).as_posix() except ValueError: raise FileNotFoundError( f"Asset file not found and path is not under " @@ -114,6 +117,11 @@ def _resolve_single(path_str: str, *, repo_id: str = _HF_MOTIONS_REPO_ID) -> str return _download_from_hf(relative, repo_id=repo_id) +def _hf_relative_path(path_str: str) -> str: + """Return a repo-relative HF path with POSIX separators.""" + return path_str.replace("\\", "/") + + def _hf_download(hf_hub_download, relative_path: str, *, repo_id: str) -> str: # type: ignore[no-untyped-def] """Call ``hf_hub_download`` with the standard arguments.""" return str( @@ -206,6 +214,7 @@ def _resolve_snapshot_dir(directory: str, *, repo_id: str, marker: str) -> Path: Returns: Absolute ``Path`` to the resolved directory. """ + hf_directory = _hf_relative_path(directory) target = ASSETS_ROOT_PATH / directory if (target / marker).is_file(): return target @@ -221,10 +230,10 @@ def _resolve_snapshot_dir(directory: str, *, repo_id: str, marker: str) -> Path: " uv pip install huggingface_hub" ) from None - logger.info("Downloading %s from HF repo %s ...", directory, repo_id) + logger.info("Downloading %s from HF repo %s ...", hf_directory, repo_id) try: - _snapshot_download(snapshot_download, directory, repo_id=repo_id) + _snapshot_download(snapshot_download, hf_directory, repo_id=repo_id) except Exception: current_endpoint = os.environ.get("HF_ENDPOINT", "") if current_endpoint and current_endpoint != _HF_OFFICIAL_ENDPOINT: @@ -236,7 +245,7 @@ def _resolve_snapshot_dir(directory: str, *, repo_id: str, marker: str) -> Path: original = os.environ["HF_ENDPOINT"] os.environ["HF_ENDPOINT"] = _HF_OFFICIAL_ENDPOINT try: - _snapshot_download(snapshot_download, directory, repo_id=repo_id) + _snapshot_download(snapshot_download, hf_directory, repo_id=repo_id) finally: os.environ["HF_ENDPOINT"] = original else: diff --git a/src/unilab/base/backend/motrix/playback.py b/src/unilab/base/backend/motrix/playback.py index 8384856d5..cc94096b9 100644 --- a/src/unilab/base/backend/motrix/playback.py +++ b/src/unilab/base/backend/motrix/playback.py @@ -8,7 +8,7 @@ import numpy as np -from unilab.base.backend.playback_common import env_cfg_value +from unilab.base.backend.playback_common import env_cfg_value, write_playback_video ObsT = TypeVar("ObsT") @@ -66,10 +66,8 @@ def run_motrix_playback( assert output_video is not None assert frames is not None - import mediapy as media - ctrl_dt = float(env_cfg_value(env, "ctrl_dt", 1.0 / 60.0)) - media.write_video(str(output_video), frames, fps=int(1.0 / ctrl_dt)) + write_playback_video(str(output_video), frames, fps=int(1.0 / ctrl_dt)) return str(output_video) effective_spacing = ( diff --git a/src/unilab/base/backend/mujoco/playback.py b/src/unilab/base/backend/mujoco/playback.py index 94a644b57..3138ccb9b 100644 --- a/src/unilab/base/backend/mujoco/playback.py +++ b/src/unilab/base/backend/mujoco/playback.py @@ -9,7 +9,7 @@ import numpy as np -from unilab.base.backend.playback_common import env_cfg_value +from unilab.base.backend.playback_common import env_cfg_value, write_playback_video from unilab.base.scene import SceneCfg ObsT = TypeVar("ObsT") @@ -110,10 +110,8 @@ def run_mujoco_playback( print(f"[playback] No frames rendered; skipping video export to {output_video}.") return None - import mediapy as media - ctrl_dt = float(env_cfg_value(env, "ctrl_dt", 1.0 / 60.0)) - media.write_video(str(output_video), frames, fps=int(1.0 / ctrl_dt)) + write_playback_video(str(output_video), frames, fps=int(1.0 / ctrl_dt)) return str(output_video) diff --git a/src/unilab/base/backend/playback_common.py b/src/unilab/base/backend/playback_common.py index c605c1300..c1e66d68e 100644 --- a/src/unilab/base/backend/playback_common.py +++ b/src/unilab/base/backend/playback_common.py @@ -4,9 +4,17 @@ from typing import Any +import imageio.v2 as imageio +import numpy as np + def env_cfg_value(env: Any, name: str, default: Any) -> Any: cfg = getattr(env, "cfg", None) if cfg is None: return default return getattr(cfg, name, default) + + +def write_playback_video(path: str, frames: list[np.ndarray], *, fps: int) -> None: + """Write playback frames with the repository-managed imageio stack.""" + imageio.mimsave(path, frames, fps=fps) diff --git a/src/unilab/ipc/memory_budget.py b/src/unilab/ipc/memory_budget.py index a390cda7b..9a23b78b1 100644 --- a/src/unilab/ipc/memory_budget.py +++ b/src/unilab/ipc/memory_budget.py @@ -7,6 +7,7 @@ from __future__ import annotations import os +import shutil import sys @@ -92,8 +93,7 @@ def get_available_memory_bytes() -> int | None: def get_shared_memory_available_bytes(path: str = "/dev/shm") -> int | None: """Best-effort available shared-memory space detection.""" try: - stat = os.statvfs(path) - return int(stat.f_bavail) * int(stat.f_frsize) + return int(shutil.disk_usage(path).free) except (OSError, ValueError): return None diff --git a/src/unilab/logging/common.py b/src/unilab/logging/common.py index 2ff111f86..6432442ea 100644 --- a/src/unilab/logging/common.py +++ b/src/unilab/logging/common.py @@ -2,6 +2,7 @@ import importlib import os +import sys import time from collections import deque from typing import Any @@ -38,6 +39,15 @@ def _fmt_number(v: float) -> str: return f"{v:.2e}" +def _console_supports_unicode() -> bool: + encoding = getattr(sys.stdout, "encoding", None) or "utf-8" + try: + "⏱ ▲ ▼ ━".encode(encoding) + except UnicodeEncodeError: + return False + return True + + def _load_wandb() -> Any | None: """Load wandb lazily so it remains an optional dependency.""" try: @@ -77,7 +87,8 @@ def __init__( self._no_print = log_backend.lower() == "no_print" self._log_backend = "none" if self._no_print else log_backend.lower() - self._console = Console() + self._unicode_console = _console_supports_unicode() + self._console = Console(force_terminal=False if not self._unicode_console else None) self._live: Live | None = None self._refresh_rate = refresh_per_second self._last_live_refresh_time: float | None = None @@ -294,7 +305,8 @@ def _build_header(self, *, include_status: bool) -> Panel: header_text.append(" │ ", style="dim") header_text.append(f"iter {self._iteration}/{self.max_iterations}", style="yellow") header_text.append(" │ ", style="dim") - header_text.append(f"⏱ {_fmt_time(elapsed)}", style="green") + time_label = "⏱" if self._unicode_console else "time" + header_text.append(f"{time_label} {_fmt_time(elapsed)}", style="green") if eta: header_text.append(" │ ETA ", style="dim") header_text.append(eta, style="bold magenta") @@ -316,7 +328,7 @@ def _build_compact_header( (f" {self.algo_name}", "bold cyan"), (self.env_name, "bold white"), (f"iter {self._iteration}/{self.max_iterations}", "yellow"), - (f"⏱ {_fmt_time(elapsed)}", "green"), + (f"{'⏱' if self._unicode_console else 'time'} {_fmt_time(elapsed)}", "green"), ] if eta: fields.append((f"ETA {eta}", "bold magenta")) @@ -359,13 +371,12 @@ def _build_reward_table_common( if len(recent) >= 10: old = sum(recent[-20:-10]) / 10 new = sum(recent[-10:]) / 10 - trend = ( - "[green]▲[/]" - if new > old * 1.05 - else "[red]▼[/]" - if new < old * 0.95 - else "[yellow]━[/]" - ) + if new > old * 1.05: + trend = "[green]▲[/]" if self._unicode_console else "[green]+[/]" + elif new < old * 0.95: + trend = "[red]▼[/]" if self._unicode_console else "[red]-[/]" + else: + trend = "[yellow]━[/]" if self._unicode_console else "[yellow]=[/]" else: trend = "" diff --git a/src/unilab/logging/offpolicy.py b/src/unilab/logging/offpolicy.py index fd2936a93..f4588e5ba 100644 --- a/src/unilab/logging/offpolicy.py +++ b/src/unilab/logging/offpolicy.py @@ -347,7 +347,11 @@ def _build_display(self) -> Panel: grid.add_row(left, "", right) return Panel( Group(header, Text(""), grid, Text(""), bottom), - title="[bold] 🚀 UniLab Off-Policy Training [/]", + title=( + "[bold] 🚀 UniLab Off-Policy Training [/]" + if self._unicode_console + else "[bold] UniLab Off-Policy Training [/]" + ), border_style="bright_blue", padding=(0, 1), ) @@ -429,10 +433,10 @@ def _build_timing_table(self) -> Table: ] ) system_items.append(("Envs", f"{self.num_envs:,}")) + yes_mark = "✓" if self._unicode_console else "yes" + no_mark = "✗" if self._unicode_console else "no" sync_collect = ( - f"{'✓' if self._sync_collection else '✗'} ({self._env_steps_per_sync})" - if self._sync_collection - else "✗" + f"{yes_mark} ({self._env_steps_per_sync})" if self._sync_collection else no_mark ) system_items.append(("Sync Collect", sync_collect)) if self._staging_pool_max > 0: diff --git a/src/unilab/logging/onpolicy.py b/src/unilab/logging/onpolicy.py index 83e8c9cad..d592c43bc 100644 --- a/src/unilab/logging/onpolicy.py +++ b/src/unilab/logging/onpolicy.py @@ -132,7 +132,11 @@ def _build_display(self) -> Panel: grid.add_row(left, "", right) return Panel( Group(header, Text(""), grid, Text(""), bottom), - title="[bold] 🚀 UniLab On-Policy Training [/]", + title=( + "[bold] 🚀 UniLab On-Policy Training [/]" + if self._unicode_console + else "[bold] UniLab On-Policy Training [/]" + ), border_style="bright_blue", padding=(0, 1), ) diff --git a/src/unilab/tools/completion.py b/src/unilab/tools/completion.py index 7517b56ca..634abd8e7 100644 --- a/src/unilab/tools/completion.py +++ b/src/unilab/tools/completion.py @@ -636,9 +636,11 @@ def _write_completion_block( dry_run: bool, force: bool, ) -> None: - content = ( - rc_file.read_text(encoding="utf-8", errors="surrogateescape") if rc_file.exists() else "" - ) + if rc_file.exists(): + with rc_file.open("r", encoding="utf-8", errors="surrogateescape", newline="") as file: + content = file.read() + else: + content = "" cleaned = _without_completion_block(content, force=force).rstrip() block = _completion_block(script_path).rstrip() updated = f"{cleaned}\n\n{block}\n" if cleaned else f"{block}\n" @@ -646,7 +648,7 @@ def _write_completion_block( print(updated, end="") return rc_file.parent.mkdir(parents=True, exist_ok=True) - rc_file.write_text(updated, encoding="utf-8", errors="surrogateescape") + rc_file.write_text(updated, encoding="utf-8", errors="surrogateescape", newline="") print(f"Installed UniLab completion in {rc_file}") print(f"Open a new shell or run: source {rc_file}") @@ -655,12 +657,13 @@ def _remove_completion_block(*, rc_file: Path, dry_run: bool, force: bool) -> No if not rc_file.exists(): print(f"No rc file found: {rc_file}") return - content = rc_file.read_text(encoding="utf-8", errors="surrogateescape") + with rc_file.open("r", encoding="utf-8", errors="surrogateescape", newline="") as file: + content = file.read() updated = _without_completion_block(content, force=force) if dry_run: print(updated, end="") return - rc_file.write_text(updated, encoding="utf-8", errors="surrogateescape") + rc_file.write_text(updated, encoding="utf-8", errors="surrogateescape", newline="") print(f"Removed UniLab completion from {rc_file}") diff --git a/src/unilab/visualization/render_many.py b/src/unilab/visualization/render_many.py index 725b6b30e..e8d86a209 100644 --- a/src/unilab/visualization/render_many.py +++ b/src/unilab/visualization/render_many.py @@ -82,20 +82,24 @@ def _egl_runtime_usable() -> bool: def _resolve_gl_backend() -> str: """Pick a valid MUJOCO_GL backend for the current platform. - Respects an explicit user setting unless it's provably invalid (e.g. egl - on macOS). Prefers GPU-backed EGL, then software OSMesa on headless hosts. - ``glfw`` is only chosen when a display is available, because it requires an - X11 context and would otherwise fail in every render worker. + Respects an explicit user setting unless it's provably invalid for the + platform. Prefers GPU-backed EGL, then software OSMesa on Linux headless + hosts. ``glfw`` is only gated on ``DISPLAY`` for Linux because Windows and + macOS do not use that X11 signal. """ current = os.environ.get("MUJOCO_GL", "") - safe_values = {"glfw", "osmesa", "disabled"} if sys.platform == "darwin": - # macOS has no EGL support; glfw is the only off-screen option - return current if current in safe_values else "glfw" + # macOS has no EGL/OSMesa support in the mujoco Python package. + return current if current in {"glfw", "disabled"} else "glfw" + + if sys.platform == "win32": + # Windows has no DISPLAY and the mujoco Python package rejects egl and + # osmesa here. GLFW can still create an off-screen renderer. + return current if current in {"glfw", "disabled"} else "glfw" # Linux / other: honour explicit non-egl choices supplied before import. - if current in safe_values and current == _USER_MUJOCO_GL: + if current in {"glfw", "osmesa", "disabled"} and current == _USER_MUJOCO_GL: return current # Probe EGL by creating a tiny MuJoCo renderer in a clean subprocess. @@ -134,13 +138,23 @@ def render_backend_usable() -> bool: def _warn_render_unavailable() -> None: """Emit a single actionable message when off-screen rendering is impossible.""" backend = os.environ.get("MUJOCO_GL", "") + platform = sys.platform has_display = "set" if os.environ.get("DISPLAY") else "unset" + if platform == "win32": + advice = ( + "[render] On Windows, use the default GLFW backend " + "(`MUJOCO_GL=glfw`) and make sure a working graphics driver is available." + ) + else: + advice = ( + "[render] On a headless host install software rendering " + "(e.g. `apt-get install libosmesa6`) or enable EGL on a GPU " + "(`MUJOCO_GL=egl`), then re-run with `--render-mode record`." + ) print( "[render] MuJoCo off-screen rendering is unavailable " - f"(MUJOCO_GL={backend!r}, DISPLAY={has_display}); skipping video recording.\n" - "[render] On a headless host install software rendering " - "(e.g. `apt-get install libosmesa6`) or enable EGL on a GPU " - "(`MUJOCO_GL=egl`), then re-run with `--render-mode record`.", + f"(platform={platform!r}, MUJOCO_GL={backend!r}, DISPLAY={has_display}); " + f"skipping video recording.\n{advice}", file=sys.stderr, ) diff --git a/tests/algos/test_rsl_rl_runner.py b/tests/algos/test_rsl_rl_runner.py index b5ae739cf..a7e2d7f84 100644 --- a/tests/algos/test_rsl_rl_runner.py +++ b/tests/algos/test_rsl_rl_runner.py @@ -157,7 +157,12 @@ def test_rsl_rl_ppo_one_iteration( with tempfile.TemporaryDirectory() as tmpdir: runner = OnPolicyRunner(cast(Any, wrapped), train_cfg, log_dir=tmpdir, device="cpu") - runner.learn(num_learning_iterations=1, init_at_random_ep_len=True) + try: + runner.learn(num_learning_iterations=1, init_at_random_ep_len=True) + finally: + writer = getattr(getattr(runner, "logger", None), "writer", None) + if writer is not None and hasattr(writer, "close"): + writer.close() env.close() diff --git a/tests/algos/test_torch_compile_helper.py b/tests/algos/test_torch_compile_helper.py new file mode 100644 index 000000000..d4b1eb30f --- /dev/null +++ b/tests/algos/test_torch_compile_helper.py @@ -0,0 +1,62 @@ +from __future__ import annotations + +import importlib.util +from collections.abc import Callable +from typing import Any + +import torch + +from unilab.algos.torch.common import compile as compile_helper + + +def _without_triton(name: str, *args: Any, **kwargs: Any) -> Any: + if name == "triton": + return None + return _ORIGINAL_FIND_SPEC(name, *args, **kwargs) + + +_ORIGINAL_FIND_SPEC = importlib.util.find_spec + + +def test_torch_compile_cuda_fallback_warns_when_triton_missing(monkeypatch, capsys) -> None: + def fake_compile(fn: Callable[..., Any], **kwargs: Any) -> Callable[..., Any]: + return fn + + fake_compile.__module__ = "torch" + monkeypatch.setattr(torch, "compile", fake_compile) + monkeypatch.setattr(importlib.util, "find_spec", _without_triton) + compile_helper._WARNED_REASONS.clear() + + assert compile_helper.get_torch_compile_for_cuda("cuda", warn=True) is None + + stderr = capsys.readouterr().err + assert "WARNING: torch.compile is unavailable for CUDA" in stderr + assert "Triton is not" in stderr + assert "installed" in stderr + + +def test_torch_compile_cuda_fallback_warning_is_once(monkeypatch, capsys) -> None: + def fake_compile(fn: Callable[..., Any], **kwargs: Any) -> Callable[..., Any]: + return fn + + fake_compile.__module__ = "torch" + monkeypatch.setattr(torch, "compile", fake_compile) + monkeypatch.setattr(importlib.util, "find_spec", _without_triton) + compile_helper._WARNED_REASONS.clear() + + compile_helper.get_torch_compile_for_cuda("cuda", warn=True) + compile_helper.get_torch_compile_for_cuda("cuda", warn=True) + + assert capsys.readouterr().err.count("torch.compile is unavailable") == 1 + + +def test_torch_compile_cuda_returns_available_compile_without_warning(monkeypatch, capsys) -> None: + def fake_compile(fn: Callable[..., Any], **kwargs: Any) -> Callable[..., Any]: + return fn + + fake_compile.__module__ = "test" + monkeypatch.setattr(torch, "compile", fake_compile) + compile_helper._WARNED_REASONS.clear() + + assert compile_helper.get_torch_compile_for_cuda("cuda", warn=True) is fake_compile + assert capsys.readouterr().err == "" diff --git a/tests/assets/test_hub.py b/tests/assets/test_hub.py index 2e6173757..9804b9dc3 100644 --- a/tests/assets/test_hub.py +++ b/tests/assets/test_hub.py @@ -63,7 +63,7 @@ def test_resolve_calls_hf_hub_download_for_missing_file(): missing = ASSETS_ROOT_PATH / "motions" / "g1" / "__test_nonexistent__.npz" assert not missing.exists() - expected_relative = str(missing.relative_to(ASSETS_ROOT_PATH)) + expected_relative = missing.relative_to(ASSETS_ROOT_PATH).as_posix() fake_download = MagicMock(return_value=str(missing)) fake_module = MagicMock() @@ -104,6 +104,49 @@ def test_resolve_relative_path_falls_back_to_hf(): ) +def test_resolve_absolute_windows_path_uses_posix_hf_filename(): + missing = ASSETS_ROOT_PATH / "motions" / "g1" / "__test_nonexistent_windows_abs__.npz" + assert not missing.exists() + + expected_relative = missing.relative_to(ASSETS_ROOT_PATH).as_posix() + + fake_download = MagicMock(return_value=str(missing)) + fake_module = MagicMock() + fake_module.hf_hub_download = fake_download + + with patch.dict("sys.modules", {"huggingface_hub": fake_module}): + result = resolve_motion_files(str(missing)) + + assert result == str(missing) + fake_download.assert_called_once_with( + repo_id="unilabsim/unilab-motions", + filename=expected_relative, + repo_type="dataset", + local_dir=str(ASSETS_ROOT_PATH), + ) + + +def test_resolve_relative_windows_path_uses_posix_hf_filename(): + rel = r"motions\g1\__test_nonexistent_windows_rel__.npz" + local = ASSETS_ROOT_PATH / rel + assert not local.exists() + + fake_download = MagicMock(return_value=str(local)) + fake_module = MagicMock() + fake_module.hf_hub_download = fake_download + + with patch.dict("sys.modules", {"huggingface_hub": fake_module}): + result = resolve_motion_files(rel) + + assert result == str(local) + fake_download.assert_called_once_with( + repo_id="unilabsim/unilab-motions", + filename="motions/g1/__test_nonexistent_windows_rel__.npz", + repo_type="dataset", + local_dir=str(ASSETS_ROOT_PATH), + ) + + # --------------------------------------------------------------------------- # Grasp cache resolve — local fast path # --------------------------------------------------------------------------- @@ -134,7 +177,7 @@ def test_resolve_grasp_cache_calls_hf_download_with_caches_repo(): missing = ASSETS_ROOT_PATH / "caches" / "__test_nonexistent__.npy" assert not missing.exists() - expected_relative = str(missing.relative_to(ASSETS_ROOT_PATH)) + expected_relative = missing.relative_to(ASSETS_ROOT_PATH).as_posix() fake_download = MagicMock(return_value=str(missing)) fake_module = MagicMock() @@ -210,6 +253,23 @@ def test_resolve_scene_dir_calls_snapshot_download_when_missing(tmp_path: Path): ) +def test_resolve_scene_dir_windows_path_uses_posix_hf_pattern(tmp_path: Path): + fake_snapshot = MagicMock(return_value=str(tmp_path)) + fake_module = MagicMock() + fake_module.snapshot_download = fake_snapshot + + with patch("unilab.assets.hub.ASSETS_ROOT_PATH", tmp_path): + with patch.dict("sys.modules", {"huggingface_hub": fake_module}): + resolve_scene_dir(r"scenes\teaser") + + fake_snapshot.assert_called_once_with( + repo_id="unilabsim/unilab-scenes", + repo_type="dataset", + allow_patterns="scenes/teaser/**", + local_dir=str(tmp_path), + ) + + def test_resolve_scene_dir_raises_import_error_when_hf_hub_missing(tmp_path: Path): """When the scene directory is missing and huggingface_hub is not installed, a clear ImportError is raised.""" diff --git a/tests/envs/locomotion/go2_arm/test_manip_loco_contract.py b/tests/envs/locomotion/go2_arm/test_manip_loco_contract.py index 4532f47ee..5d41d55e1 100644 --- a/tests/envs/locomotion/go2_arm/test_manip_loco_contract.py +++ b/tests/envs/locomotion/go2_arm/test_manip_loco_contract.py @@ -97,7 +97,7 @@ def test_go2_arm_manip_loco_cfg_declares_scene_for_playback(): assert isinstance(cfg.scene, SceneCfg) assert cfg.scene.model_file == cfg.model_file - assert cfg.scene.model_file.endswith("robots/go2_arm/scene_flat.xml") + assert cfg.scene.model_file.replace("\\", "/").endswith("robots/go2_arm/scene_flat.xml") cfg.model_file = "custom_scene.xml" scene = _resolve_go2_arm_scene(cfg) diff --git a/tests/ipc/test_async_runner.py b/tests/ipc/test_async_runner.py index 89f08ea23..9c4b4c11a 100644 --- a/tests/ipc/test_async_runner.py +++ b/tests/ipc/test_async_runner.py @@ -246,7 +246,7 @@ def test_format_collector_death_reports_negative_sigbus(): def test_format_collector_death_reports_sigkill_oom_hint(): report = format_collector_death(137) - assert "SIGKILL" in report + assert "SIGKILL" in report or "SIG9" in report assert "OOM killer" in report diff --git a/tests/ipc/test_memory_budget.py b/tests/ipc/test_memory_budget.py index daab9f4a8..fbd57b6e3 100644 --- a/tests/ipc/test_memory_budget.py +++ b/tests/ipc/test_memory_budget.py @@ -1,6 +1,6 @@ from __future__ import annotations -import os +import shutil import pytest @@ -28,18 +28,17 @@ def test_offpolicy_memory_budget_notes_native_exclusions() -> None: def test_shared_memory_budget_unknown_available_is_noop(monkeypatch: pytest.MonkeyPatch) -> None: - monkeypatch.setattr(os, "statvfs", lambda path: (_ for _ in ()).throw(OSError())) + monkeypatch.setattr(shutil, "disk_usage", lambda path: (_ for _ in ()).throw(OSError())) estimate = {"total": 1024, "breakdown": "test"} raise_if_shared_memory_over_budget(estimate, label="test", path="/missing-shm") def test_shared_memory_budget_allows_within_threshold(monkeypatch: pytest.MonkeyPatch) -> None: - class _Stat: - f_bavail = 100 - f_frsize = 1024 + class _Usage: + free = 100 * 1024 - monkeypatch.setattr(os, "statvfs", lambda path: _Stat()) + monkeypatch.setattr(shutil, "disk_usage", lambda path: _Usage()) estimate = {"total": 80 * 1024, "breakdown": "test"} raise_if_shared_memory_over_budget(estimate, label="test", threshold=0.8) @@ -48,11 +47,10 @@ class _Stat: def test_shared_memory_budget_raises_before_over_allocating( monkeypatch: pytest.MonkeyPatch, ) -> None: - class _Stat: - f_bavail = 100 - f_frsize = 1024 + class _Usage: + free = 100 * 1024 - monkeypatch.setattr(os, "statvfs", lambda path: _Stat()) + monkeypatch.setattr(shutil, "disk_usage", lambda path: _Usage()) estimate = {"total": 81 * 1024, "breakdown": "test"} with pytest.raises(MemoryError) as excinfo: diff --git a/tests/ipc/test_replay_pipeline_double_buffer.py b/tests/ipc/test_replay_pipeline_double_buffer.py index 075c11c72..64350e704 100644 --- a/tests/ipc/test_replay_pipeline_double_buffer.py +++ b/tests/ipc/test_replay_pipeline_double_buffer.py @@ -596,7 +596,7 @@ def test_trace_events_include_gpu_span_and_swap_metadata(self): assert submit["args"]["tick_id"] == 2 assert submit["args"]["pack_layout"] == "packed" assert submit["args"]["pack_executor"] == "collector_thread" - assert submit["args"]["h2d_submitter"] == "pybind11" + assert submit["args"]["h2d_submitter"] in {"pybind11", "torch_copy_stream"} assert submit["args"]["direct_pinned_shared"] is True assert submit["args"]["h2d_bytes"] > 0 @@ -661,7 +661,7 @@ def test_h2d_cuda_span_has_full_tick_metadata(self): assert args["sample_seed"] == 3 + 4 assert args["sample_count"] == 8 assert args["pinned_memory"] is True - assert args["h2d_submitter"] == "pybind11" + assert args["h2d_submitter"] in {"pybind11", "torch_copy_stream"} assert args["h2d_bytes"] > 0 def test_fixed_pybind11_h2d_submitter_samples_expected_batch(self): diff --git a/tests/scripts/test_torch_cuda_source.py b/tests/scripts/test_torch_cuda_source.py new file mode 100644 index 000000000..9bae4c8b1 --- /dev/null +++ b/tests/scripts/test_torch_cuda_source.py @@ -0,0 +1,48 @@ +from __future__ import annotations + +from pathlib import Path + +import tomllib + + +def test_torch_cuda_source_covers_windows_and_linux() -> None: + pyproject = Path(__file__).resolve().parents[2] / "pyproject.toml" + data = tomllib.loads(pyproject.read_text(encoding="utf-8")) + + torch_sources = data["tool"]["uv"]["sources"]["torch"] + cu128_sources = [source for source in torch_sources if source.get("index") == "pytorch-cu128"] + + assert len(cu128_sources) == 1 + marker = cu128_sources[0]["marker"] + assert "sys_platform=='linux'" in marker + assert "sys_platform=='win32'" in marker + + +def test_windows_lock_uses_cuda_torch() -> None: + lockfile = Path(__file__).resolve().parents[2] / "uv.lock" + lock = tomllib.loads(lockfile.read_text(encoding="utf-8")) + + root = next(package for package in lock["package"] if package["name"] == "unilab") + torch_dependencies = [dep for dep in root["dependencies"] if dep["name"] == "torch"] + + assert { + "name": "torch", + "version": "2.7.0+cu128", + "source": {"registry": "https://download.pytorch.org/whl/cu128"}, + "marker": "sys_platform == 'linux' or sys_platform == 'win32'", + } in torch_dependencies + + torch_packages = [package for package in lock["package"] if package["name"] == "torch"] + cu128_package = next( + package + for package in torch_packages + if package["source"] == {"registry": "https://download.pytorch.org/whl/cu128"} + ) + + assert cu128_package["version"] == "2.7.0+cu128" + assert any( + "sys_platform == 'win32'" in marker for marker in cu128_package["resolution-markers"] + ) + + wheel_urls = [wheel["url"] for wheel in cu128_package["wheels"]] + assert any("torch-2.7.0%2Bcu128" in url and "win_amd64.whl" in url for url in wheel_urls) diff --git a/tests/scripts/test_train_scripts.py b/tests/scripts/test_train_scripts.py index a04e5ce0b..1c787e42e 100644 --- a/tests/scripts/test_train_scripts.py +++ b/tests/scripts/test_train_scripts.py @@ -2480,7 +2480,7 @@ def test_train_rsl_rl_get_log_root_uses_algo_log_name(monkeypatch: pytest.Monkey cfg.algo.algo_log_name = "test_rsl_rl_ppo" log_root = mod._get_log_root(cfg) - assert "logs/test_rsl_rl_ppo" in log_root + assert "logs/test_rsl_rl_ppo" in log_root.replace("\\", "/") def test_train_rsl_rl_play_missing_checkpoint_skips_env_creation_and_prints_context( @@ -2741,7 +2741,7 @@ def test_train_appo_get_log_root_uses_algo_log_name(monkeypatch: pytest.MonkeyPa cfg.algo.algo_log_name = "test_appo" log_root = mod._get_log_root(cfg) - assert "logs/test_appo" in log_root + assert "logs/test_appo" in log_root.replace("\\", "/") def test_play_resolve_checkpoint_uses_algo_log_name( @@ -2971,7 +2971,7 @@ def sync(self): mod.play_interactive(args) assert captured["ckpt"] == "/tmp/model_10.pt" - assert captured["log_dir"] == "/tmp/custom_ppo/MyTask/play_temp" + assert captured["log_dir"].replace("\\", "/") == "/tmp/custom_ppo/MyTask/play_temp" def test_play_interactive_import_does_not_swallow_registry_bootstrap_errors( diff --git a/tests/test_cli.py b/tests/test_cli.py index acc448ff9..1cf4165dd 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -560,7 +560,7 @@ def fail_resolve(_: str) -> str: output = capsys.readouterr().out assert rc == 1 assert "Checkpoint not found" in output - assert "checkpoints/sharpa_appo_student/model_0.pt" in output + assert "checkpoints/sharpa_appo_student/model_0.pt" in output.replace("\\", "/") def test_demo_local_only_checkpoint_uses_existing_file( diff --git a/tests/training/test_training_helpers.py b/tests/training/test_training_helpers.py index 835e26fb3..0e08f988d 100644 --- a/tests/training/test_training_helpers.py +++ b/tests/training/test_training_helpers.py @@ -1,7 +1,5 @@ from __future__ import annotations -import sys -import types from pathlib import Path import numpy as np @@ -467,11 +465,12 @@ def capture_video_frame(self) -> np.ndarray: self.capture_calls += 1 return np.full((2, 3, 3), self.capture_calls, dtype=np.uint8) - fake_media = types.ModuleType("mediapy") - fake_media.write_video = lambda path, frames, fps: captured.update( # type: ignore[attr-defined] - {"video_path": path, "frames": frames, "fps": fps} + monkeypatch.setattr( + "unilab.base.backend.playback_common.imageio.mimsave", + lambda path, frames, fps: captured.update( + {"video_path": path, "frames": frames, "fps": fps} + ), ) - monkeypatch.setitem(sys.modules, "mediapy", fake_media) env = FakeEnv() output_path = tmp_path / "motrix.mp4" @@ -533,11 +532,12 @@ def capture_video_frame(self) -> np.ndarray: self.capture_calls += 1 return np.full((2, 3, 3), self.capture_calls, dtype=np.uint8) - fake_media = types.ModuleType("mediapy") - fake_media.write_video = lambda path, frames, fps: captured.update( # type: ignore[attr-defined] - {"video_path": path, "frames": frames, "fps": fps} + monkeypatch.setattr( + "unilab.base.backend.playback_common.imageio.mimsave", + lambda path, frames, fps: captured.update( + {"video_path": path, "frames": frames, "fps": fps} + ), ) - monkeypatch.setitem(sys.modules, "mediapy", fake_media) env = FakeEnv() output_path = tmp_path / "motrix_interactive.mp4" @@ -586,12 +586,12 @@ def _render_states_get_frames(state_list, model_file, **kwargs): captured["camera_kwargs"] = kwargs return [np.zeros((2, 2, 3), dtype=np.uint8)] - fake_media = types.ModuleType("mediapy") - fake_media.write_video = lambda path, frames, fps: captured.update( # type: ignore[attr-defined] - {"video_path": path, "frames": frames, "fps": fps} + monkeypatch.setattr( + "unilab.base.backend.playback_common.imageio.mimsave", + lambda path, frames, fps: captured.update( + {"video_path": path, "frames": frames, "fps": fps} + ), ) - - monkeypatch.setitem(sys.modules, "mediapy", fake_media) monkeypatch.setattr( "unilab.visualization.render_many.render_states_get_frames", _render_states_get_frames, @@ -687,12 +687,12 @@ def _render_states_get_frames(state_list, model_file, **kwargs): captured["ground1_size"] = model1.geom_size[ground1].copy() return [np.zeros((2, 2, 3), dtype=np.uint8)] - fake_media = types.ModuleType("mediapy") - fake_media.write_video = lambda path, frames, fps: captured.update( # type: ignore[attr-defined] - {"video_path": path, "frames": frames, "fps": fps} + monkeypatch.setattr( + "unilab.base.backend.playback_common.imageio.mimsave", + lambda path, frames, fps: captured.update( + {"video_path": path, "frames": frames, "fps": fps} + ), ) - - monkeypatch.setitem(sys.modules, "mediapy", fake_media) monkeypatch.setattr( "unilab.visualization.render_many.render_states_get_frames", _render_states_get_frames, diff --git a/tests/utils/test_render_many.py b/tests/utils/test_render_many.py index c733068d6..8d3cd127e 100644 --- a/tests/utils/test_render_many.py +++ b/tests/utils/test_render_many.py @@ -68,6 +68,26 @@ def test_resolve_gl_backend_preserves_explicit_safe_value(monkeypatch) -> None: assert render_many._resolve_gl_backend() == "osmesa" +def test_resolve_gl_backend_uses_glfw_on_windows_without_display(monkeypatch) -> None: + monkeypatch.setattr(sys, "platform", "win32") + monkeypatch.delenv("MUJOCO_GL", raising=False) + monkeypatch.delenv("DISPLAY", raising=False) + + render_many = _reload_render_many(monkeypatch) + monkeypatch.setattr(render_many, "_egl_runtime_usable", lambda: False) + + assert render_many._resolve_gl_backend() == "glfw" + + +def test_resolve_gl_backend_rejects_linux_only_backend_on_windows(monkeypatch) -> None: + monkeypatch.setattr(sys, "platform", "win32") + monkeypatch.setenv("MUJOCO_GL", "osmesa") + + render_many = _reload_render_many(monkeypatch) + + assert render_many._resolve_gl_backend() == "glfw" + + def test_egl_runtime_usable_sets_default_device_id(monkeypatch) -> None: render_many = _reload_render_many(monkeypatch) monkeypatch.delenv("MUJOCO_EGL_DEVICE_ID", raising=False) diff --git a/tests/visualization/test_interactive_playback.py b/tests/visualization/test_interactive_playback.py index 779799796..5032f8299 100644 --- a/tests/visualization/test_interactive_playback.py +++ b/tests/visualization/test_interactive_playback.py @@ -167,7 +167,7 @@ def get_inference_policy(self, *, device): assert session.env is env assert policy_obs_mode == "actor" assert checkpoint == "/tmp/model_10.pt" - assert captured["runner_log_dir"] == "/tmp/custom_ppo/MyTask/play_temp" + assert captured["runner_log_dir"].replace("\\", "/") == "/tmp/custom_ppo/MyTask/play_temp" assert captured["checkpoint"] == "/tmp/model_10.pt" assert captured["train_cfg"]["runner"]["logger"] == "none" diff --git a/uv.lock b/uv.lock index 5bb321cf1..0d24f5b26 100644 --- a/uv.lock +++ b/uv.lock @@ -6,34 +6,42 @@ resolution-markers = [ "python_full_version >= '3.13' and platform_machine == 'x86_64' and sys_platform == 'linux'", "python_full_version >= '3.13' and platform_machine == 'aarch64' and platform_python_implementation == 'CPython' and sys_platform == 'linux'", "python_full_version >= '3.13' and platform_machine != 's390x' and sys_platform == 'darwin'", - "python_full_version >= '3.13' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version >= '3.13' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version >= '3.13' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version == '3.12.*' and platform_machine == 'x86_64' and sys_platform == 'linux'", "(python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_machine != 's390x' and platform_machine != 'x86_64' and sys_platform == 'linux') or (python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation != 'CPython' and sys_platform == 'linux')", "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation == 'CPython' and sys_platform == 'linux'", "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform == 'darwin'", - "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform == 'linux'", "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform == 'darwin'", - "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform == 'linux'", "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform == 'darwin'", - "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version == '3.11.*' and platform_machine == 'x86_64' and sys_platform == 'linux'", "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and platform_machine != 's390x' and platform_machine != 'x86_64' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation != 'CPython' and sys_platform == 'linux')", "python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation == 'CPython' and sys_platform == 'linux'", "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform == 'darwin'", - "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform == 'linux'", "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform == 'darwin'", - "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version < '3.11' and platform_machine == 'x86_64' and sys_platform == 'linux'", "(python_full_version < '3.11' and platform_machine != 'aarch64' and platform_machine != 's390x' and platform_machine != 'x86_64' and sys_platform == 'linux') or (python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation != 'CPython' and sys_platform == 'linux')", "python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation == 'CPython' and sys_platform == 'linux'", "python_full_version < '3.11' and platform_machine != 's390x' and sys_platform == 'darwin'", - "python_full_version < '3.11' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version < '3.11' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version < '3.11' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version < '3.11' and platform_machine == 's390x' and sys_platform == 'linux'", "python_full_version < '3.11' and platform_machine == 's390x' and sys_platform == 'darwin'", - "python_full_version < '3.11' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version < '3.11' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version < '3.11' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", ] required-markers = [ "platform_machine == 'arm64' and sys_platform == 'darwin'", @@ -433,10 +441,12 @@ resolution-markers = [ "(python_full_version < '3.11' and platform_machine != 'aarch64' and platform_machine != 's390x' and platform_machine != 'x86_64' and sys_platform == 'linux') or (python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation != 'CPython' and sys_platform == 'linux')", "python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation == 'CPython' and sys_platform == 'linux'", "python_full_version < '3.11' and platform_machine != 's390x' and sys_platform == 'darwin'", - "python_full_version < '3.11' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version < '3.11' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version < '3.11' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version < '3.11' and platform_machine == 's390x' and sys_platform == 'linux'", "python_full_version < '3.11' and platform_machine == 's390x' and sys_platform == 'darwin'", - "python_full_version < '3.11' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version < '3.11' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version < '3.11' and platform_machine == 's390x' 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'" }, @@ -510,26 +520,32 @@ resolution-markers = [ "python_full_version >= '3.13' and platform_machine == 'x86_64' and sys_platform == 'linux'", "python_full_version >= '3.13' and platform_machine == 'aarch64' and platform_python_implementation == 'CPython' and sys_platform == 'linux'", "python_full_version >= '3.13' and platform_machine != 's390x' and sys_platform == 'darwin'", - "python_full_version >= '3.13' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version >= '3.13' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version >= '3.13' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version == '3.12.*' and platform_machine == 'x86_64' and sys_platform == 'linux'", "(python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_machine != 's390x' and platform_machine != 'x86_64' and sys_platform == 'linux') or (python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation != 'CPython' and sys_platform == 'linux')", "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation == 'CPython' and sys_platform == 'linux'", "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform == 'darwin'", - "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform == 'linux'", "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform == 'darwin'", - "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform == 'linux'", "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform == 'darwin'", - "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version == '3.11.*' and platform_machine == 'x86_64' and sys_platform == 'linux'", "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and platform_machine != 's390x' and platform_machine != 'x86_64' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation != 'CPython' and sys_platform == 'linux')", "python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation == 'CPython' and sys_platform == 'linux'", "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform == 'darwin'", - "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform == 'linux'", "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform == 'darwin'", - "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", ] dependencies = [ { name = "numpy", version = "2.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, @@ -759,10 +775,12 @@ resolution-markers = [ "(python_full_version < '3.11' and platform_machine != 'aarch64' and platform_machine != 's390x' and platform_machine != 'x86_64' and sys_platform == 'linux') or (python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation != 'CPython' and sys_platform == 'linux')", "python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation == 'CPython' and sys_platform == 'linux'", "python_full_version < '3.11' and platform_machine != 's390x' and sys_platform == 'darwin'", - "python_full_version < '3.11' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version < '3.11' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version < '3.11' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version < '3.11' and platform_machine == 's390x' and sys_platform == 'linux'", "python_full_version < '3.11' and platform_machine == 's390x' and sys_platform == 'darwin'", - "python_full_version < '3.11' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version < '3.11' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version < '3.11' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", ] sdist = { url = "https://files.pythonhosted.org/packages/9b/a0/522bbff0f3cdd37968f90dd7f26c7aa801ed87f5ba335f156de7f2b88a48/etils-1.13.0.tar.gz", hash = "sha256:a5b60c71f95bcd2d43d4e9fb3dc3879120c1f60472bb5ce19f7a860b1d44f607", size = 106368, upload-time = "2025-07-15T10:29:10.563Z" } wheels = [ @@ -786,26 +804,32 @@ resolution-markers = [ "python_full_version >= '3.13' and platform_machine == 'x86_64' and sys_platform == 'linux'", "python_full_version >= '3.13' and platform_machine == 'aarch64' and platform_python_implementation == 'CPython' and sys_platform == 'linux'", "python_full_version >= '3.13' and platform_machine != 's390x' and sys_platform == 'darwin'", - "python_full_version >= '3.13' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version >= '3.13' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version >= '3.13' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version == '3.12.*' and platform_machine == 'x86_64' and sys_platform == 'linux'", "(python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_machine != 's390x' and platform_machine != 'x86_64' and sys_platform == 'linux') or (python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation != 'CPython' and sys_platform == 'linux')", "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation == 'CPython' and sys_platform == 'linux'", "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform == 'darwin'", - "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform == 'linux'", "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform == 'darwin'", - "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform == 'linux'", "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform == 'darwin'", - "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version == '3.11.*' and platform_machine == 'x86_64' and sys_platform == 'linux'", "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and platform_machine != 's390x' and platform_machine != 'x86_64' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation != 'CPython' and sys_platform == 'linux')", "python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation == 'CPython' and sys_platform == 'linux'", "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform == 'darwin'", - "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform == 'linux'", "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform == 'darwin'", - "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", ] sdist = { url = "https://files.pythonhosted.org/packages/26/ce/6e067242fde898841922ac6fc82b0bb2fe35c38e995880bdffdfbe30182a/etils-1.14.0.tar.gz", hash = "sha256:8136e7f4c4173cd0af0ca5481c4475152f0b8686192951eefa60ee8711e1ede4", size = 108127, upload-time = "2026-03-04T17:41:36.291Z" } wheels = [ @@ -1188,6 +1212,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/49/fa/391e437a34e55095173dca5f24070d89cbc233ff85bf1c29c93248c6588d/imageio-2.37.3-py3-none-any.whl", hash = "sha256:46f5bb8522cd421c0f5ae104d8268f569d856b29eb1a13b92829d1970f32c9f0", size = 317646, upload-time = "2026-03-09T11:31:10.771Z" }, ] +[[package]] +name = "imageio-ffmpeg" +version = "0.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/44/bd/c3343c721f2a1b0c9fc71c1aebf1966a3b7f08c2eea8ed5437a2865611d6/imageio_ffmpeg-0.6.0.tar.gz", hash = "sha256:e2556bed8e005564a9f925bb7afa4002d82770d6b08825078b7697ab88ba1755", size = 25210, upload-time = "2025-01-16T21:34:32.747Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/58/87ef68ac83f4c7690961bce288fd8e382bc5f1513860fc7f90a9c1c1c6bf/imageio_ffmpeg-0.6.0-py3-none-macosx_10_9_intel.macosx_10_9_x86_64.whl", hash = "sha256:9d2baaf867088508d4a3458e61eeb30e945c4ad8016025545f66c4b5aaef0a61", size = 24932969, upload-time = "2025-01-16T21:34:20.464Z" }, + { url = "https://files.pythonhosted.org/packages/40/5c/f3d8a657d362cc93b81aab8feda487317da5b5d31c0e1fdfd5e986e55d17/imageio_ffmpeg-0.6.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:b1ae3173414b5fc5f538a726c4e48ea97edc0d2cdc11f103afee655c463fa742", size = 21113891, upload-time = "2025-01-16T21:34:00.277Z" }, + { url = "https://files.pythonhosted.org/packages/33/e7/1925bfbc563c39c1d2e82501d8372734a5c725e53ac3b31b4c2d081e895b/imageio_ffmpeg-0.6.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1d47bebd83d2c5fc770720d211855f208af8a596c82d17730aa51e815cdee6dc", size = 25632706, upload-time = "2025-01-16T21:33:53.475Z" }, + { url = "https://files.pythonhosted.org/packages/a0/2d/43c8522a2038e9d0e7dbdf3a61195ecc31ca576fb1527a528c877e87d973/imageio_ffmpeg-0.6.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:c7e46fcec401dd990405049d2e2f475e2b397779df2519b544b8aab515195282", size = 29498237, upload-time = "2025-01-16T21:34:13.726Z" }, + { url = "https://files.pythonhosted.org/packages/a0/13/59da54728351883c3c1d9fca1710ab8eee82c7beba585df8f25ca925f08f/imageio_ffmpeg-0.6.0-py3-none-win32.whl", hash = "sha256:196faa79366b4a82f95c0f4053191d2013f4714a715780f0ad2a68ff37483cc2", size = 19652251, upload-time = "2025-01-16T21:34:06.812Z" }, + { url = "https://files.pythonhosted.org/packages/2c/c6/fa760e12a2483469e2bf5058c5faff664acf66cadb4df2ad6205b016a73d/imageio_ffmpeg-0.6.0-py3-none-win_amd64.whl", hash = "sha256:02fa47c83703c37df6bfe4896aab339013f62bf02c5ebf2dce6da56af04ffc0a", size = 31246824, upload-time = "2025-01-16T21:34:28.6Z" }, +] + [[package]] name = "importlib-metadata" version = "9.0.0" @@ -1253,10 +1291,12 @@ resolution-markers = [ "(python_full_version < '3.11' and platform_machine != 'aarch64' and platform_machine != 's390x' and platform_machine != 'x86_64' and sys_platform == 'linux') or (python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation != 'CPython' and sys_platform == 'linux')", "python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation == 'CPython' and sys_platform == 'linux'", "python_full_version < '3.11' and platform_machine != 's390x' and sys_platform == 'darwin'", - "python_full_version < '3.11' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version < '3.11' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version < '3.11' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version < '3.11' and platform_machine == 's390x' and sys_platform == 'linux'", "python_full_version < '3.11' and platform_machine == 's390x' and sys_platform == 'darwin'", - "python_full_version < '3.11' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version < '3.11' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version < '3.11' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", ] dependencies = [ { name = "colorama", marker = "python_full_version < '3.11' and sys_platform == 'win32'" }, @@ -1285,10 +1325,12 @@ resolution-markers = [ "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and platform_machine != 's390x' and platform_machine != 'x86_64' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation != 'CPython' and sys_platform == 'linux')", "python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation == 'CPython' and sys_platform == 'linux'", "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform == 'darwin'", - "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform == 'linux'", "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform == 'darwin'", - "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", ] dependencies = [ { name = "colorama", marker = "python_full_version == '3.11.*' and sys_platform == 'win32'" }, @@ -1317,18 +1359,22 @@ resolution-markers = [ "python_full_version >= '3.13' and platform_machine == 'x86_64' and sys_platform == 'linux'", "python_full_version >= '3.13' and platform_machine == 'aarch64' and platform_python_implementation == 'CPython' and sys_platform == 'linux'", "python_full_version >= '3.13' and platform_machine != 's390x' and sys_platform == 'darwin'", - "python_full_version >= '3.13' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version >= '3.13' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version >= '3.13' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version == '3.12.*' and platform_machine == 'x86_64' and sys_platform == 'linux'", "(python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_machine != 's390x' and platform_machine != 'x86_64' and sys_platform == 'linux') or (python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation != 'CPython' and sys_platform == 'linux')", "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation == 'CPython' and sys_platform == 'linux'", "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform == 'darwin'", - "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform == 'linux'", "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform == 'darwin'", - "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform == 'linux'", "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform == 'darwin'", - "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", ] dependencies = [ { name = "colorama", marker = "python_full_version >= '3.12' and sys_platform == 'win32'" }, @@ -2293,12 +2339,16 @@ sdist = { url = "https://files.pythonhosted.org/packages/d7/af/c042c865b78400d13 wheels = [ { url = "https://files.pythonhosted.org/packages/dc/06/662b657925a036b709e82474656b25e39559ef399449c78492a4f9f69b60/mujoco_uni-3.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5e7c9daa247c1237ac4753d6269da39ff260d502e12819a8ba4921d0c8f542fa", size = 7039352, upload-time = "2026-05-30T08:34:01.139Z" }, { url = "https://files.pythonhosted.org/packages/bd/a1/31f6e13cbe25bcd840cccb7aeccb41235202728ab0e899cc12e6ac617fa6/mujoco_uni-3.8.0-cp310-cp310-manylinux_2_27_x86_64.whl", hash = "sha256:1326817ad54620ecfe473f581667f7be0d8f9df78db59b69c69b33c4c588a17d", size = 10781648, upload-time = "2026-05-30T09:16:34.589Z" }, + { url = "https://files.pythonhosted.org/packages/07/db/198a7563ae0dee5e2be9adb7ef647170925f20222ff677cdff5e493e5f12/mujoco_uni-3.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:5ce4610c5d8c4378ba90c905826dbd5a2dcdddc6ac6bd4d90f35a270ad8586b5", size = 5151515, upload-time = "2026-06-20T09:11:15.99Z" }, { url = "https://files.pythonhosted.org/packages/00/6f/cc3a8e72105253587a839732c2cdcedb7f674aaf8ffc250b21caf3e920bb/mujoco_uni-3.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ada4f286820bb982bb88ba14ad825e8f9ae1d2d69dbc1c1bd619ce5952f1ac90", size = 7053583, upload-time = "2026-05-30T08:34:04.819Z" }, { url = "https://files.pythonhosted.org/packages/72/d0/68202a14dabd695062d121fb706dfa88f97151e41b0bced26e14d0cac953/mujoco_uni-3.8.0-cp311-cp311-manylinux_2_27_x86_64.whl", hash = "sha256:0689b6fff5f69d943f501dcddde02fcc35ffa67821106c35f45643894c21be58", size = 10796553, upload-time = "2026-05-30T09:16:37.602Z" }, + { url = "https://files.pythonhosted.org/packages/f2/af/5d6ff16a1fa4a51e259dbe33fcab84246a202b6f8faf1e0468b020142db6/mujoco_uni-3.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:bc1679f21eb0a755b33a95c1efc3d7852c006d4592b1f75e2f8e75486a7f2508", size = 5166505, upload-time = "2026-06-20T09:11:17.695Z" }, { url = "https://files.pythonhosted.org/packages/f1/10/4d385b13ba42948bd806c1ba3101c6cd196cd56ae74692ba8a399c4292de/mujoco_uni-3.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e7df4482799acda1f5817ee4fb3f8ca403692b8120118984b1bcd525bfbe0bcf", size = 7068818, upload-time = "2026-05-30T08:34:07.91Z" }, { url = "https://files.pythonhosted.org/packages/5d/00/60a2fe19e943eb67d1df1b000c1eedc8dd1ed44106959fb2f9cec4fa4ec1/mujoco_uni-3.8.0-cp312-cp312-manylinux_2_27_x86_64.whl", hash = "sha256:241890f6cfcbd31ef4bc169eee7442fbdca35e48740f0b67ac8f7872fc4b8453", size = 10890544, upload-time = "2026-05-30T09:16:40.622Z" }, + { url = "https://files.pythonhosted.org/packages/ac/dd/b9ae0e667738b1a0639c7ea17eed582c115613eff02824b776d972a16e76/mujoco_uni-3.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:679fe797bf85cd2324e976883a63031467ff5cd4bdad3f68711f6c26c6c42852", size = 5185412, upload-time = "2026-06-20T09:11:19.296Z" }, { url = "https://files.pythonhosted.org/packages/90/23/98a7802d7fc5111b2449364aaf1b1a364266f62d7578c4442db5f59eb114/mujoco_uni-3.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bc191279752a4a63f161ff026ed5cb8aac013c1934c308944f3cc5970bae90ca", size = 7069246, upload-time = "2026-05-30T08:34:10.292Z" }, { url = "https://files.pythonhosted.org/packages/dd/23/a1bce997e15a8d27beadff7c320375bb5c71a9cf2700607ec97c6239240c/mujoco_uni-3.8.0-cp313-cp313-manylinux_2_27_x86_64.whl", hash = "sha256:441bbb1800a8f36985f146c5bc3fa3eb6c1aa16efe6eb94770c653994258c8f7", size = 10890301, upload-time = "2026-05-30T09:16:43.505Z" }, + { url = "https://files.pythonhosted.org/packages/ea/af/bcd604ea08dbe1426078b9d67de8bfb0c68c139d897f732387c31848259a/mujoco_uni-3.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:b2189c324024eeaf51e5e1121ca186c8b68fd9c3d114da481c5ce5786e345794", size = 5183208, upload-time = "2026-06-20T09:11:20.897Z" }, ] [[package]] @@ -2427,10 +2477,12 @@ resolution-markers = [ "(python_full_version < '3.11' and platform_machine != 'aarch64' and platform_machine != 's390x' and platform_machine != 'x86_64' and sys_platform == 'linux') or (python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation != 'CPython' and sys_platform == 'linux')", "python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation == 'CPython' and sys_platform == 'linux'", "python_full_version < '3.11' and platform_machine != 's390x' and sys_platform == 'darwin'", - "python_full_version < '3.11' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version < '3.11' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version < '3.11' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version < '3.11' and platform_machine == 's390x' and sys_platform == 'linux'", "python_full_version < '3.11' and platform_machine == 's390x' and sys_platform == 'darwin'", - "python_full_version < '3.11' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version < '3.11' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version < '3.11' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", ] sdist = { url = "https://files.pythonhosted.org/packages/fd/1d/06475e1cd5264c0b870ea2cc6fdb3e37177c1e565c43f56ff17a10e3937f/networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1", size = 2151368, upload-time = "2024-10-21T12:39:38.695Z" } wheels = [ @@ -2446,26 +2498,32 @@ resolution-markers = [ "python_full_version >= '3.13' and platform_machine == 'x86_64' and sys_platform == 'linux'", "python_full_version >= '3.13' and platform_machine == 'aarch64' and platform_python_implementation == 'CPython' and sys_platform == 'linux'", "python_full_version >= '3.13' and platform_machine != 's390x' and sys_platform == 'darwin'", - "python_full_version >= '3.13' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version >= '3.13' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version >= '3.13' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version == '3.12.*' and platform_machine == 'x86_64' and sys_platform == 'linux'", "(python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_machine != 's390x' and platform_machine != 'x86_64' and sys_platform == 'linux') or (python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation != 'CPython' and sys_platform == 'linux')", "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation == 'CPython' and sys_platform == 'linux'", "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform == 'darwin'", - "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform == 'linux'", "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform == 'darwin'", - "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform == 'linux'", "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform == 'darwin'", - "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version == '3.11.*' and platform_machine == 'x86_64' and sys_platform == 'linux'", "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and platform_machine != 's390x' and platform_machine != 'x86_64' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation != 'CPython' and sys_platform == 'linux')", "python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation == 'CPython' and sys_platform == 'linux'", "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform == 'darwin'", - "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform == 'linux'", "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform == 'darwin'", - "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", ] sdist = { url = "https://files.pythonhosted.org/packages/6a/51/63fe664f3908c97be9d2e4f1158eb633317598cfa6e1fc14af5383f17512/networkx-3.6.1.tar.gz", hash = "sha256:26b7c357accc0c8cde558ad486283728b65b6a95d85ee1cd66bafab4c8168509", size = 2517025, upload-time = "2025-12-08T17:02:39.908Z" } wheels = [ @@ -2540,10 +2598,12 @@ resolution-markers = [ "(python_full_version < '3.11' and platform_machine != 'aarch64' and platform_machine != 's390x' and platform_machine != 'x86_64' and sys_platform == 'linux') or (python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation != 'CPython' and sys_platform == 'linux')", "python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation == 'CPython' and sys_platform == 'linux'", "python_full_version < '3.11' and platform_machine != 's390x' and sys_platform == 'darwin'", - "python_full_version < '3.11' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version < '3.11' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version < '3.11' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version < '3.11' and platform_machine == 's390x' and sys_platform == 'linux'", "python_full_version < '3.11' and platform_machine == 's390x' and sys_platform == 'darwin'", - "python_full_version < '3.11' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version < '3.11' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version < '3.11' and platform_machine == 's390x' 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 = [ @@ -2612,26 +2672,32 @@ resolution-markers = [ "python_full_version >= '3.13' and platform_machine == 'x86_64' and sys_platform == 'linux'", "python_full_version >= '3.13' and platform_machine == 'aarch64' and platform_python_implementation == 'CPython' and sys_platform == 'linux'", "python_full_version >= '3.13' and platform_machine != 's390x' and sys_platform == 'darwin'", - "python_full_version >= '3.13' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version >= '3.13' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version >= '3.13' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version == '3.12.*' and platform_machine == 'x86_64' and sys_platform == 'linux'", "(python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_machine != 's390x' and platform_machine != 'x86_64' and sys_platform == 'linux') or (python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation != 'CPython' and sys_platform == 'linux')", "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation == 'CPython' and sys_platform == 'linux'", "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform == 'darwin'", - "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform == 'linux'", "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform == 'darwin'", - "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform == 'linux'", "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform == 'darwin'", - "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version == '3.11.*' and platform_machine == 'x86_64' and sys_platform == 'linux'", "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and platform_machine != 's390x' and platform_machine != 'x86_64' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation != 'CPython' and sys_platform == 'linux')", "python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation == 'CPython' and sys_platform == 'linux'", "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform == 'darwin'", - "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform == 'linux'", "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform == 'darwin'", - "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", ] sdist = { url = "https://files.pythonhosted.org/packages/d7/9f/b8cef5bffa569759033adda9481211426f12f53299629b410340795c2514/numpy-2.4.4.tar.gz", hash = "sha256:2d390634c5182175533585cc89f3608a4682ccb173cc9bb940b2881c8d6f8fa0", size = 20731587, upload-time = "2026-03-29T13:22:01.298Z" } wheels = [ @@ -2889,10 +2955,12 @@ resolution-markers = [ "(python_full_version < '3.11' and platform_machine != 'aarch64' and platform_machine != 's390x' and platform_machine != 'x86_64' and sys_platform == 'linux') or (python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation != 'CPython' and sys_platform == 'linux')", "python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation == 'CPython' and sys_platform == 'linux'", "python_full_version < '3.11' and platform_machine != 's390x' and sys_platform == 'darwin'", - "python_full_version < '3.11' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version < '3.11' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version < '3.11' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version < '3.11' and platform_machine == 's390x' and sys_platform == 'linux'", "python_full_version < '3.11' and platform_machine == 's390x' and sys_platform == 'darwin'", - "python_full_version < '3.11' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version < '3.11' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version < '3.11' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", ] dependencies = [ { name = "coloredlogs", marker = "python_full_version < '3.11'" }, @@ -2929,26 +2997,32 @@ resolution-markers = [ "python_full_version >= '3.13' and platform_machine == 'x86_64' and sys_platform == 'linux'", "python_full_version >= '3.13' and platform_machine == 'aarch64' and platform_python_implementation == 'CPython' and sys_platform == 'linux'", "python_full_version >= '3.13' and platform_machine != 's390x' and sys_platform == 'darwin'", - "python_full_version >= '3.13' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version >= '3.13' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version >= '3.13' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version == '3.12.*' and platform_machine == 'x86_64' and sys_platform == 'linux'", "(python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_machine != 's390x' and platform_machine != 'x86_64' and sys_platform == 'linux') or (python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation != 'CPython' and sys_platform == 'linux')", "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation == 'CPython' and sys_platform == 'linux'", "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform == 'darwin'", - "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform == 'linux'", "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform == 'darwin'", - "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform == 'linux'", "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform == 'darwin'", - "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version == '3.11.*' and platform_machine == 'x86_64' and sys_platform == 'linux'", "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and platform_machine != 's390x' and platform_machine != 'x86_64' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation != 'CPython' and sys_platform == 'linux')", "python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation == 'CPython' and sys_platform == 'linux'", "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform == 'darwin'", - "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform == 'linux'", "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform == 'darwin'", - "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", ] dependencies = [ { name = "flatbuffers", marker = "python_full_version >= '3.11'" }, @@ -3111,7 +3185,7 @@ name = "pexpect" version = "4.9.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "ptyprocess" }, + { name = "ptyprocess", marker = "sys_platform != 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" } wheels = [ @@ -3830,8 +3904,8 @@ dependencies = [ { name = "onnx" }, { name = "onnxscript" }, { name = "tensordict" }, - { name = "torch", version = "2.7.0", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform != 'linux'" }, - { name = "torch", version = "2.7.0+cu128", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "sys_platform == 'linux'" }, + { name = "torch", version = "2.7.0", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform != 'linux' and sys_platform != 'win32'" }, + { name = "torch", version = "2.7.0+cu128", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/d5/23/dae404688e571e73662b7754ab2a8bddcc48f625c338b7f55576ad528653/rsl_rl_lib-5.0.1.tar.gz", hash = "sha256:b6e1fce8f4481c6118d53c7b03b80c8070d0a1edd3df3efbec5e5e6ff7c92132", size = 58623, upload-time = "2026-03-04T08:19:49.671Z" } wheels = [ @@ -3888,10 +3962,12 @@ resolution-markers = [ "(python_full_version < '3.11' and platform_machine != 'aarch64' and platform_machine != 's390x' and platform_machine != 'x86_64' and sys_platform == 'linux') or (python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation != 'CPython' and sys_platform == 'linux')", "python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation == 'CPython' and sys_platform == 'linux'", "python_full_version < '3.11' and platform_machine != 's390x' and sys_platform == 'darwin'", - "python_full_version < '3.11' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version < '3.11' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version < '3.11' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version < '3.11' and platform_machine == 's390x' and sys_platform == 'linux'", "python_full_version < '3.11' and platform_machine == 's390x' and sys_platform == 'darwin'", - "python_full_version < '3.11' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version < '3.11' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version < '3.11' and platform_machine == 's390x' 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'" }, @@ -3954,26 +4030,32 @@ resolution-markers = [ "python_full_version >= '3.13' and platform_machine == 'x86_64' and sys_platform == 'linux'", "python_full_version >= '3.13' and platform_machine == 'aarch64' and platform_python_implementation == 'CPython' and sys_platform == 'linux'", "python_full_version >= '3.13' and platform_machine != 's390x' and sys_platform == 'darwin'", - "python_full_version >= '3.13' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version >= '3.13' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version >= '3.13' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version == '3.12.*' and platform_machine == 'x86_64' and sys_platform == 'linux'", "(python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_machine != 's390x' and platform_machine != 'x86_64' and sys_platform == 'linux') or (python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation != 'CPython' and sys_platform == 'linux')", "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation == 'CPython' and sys_platform == 'linux'", "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform == 'darwin'", - "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform == 'linux'", "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform == 'darwin'", - "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform == 'linux'", "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform == 'darwin'", - "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version == '3.11.*' and platform_machine == 'x86_64' and sys_platform == 'linux'", "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and platform_machine != 's390x' and platform_machine != 'x86_64' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation != 'CPython' and sys_platform == 'linux')", "python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation == 'CPython' and sys_platform == 'linux'", "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform == 'darwin'", - "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform == 'linux'", "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform == 'darwin'", - "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", ] dependencies = [ { name = "numpy", version = "2.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, @@ -4219,8 +4301,8 @@ dependencies = [ { name = "orjson", marker = "python_full_version < '3.13'" }, { name = "packaging" }, { name = "pyvers" }, - { name = "torch", version = "2.7.0", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform != 'linux'" }, - { name = "torch", version = "2.7.0+cu128", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "sys_platform == 'linux'" }, + { name = "torch", version = "2.7.0", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform != 'linux' and sys_platform != 'win32'" }, + { name = "torch", version = "2.7.0+cu128", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/50/bc/2411956883bf1c7531e107dd79225ca47ce4a42d9306da015f625a6f08c5/tensordict-0.11.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:269a94f6afd8229718f8a657bf093f2c861dd24223625fdadfed446cf4cdf86e", size = 813584, upload-time = "2026-01-26T11:35:55.172Z" }, @@ -4313,42 +4395,37 @@ version = "2.7.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.13' and platform_machine != 's390x' and sys_platform == 'darwin'", - "python_full_version >= '3.13' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version >= '3.13' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform == 'darwin'", - "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform == 'darwin'", - "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform == 'darwin'", - "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform == 'darwin'", - "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform == 'darwin'", - "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version < '3.11' and platform_machine != 's390x' and sys_platform == 'darwin'", - "python_full_version < '3.11' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version < '3.11' and platform_machine != 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", "python_full_version < '3.11' and platform_machine == 's390x' and sys_platform == 'darwin'", - "python_full_version < '3.11' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux'", + "python_full_version < '3.11' and platform_machine == 's390x' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32'", ] dependencies = [ - { name = "filelock", marker = "sys_platform != 'linux'" }, - { name = "fsspec", marker = "sys_platform != 'linux'" }, - { name = "jinja2", marker = "sys_platform != 'linux'" }, - { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11' and sys_platform != 'linux'" }, - { name = "networkx", version = "3.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11' and sys_platform != 'linux'" }, - { name = "setuptools", marker = "python_full_version >= '3.12' and sys_platform != 'linux'" }, - { name = "sympy", marker = "sys_platform != 'linux'" }, - { name = "typing-extensions", marker = "sys_platform != 'linux'" }, + { name = "filelock", marker = "sys_platform != 'linux' and sys_platform != 'win32'" }, + { name = "fsspec", marker = "sys_platform != 'linux' and sys_platform != 'win32'" }, + { name = "jinja2", marker = "sys_platform != 'linux' and sys_platform != 'win32'" }, + { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11' and sys_platform != 'linux' and sys_platform != 'win32'" }, + { name = "networkx", version = "3.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11' and sys_platform != 'linux' and sys_platform != 'win32'" }, + { name = "setuptools", marker = "python_full_version >= '3.12' and sys_platform != 'linux' and sys_platform != 'win32'" }, + { name = "sympy", marker = "sys_platform != 'linux' and sys_platform != 'win32'" }, + { name = "typing-extensions", marker = "sys_platform != 'linux' and sys_platform != 'win32'" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/7f/7e/1b1cc4e0e7cc2666cceb3d250eef47a205f0821c330392cf45eb08156ce5/torch-2.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:2ad79d0d8c2a20a37c5df6052ec67c2078a2c4e9a96dd3a8b55daaff6d28ea29", size = 212521189, upload-time = "2025-04-23T14:34:53.898Z" }, { url = "https://files.pythonhosted.org/packages/dc/0b/b2b83f30b8e84a51bf4f96aa3f5f65fdf7c31c591cc519310942339977e2/torch-2.7.0-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:34e0168ed6de99121612d72224e59b2a58a83dae64999990eada7260c5dd582d", size = 68559462, upload-time = "2025-04-23T14:35:39.889Z" }, - { url = "https://files.pythonhosted.org/packages/13/85/6c1092d4b06c3db1ed23d4106488750917156af0b24ab0a2d9951830b0e9/torch-2.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:58df8d5c2eeb81305760282b5069ea4442791a6bbf0c74d9069b7b3304ff8a37", size = 212520100, upload-time = "2025-04-23T14:35:27.473Z" }, { url = "https://files.pythonhosted.org/packages/aa/3f/85b56f7e2abcfa558c5fbf7b11eb02d78a4a63e6aeee2bbae3bb552abea5/torch-2.7.0-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:0a8d43caa342b9986101ec5feb5bbf1d86570b5caa01e9cb426378311258fdde", size = 68569377, upload-time = "2025-04-23T14:35:20.361Z" }, - { url = "https://files.pythonhosted.org/packages/44/80/b353c024e6b624cd9ce1d66dcb9d24e0294680f95b369f19280e241a0159/torch-2.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:f56d4b2510934e072bab3ab8987e00e60e1262fb238176168f5e0c43a1320c6d", size = 212482262, upload-time = "2025-04-23T14:35:03.527Z" }, { url = "https://files.pythonhosted.org/packages/ee/8d/b2939e5254be932db1a34b2bd099070c509e8887e0c5a90c498a917e4032/torch-2.7.0-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:30b7688a87239a7de83f269333651d8e582afffce6f591fff08c046f7787296e", size = 68574294, upload-time = "2025-04-23T14:34:47.098Z" }, - { url = "https://files.pythonhosted.org/packages/74/c8/2ab2b6eadc45554af8768ae99668c5a8a8552e2012c7238ded7e9e4395e1/torch-2.7.0-cp313-cp313-win_amd64.whl", hash = "sha256:434cf3b378340efc87c758f250e884f34460624c0523fe5c9b518d205c91dd1b", size = 212490304, upload-time = "2025-04-23T14:33:57.108Z" }, { url = "https://files.pythonhosted.org/packages/28/fd/74ba6fde80e2b9eef4237fe668ffae302c76f0e4221759949a632ca13afa/torch-2.7.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:edad98dddd82220465b106506bb91ee5ce32bd075cddbcf2b443dfaa2cbd83bf", size = 68856166, upload-time = "2025-04-23T14:34:04.012Z" }, - { url = "https://files.pythonhosted.org/packages/d1/b7/2235d0c3012c596df1c8d39a3f4afc1ee1b6e318d469eda4c8bb68566448/torch-2.7.0-cp313-cp313t-win_amd64.whl", hash = "sha256:d0ca446a93f474985d81dc866fcc8dccefb9460a29a456f79d99c29a78a66993", size = 212750916, upload-time = "2025-04-23T14:32:22.91Z" }, { url = "https://files.pythonhosted.org/packages/90/48/7e6477cf40d48cc0a61fa0d41ee9582b9a316b12772fcac17bc1a40178e7/torch-2.7.0-cp313-none-macosx_11_0_arm64.whl", hash = "sha256:27f5007bdf45f7bb7af7f11d1828d5c2487e030690afb3d89a651fd7036a390e", size = 68575074, upload-time = "2025-04-23T14:32:38.136Z" }, ] @@ -4360,26 +4437,34 @@ resolution-markers = [ "(python_full_version >= '3.13' and platform_machine != 'aarch64' and platform_machine != 's390x' and platform_machine != 'x86_64' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_machine == 'aarch64' and platform_python_implementation != 'CPython' and sys_platform == 'linux')", "python_full_version >= '3.13' and platform_machine == 'x86_64' and sys_platform == 'linux'", "python_full_version >= '3.13' and platform_machine == 'aarch64' and platform_python_implementation == 'CPython' and sys_platform == 'linux'", + "python_full_version >= '3.13' and platform_machine != 's390x' and sys_platform == 'win32'", "python_full_version == '3.12.*' and platform_machine == 'x86_64' and sys_platform == 'linux'", "(python_full_version == '3.12.*' and platform_machine != 'aarch64' and platform_machine != 's390x' and platform_machine != 'x86_64' and sys_platform == 'linux') or (python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation != 'CPython' and sys_platform == 'linux')", "python_full_version == '3.12.*' and platform_machine == 'aarch64' and platform_python_implementation == 'CPython' and sys_platform == 'linux'", + "python_full_version == '3.12.*' and platform_machine != 's390x' and sys_platform == 'win32'", "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform == 'linux'", + "python_full_version >= '3.13' and platform_machine == 's390x' and sys_platform == 'win32'", "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform == 'linux'", + "python_full_version == '3.12.*' and platform_machine == 's390x' and sys_platform == 'win32'", "python_full_version == '3.11.*' and platform_machine == 'x86_64' and sys_platform == 'linux'", "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and platform_machine != 's390x' and platform_machine != 'x86_64' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation != 'CPython' and sys_platform == 'linux')", "python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_python_implementation == 'CPython' and sys_platform == 'linux'", + "python_full_version == '3.11.*' and platform_machine != 's390x' and sys_platform == 'win32'", "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform == 'linux'", + "python_full_version == '3.11.*' and platform_machine == 's390x' and sys_platform == 'win32'", "python_full_version < '3.11' and platform_machine == 'x86_64' and sys_platform == 'linux'", "(python_full_version < '3.11' and platform_machine != 'aarch64' and platform_machine != 's390x' and platform_machine != 'x86_64' and sys_platform == 'linux') or (python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation != 'CPython' and sys_platform == 'linux')", "python_full_version < '3.11' and platform_machine == 'aarch64' and platform_python_implementation == 'CPython' and sys_platform == 'linux'", + "python_full_version < '3.11' and platform_machine != 's390x' and sys_platform == 'win32'", "python_full_version < '3.11' and platform_machine == 's390x' and sys_platform == 'linux'", + "python_full_version < '3.11' and platform_machine == 's390x' and sys_platform == 'win32'", ] dependencies = [ - { name = "filelock", marker = "sys_platform == 'linux'" }, - { name = "fsspec", marker = "sys_platform == 'linux'" }, - { name = "jinja2", marker = "sys_platform == 'linux'" }, - { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11' and sys_platform == 'linux'" }, - { name = "networkx", version = "3.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11' and sys_platform == 'linux'" }, + { name = "filelock", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "fsspec", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "jinja2", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.11' and sys_platform == 'linux') or (python_full_version < '3.11' and sys_platform == 'win32')" }, + { name = "networkx", version = "3.6.1", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.11' and sys_platform == 'linux') or (python_full_version >= '3.11' and sys_platform == 'win32')" }, { name = "nvidia-cublas-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, { name = "nvidia-cuda-cupti-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, { name = "nvidia-cuda-nvrtc-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, @@ -4394,22 +4479,27 @@ dependencies = [ { name = "nvidia-nccl-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, { name = "nvidia-nvjitlink-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, { name = "nvidia-nvtx-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "setuptools", marker = "python_full_version >= '3.12' and sys_platform == 'linux'" }, - { name = "sympy", marker = "sys_platform == 'linux'" }, + { name = "setuptools", marker = "(python_full_version >= '3.12' and sys_platform == 'linux') or (python_full_version >= '3.12' and sys_platform == 'win32')" }, + { name = "sympy", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "triton", marker = "sys_platform == 'linux'" }, - { name = "typing-extensions", marker = "sys_platform == 'linux'" }, + { name = "typing-extensions", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, ] wheels = [ { url = "https://download-r2.pytorch.org/whl/cu128/torch-2.7.0%2Bcu128-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:b1f0cdd0720ad60536deb5baa427b782fd920dd4fcf72e244d32974caafa3b9e", upload-time = "2025-05-14T03:33:41Z" }, { url = "https://download-r2.pytorch.org/whl/cu128/torch-2.7.0%2Bcu128-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:ac1849553ee673dfafb44c610c60cb60a2890f0e117f43599a526cf777eb8b8c", upload-time = "2025-04-22T18:19:25Z" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torch-2.7.0%2Bcu128-cp310-cp310-win_amd64.whl", hash = "sha256:c52c4b869742f00b12cb34521d1381be6119fa46244791704b00cc4a3cb06850", upload-time = "2025-04-22T18:19:44Z" }, { url = "https://download-r2.pytorch.org/whl/cu128/torch-2.7.0%2Bcu128-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:47c895bcab508769d129d717a4b916b10225ae3855723aeec8dff8efe5346207", upload-time = "2025-05-14T03:35:36Z" }, { url = "https://download-r2.pytorch.org/whl/cu128/torch-2.7.0%2Bcu128-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:c4bbc0b4be60319ba1cefc90be9557b317f0b3c261eeceb96ca6e0343eec56bf", upload-time = "2025-04-22T18:20:00Z" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torch-2.7.0%2Bcu128-cp311-cp311-win_amd64.whl", hash = "sha256:bf88f647d76d79da9556ca55df49e45aff1d66c12797886364343179dd09a36c", upload-time = "2025-04-22T18:20:15Z" }, { url = "https://download-r2.pytorch.org/whl/cu128/torch-2.7.0%2Bcu128-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:6bba7dca5d9a729f1e8e9befb98055498e551efaf5ed034824c168b560afc1ac", upload-time = "2025-05-14T03:37:30Z" }, { url = "https://download-r2.pytorch.org/whl/cu128/torch-2.7.0%2Bcu128-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:7c0f08d1c44a02abad389373dddfce75904b969a410be2f4e5109483dd3dc0ce", upload-time = "2025-04-22T18:20:33Z" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torch-2.7.0%2Bcu128-cp312-cp312-win_amd64.whl", hash = "sha256:1704e5dd66c9221e4e8b6ae2d80cbf54e129571e643f5fa9ca78cc6d2096403a", upload-time = "2025-04-22T18:21:07Z" }, { url = "https://download-r2.pytorch.org/whl/cu128/torch-2.7.0%2Bcu128-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:633f35e8b1b1f640ef5f8a98dbd84f19b548222ce7ba8f017fe47ce6badc106a", upload-time = "2025-05-14T03:39:04Z" }, { url = "https://download-r2.pytorch.org/whl/cu128/torch-2.7.0%2Bcu128-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:d2f69f909da5dc52113ec66a851d62079f3d52c83184cf64beebdf12ca2f705c", upload-time = "2025-04-22T18:21:25Z" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torch-2.7.0%2Bcu128-cp313-cp313-win_amd64.whl", hash = "sha256:58c749f52ddc9098155c77d6c74153bb13d8978fd6e1063b5d7b41d4644f5af5", upload-time = "2025-04-22T18:21:51Z" }, { url = "https://download-r2.pytorch.org/whl/cu128/torch-2.7.0%2Bcu128-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:fa05ac6ebed4777de7a5eff398c1f17b697c02422516748ce66a8151873e5a0e", upload-time = "2025-05-14T03:40:41Z" }, { url = "https://download-r2.pytorch.org/whl/cu128/torch-2.7.0%2Bcu128-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:78e13c26c38ae92d6841cf9ce760d7e9d52bca3e3183de371812e84274b054dc", upload-time = "2025-04-22T18:21:58Z" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torch-2.7.0%2Bcu128-cp313-cp313t-win_amd64.whl", hash = "sha256:3559e98be824c2b12ab807319cd61c6174d73a524c9961317de8e8a44133c5c5", upload-time = "2025-04-22T18:22:33Z" }, ] [[package]] @@ -4557,6 +4647,7 @@ dependencies = [ { name = "huggingface-hub" }, { name = "hydra-core" }, { name = "imageio" }, + { name = "imageio-ffmpeg" }, { name = "lark" }, { name = "mediapy" }, { name = "mlx", marker = "sys_platform == 'darwin'" }, @@ -4572,8 +4663,8 @@ dependencies = [ { name = "setuptools" }, { name = "tensorboard" }, { name = "tensordict" }, - { name = "torch", version = "2.7.0", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform != 'linux'" }, - { name = "torch", version = "2.7.0+cu128", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "sys_platform == 'linux'" }, + { name = "torch", version = "2.7.0", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform != 'linux' and sys_platform != 'win32'" }, + { name = "torch", version = "2.7.0+cu128", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "tqdm" }, { name = "typing-extensions" }, { name = "wandb" }, @@ -4607,6 +4698,7 @@ requires-dist = [ { name = "huggingface-hub", specifier = ">=0.25" }, { name = "hydra-core", specifier = ">=1.3" }, { name = "imageio" }, + { name = "imageio-ffmpeg", specifier = ">=0.6.0" }, { name = "lark", specifier = ">=1.3.1" }, { name = "mediapy" }, { name = "mlx", marker = "sys_platform == 'darwin'" }, @@ -4623,8 +4715,8 @@ requires-dist = [ { name = "setuptools", specifier = "<70" }, { name = "tensorboard" }, { name = "tensordict" }, - { name = "torch", marker = "sys_platform != 'linux'", specifier = "==2.7.0" }, - { name = "torch", marker = "sys_platform == 'linux'", specifier = "==2.7.0", index = "https://download.pytorch.org/whl/cu128" }, + { name = "torch", marker = "sys_platform != 'linux' and sys_platform != 'win32'", specifier = "==2.7.0" }, + { name = "torch", marker = "sys_platform == 'linux' or sys_platform == 'win32'", specifier = "==2.7.0", index = "https://download.pytorch.org/whl/cu128" }, { name = "tqdm" }, { name = "trimesh", marker = "extra == 'viser'", specifier = ">=3.21.7" }, { name = "typing-extensions" },