diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 00b538e8..f1ddb3da 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -17,6 +17,7 @@ repos: rev: v3.19.1 hooks: - id: pyupgrade + exclude: '^(.*_pb2_grpc\.py|.*_pb2\.py$)' - repo: https://github.com/astral-sh/ruff-pre-commit rev: v0.9.6 hooks: diff --git a/docker/lerobot-gpu-mani-skill/Dockerfile b/docker/lerobot-gpu-mani-skill/Dockerfile new file mode 100644 index 00000000..e45d84e8 --- /dev/null +++ b/docker/lerobot-gpu-mani-skill/Dockerfile @@ -0,0 +1,11 @@ +FROM huggingface/lerobot-gpu:latest + +RUN apt-get update && apt-get install -y --no-install-recommends \ + libvulkan1 vulkan-tools \ + && apt-get clean && rm -rf /var/lib/apt/lists/* + +RUN pip install --upgrade --no-cache-dir pip +RUN pip install --no-cache-dir ".[mani-skill]" + +# Set EGL as the rendering backend for MuJoCo +ENV MUJOCO_GL="egl" diff --git a/examples/12_train_hilserl_classifier.md b/examples/12_train_hilserl_classifier.md index eeaf0f2b..9f7ccf81 100644 --- a/examples/12_train_hilserl_classifier.md +++ b/examples/12_train_hilserl_classifier.md @@ -81,3 +81,14 @@ You can also log sample predictions during evaluation. Each logged sample will i - The **classifier's "confidence" (logits/probability)**. These logs can be useful for diagnosing and debugging performance issues. + + +#### Generate protobuf files + +```bash +python -m grpc_tools.protoc \ + -I lerobot/scripts/server \ + --python_out=lerobot/scripts/server \ + --grpc_python_out=lerobot/scripts/server \ + lerobot/scripts/server/hilserl.proto +``` diff --git a/lerobot/common/policies/sac/configuration_sac.py b/lerobot/common/policies/sac/configuration_sac.py index 1d296bf1..d225f11b 100644 --- a/lerobot/common/policies/sac/configuration_sac.py +++ b/lerobot/common/policies/sac/configuration_sac.py @@ -41,11 +41,16 @@ class SACConfig: ) input_normalization_params: dict[str, dict[str, list[float]]] = field( default_factory=lambda: { - "observation.image": {"mean": [[0.485, 0.456, 0.406]], "std": [[0.229, 0.224, 0.225]]}, + "observation.image": { + "mean": [[0.485, 0.456, 0.406]], + "std": [[0.229, 0.224, 0.225]], + }, "observation.state": {"min": [-1, -1, -1, -1], "max": [1, 1, 1, 1]}, } ) - output_normalization_modes: dict[str, str] = field(default_factory=lambda: {"action": "min_max"}) + output_normalization_modes: dict[str, str] = field( + default_factory=lambda: {"action": "min_max"} + ) output_normalization_params: dict[str, dict[str, list[float]]] = field( default_factory=lambda: { "action": {"min": [-1, -1], "max": [1, 1]}, @@ -54,9 +59,8 @@ class SACConfig: # TODO: Move it outside of the config actor_learner_config: dict[str, str | int] = field( default_factory=lambda: { - "actor_ip": "127.0.0.1", - "port": 50051, - "learner_ip": "127.0.0.1", + "learner_host": "127.0.0.1", + "learner_port": 50051, } ) camera_number: int = 1 diff --git a/lerobot/configs/policy/sac_maniskill.yaml b/lerobot/configs/policy/sac_maniskill.yaml index e657434a..3e0dbe61 100644 --- a/lerobot/configs/policy/sac_maniskill.yaml +++ b/lerobot/configs/policy/sac_maniskill.yaml @@ -108,5 +108,6 @@ policy: utd_ratio: 2 # 10 actor_learner_config: - actor_ip: "127.0.0.1" - port: 50051 + learner_host: "127.0.0.1" + learner_port: 50051 + policy_parameters_push_frequency: 15 diff --git a/lerobot/configs/policy/sac_real.yaml b/lerobot/configs/policy/sac_real.yaml index 4b021aaa..139463f9 100644 --- a/lerobot/configs/policy/sac_real.yaml +++ b/lerobot/configs/policy/sac_real.yaml @@ -65,7 +65,7 @@ policy: action: [4] # ["${env.action_dim}"] # Normalization / Unnormalization - input_normalization_modes: + input_normalization_modes: observation.images.front: mean_std observation.images.side: mean_std observation.state: min_max @@ -80,7 +80,7 @@ policy: min: [-77.08008, 56.25, 60.55664, 19.511719, 0., -0.63829786] max: [ 7.215820e+01, 1.5398438e+02, 1.6075195e+02, 9.3251953e+01, 0., -1.4184397e-01] - # min: [-87.09961, 62.402344, 67.23633, 36.035156, 77.34375,0.53691274] + # min: [-87.09961, 62.402344, 67.23633, 36.035156, 77.34375,0.53691274] # max: [58.183594, 131.83594, 145.98633, 82.08984, 78.22266, 0.60402685] # min: [-88.50586, 23.81836, 0.87890625, -32.16797, 78.66211, 0.53691274] # max: [84.55078, 187.11914, 145.98633, 101.60156, 146.60156, 88.18792] @@ -112,8 +112,9 @@ policy: utd_ratio: 2 # 10 actor_learner_config: - actor_ip: "127.0.0.1" - port: 50051 + learner_host: "127.0.0.1" + learner_port: 50051 + policy_parameters_push_frequency: 15 # # Loss coefficients. # reward_coeff: 0.5 diff --git a/lerobot/scripts/server/actor_server.py b/lerobot/scripts/server/actor_server.py index d74b2cfe..f0c6f2a9 100644 --- a/lerobot/scripts/server/actor_server.py +++ b/lerobot/scripts/server/actor_server.py @@ -17,9 +17,9 @@ import io import logging import pickle import queue -import time -from concurrent import futures from statistics import mean, quantiles +import signal +from functools import lru_cache # from lerobot.scripts.eval import eval_policy from threading import Thread @@ -35,7 +35,6 @@ from torch import nn # from lerobot.common.envs.utils import preprocess_maniskill_observation from lerobot.common.policies.factory import make_policy from lerobot.common.policies.sac.modeling_sac import SACPolicy -from lerobot.common.robot_devices.control_utils import busy_wait from lerobot.common.robot_devices.robots.factory import make_robot from lerobot.common.robot_devices.robots.utils import Robot from lerobot.common.utils.utils import ( @@ -44,14 +43,24 @@ from lerobot.common.utils.utils import ( set_global_seed, ) from lerobot.scripts.server import hilserl_pb2, hilserl_pb2_grpc -from lerobot.scripts.server.buffer import Transition, move_state_dict_to_device, move_transition_to_device +from lerobot.scripts.server.buffer import ( + Transition, + move_state_dict_to_device, + move_transition_to_device, + bytes_buffer_size, +) from lerobot.scripts.server.gym_manipulator import get_classifier, make_robot_env +from lerobot.scripts.server import learner_service + +from threading import Event logging.basicConfig(level=logging.INFO) parameters_queue = queue.Queue(maxsize=1) message_queue = queue.Queue(maxsize=1_000_000) +ACTOR_SHUTDOWN_TIMEOUT = 30 + class ActorInformation: """ @@ -70,95 +79,171 @@ class ActorInformation: self.interaction_message = interaction_message -class ActorServiceServicer(hilserl_pb2_grpc.ActorServiceServicer): - """ - gRPC service for actor-learner communication in reinforcement learning. +def receive_policy( + learner_client: hilserl_pb2_grpc.LearnerServiceStub, + shutdown_event: Event, + parameters_queue: queue.Queue, +): + logging.info("[ACTOR] Start receiving parameters from the Learner") + bytes_buffer = io.BytesIO() + step = 0 + try: + for model_update in learner_client.StreamParameters(hilserl_pb2.Empty()): + if shutdown_event.is_set(): + logging.info("[ACTOR] Shutting down policy streaming receiver") + return hilserl_pb2.Empty() - This service is responsible for: - 1. Streaming batches of transition data and statistical metrics from the actor to the learner. - 2. Receiving updated network parameters from the learner. - """ - - def StreamTransition(self, request, context): # noqa: N802 - """ - Streams data from the actor to the learner. - - This function continuously retrieves messages from the queue and processes them based on their type: - - - **Transition Data:** - - A batch of transitions (observation, action, reward, next observation) is collected. - - Transitions are moved to the CPU and serialized using PyTorch. - - The serialized data is wrapped in a `hilserl_pb2.Transition` message and sent to the learner. - - - **Interaction Messages:** - - Contains useful statistics about episodic rewards and policy timings. - - The message is serialized using `pickle` and sent to the learner. - - Yields: - hilserl_pb2.ActorInformation: The response message containing either transition data or an interaction message. - """ - while True: - message = message_queue.get(block=True) - - if message.transition is not None: - transition_to_send_to_learner: list[Transition] = [ - move_transition_to_device(transition=T, device="cpu") for T in message.transition - ] - # Check for NaNs in transitions before sending to learner - for transition in transition_to_send_to_learner: - for key, value in transition["state"].items(): - if torch.isnan(value).any(): - logging.warning(f"Found NaN values in transition {key}") - buf = io.BytesIO() - torch.save(transition_to_send_to_learner, buf) - transition_bytes = buf.getvalue() - - transition_message = hilserl_pb2.Transition(transition_bytes=transition_bytes) - - response = hilserl_pb2.ActorInformation(transition=transition_message) - - elif message.interaction_message is not None: - content = hilserl_pb2.InteractionMessage( - interaction_message_bytes=pickle.dumps(message.interaction_message) + if model_update.transfer_state == hilserl_pb2.TransferState.TRANSFER_BEGIN: + bytes_buffer.seek(0) + bytes_buffer.truncate(0) + bytes_buffer.write(model_update.parameter_bytes) + logging.info("Received model update at step 0") + step = 0 + continue + elif ( + model_update.transfer_state == hilserl_pb2.TransferState.TRANSFER_MIDDLE + ): + bytes_buffer.write(model_update.parameter_bytes) + step += 1 + logging.info(f"Received model update at step {step}") + elif model_update.transfer_state == hilserl_pb2.TransferState.TRANSFER_END: + bytes_buffer.write(model_update.parameter_bytes) + logging.info( + f"Received model update at step end size {bytes_buffer_size(bytes_buffer)}" ) - response = hilserl_pb2.ActorInformation(interaction_message=content) - yield response + state_dict = torch.load(bytes_buffer) - def SendParameters(self, request, context): # noqa: N802 - """ - Receives updated parameters from the learner and updates the actor. + bytes_buffer.seek(0) + bytes_buffer.truncate(0) + step = 0 - The learner calls this method to send new model parameters. The received parameters are deserialized - and placed in a queue to be consumed by the actor. + logging.info("Model updated") - Args: - request (hilserl_pb2.ParameterUpdate): The request containing serialized network parameters. - context (grpc.ServicerContext): The gRPC context. + parameters_queue.put(state_dict) - Returns: - hilserl_pb2.Empty: An empty response to acknowledge receipt. - """ - buffer = io.BytesIO(request.parameter_bytes) - params = torch.load(buffer) - parameters_queue.put(params) - return hilserl_pb2.Empty() + except grpc.RpcError as e: + logging.error(f"[ACTOR] gRPC error: {e}") + + return hilserl_pb2.Empty() -def serve_actor_service(port=50052): +def transitions_stream(shutdown_event: Event, message_queue: queue.Queue): + while not shutdown_event.is_set(): + try: + message = message_queue.get(block=True, timeout=5) + except queue.Empty: + logging.debug("[ACTOR] Transition queue is empty") + continue + + if message.transition is not None: + transition_to_send_to_learner: list[Transition] = [ + move_transition_to_device(transition=T, device="cpu") + for T in message.transition + ] + # Check for NaNs in transitions before sending to learner + for transition in transition_to_send_to_learner: + for key, value in transition["state"].items(): + if torch.isnan(value).any(): + logging.warning(f"Found NaN values in transition {key}") + buf = io.BytesIO() + torch.save(transition_to_send_to_learner, buf) + transition_bytes = buf.getvalue() + + transition_message = hilserl_pb2.Transition( + transition_bytes=transition_bytes + ) + + response = hilserl_pb2.ActorInformation(transition=transition_message) + + elif message.interaction_message is not None: + content = hilserl_pb2.InteractionMessage( + interaction_message_bytes=pickle.dumps(message.interaction_message) + ) + response = hilserl_pb2.ActorInformation(interaction_message=content) + + yield response + + return hilserl_pb2.Empty() + + +def send_transitions( + learner_client: hilserl_pb2_grpc.LearnerServiceStub, + shutdown_event: Event, + message_queue: queue.Queue, +): """ - Runs a gRPC server to start streaming the data from the actor to the learner. - Throught this server the learner can push parameters to the Actor as well. + Streams data from the actor to the learner. + + This function continuously retrieves messages from the queue and processes them based on their type: + + - **Transition Data:** + - A batch of transitions (observation, action, reward, next observation) is collected. + - Transitions are moved to the CPU and serialized using PyTorch. + - The serialized data is wrapped in a `hilserl_pb2.Transition` message and sent to the learner. + + - **Interaction Messages:** + - Contains useful statistics about episodic rewards and policy timings. + - The message is serialized using `pickle` and sent to the learner. + + Yields: + hilserl_pb2.ActorInformation: The response message containing either transition data or an interaction message. """ - server = grpc.server( - futures.ThreadPoolExecutor(max_workers=20), - options=[("grpc.max_send_message_length", -1), ("grpc.max_receive_message_length", -1)], + try: + learner_client.ReceiveTransitions( + transitions_stream(shutdown_event, message_queue) + ) + except grpc.RpcError as e: + logging.error(f"[ACTOR] gRPC error: {e}") + + logging.info("[ACTOR] Finished streaming transitions") + + +@lru_cache(maxsize=1) +def learner_service_client( + host="127.0.0.1", port=50051 +) -> tuple[hilserl_pb2_grpc.LearnerServiceStub, grpc.Channel]: + import json + + """ + Returns a client for the learner service. + + GRPC uses HTTP/2, which is a binary protocol and multiplexes requests over a single connection. + So we need to create only one client and reuse it. + """ + + service_config = { + "methodConfig": [ + { + "name": [{}], # Applies to ALL methods in ALL services + "retryPolicy": { + "maxAttempts": 5, # Max retries (total attempts = 5) + "initialBackoff": "0.1s", # First retry after 0.1s + "maxBackoff": "2s", # Max wait time between retries + "backoffMultiplier": 2, # Exponential backoff factor + "retryableStatusCodes": [ + "UNAVAILABLE", + "DEADLINE_EXCEEDED", + ], # Retries on network failures + }, + } + ] + } + + service_config_json = json.dumps(service_config) + + channel = grpc.insecure_channel( + f"{host}:{port}", + options=[ + ("grpc.max_receive_message_length", learner_service.MAX_MESSAGE_SIZE), + ("grpc.max_send_message_length", learner_service.MAX_MESSAGE_SIZE), + ("grpc.enable_retries", 1), + ("grpc.service_config", service_config_json), + ], ) - hilserl_pb2_grpc.add_ActorServiceServicer_to_server(ActorServiceServicer(), server) - server.add_insecure_port(f"[::]:{port}") - server.start() - logging.info(f"[ACTOR] gRPC server listening on port {port}") - server.wait_for_termination() + stub = hilserl_pb2_grpc.LearnerServiceStub(channel) + logging.info("[LEARNER] Learner service client created") + return stub, channel def update_policy_parameters(policy: SACPolicy, parameters_queue: queue.Queue, device): @@ -169,7 +254,9 @@ def update_policy_parameters(policy: SACPolicy, parameters_queue: queue.Queue, d policy.load_state_dict(state_dict) -def act_with_policy(cfg: DictConfig, robot: Robot, reward_classifier: nn.Module): +def act_with_policy( + cfg: DictConfig, robot: Robot, reward_classifier: nn.Module, shutdown_event: Event +): """ Executes policy interaction within the environment. @@ -182,7 +269,9 @@ def act_with_policy(cfg: DictConfig, robot: Robot, reward_classifier: nn.Module) logging.info("make_env online") - online_env = make_robot_env(robot=robot, reward_classifier=reward_classifier, cfg=cfg) + online_env = make_robot_env( + robot=robot, reward_classifier=reward_classifier, cfg=cfg + ) set_global_seed(cfg.seed) device = get_safe_torch_device(cfg.device, log=True) @@ -227,17 +316,27 @@ def act_with_policy(cfg: DictConfig, robot: Robot, reward_classifier: nn.Module) episode_intervention = False for interaction_step in range(cfg.training.online_steps): + if shutdown_event.is_set(): + logging.info("[ACTOR] Shutdown signal received. Exiting...") + return + if interaction_step >= cfg.training.online_step_before_learning: # Time policy inference and check if it meets FPS requirement with TimerManager( - elapsed_time_list=list_policy_time, label="Policy inference time", log=False + elapsed_time_list=list_policy_time, + label="Policy inference time", + log=False, ) as timer: # noqa: F841 action = policy.select_action(batch=obs) policy_fps = 1.0 / (list_policy_time[-1] + 1e-9) - log_policy_frequency_issue(policy_fps=policy_fps, cfg=cfg, interaction_step=interaction_step) + log_policy_frequency_issue( + policy_fps=policy_fps, cfg=cfg, interaction_step=interaction_step + ) - next_obs, reward, done, truncated, info = online_env.step(action.squeeze(dim=0).cpu().numpy()) + next_obs, reward, done, truncated, info = online_env.step( + action.squeeze(dim=0).cpu().numpy() + ) else: # TODO (azouitine): Make a custom space for torch tensor action = online_env.action_space.sample() @@ -245,7 +344,9 @@ def act_with_policy(cfg: DictConfig, robot: Robot, reward_classifier: nn.Module) # HACK: We have only one env but we want to batch it, it will be resolved with the torch box action = ( - torch.from_numpy(action[0]).to(device, non_blocking=device.type == "cuda").unsqueeze(dim=0) + torch.from_numpy(action[0]) + .to(device, non_blocking=device.type == "cuda") + .unsqueeze(dim=0) ) sum_reward_episode += float(reward) @@ -261,7 +362,9 @@ def act_with_policy(cfg: DictConfig, robot: Robot, reward_classifier: nn.Module) # Check for NaN values in observations for key, tensor in obs.items(): if torch.isnan(tensor).any(): - logging.error(f"[ACTOR] NaN values found in obs[{key}] at step {interaction_step}") + logging.error( + f"[ACTOR] NaN values found in obs[{key}] at step {interaction_step}" + ) list_transition_to_send_to_learner.append( Transition( @@ -281,13 +384,19 @@ def act_with_policy(cfg: DictConfig, robot: Robot, reward_classifier: nn.Module) # Because we are using a single environment we can index at zero if done or truncated: # TODO: Handle logging for episode information - logging.info(f"[ACTOR] Global step {interaction_step}: Episode reward: {sum_reward_episode}") + logging.info( + f"[ACTOR] Global step {interaction_step}: Episode reward: {sum_reward_episode}" + ) - update_policy_parameters(policy=policy.actor, parameters_queue=parameters_queue, device=device) + update_policy_parameters( + policy=policy.actor, parameters_queue=parameters_queue, device=device + ) if len(list_transition_to_send_to_learner) > 0: send_transitions_in_chunks( - transitions=list_transition_to_send_to_learner, message_queue=message_queue, chunk_size=4 + transitions=list_transition_to_send_to_learner, + message_queue=message_queue, + chunk_size=4, ) list_transition_to_send_to_learner = [] @@ -332,11 +441,16 @@ def get_frequency_stats(list_policy_time: list[float]) -> dict[str, float]: quantiles_90 = quantiles(list_policy_fps, n=10)[-1] logging.debug(f"[ACTOR] Average policy frame rate: {policy_fps}") logging.debug(f"[ACTOR] Policy frame rate 90th percentile: {quantiles_90}") - stats = {"Policy frequency [Hz]": policy_fps, "Policy frequency 90th-p [Hz]": quantiles_90} + stats = { + "Policy frequency [Hz]": policy_fps, + "Policy frequency 90th-p [Hz]": quantiles_90, + } return stats -def log_policy_frequency_issue(policy_fps: float, cfg: DictConfig, interaction_step: int): +def log_policy_frequency_issue( + policy_fps: float, cfg: DictConfig, interaction_step: int +): if policy_fps < cfg.fps: logging.warning( f"[ACTOR] Policy FPS {policy_fps:.1f} below required {cfg.fps} at step {interaction_step}" @@ -347,7 +461,34 @@ def log_policy_frequency_issue(policy_fps: float, cfg: DictConfig, interaction_s def actor_cli(cfg: dict): robot = make_robot(cfg=cfg.robot) - server_thread = Thread(target=serve_actor_service, args=(cfg.actor_learner_config.port,), daemon=True) + shutdown_event = Event() + + # Define signal handler + def signal_handler(signum, frame): + logging.info("Shutdown signal received. Cleaning up...") + shutdown_event.set() + + signal.signal(signal.SIGINT, signal_handler) # Ctrl+C + signal.signal(signal.SIGTERM, signal_handler) # Termination request (kill) + signal.signal(signal.SIGHUP, signal_handler) # Terminal closed/Hangup + signal.signal(signal.SIGQUIT, signal_handler) # Ctrl+\ + + learner_client, grpc_channel = learner_service_client( + host=cfg.actor_learner_config.learner_host, + port=cfg.actor_learner_config.learner_port, + ) + + receive_policy_thread = Thread( + target=receive_policy, + args=(learner_client, shutdown_event, parameters_queue), + daemon=True, + ) + + transitions_thread = Thread( + target=send_transitions, + args=(learner_client, shutdown_event, message_queue), + daemon=True, + ) # HACK: FOR MANISKILL we do not have a reward classifier # TODO: Remove this once we merge into main @@ -360,15 +501,27 @@ def actor_cli(cfg: dict): pretrained_path=cfg.env.reward_classifier.pretrained_path, config_path=cfg.env.reward_classifier.config_path, ) + policy_thread = Thread( target=act_with_policy, daemon=True, - args=(cfg, robot, reward_classifier), + args=(cfg, robot, reward_classifier, shutdown_event), ) - server_thread.start() + + transitions_thread.start() policy_thread.start() + receive_policy_thread.start() + + shutdown_event.wait() + logging.info("[ACTOR] Shutdown event received") + grpc_channel.close() + policy_thread.join() - server_thread.join() + logging.info("[ACTOR] Policy thread joined") + transitions_thread.join() + logging.info("[ACTOR] Transitions thread joined") + receive_policy_thread.join() + logging.info("[ACTOR] Receive policy thread joined") if __name__ == "__main__": diff --git a/lerobot/scripts/server/buffer.py b/lerobot/scripts/server/buffer.py index 6a290e6e..c113678b 100644 --- a/lerobot/scripts/server/buffer.py +++ b/lerobot/scripts/server/buffer.py @@ -17,6 +17,7 @@ import functools import random from typing import Any, Callable, Optional, Sequence, TypedDict +import io import torch import torch.nn.functional as F # noqa: N812 from tqdm import tqdm @@ -41,24 +42,33 @@ class BatchTransition(TypedDict): done: torch.Tensor -def move_transition_to_device(transition: Transition, device: str = "cpu") -> Transition: +def move_transition_to_device( + transition: Transition, device: str = "cpu" +) -> Transition: # Move state tensors to CPU device = torch.device(device) transition["state"] = { - key: val.to(device, non_blocking=device.type == "cuda") for key, val in transition["state"].items() + key: val.to(device, non_blocking=device.type == "cuda") + for key, val in transition["state"].items() } # Move action to CPU - transition["action"] = transition["action"].to(device, non_blocking=device.type == "cuda") + transition["action"] = transition["action"].to( + device, non_blocking=device.type == "cuda" + ) # No need to move reward or done, as they are float and bool # No need to move reward or done, as they are float and bool if isinstance(transition["reward"], torch.Tensor): - transition["reward"] = transition["reward"].to(device=device, non_blocking=device.type == "cuda") + transition["reward"] = transition["reward"].to( + device=device, non_blocking=device.type == "cuda" + ) if isinstance(transition["done"], torch.Tensor): - transition["done"] = transition["done"].to(device, non_blocking=device.type == "cuda") + transition["done"] = transition["done"].to( + device, non_blocking=device.type == "cuda" + ) # Move next_state tensors to CPU transition["next_state"] = { @@ -82,7 +92,10 @@ def move_state_dict_to_device(state_dict, device): if isinstance(state_dict, torch.Tensor): return state_dict.to(device) elif isinstance(state_dict, dict): - return {k: move_state_dict_to_device(v, device=device) for k, v in state_dict.items()} + return { + k: move_state_dict_to_device(v, device=device) + for k, v in state_dict.items() + } elif isinstance(state_dict, list): return [move_state_dict_to_device(v, device=device) for v in state_dict] elif isinstance(state_dict, tuple): @@ -91,6 +104,22 @@ def move_state_dict_to_device(state_dict, device): return state_dict +def state_to_bytes(state_dict: dict[str, torch.Tensor]) -> io.BytesIO: + """Convert model state dict to flat array for transmission""" + buffer = io.BytesIO() + + torch.save(state_dict, buffer) + + return buffer + + +def bytes_buffer_size(buffer: io.BytesIO) -> int: + buffer.seek(0, io.SEEK_END) + result = buffer.tell() + buffer.seek(0) + return result + + def random_crop_vectorized(images: torch.Tensor, output_size: tuple) -> torch.Tensor: """ Perform a per-image random crop over a batch of images in a vectorized way. @@ -116,7 +145,9 @@ def random_crop_vectorized(images: torch.Tensor, output_size: tuple) -> torch.Te images_hwcn = images.permute(0, 2, 3, 1) # (B, H, W, C) # Gather pixels - cropped_hwcn = images_hwcn[torch.arange(B, device=images.device).view(B, 1, 1), rows, cols, :] + cropped_hwcn = images_hwcn[ + torch.arange(B, device=images.device).view(B, 1, 1), rows, cols, : + ] # cropped_hwcn => (B, crop_h, crop_w, C) cropped = cropped_hwcn.permute(0, 3, 1, 2) # (B, C, crop_h, crop_w) @@ -179,7 +210,9 @@ class ReplayBuffer: """Saves a transition, ensuring tensors are stored on the designated storage device.""" # Move tensors to the storage device state = {key: tensor.to(self.storage_device) for key, tensor in state.items()} - next_state = {key: tensor.to(self.storage_device) for key, tensor in next_state.items()} + next_state = { + key: tensor.to(self.storage_device) for key, tensor in next_state.items() + } action = action.to(self.storage_device) # if complementary_info is not None: # complementary_info = { @@ -234,7 +267,9 @@ class ReplayBuffer: ) replay_buffer = cls(capacity=capacity, device=device, state_keys=state_keys) - list_transition = cls._lerobotdataset_to_transitions(dataset=lerobot_dataset, state_keys=state_keys) + list_transition = cls._lerobotdataset_to_transitions( + dataset=lerobot_dataset, state_keys=state_keys + ) # Fill the replay buffer with the lerobot dataset transitions for data in list_transition: for k, v in data.items(): @@ -295,7 +330,9 @@ class ReplayBuffer: # If not provided, you can either raise an error or define a default: if state_keys is None: - raise ValueError("You must provide a list of keys in `state_keys` that define your 'state'.") + raise ValueError( + "You must provide a list of keys in `state_keys` that define your 'state'." + ) transitions: list[Transition] = [] num_frames = len(dataset) @@ -350,33 +387,37 @@ class ReplayBuffer: # -- Build batched states -- batch_state = {} for key in self.state_keys: - batch_state[key] = torch.cat([t["state"][key] for t in list_of_transitions], dim=0).to( - self.device - ) + batch_state[key] = torch.cat( + [t["state"][key] for t in list_of_transitions], dim=0 + ).to(self.device) if key.startswith("observation.image") and self.use_drq: batch_state[key] = self.image_augmentation_function(batch_state[key]) # -- Build batched actions -- - batch_actions = torch.cat([t["action"] for t in list_of_transitions]).to(self.device) - - # -- Build batched rewards -- - batch_rewards = torch.tensor([t["reward"] for t in list_of_transitions], dtype=torch.float32).to( + batch_actions = torch.cat([t["action"] for t in list_of_transitions]).to( self.device ) + # -- Build batched rewards -- + batch_rewards = torch.tensor( + [t["reward"] for t in list_of_transitions], dtype=torch.float32 + ).to(self.device) + # -- Build batched next states -- batch_next_state = {} for key in self.state_keys: - batch_next_state[key] = torch.cat([t["next_state"][key] for t in list_of_transitions], dim=0).to( - self.device - ) + batch_next_state[key] = torch.cat( + [t["next_state"][key] for t in list_of_transitions], dim=0 + ).to(self.device) if key.startswith("observation.image") and self.use_drq: - batch_next_state[key] = self.image_augmentation_function(batch_next_state[key]) + batch_next_state[key] = self.image_augmentation_function( + batch_next_state[key] + ) # -- Build batched dones -- - batch_dones = torch.tensor([t["done"] for t in list_of_transitions], dtype=torch.float32).to( - self.device - ) + batch_dones = torch.tensor( + [t["done"] for t in list_of_transitions], dtype=torch.float32 + ).to(self.device) # Return a BatchTransition typed dict return BatchTransition( @@ -433,7 +474,9 @@ class ReplayBuffer: # Add state keys for key in self.state_keys: - sample_val = first_transition["state"][key].squeeze(dim=0) # Remove batch dimension + sample_val = first_transition["state"][key].squeeze( + dim=0 + ) # Remove batch dimension if not isinstance(sample_val, torch.Tensor): raise ValueError( f"State key '{key}' is not a torch.Tensor. Please ensure your states are stored as torch.Tensors." @@ -465,7 +508,9 @@ class ReplayBuffer: # We detect episode boundaries by `done == True`. # -------------------------------------------------------------------------------------------- episode_index = 0 - lerobot_dataset.episode_buffer = lerobot_dataset.create_episode_buffer(episode_index) + lerobot_dataset.episode_buffer = lerobot_dataset.create_episode_buffer( + episode_index + ) frame_idx_in_episode = 0 for global_frame_idx, transition in enumerate(self.memory): @@ -476,16 +521,24 @@ class ReplayBuffer: # Expand dimension to match what the dataset expects (the dataset wants the raw shape) # We assume your buffer has shape [C, H, W] (if image) or [D] if vector # This is typically already correct, but if needed you can reshape below. - frame_dict[key] = transition["state"][key].cpu().squeeze(dim=0) # Remove batch dimension + frame_dict[key] = ( + transition["state"][key].cpu().squeeze(dim=0) + ) # Remove batch dimension # Fill action, reward, done # Make sure they are shape (X,) or (X,Y,...) as needed. - frame_dict["action"] = transition["action"].cpu().squeeze(dim=0) # Remove batch dimension + frame_dict["action"] = ( + transition["action"].cpu().squeeze(dim=0) + ) # Remove batch dimension frame_dict["next.reward"] = ( - torch.tensor([transition["reward"]], dtype=torch.float32).cpu().squeeze(dim=0) + torch.tensor([transition["reward"]], dtype=torch.float32) + .cpu() + .squeeze(dim=0) ) frame_dict["next.done"] = ( - torch.tensor([transition["done"]], dtype=torch.bool).cpu().squeeze(dim=0) + torch.tensor([transition["done"]], dtype=torch.bool) + .cpu() + .squeeze(dim=0) ) # Add to the dataset's buffer lerobot_dataset.add_frame(frame_dict) @@ -499,7 +552,9 @@ class ReplayBuffer: episode_index += 1 frame_idx_in_episode = 0 # Start a new buffer for the next episode - lerobot_dataset.episode_buffer = lerobot_dataset.create_episode_buffer(episode_index) + lerobot_dataset.episode_buffer = lerobot_dataset.create_episode_buffer( + episode_index + ) # We are done adding frames # If the last transition wasn't done=True, we still have an open buffer with frames. @@ -541,7 +596,13 @@ def concatenate_batch_transitions( ) -> BatchTransition: """NOTE: Be careful it change the left_batch_transitions in place""" left_batch_transitions["state"] = { - key: torch.cat([left_batch_transitions["state"][key], right_batch_transition["state"][key]], dim=0) + key: torch.cat( + [ + left_batch_transitions["state"][key], + right_batch_transition["state"][key], + ], + dim=0, + ) for key in left_batch_transitions["state"] } left_batch_transitions["action"] = torch.cat( @@ -552,7 +613,11 @@ def concatenate_batch_transitions( ) left_batch_transitions["next_state"] = { key: torch.cat( - [left_batch_transitions["next_state"][key], right_batch_transition["next_state"][key]], dim=0 + [ + left_batch_transitions["next_state"][key], + right_batch_transition["next_state"][key], + ], + dim=0, ) for key in left_batch_transitions["next_state"] } diff --git a/lerobot/scripts/server/gym_manipulator.py b/lerobot/scripts/server/gym_manipulator.py index d981f4b3..c1a7c88c 100644 --- a/lerobot/scripts/server/gym_manipulator.py +++ b/lerobot/scripts/server/gym_manipulator.py @@ -10,11 +10,9 @@ import torch import torchvision.transforms.functional as F # noqa: N812 from lerobot.common.envs.utils import preprocess_observation -from lerobot.common.robot_devices.control_utils import busy_wait, is_headless, reset_follower_position +from lerobot.common.robot_devices.control_utils import busy_wait, is_headless from lerobot.common.robot_devices.robots.factory import make_robot from lerobot.common.utils.utils import init_hydra_config, log_say -from lerobot.scripts.server.maniskill_manipulator import make_maniskill - logging.basicConfig(level=logging.INFO) @@ -62,7 +60,9 @@ class HILSerlRobotEnv(gym.Env): if not self.robot.is_connected: self.robot.connect() - self.initial_follower_position = robot.follower_arms["main"].read("Present_Position") + self.initial_follower_position = robot.follower_arms["main"].read( + "Present_Position" + ) # Episode tracking. self.current_step = 0 @@ -70,7 +70,9 @@ class HILSerlRobotEnv(gym.Env): self.delta = delta self.use_delta_action_space = use_delta_action_space - self.current_joint_positions = self.robot.follower_arms["main"].read("Present_Position") + self.current_joint_positions = self.robot.follower_arms["main"].read( + "Present_Position" + ) # Retrieve the size of the joint position interval bound. self.relative_bounds_size = ( @@ -105,12 +107,16 @@ class HILSerlRobotEnv(gym.Env): image_keys = [key for key in example_obs if "image" in key] state_keys = [key for key in example_obs if "image" not in key] observation_spaces = { - key: gym.spaces.Box(low=0, high=255, shape=example_obs[key].shape, dtype=np.uint8) + key: gym.spaces.Box( + low=0, high=255, shape=example_obs[key].shape, dtype=np.uint8 + ) for key in image_keys } observation_spaces["observation.state"] = gym.spaces.Dict( { - key: gym.spaces.Box(low=0, high=10, shape=example_obs[key].shape, dtype=np.float32) + key: gym.spaces.Box( + low=0, high=10, shape=example_obs[key].shape, dtype=np.float32 + ) for key in state_keys } ) @@ -128,8 +134,12 @@ class HILSerlRobotEnv(gym.Env): ) else: action_space_robot = gym.spaces.Box( - low=self.robot.config.joint_position_relative_bounds["min"].cpu().numpy(), - high=self.robot.config.joint_position_relative_bounds["max"].cpu().numpy(), + low=self.robot.config.joint_position_relative_bounds["min"] + .cpu() + .numpy(), + high=self.robot.config.joint_position_relative_bounds["max"] + .cpu() + .numpy(), shape=(action_dim,), dtype=np.float32, ) @@ -141,7 +151,9 @@ class HILSerlRobotEnv(gym.Env): ), ) - def reset(self, seed=None, options=None) -> Tuple[Dict[str, np.ndarray], Dict[str, Any]]: + def reset( + self, seed=None, options=None + ) -> Tuple[Dict[str, np.ndarray], Dict[str, Any]]: """ Reset the environment to its initial state. This method resets the step counter and clears any episodic data. @@ -198,24 +210,34 @@ class HILSerlRobotEnv(gym.Env): """ policy_action, intervention_bool = action teleop_action = None - self.current_joint_positions = self.robot.follower_arms["main"].read("Present_Position") + self.current_joint_positions = self.robot.follower_arms["main"].read( + "Present_Position" + ) if isinstance(policy_action, torch.Tensor): policy_action = policy_action.cpu().numpy() - policy_action = np.clip(policy_action, self.action_space[0].low, self.action_space[0].high) + policy_action = np.clip( + policy_action, self.action_space[0].low, self.action_space[0].high + ) if not intervention_bool: if self.use_delta_action_space: - target_joint_positions = self.current_joint_positions + self.delta * policy_action + target_joint_positions = ( + self.current_joint_positions + self.delta * policy_action + ) else: target_joint_positions = policy_action self.robot.send_action(torch.from_numpy(target_joint_positions)) observation = self.robot.capture_observation() else: observation, teleop_action = self.robot.teleop_step(record_data=True) - teleop_action = teleop_action["action"] # Convert tensor to appropriate format + teleop_action = teleop_action[ + "action" + ] # Convert tensor to appropriate format # When applying the delta action space, convert teleop absolute values to relative differences. if self.use_delta_action_space: - teleop_action = (teleop_action - self.current_joint_positions) / self.delta + teleop_action = ( + teleop_action - self.current_joint_positions + ) / self.delta if torch.any(teleop_action < -self.relative_bounds_size) and torch.any( teleop_action > self.relative_bounds_size ): @@ -226,7 +248,9 @@ class HILSerlRobotEnv(gym.Env): ) teleop_action = torch.clamp( - teleop_action, -self.relative_bounds_size, self.relative_bounds_size + teleop_action, + -self.relative_bounds_size, + self.relative_bounds_size, ) # NOTE: To mimic the shape of a neural network output, we add a batch dimension to the teleop action. if teleop_action.dim() == 1: @@ -245,7 +269,10 @@ class HILSerlRobotEnv(gym.Env): reward, terminated, truncated, - {"action_intervention": teleop_action, "is_intervention": teleop_action is not None}, + { + "action_intervention": teleop_action, + "is_intervention": teleop_action is not None, + }, ) def render(self): @@ -351,7 +378,9 @@ class JointMaskingActionSpace(gym.Wrapper): raise ValueError("Mask length must match action space dimensions") low = env.action_space.low[self.active_dims] high = env.action_space.high[self.active_dims] - self.action_space = gym.spaces.Box(low=low, high=high, dtype=env.action_space.dtype) + self.action_space = gym.spaces.Box( + low=low, high=high, dtype=env.action_space.dtype + ) if isinstance(env.action_space, gym.spaces.Tuple): if len(mask) != env.action_space[0].shape[0]: @@ -359,8 +388,12 @@ class JointMaskingActionSpace(gym.Wrapper): low = env.action_space[0].low[self.active_dims] high = env.action_space[0].high[self.active_dims] - action_space_masked = gym.spaces.Box(low=low, high=high, dtype=env.action_space[0].dtype) - self.action_space = gym.spaces.Tuple((action_space_masked, env.action_space[1])) + action_space_masked = gym.spaces.Box( + low=low, high=high, dtype=env.action_space[0].dtype + ) + self.action_space = gym.spaces.Tuple( + (action_space_masked, env.action_space[1]) + ) # Create new action space with masked dimensions def action(self, action): @@ -379,14 +412,18 @@ class JointMaskingActionSpace(gym.Wrapper): # Extract the masked component from the tuple. masked_action = action[0] if isinstance(action, tuple) else action # Create a full action for the Box element. - full_box_action = np.zeros(self.env.action_space[0].shape, dtype=self.env.action_space[0].dtype) + full_box_action = np.zeros( + self.env.action_space[0].shape, dtype=self.env.action_space[0].dtype + ) full_box_action[self.active_dims] = masked_action # Return a tuple with the reconstructed Box action and the unchanged remainder. return (full_box_action, action[1]) else: # For Box action spaces. masked_action = action if not isinstance(action, tuple) else action[0] - full_action = np.zeros(self.env.action_space.shape, dtype=self.env.action_space.dtype) + full_action = np.zeros( + self.env.action_space.shape, dtype=self.env.action_space.dtype + ) full_action[self.active_dims] = masked_action return full_action @@ -395,9 +432,13 @@ class JointMaskingActionSpace(gym.Wrapper): obs, reward, terminated, truncated, info = self.env.step(action) if "action_intervention" in info and info["action_intervention"] is not None: if info["action_intervention"].dim() == 1: - info["action_intervention"] = info["action_intervention"][self.active_dims] + info["action_intervention"] = info["action_intervention"][ + self.active_dims + ] else: - info["action_intervention"] = info["action_intervention"][:, self.active_dims] + info["action_intervention"] = info["action_intervention"][ + :, self.active_dims + ] return obs, reward, terminated, truncated, info @@ -438,7 +479,12 @@ class TimeLimitWrapper(gym.Wrapper): class ImageCropResizeWrapper(gym.Wrapper): - def __init__(self, env, crop_params_dict: Dict[str, Annotated[Tuple[int], 4]], resize_size=None): + def __init__( + self, + env, + crop_params_dict: Dict[str, Annotated[Tuple[int], 4]], + resize_size=None, + ): super().__init__(env) self.env = env self.crop_params_dict = crop_params_dict @@ -450,7 +496,9 @@ class ImageCropResizeWrapper(gym.Wrapper): for key in crop_params_dict: top, left, height, width = crop_params_dict[key] new_shape = (top + height, left + width) - self.observation_space[key] = gym.spaces.Box(low=0, high=255, shape=new_shape) + self.observation_space[key] = gym.spaces.Box( + low=0, high=255, shape=new_shape + ) self.resize_size = resize_size if self.resize_size is None: @@ -463,7 +511,9 @@ class ImageCropResizeWrapper(gym.Wrapper): # Check for NaNs before processing if torch.isnan(obs[k]).any(): - logging.error(f"NaN values detected in observation {k} before crop and resize") + logging.error( + f"NaN values detected in observation {k} before crop and resize" + ) if device == torch.device("mps:0"): obs[k] = obs[k].cpu() @@ -473,7 +523,9 @@ class ImageCropResizeWrapper(gym.Wrapper): # Check for NaNs after processing if torch.isnan(obs[k]).any(): - logging.error(f"NaN values detected in observation {k} after crop and resize") + logging.error( + f"NaN values detected in observation {k} after crop and resize" + ) obs[k] = obs[k].to(device) @@ -503,10 +555,14 @@ class ConvertToLeRobotObservation(gym.ObservationWrapper): observation = preprocess_observation(observation) observation = { - key: observation[key].to(self.device, non_blocking=self.device.type == "cuda") + key: observation[key].to( + self.device, non_blocking=self.device.type == "cuda" + ) for key in observation } - observation = {k: torch.tensor(v, device=self.device) for k, v in observation.items()} + observation = { + k: torch.tensor(v, device=self.device) for k, v in observation.items() + } return observation @@ -553,18 +609,31 @@ class KeyboardInterfaceWrapper(gym.Wrapper): "Place the leader in similar pose to the follower and press space again." ) self.events["pause_policy"] = True - log_say("Human intervention stage. Get ready to take over.", play_sounds=True) + log_say( + "Human intervention stage. Get ready to take over.", + play_sounds=True, + ) return - if self.events["pause_policy"] and not self.events["human_intervention_step"]: + if ( + self.events["pause_policy"] + and not self.events["human_intervention_step"] + ): self.events["human_intervention_step"] = True print("Space key pressed. Human intervention starting.") - log_say("Starting human intervention.", play_sounds=True) + log_say( + "Starting human intervention.", play_sounds=True + ) return - if self.events["pause_policy"] and self.events["human_intervention_step"]: + if ( + self.events["pause_policy"] + and self.events["human_intervention_step"] + ): self.events["pause_policy"] = False self.events["human_intervention_step"] = False print("Space key pressed for a third time.") - log_say("Continuing with policy actions.", play_sounds=True) + log_say( + "Continuing with policy actions.", play_sounds=True + ) return except Exception as e: print(f"Error handling key press: {e}") @@ -572,7 +641,9 @@ class KeyboardInterfaceWrapper(gym.Wrapper): self.listener = keyboard.Listener(on_press=on_press) self.listener.start() except ImportError: - logging.warning("Could not import pynput. Keyboard interface will not be available.") + logging.warning( + "Could not import pynput. Keyboard interface will not be available." + ) self.listener = None def step(self, action: Any) -> Tuple[Any, float, bool, bool, Dict]: @@ -599,7 +670,9 @@ class KeyboardInterfaceWrapper(gym.Wrapper): time.sleep(0.1) # Check more frequently if desired # Execute the step in the underlying environment - obs, reward, terminated, truncated, info = self.env.step((policy_action, is_intervention)) + obs, reward, terminated, truncated, info = self.env.step( + (policy_action, is_intervention) + ) # Override reward and termination if episode success event triggered with self.event_lock: @@ -628,7 +701,10 @@ class KeyboardInterfaceWrapper(gym.Wrapper): class ResetWrapper(gym.Wrapper): def __init__( - self, env: HILSerlRobotEnv, reset_fn: Optional[Callable[[], None]] = None, reset_time_s: float = 5 + self, + env: HILSerlRobotEnv, + reset_fn: Optional[Callable[[], None]] = None, + reset_time_s: float = 5, ): super().__init__(env) self.reset_fn = reset_fn @@ -641,7 +717,10 @@ class ResetWrapper(gym.Wrapper): if self.reset_fn is not None: self.reset_fn(self.env) else: - log_say(f"Manually reset the environment for {self.reset_time_s} seconds.", play_sounds=True) + log_say( + f"Manually reset the environment for {self.reset_time_s} seconds.", + play_sounds=True, + ) start_time = time.perf_counter() while time.perf_counter() - start_time < self.reset_time_s: self.robot.teleop_step() @@ -654,7 +733,9 @@ class BatchCompitableWrapper(gym.ObservationWrapper): def __init__(self, env): super().__init__(env) - def observation(self, observation: dict[str, torch.Tensor]) -> dict[str, torch.Tensor]: + def observation( + self, observation: dict[str, torch.Tensor] + ) -> dict[str, torch.Tensor]: for key in observation: if "image" in key and observation[key].dim() == 3: observation[key] = observation[key].unsqueeze(0) @@ -685,6 +766,8 @@ def make_robot_env( A vectorized gym environment with all the necessary wrappers applied. """ if "maniskill" in cfg.env.name: + from lerobot.scripts.server.maniskill_manipulator import make_maniskill + logging.warning("WE SHOULD REMOVE THE MANISKILL BEFORE THE MERGE INTO MAIN") env = make_maniskill( cfg=cfg, @@ -703,15 +786,23 @@ def make_robot_env( env = ConvertToLeRobotObservation(env=env, device=cfg.device) if cfg.env.wrapper.crop_params_dict is not None: env = ImageCropResizeWrapper( - env=env, crop_params_dict=cfg.env.wrapper.crop_params_dict, resize_size=cfg.env.wrapper.resize_size + env=env, + crop_params_dict=cfg.env.wrapper.crop_params_dict, + resize_size=cfg.env.wrapper.resize_size, ) # Add reward computation and control wrappers env = RewardWrapper(env=env, reward_classifier=reward_classifier, device=cfg.device) - env = TimeLimitWrapper(env=env, control_time_s=cfg.env.wrapper.control_time_s, fps=cfg.fps) + env = TimeLimitWrapper( + env=env, control_time_s=cfg.env.wrapper.control_time_s, fps=cfg.fps + ) env = KeyboardInterfaceWrapper(env=env) - env = ResetWrapper(env=env, reset_fn=None, reset_time_s=cfg.env.wrapper.reset_time_s) - env = JointMaskingActionSpace(env=env, mask=cfg.env.wrapper.joint_masking_action_space) + env = ResetWrapper( + env=env, reset_fn=None, reset_time_s=cfg.env.wrapper.reset_time_s + ) + env = JointMaskingActionSpace( + env=env, mask=cfg.env.wrapper.joint_masking_action_space + ) env = BatchCompitableWrapper(env=env) return env @@ -724,13 +815,19 @@ def get_classifier(pretrained_path, config_path, device="mps"): return None from lerobot.common.policies.factory import _policy_cfg_from_hydra_cfg - from lerobot.common.policies.hilserl.classifier.configuration_classifier import ClassifierConfig - from lerobot.common.policies.hilserl.classifier.modeling_classifier import Classifier + from lerobot.common.policies.hilserl.classifier.configuration_classifier import ( + ClassifierConfig, + ) + from lerobot.common.policies.hilserl.classifier.modeling_classifier import ( + Classifier, + ) cfg = init_hydra_config(config_path) classifier_config = _policy_cfg_from_hydra_cfg(ClassifierConfig, cfg) - classifier_config.num_cameras = len(cfg.training.image_keys) # TODO automate these paths + classifier_config.num_cameras = len( + cfg.training.image_keys + ) # TODO automate these paths model = Classifier(classifier_config) model.load_state_dict(Classifier.from_pretrained(pretrained_path).state_dict()) model = model.to(device) @@ -741,7 +838,9 @@ def replay_episode(env, repo_id, root=None, episode=0): from lerobot.common.datasets.lerobot_dataset import LeRobotDataset local_files_only = root is not None - dataset = LeRobotDataset(repo_id, root=root, episodes=[episode], local_files_only=local_files_only) + dataset = LeRobotDataset( + repo_id, root=root, episodes=[episode], local_files_only=local_files_only + ) actions = dataset.hf_dataset.select_columns("action") for idx in range(dataset.num_frames): @@ -787,7 +886,8 @@ if __name__ == "__main__": ), ) parser.add_argument( - "--display-cameras", help=("Whether to display the camera feed while the rollout is happening") + "--display-cameras", + help=("Whether to display the camera feed while the rollout is happening"), ) parser.add_argument( "--reward-classifier-pretrained-path", @@ -801,13 +901,39 @@ if __name__ == "__main__": default=None, help="Path to a yaml config file that is necessary to build the reward classifier model.", ) - parser.add_argument("--env-path", type=str, default=None, help="Path to the env yaml file") - parser.add_argument("--env-overrides", type=str, default=None, help="Overrides for the env yaml file") - parser.add_argument("--control-time-s", type=float, default=20, help="Maximum episode length in seconds") - parser.add_argument("--reset-follower-pos", type=int, default=1, help="Reset follower between episodes") - parser.add_argument("--replay-repo-id", type=str, default=None, help="Repo ID of the episode to replay") - parser.add_argument("--replay-root", type=str, default=None, help="Root of the dataset to replay") - parser.add_argument("--replay-episode", type=int, default=0, help="Episode to replay") + parser.add_argument( + "--env-path", type=str, default=None, help="Path to the env yaml file" + ) + parser.add_argument( + "--env-overrides", + type=str, + default=None, + help="Overrides for the env yaml file", + ) + parser.add_argument( + "--control-time-s", + type=float, + default=20, + help="Maximum episode length in seconds", + ) + parser.add_argument( + "--reset-follower-pos", + type=int, + default=1, + help="Reset follower between episodes", + ) + parser.add_argument( + "--replay-repo-id", + type=str, + default=None, + help="Repo ID of the episode to replay", + ) + parser.add_argument( + "--replay-root", type=str, default=None, help="Root of the dataset to replay" + ) + parser.add_argument( + "--replay-episode", type=int, default=0, help="Episode to replay" + ) args = parser.parse_args() robot_cfg = init_hydra_config(args.robot_path, args.robot_overrides) @@ -828,7 +954,9 @@ if __name__ == "__main__": env.reset() if args.replay_repo_id is not None: - replay_episode(env, args.replay_repo_id, root=args.replay_root, episode=args.replay_episode) + replay_episode( + env, args.replay_repo_id, root=args.replay_root, episode=args.replay_episode + ) exit() # Retrieve the robot's action space for joint commands. @@ -849,7 +977,9 @@ if __name__ == "__main__": smoothed_action = alpha * new_random_action + (1 - alpha) * smoothed_action # Execute the step: wrap the NumPy action in a torch tensor. - obs, reward, terminated, truncated, info = env.step((torch.from_numpy(smoothed_action), False)) + obs, reward, terminated, truncated, info = env.step( + (torch.from_numpy(smoothed_action), False) + ) if terminated or truncated: env.reset() diff --git a/lerobot/scripts/server/hilserl.proto b/lerobot/scripts/server/hilserl.proto index 9fd8663f..6aa46e0e 100644 --- a/lerobot/scripts/server/hilserl.proto +++ b/lerobot/scripts/server/hilserl.proto @@ -22,19 +22,11 @@ package hil_serl; // The Learner implements this service. service LearnerService { // Actor -> Learner to store transitions - rpc SendTransition(Transition) returns (Empty); - rpc SendInteractionMessage(InteractionMessage) returns (Empty); + rpc SendInteractionMessage(InteractionMessage) returns (Empty); + rpc StreamParameters(Empty) returns (stream Parameters); + rpc ReceiveTransitions(stream ActorInformation) returns (Empty); } -// ActorService: the Learner calls this to push parameters. -// The Actor implements this service. -service ActorService { - // Learner -> Actor to send new parameters - rpc StreamTransition(Empty) returns (stream ActorInformation) {}; - rpc SendParameters(Parameters) returns (Empty); -} - - message ActorInformation { oneof data { Transition transition = 1; @@ -42,17 +34,25 @@ message ActorInformation { } } +enum TransferState { + TRANSFER_UNKNOWN = 0; + TRANSFER_BEGIN = 1; + TRANSFER_MIDDLE = 2; + TRANSFER_END = 3; +} + // Messages message Transition { bytes transition_bytes = 1; } message Parameters { - bytes parameter_bytes = 1; + TransferState transfer_state = 1; + bytes parameter_bytes = 2; } message InteractionMessage { - bytes interaction_message_bytes = 1; + bytes interaction_message_bytes = 1; } -message Empty {} \ No newline at end of file +message Empty {} diff --git a/lerobot/scripts/server/hilserl_pb2.py b/lerobot/scripts/server/hilserl_pb2.py index bf605a37..d5eb8d4c 100644 --- a/lerobot/scripts/server/hilserl_pb2.py +++ b/lerobot/scripts/server/hilserl_pb2.py @@ -24,25 +24,25 @@ _sym_db = _symbol_database.Default() -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\rhilserl.proto\x12\x08hil_serl\"\x83\x01\n\x10\x41\x63torInformation\x12*\n\ntransition\x18\x01 \x01(\x0b\x32\x14.hil_serl.TransitionH\x00\x12;\n\x13interaction_message\x18\x02 \x01(\x0b\x32\x1c.hil_serl.InteractionMessageH\x00\x42\x06\n\x04\x64\x61ta\"&\n\nTransition\x12\x18\n\x10transition_bytes\x18\x01 \x01(\x0c\"%\n\nParameters\x12\x17\n\x0fparameter_bytes\x18\x01 \x01(\x0c\"7\n\x12InteractionMessage\x12!\n\x19interaction_message_bytes\x18\x01 \x01(\x0c\"\x07\n\x05\x45mpty2\x92\x01\n\x0eLearnerService\x12\x37\n\x0eSendTransition\x12\x14.hil_serl.Transition\x1a\x0f.hil_serl.Empty\x12G\n\x16SendInteractionMessage\x12\x1c.hil_serl.InteractionMessage\x1a\x0f.hil_serl.Empty2\x8c\x01\n\x0c\x41\x63torService\x12\x43\n\x10StreamTransition\x12\x0f.hil_serl.Empty\x1a\x1a.hil_serl.ActorInformation\"\x00\x30\x01\x12\x37\n\x0eSendParameters\x12\x14.hil_serl.Parameters\x1a\x0f.hil_serl.Emptyb\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\rhilserl.proto\x12\x08hil_serl\"\x83\x01\n\x10\x41\x63torInformation\x12*\n\ntransition\x18\x01 \x01(\x0b\x32\x14.hil_serl.TransitionH\x00\x12;\n\x13interaction_message\x18\x02 \x01(\x0b\x32\x1c.hil_serl.InteractionMessageH\x00\x42\x06\n\x04\x64\x61ta\"&\n\nTransition\x12\x18\n\x10transition_bytes\x18\x01 \x01(\x0c\"V\n\nParameters\x12/\n\x0etransfer_state\x18\x01 \x01(\x0e\x32\x17.hil_serl.TransferState\x12\x17\n\x0fparameter_bytes\x18\x02 \x01(\x0c\"7\n\x12InteractionMessage\x12!\n\x19interaction_message_bytes\x18\x01 \x01(\x0c\"\x07\n\x05\x45mpty*`\n\rTransferState\x12\x14\n\x10TRANSFER_UNKNOWN\x10\x00\x12\x12\n\x0eTRANSFER_BEGIN\x10\x01\x12\x13\n\x0fTRANSFER_MIDDLE\x10\x02\x12\x10\n\x0cTRANSFER_END\x10\x03\x32\xdb\x01\n\x0eLearnerService\x12G\n\x16SendInteractionMessage\x12\x1c.hil_serl.InteractionMessage\x1a\x0f.hil_serl.Empty\x12;\n\x10StreamParameters\x12\x0f.hil_serl.Empty\x1a\x14.hil_serl.Parameters0\x01\x12\x43\n\x12ReceiveTransitions\x12\x1a.hil_serl.ActorInformation\x1a\x0f.hil_serl.Empty(\x01\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'hilserl_pb2', _globals) if not _descriptor._USE_C_DESCRIPTORS: DESCRIPTOR._loaded_options = None + _globals['_TRANSFERSTATE']._serialized_start=355 + _globals['_TRANSFERSTATE']._serialized_end=451 _globals['_ACTORINFORMATION']._serialized_start=28 _globals['_ACTORINFORMATION']._serialized_end=159 _globals['_TRANSITION']._serialized_start=161 _globals['_TRANSITION']._serialized_end=199 _globals['_PARAMETERS']._serialized_start=201 - _globals['_PARAMETERS']._serialized_end=238 - _globals['_INTERACTIONMESSAGE']._serialized_start=240 - _globals['_INTERACTIONMESSAGE']._serialized_end=295 - _globals['_EMPTY']._serialized_start=297 - _globals['_EMPTY']._serialized_end=304 - _globals['_LEARNERSERVICE']._serialized_start=307 - _globals['_LEARNERSERVICE']._serialized_end=453 - _globals['_ACTORSERVICE']._serialized_start=456 - _globals['_ACTORSERVICE']._serialized_end=596 + _globals['_PARAMETERS']._serialized_end=287 + _globals['_INTERACTIONMESSAGE']._serialized_start=289 + _globals['_INTERACTIONMESSAGE']._serialized_end=344 + _globals['_EMPTY']._serialized_start=346 + _globals['_EMPTY']._serialized_end=353 + _globals['_LEARNERSERVICE']._serialized_start=454 + _globals['_LEARNERSERVICE']._serialized_end=673 # @@protoc_insertion_point(module_scope) diff --git a/lerobot/scripts/server/hilserl_pb2_grpc.py b/lerobot/scripts/server/hilserl_pb2_grpc.py index 7dcc8221..42d4674e 100644 --- a/lerobot/scripts/server/hilserl_pb2_grpc.py +++ b/lerobot/scripts/server/hilserl_pb2_grpc.py @@ -36,16 +36,21 @@ class LearnerServiceStub(object): Args: channel: A grpc.Channel. """ - self.SendTransition = channel.unary_unary( - '/hil_serl.LearnerService/SendTransition', - request_serializer=hilserl__pb2.Transition.SerializeToString, - response_deserializer=hilserl__pb2.Empty.FromString, - _registered_method=True) self.SendInteractionMessage = channel.unary_unary( '/hil_serl.LearnerService/SendInteractionMessage', request_serializer=hilserl__pb2.InteractionMessage.SerializeToString, response_deserializer=hilserl__pb2.Empty.FromString, _registered_method=True) + self.StreamParameters = channel.unary_stream( + '/hil_serl.LearnerService/StreamParameters', + request_serializer=hilserl__pb2.Empty.SerializeToString, + response_deserializer=hilserl__pb2.Parameters.FromString, + _registered_method=True) + self.ReceiveTransitions = channel.stream_unary( + '/hil_serl.LearnerService/ReceiveTransitions', + request_serializer=hilserl__pb2.ActorInformation.SerializeToString, + response_deserializer=hilserl__pb2.Empty.FromString, + _registered_method=True) class LearnerServiceServicer(object): @@ -53,14 +58,20 @@ class LearnerServiceServicer(object): The Learner implements this service. """ - def SendTransition(self, request, context): + def SendInteractionMessage(self, request, context): """Actor -> Learner to store transitions """ context.set_code(grpc.StatusCode.UNIMPLEMENTED) context.set_details('Method not implemented!') raise NotImplementedError('Method not implemented!') - def SendInteractionMessage(self, request, context): + def StreamParameters(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ReceiveTransitions(self, request_iterator, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) context.set_details('Method not implemented!') @@ -69,16 +80,21 @@ class LearnerServiceServicer(object): def add_LearnerServiceServicer_to_server(servicer, server): rpc_method_handlers = { - 'SendTransition': grpc.unary_unary_rpc_method_handler( - servicer.SendTransition, - request_deserializer=hilserl__pb2.Transition.FromString, - response_serializer=hilserl__pb2.Empty.SerializeToString, - ), 'SendInteractionMessage': grpc.unary_unary_rpc_method_handler( servicer.SendInteractionMessage, request_deserializer=hilserl__pb2.InteractionMessage.FromString, response_serializer=hilserl__pb2.Empty.SerializeToString, ), + 'StreamParameters': grpc.unary_stream_rpc_method_handler( + servicer.StreamParameters, + request_deserializer=hilserl__pb2.Empty.FromString, + response_serializer=hilserl__pb2.Parameters.SerializeToString, + ), + 'ReceiveTransitions': grpc.stream_unary_rpc_method_handler( + servicer.ReceiveTransitions, + request_deserializer=hilserl__pb2.ActorInformation.FromString, + response_serializer=hilserl__pb2.Empty.SerializeToString, + ), } generic_handler = grpc.method_handlers_generic_handler( 'hil_serl.LearnerService', rpc_method_handlers) @@ -92,33 +108,6 @@ class LearnerService(object): The Learner implements this service. """ - @staticmethod - def SendTransition(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary( - request, - target, - '/hil_serl.LearnerService/SendTransition', - hilserl__pb2.Transition.SerializeToString, - hilserl__pb2.Empty.FromString, - options, - channel_credentials, - insecure, - call_credentials, - compression, - wait_for_ready, - timeout, - metadata, - _registered_method=True) - @staticmethod def SendInteractionMessage(request, target, @@ -146,76 +135,8 @@ class LearnerService(object): metadata, _registered_method=True) - -class ActorServiceStub(object): - """ActorService: the Learner calls this to push parameters. - The Actor implements this service. - """ - - def __init__(self, channel): - """Constructor. - - Args: - channel: A grpc.Channel. - """ - self.StreamTransition = channel.unary_stream( - '/hil_serl.ActorService/StreamTransition', - request_serializer=hilserl__pb2.Empty.SerializeToString, - response_deserializer=hilserl__pb2.ActorInformation.FromString, - _registered_method=True) - self.SendParameters = channel.unary_unary( - '/hil_serl.ActorService/SendParameters', - request_serializer=hilserl__pb2.Parameters.SerializeToString, - response_deserializer=hilserl__pb2.Empty.FromString, - _registered_method=True) - - -class ActorServiceServicer(object): - """ActorService: the Learner calls this to push parameters. - The Actor implements this service. - """ - - def StreamTransition(self, request, context): - """Learner -> Actor to send new parameters - """ - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def SendParameters(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - -def add_ActorServiceServicer_to_server(servicer, server): - rpc_method_handlers = { - 'StreamTransition': grpc.unary_stream_rpc_method_handler( - servicer.StreamTransition, - request_deserializer=hilserl__pb2.Empty.FromString, - response_serializer=hilserl__pb2.ActorInformation.SerializeToString, - ), - 'SendParameters': grpc.unary_unary_rpc_method_handler( - servicer.SendParameters, - request_deserializer=hilserl__pb2.Parameters.FromString, - response_serializer=hilserl__pb2.Empty.SerializeToString, - ), - } - generic_handler = grpc.method_handlers_generic_handler( - 'hil_serl.ActorService', rpc_method_handlers) - server.add_generic_rpc_handlers((generic_handler,)) - server.add_registered_method_handlers('hil_serl.ActorService', rpc_method_handlers) - - - # This class is part of an EXPERIMENTAL API. -class ActorService(object): - """ActorService: the Learner calls this to push parameters. - The Actor implements this service. - """ - @staticmethod - def StreamTransition(request, + def StreamParameters(request, target, options=(), channel_credentials=None, @@ -228,9 +149,9 @@ class ActorService(object): return grpc.experimental.unary_stream( request, target, - '/hil_serl.ActorService/StreamTransition', + '/hil_serl.LearnerService/StreamParameters', hilserl__pb2.Empty.SerializeToString, - hilserl__pb2.ActorInformation.FromString, + hilserl__pb2.Parameters.FromString, options, channel_credentials, insecure, @@ -242,7 +163,7 @@ class ActorService(object): _registered_method=True) @staticmethod - def SendParameters(request, + def ReceiveTransitions(request_iterator, target, options=(), channel_credentials=None, @@ -252,11 +173,11 @@ class ActorService(object): wait_for_ready=None, timeout=None, metadata=None): - return grpc.experimental.unary_unary( - request, + return grpc.experimental.stream_unary( + request_iterator, target, - '/hil_serl.ActorService/SendParameters', - hilserl__pb2.Parameters.SerializeToString, + '/hil_serl.LearnerService/ReceiveTransitions', + hilserl__pb2.ActorInformation.SerializeToString, hilserl__pb2.Empty.FromString, options, channel_credentials, diff --git a/lerobot/scripts/server/learner_server.py b/lerobot/scripts/server/learner_server.py index 3a608538..2d00e7ed 100644 --- a/lerobot/scripts/server/learner_server.py +++ b/lerobot/scripts/server/learner_server.py @@ -14,19 +14,19 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -import io import logging -import pickle import queue import shutil import time from pprint import pformat from threading import Lock, Thread +import signal +from threading import Event +from concurrent.futures import ThreadPoolExecutor import grpc # Import generated stubs -import hilserl_pb2 # type: ignore import hilserl_pb2_grpc # type: ignore import hydra import torch @@ -55,10 +55,11 @@ from lerobot.common.utils.utils import ( from lerobot.scripts.server.buffer import ( ReplayBuffer, concatenate_batch_transitions, - move_state_dict_to_device, move_transition_to_device, ) +from lerobot.scripts.server import learner_service + logging.basicConfig(level=logging.INFO) transition_queue = queue.Queue() @@ -77,9 +78,13 @@ def handle_resume_logic(cfg: DictConfig, out_dir: str) -> DictConfig: # if resume == True checkpoint_dir = Logger.get_last_checkpoint_dir(out_dir) if not checkpoint_dir.exists(): - raise RuntimeError(f"No model checkpoint found in {checkpoint_dir} for resume=True") + raise RuntimeError( + f"No model checkpoint found in {checkpoint_dir} for resume=True" + ) - checkpoint_cfg_path = str(Logger.get_last_pretrained_model_dir(out_dir) / "config.yaml") + checkpoint_cfg_path = str( + Logger.get_last_pretrained_model_dir(out_dir) / "config.yaml" + ) logging.info( colored( "Resume=True detected, resuming previous run", @@ -112,7 +117,9 @@ def load_training_state( if not cfg.resume: return None, None - training_state = torch.load(logger.last_checkpoint_dir / logger.training_state_file_name) + training_state = torch.load( + logger.last_checkpoint_dir / logger.training_state_file_name + ) if isinstance(training_state["optimizer"], dict): assert set(training_state["optimizer"].keys()) == set(optimizers.keys()) @@ -126,7 +133,9 @@ def load_training_state( def log_training_info(cfg: DictConfig, out_dir: str, policy: nn.Module) -> None: - num_learnable_params = sum(p.numel() for p in policy.parameters() if p.requires_grad) + num_learnable_params = sum( + p.numel() for p in policy.parameters() if p.requires_grad + ) num_total_params = sum(p.numel() for p in policy.parameters()) log_output_dir(out_dir) @@ -136,7 +145,9 @@ def log_training_info(cfg: DictConfig, out_dir: str, policy: nn.Module) -> None: logging.info(f"{num_total_params=} ({format_big_number(num_total_params)})") -def initialize_replay_buffer(cfg: DictConfig, logger: Logger, device: str) -> ReplayBuffer: +def initialize_replay_buffer( + cfg: DictConfig, logger: Logger, device: str +) -> ReplayBuffer: if not cfg.resume: return ReplayBuffer( capacity=cfg.training.online_buffer_capacity, @@ -146,7 +157,9 @@ def initialize_replay_buffer(cfg: DictConfig, logger: Logger, device: str) -> Re ) dataset = LeRobotDataset( - repo_id=cfg.dataset_repo_id, local_files_only=True, root=logger.log_dir / "dataset" + repo_id=cfg.dataset_repo_id, + local_files_only=True, + root=logger.log_dir / "dataset", ) return ReplayBuffer.from_lerobot_dataset( lerobot_dataset=dataset, @@ -168,18 +181,10 @@ def start_learner_threads( logger: Logger, resume_optimization_step: int | None = None, resume_interaction_step: int | None = None, + shutdown_event: Event | None = None, ) -> None: - actor_ip = cfg.actor_learner_config.actor_ip - port = cfg.actor_learner_config.port - - server_thread = Thread( - target=stream_transitions_from_actor, - args=( - actor_ip, - port, - ), - daemon=True, - ) + host = cfg.actor_learner_config.learner_host + port = cfg.actor_learner_config.learner_port transition_thread = Thread( target=add_actor_information_and_train, @@ -196,95 +201,56 @@ def start_learner_threads( logger, resume_optimization_step, resume_interaction_step, + shutdown_event, ), ) - param_push_thread = Thread( - target=learner_push_parameters, - args=(policy, policy_lock, actor_ip, port, 15), - daemon=True, - ) - - server_thread.start() transition_thread.start() - param_push_thread.start() - param_push_thread.join() + + service = learner_service.LearnerService( + shutdown_event, + policy, + policy_lock, + cfg.actor_learner_config.policy_parameters_push_frequency, + transition_queue, + interaction_message_queue, + ) + server = start_learner_server(service, host, port) + + shutdown_event.wait() + server.stop(learner_service.STUTDOWN_TIMEOUT) + logging.info("[LEARNER] gRPC server stopped") + transition_thread.join() - server_thread.join() + logging.info("[LEARNER] Transition thread stopped") -def stream_transitions_from_actor(host="127.0.0.1", port=50051): - """ - Runs a gRPC client that listens for transition and interaction messages from an Actor service. - - This function establishes a gRPC connection with the given `host` and `port`, then continuously - streams transition data from the `ActorServiceStub`. The received transition data is deserialized - and stored in a queue (`transition_queue`). Similarly, interaction messages are also deserialized - and stored in a separate queue (`interaction_message_queue`). - - Args: - host (str, optional): The IP address or hostname of the gRPC server. Defaults to `"127.0.0.1"`. - port (int, optional): The port number on which the gRPC server is running. Defaults to `50051`. - - """ - # NOTE: This is waiting for the handshake to be done - # In the future we will do it in a canonical way with a proper handshake - time.sleep(10) - channel = grpc.insecure_channel( - f"{host}:{port}", - options=[("grpc.max_send_message_length", -1), ("grpc.max_receive_message_length", -1)], +def start_learner_server( + service: learner_service.LearnerService, + host="0.0.0.0", + port=50051, +) -> grpc.server: + server = grpc.server( + ThreadPoolExecutor(max_workers=learner_service.MAX_WORKERS), + options=[ + ("grpc.max_receive_message_length", learner_service.MAX_MESSAGE_SIZE), + ("grpc.max_send_message_length", learner_service.MAX_MESSAGE_SIZE), + ], ) - stub = hilserl_pb2_grpc.ActorServiceStub(channel) - for response in stub.StreamTransition(hilserl_pb2.Empty()): - if response.HasField("transition"): - buffer = io.BytesIO(response.transition.transition_bytes) - transition = torch.load(buffer) - transition_queue.put(transition) - if response.HasField("interaction_message"): - content = pickle.loads(response.interaction_message.interaction_message_bytes) - interaction_message_queue.put(content) + hilserl_pb2_grpc.add_LearnerServiceServicer_to_server( + service, + server, + ) + server.add_insecure_port(f"{host}:{port}") + server.start() + logging.info("[LEARNER] gRPC server started") + + return server -def learner_push_parameters( - policy: nn.Module, policy_lock: Lock, actor_host="127.0.0.1", actor_port=50052, seconds_between_pushes=5 +def check_nan_in_transition( + observations: torch.Tensor, actions: torch.Tensor, next_state: torch.Tensor ): - """ - As a client, connect to the Actor's gRPC server (ActorService) - and periodically push new parameters. - """ - time.sleep(10) - channel = grpc.insecure_channel( - f"{actor_host}:{actor_port}", - options=[("grpc.max_send_message_length", -1), ("grpc.max_receive_message_length", -1)], - ) - actor_stub = hilserl_pb2_grpc.ActorServiceStub(channel) - - while True: - with policy_lock: - params_dict = policy.actor.state_dict() - if policy.config.vision_encoder_name is not None: - if policy.config.freeze_vision_encoder: - params_dict: dict[str, torch.Tensor] = { - k: v for k, v in params_dict.items() if not k.startswith("encoder.") - } - else: - raise NotImplementedError( - "Vision encoder is not frozen, we need to send the full model over the network which requires chunking the model." - ) - - params_dict = move_state_dict_to_device(params_dict, device="cpu") - # Serialize - buf = io.BytesIO() - torch.save(params_dict, buf) - params_bytes = buf.getvalue() - - # Push them to the Actor's "SendParameters" method - logging.info("[LEARNER] Publishing parameters to the Actor") - response = actor_stub.SendParameters(hilserl_pb2.Parameters(parameter_bytes=params_bytes)) # noqa: F841 - time.sleep(seconds_between_pushes) - - -def check_nan_in_transition(observations: torch.Tensor, actions: torch.Tensor, next_state: torch.Tensor): for k in observations: if torch.isnan(observations[k]).any(): logging.error(f"observations[{k}] contains NaN values") @@ -307,6 +273,7 @@ def add_actor_information_and_train( logger: Logger, resume_optimization_step: int | None = None, resume_interaction_step: int | None = None, + shutdown_event: Event | None = None, ): """ Handles data transfer from the actor to the learner, manages training updates, @@ -338,6 +305,7 @@ def add_actor_information_and_train( logger (Logger): Logger instance for tracking training progress. resume_optimization_step (int | None): In the case of resume training, start from the last optimization step reached. resume_interaction_step (int | None): In the case of resume training, shift the interaction step with the last saved step in order to not break logging. + shutdown_event (Event | None): Event to signal shutdown. """ # NOTE: This function doesn't have a single responsibility, it should be split into multiple functions # in the future. The reason why we did that is the GIL in Python. It's super slow the performance @@ -345,9 +313,17 @@ def add_actor_information_and_train( time.time() logging.info("Starting learner thread") interaction_message, transition = None, None - optimization_step = resume_optimization_step if resume_optimization_step is not None else 0 - interaction_step_shift = resume_interaction_step if resume_interaction_step is not None else 0 + optimization_step = ( + resume_optimization_step if resume_optimization_step is not None else 0 + ) + interaction_step_shift = ( + resume_interaction_step if resume_interaction_step is not None else 0 + ) while True: + if shutdown_event is not None and shutdown_event.is_set(): + logging.info("[LEARNER] Shutdown signal received. Exiting...") + break + while not transition_queue.empty(): transition_list = transition_queue.get() for transition in transition_list: @@ -361,7 +337,9 @@ def add_actor_information_and_train( interaction_message = interaction_message_queue.get() # If cfg.resume, shift the interaction step with the last checkpointed step in order to not break the logging interaction_message["Interaction step"] += interaction_step_shift - logger.log_dict(interaction_message, mode="train", custom_step_key="Interaction step") + logger.log_dict( + interaction_message, mode="train", custom_step_key="Interaction step" + ) # logging.info(f"Interaction message: {interaction_message}") if len(replay_buffer) < cfg.training.online_step_before_learning: @@ -383,7 +361,9 @@ def add_actor_information_and_train( observations = batch["state"] next_observations = batch["next_state"] done = batch["done"] - check_nan_in_transition(observations=observations, actions=actions, next_state=next_observations) + check_nan_in_transition( + observations=observations, actions=actions, next_state=next_observations + ) with policy_lock: loss_critic = policy.compute_loss_critic( @@ -411,7 +391,9 @@ def add_actor_information_and_train( next_observations = batch["next_state"] done = batch["done"] - check_nan_in_transition(observations=observations, actions=actions, next_state=next_observations) + check_nan_in_transition( + observations=observations, actions=actions, next_state=next_observations + ) with policy_lock: loss_critic = policy.compute_loss_critic( @@ -439,7 +421,9 @@ def add_actor_information_and_train( training_infos["loss_actor"] = loss_actor.item() - loss_temperature = policy.compute_loss_temperature(observations=observations) + loss_temperature = policy.compute_loss_temperature( + observations=observations + ) optimizers["temperature"].zero_grad() loss_temperature.backward() optimizers["temperature"].step() @@ -453,9 +437,13 @@ def add_actor_information_and_train( # logging.info(f"Training infos: {training_infos}") time_for_one_optimization_step = time.time() - time_for_one_optimization_step - frequency_for_one_optimization_step = 1 / (time_for_one_optimization_step + 1e-9) + frequency_for_one_optimization_step = 1 / ( + time_for_one_optimization_step + 1e-9 + ) - logging.info(f"[LEARNER] Optimization frequency loop [Hz]: {frequency_for_one_optimization_step}") + logging.info( + f"[LEARNER] Optimization frequency loop [Hz]: {frequency_for_one_optimization_step}" + ) logger.log_dict( { @@ -471,7 +459,8 @@ def add_actor_information_and_train( logging.info(f"[LEARNER] Number of optimization step: {optimization_step}") if cfg.training.save_checkpoint and ( - optimization_step % cfg.training.save_freq == 0 or optimization_step == cfg.training.online_steps + optimization_step % cfg.training.save_freq == 0 + or optimization_step == cfg.training.online_steps ): logging.info(f"Checkpoint policy after step {optimization_step}") # Note: Save with step as the identifier, and format it to have at least 6 digits but more if @@ -479,7 +468,9 @@ def add_actor_information_and_train( _num_digits = max(6, len(str(cfg.training.online_steps))) step_identifier = f"{optimization_step:0{_num_digits}d}" interaction_step = ( - interaction_message["Interaction step"] if interaction_message is not None else 0 + interaction_message["Interaction step"] + if interaction_message is not None + else 0 ) logger.save_checkpoint( optimization_step, @@ -538,7 +529,9 @@ def make_optimizers_and_scheduler(cfg, policy: nn.Module): optimizer_critic = torch.optim.Adam( params=policy.critic_ensemble.parameters(), lr=policy.config.critic_lr ) - optimizer_temperature = torch.optim.Adam(params=[policy.log_alpha], lr=policy.config.critic_lr) + optimizer_temperature = torch.optim.Adam( + params=[policy.log_alpha], lr=policy.config.critic_lr + ) lr_scheduler = None optimizers = { "actor": optimizer_actor, @@ -580,14 +573,18 @@ def train(cfg: DictConfig, out_dir: str | None = None, job_name: str | None = No # dataset_stats=offline_dataset.meta.stats if not cfg.resume else None, # Hack: But if we do online traning, we do not need dataset_stats dataset_stats=None, - pretrained_policy_name_or_path=str(logger.last_pretrained_model_dir) if cfg.resume else None, + pretrained_policy_name_or_path=str(logger.last_pretrained_model_dir) + if cfg.resume + else None, ) # compile policy policy = torch.compile(policy) assert isinstance(policy, nn.Module) optimizers, lr_scheduler = make_optimizers_and_scheduler(cfg, policy) - resume_optimization_step, resume_interaction_step = load_training_state(cfg, logger, optimizers) + resume_optimization_step, resume_interaction_step = load_training_state( + cfg, logger, optimizers + ) log_training_info(cfg, out_dir, policy) @@ -599,7 +596,11 @@ def train(cfg: DictConfig, out_dir: str | None = None, job_name: str | None = No logging.info("make_dataset offline buffer") offline_dataset = make_dataset(cfg) logging.info("Convertion to a offline replay buffer") - active_action_dims = [i for i, mask in enumerate(cfg.env.wrapper.joint_masking_action_space) if mask] + active_action_dims = [ + i + for i, mask in enumerate(cfg.env.wrapper.joint_masking_action_space) + if mask + ] offline_replay_buffer = ReplayBuffer.from_lerobot_dataset( offline_dataset, device=device, @@ -609,6 +610,20 @@ def train(cfg: DictConfig, out_dir: str | None = None, job_name: str | None = No ) batch_size: int = batch_size // 2 # We will sample from both replay buffer + shutdown_event = Event() + + def signal_handler(signum, frame): + print( + f"\nReceived signal {signal.Signals(signum).name}. Initiating learner shutdown..." + ) + shutdown_event.set() + + # Register signal handlers + signal.signal(signal.SIGINT, signal_handler) # Ctrl+C + signal.signal(signal.SIGTERM, signal_handler) # Termination request + signal.signal(signal.SIGHUP, signal_handler) # Terminal closed + signal.signal(signal.SIGQUIT, signal_handler) # Ctrl+\ + start_learner_threads( cfg, device, @@ -621,6 +636,7 @@ def train(cfg: DictConfig, out_dir: str | None = None, job_name: str | None = No logger, resume_optimization_step, resume_interaction_step, + shutdown_event, ) diff --git a/lerobot/scripts/server/learner_service.py b/lerobot/scripts/server/learner_service.py new file mode 100644 index 00000000..97601528 --- /dev/null +++ b/lerobot/scripts/server/learner_service.py @@ -0,0 +1,113 @@ +import hilserl_pb2 # type: ignore +import hilserl_pb2_grpc # type: ignore +import torch +from torch import nn +from threading import Lock, Event +import logging +import queue +import io +import pickle + +from lerobot.scripts.server.buffer import ( + move_state_dict_to_device, + bytes_buffer_size, + state_to_bytes, +) + + +MAX_MESSAGE_SIZE = 4 * 1024 * 1024 # 4 MB +CHUNK_SIZE = 2 * 1024 * 1024 # 2 MB +MAX_WORKERS = 10 +STUTDOWN_TIMEOUT = 10 + + +class LearnerService(hilserl_pb2_grpc.LearnerServiceServicer): + def __init__( + self, + shutdown_event: Event, + policy: nn.Module, + policy_lock: Lock, + seconds_between_pushes: float, + transition_queue: queue.Queue, + interaction_message_queue: queue.Queue, + ): + self.shutdown_event = shutdown_event + self.policy = policy + self.policy_lock = policy_lock + self.seconds_between_pushes = seconds_between_pushes + self.transition_queue = transition_queue + self.interaction_message_queue = interaction_message_queue + + def _get_policy_state(self): + with self.policy_lock: + params_dict = self.policy.actor.state_dict() + if self.policy.config.vision_encoder_name is not None: + if self.policy.config.freeze_vision_encoder: + params_dict: dict[str, torch.Tensor] = { + k: v + for k, v in params_dict.items() + if not k.startswith("encoder.") + } + else: + raise NotImplementedError( + "Vision encoder is not frozen, we need to send the full model over the network which requires chunking the model." + ) + + return move_state_dict_to_device(params_dict, device="cpu") + + def _send_bytes(self, buffer: bytes): + size_in_bytes = bytes_buffer_size(buffer) + + sent_bytes = 0 + + logging.info(f"Model state size {size_in_bytes/1024/1024} MB with") + + while sent_bytes < size_in_bytes: + transfer_state = hilserl_pb2.TransferState.TRANSFER_MIDDLE + + if sent_bytes + CHUNK_SIZE >= size_in_bytes: + transfer_state = hilserl_pb2.TransferState.TRANSFER_END + elif sent_bytes == 0: + transfer_state = hilserl_pb2.TransferState.TRANSFER_BEGIN + + size_to_read = min(CHUNK_SIZE, size_in_bytes - sent_bytes) + chunk = buffer.read(size_to_read) + + yield hilserl_pb2.Parameters( + transfer_state=transfer_state, parameter_bytes=chunk + ) + sent_bytes += size_to_read + logging.info( + f"[Learner] Sent {sent_bytes}/{size_in_bytes} bytes with state {transfer_state}" + ) + + logging.info(f"[LEARNER] Published {sent_bytes/1024/1024} MB to the Actor") + + def StreamParameters(self, request, context): + # TODO: authorize the request + logging.info("[LEARNER] Received request to stream parameters from the Actor") + + while not self.shutdown_event.is_set(): + logging.debug("[LEARNER] Push parameters to the Actor") + state_dict = self._get_policy_state() + + with state_to_bytes(state_dict) as buffer: + yield from self._send_bytes(buffer) + + self.shutdown_event.wait(self.seconds_between_pushes) + + def ReceiveTransitions(self, request_iterator, context): + # TODO: authorize the request + logging.info("[LEARNER] Received request to receive transitions from the Actor") + + for request in request_iterator: + logging.debug("[LEARNER] Received request") + if request.HasField("transition"): + buffer = io.BytesIO(request.transition.transition_bytes) + transition = torch.load(buffer) + self.transition_queue.put(transition) + if request.HasField("interaction_message"): + content = pickle.loads( + request.interaction_message.interaction_message_bytes + ) + self.interaction_message_queue.put(content) diff --git a/poetry.lock b/poetry.lock index 81462fe8..75df6f3c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.0.1 and should not be changed by hand. [[package]] name = "absl-py" @@ -6,6 +6,8 @@ version = "2.1.0" description = "Abseil Python Common Libraries, see https://github.com/abseil/abseil-py." optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "(extra == \"xarm\" or extra == \"aloha\" or extra == \"mani-skill\") and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "absl-py-2.1.0.tar.gz", hash = "sha256:7820790efbb316739cde8b4e19357243fc3608a152024288513dd968d7d959ff"}, {file = "absl_py-2.1.0-py3-none-any.whl", hash = "sha256:526a04eadab8b4ee719ce68f204172ead1027549089702d99b9059f129ff1308"}, @@ -17,6 +19,8 @@ version = "2.4.3" description = "Happy Eyeballs for asyncio" optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "aiohappyeyeballs-2.4.3-py3-none-any.whl", hash = "sha256:8a7a83727b2756f394ab2895ea0765a0a8c475e3c71e98d43d76f22b4b435572"}, {file = "aiohappyeyeballs-2.4.3.tar.gz", hash = "sha256:75cf88a15106a5002a8eb1dab212525c00d1f4c0fa96e551c9fbe6f09a621586"}, @@ -28,6 +32,8 @@ version = "3.10.10" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "aiohttp-3.10.10-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:be7443669ae9c016b71f402e43208e13ddf00912f47f623ee5994e12fc7d4b3f"}, {file = "aiohttp-3.10.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7b06b7843929e41a94ea09eb1ce3927865387e3e23ebe108e0d0d09b08d25be9"}, @@ -140,6 +146,8 @@ version = "1.3.1" description = "An asynchronous serial port library of Python" optional = true python-versions = ">=3.6,<4.0" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "aioserial-1.3.1.tar.gz", hash = "sha256:702bf03b0eb84b8ef2d8dac5cb925e1e685dce98f77b125569bc6fd2b3b58228"}, ] @@ -153,6 +161,8 @@ version = "1.3.1" description = "aiosignal: a list of registered asynchronous callbacks" optional = false python-versions = ">=3.7" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, @@ -167,6 +177,8 @@ version = "4.9.3" description = "ANTLR 4.9.3 runtime for Python 3.7" optional = false python-versions = "*" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "antlr4-python3-runtime-4.9.3.tar.gz", hash = "sha256:f224469b4168294902bb1efa80a8bf7855f24c99aef99cbefc1bcd3cce77881b"}, ] @@ -177,6 +189,8 @@ version = "4.6.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "anyio-4.6.0-py3-none-any.whl", hash = "sha256:c7d2e9d63e31599eeb636c8c5c03a7e108d73b345f064f1c19fdc87b79036a9a"}, {file = "anyio-4.6.0.tar.gz", hash = "sha256:137b4559cbb034c477165047febb6ff83f390fc3b20bf181c1fc0a728cb8beeb"}, @@ -199,6 +213,8 @@ version = "0.1.4" description = "Disable App Nap on macOS >= 10.9" optional = true python-versions = ">=3.6" +groups = ["main"] +markers = "sys_platform == \"linux\" and platform_system == \"Darwin\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, @@ -210,6 +226,8 @@ version = "23.1.0" description = "Argon2 for Python" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "argon2_cffi-23.1.0-py3-none-any.whl", hash = "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea"}, {file = "argon2_cffi-23.1.0.tar.gz", hash = "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08"}, @@ -230,6 +248,8 @@ version = "21.2.0" description = "Low-level CFFI bindings for Argon2" optional = true python-versions = ">=3.6" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3"}, {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367"}, @@ -261,12 +281,37 @@ cffi = ">=1.0.1" dev = ["cogapp", "pre-commit", "pytest", "wheel"] tests = ["pytest"] +[[package]] +name = "arm-pytorch-utilities" +version = "0.4.3" +description = "Utilities for working with pytorch" +optional = true +python-versions = ">=3.6" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"mani-skill\"" +files = [ + {file = "arm_pytorch_utilities-0.4.3-py3-none-any.whl", hash = "sha256:39b0e1080c66614d446a25219787e656fee142817d8aac2d9eb153239707fbd1"}, + {file = "arm_pytorch_utilities-0.4.3.tar.gz", hash = "sha256:508125d6610aac7b93596a2b546f458d3c31fcc4c9ae87869269a3a8aa53f7a8"}, +] + +[package.dependencies] +matplotlib = "*" +numpy = "*" +pytorch-seed = "*" +scipy = "*" +torch = "*" + +[package.extras] +test = ["pytest"] + [[package]] name = "arrow" version = "1.3.0" description = "Better dates & times for Python" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80"}, {file = "arrow-1.3.0.tar.gz", hash = "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85"}, @@ -286,6 +331,8 @@ version = "0.3.3" description = "Draws ASCII trees." optional = false python-versions = "*" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "asciitree-0.3.3.tar.gz", hash = "sha256:4aa4b9b649f85e3fcb343363d97564aa1fb62e249677f2e18a96765145cc0f6e"}, ] @@ -296,6 +343,8 @@ version = "2.4.1" description = "Annotate AST trees with source code positions" optional = true python-versions = "*" +groups = ["main"] +markers = "(sys_platform == \"linux\" or extra == \"mani-skill\") and (python_version >= \"3.12\" or python_version <= \"3.11\") and (extra == \"stretch\" or extra == \"mani-skill\")" files = [ {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, @@ -314,6 +363,8 @@ version = "2.0.4" description = "Simple LRU cache for asyncio" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "async-lru-2.0.4.tar.gz", hash = "sha256:b8a59a5df60805ff63220b2a0c5b5393da5521b113cd5465a44eb037d81a5627"}, {file = "async_lru-2.0.4-py3-none-any.whl", hash = "sha256:ff02944ce3c288c5be660c42dbcca0742b32c3b279d6dceda655190240b99224"}, @@ -328,6 +379,8 @@ version = "4.0.3" description = "Timeout context manager for asyncio programs" optional = false python-versions = ">=3.7" +groups = ["main"] +markers = "python_version < \"3.11\"" files = [ {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, @@ -339,6 +392,8 @@ version = "24.2.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.7" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, @@ -358,6 +413,8 @@ version = "2.16.0" description = "Internationalization utilities" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b"}, {file = "babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"}, @@ -372,6 +429,8 @@ version = "4.12.3" description = "Screen-scraping library" optional = false python-versions = ">=3.6.0" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, @@ -393,6 +452,8 @@ version = "6.1.0" description = "An easy safelist-based HTML-sanitizing tool." optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "bleach-6.1.0-py3-none-any.whl", hash = "sha256:3225f354cfc436b9789c66c4ee030194bee0568fbf9cbdad3bc8b5c26c5f12b6"}, {file = "bleach-6.1.0.tar.gz", hash = "sha256:0a31f1837963c41d46bbf1331b8778e1308ea0791db03cc4e7357b97cf42a8fe"}, @@ -411,6 +472,8 @@ version = "1.8.2" description = "Fast, simple object-to-object and broadcast signaling" optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "blinker-1.8.2-py3-none-any.whl", hash = "sha256:1779309f71bf239144b9399d06ae925637cf6634cf6bd131104184531bf67c01"}, {file = "blinker-1.8.2.tar.gz", hash = "sha256:8f77b09d3bf7c795e969e9486f39c2c5e9c39d4ee07424be2bc594ece9642d83"}, @@ -422,6 +485,8 @@ version = "2024.8.30" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, @@ -433,6 +498,8 @@ version = "1.17.1" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, @@ -512,6 +579,8 @@ version = "3.4.0" description = "Validate configuration and produce human readable error messages." optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"dev\"" files = [ {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, @@ -523,6 +592,8 @@ version = "3.4.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, @@ -637,6 +708,8 @@ version = "0.7.0" description = "Python sound notifications made easy." optional = true python-versions = ">=3.6,<4.0" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "chime-0.7.0-py3-none-any.whl", hash = "sha256:9626f8151cb008b1e0ffb7de6d1834b7013ba5fc4c4e3c9ba6e29dc9bf5feac6"}, {file = "chime-0.7.0.tar.gz", hash = "sha256:ba4af8934ec8bd9a89a340b4433b2e500097b979823386432be7128e0b201f0d"}, @@ -648,6 +721,8 @@ version = "8.1.7" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, @@ -662,6 +737,8 @@ version = "3.0.0" description = "Pickler class to extend the standard pickle.Pickler functionality" optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "cloudpickle-3.0.0-py3-none-any.whl", hash = "sha256:246ee7d0c295602a036e86369c77fecda4ab17b506496730f2f576d9016fd9c7"}, {file = "cloudpickle-3.0.0.tar.gz", hash = "sha256:996d9a482c6fb4f33c1a35335cf8afd065d2a56e973270364840712d9131a882"}, @@ -673,6 +750,8 @@ version = "4.0.0" description = "CMA-ES, Covariance Matrix Adaptation Evolution Strategy for non-linear numerical optimization in Python" optional = true python-versions = "*" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "cma-4.0.0-py3-none-any.whl", hash = "sha256:97b86ba1ac9f1cbb189a06c4d4a78f591f0878e5dd3e55c95e88e622e78c1a10"}, {file = "cma-4.0.0.tar.gz", hash = "sha256:fd28ce56983bf2fca0e614189d60134ebb80bf604f070d1ea095ea4e856f13a5"}, @@ -691,6 +770,8 @@ version = "3.30.4" description = "CMake is an open-source, cross-platform family of tools designed to build, test and package software" optional = false python-versions = ">=3.7" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "cmake-3.30.4-py3-none-macosx_10_10_universal2.whl", hash = "sha256:8a1a30125213c3d44b81a1af0085ad1dcd77abc61bcdf330556e83898428198a"}, {file = "cmake-3.30.4-py3-none-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9f69b3706ae93fa48762871bdc7cb759fbbbadb04452e5eab820537c35fabcb6"}, @@ -720,6 +801,8 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["main"] +markers = "(extra == \"test\" or extra == \"mani-skill\" or platform_system == \"Windows\" or sys_platform == \"linux\") and (extra == \"test\" or platform_system != \"Darwin\" or extra == \"mani-skill\" or sys_platform == \"linux\" or sys_platform == \"win32\") and (extra == \"test\" or extra == \"mani-skill\" or extra == \"stretch\" or platform_system == \"Windows\") and (python_version >= \"3.12\" or python_version <= \"3.11\") and (sys_platform == \"win32\" or sys_platform == \"linux\" or platform_system == \"Windows\") and (sys_platform == \"win32\" or extra == \"stretch\" or platform_system == \"Windows\")" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, @@ -731,6 +814,8 @@ version = "0.2.2" description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"}, {file = "comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e"}, @@ -748,6 +833,8 @@ version = "1.7" description = "A drop-in replacement for argparse that allows options to also be set via config files and/or environment variables." optional = true python-versions = ">=3.5" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "ConfigArgParse-1.7-py3-none-any.whl", hash = "sha256:d249da6591465c6c26df64a9f73d2536e743be2f244eb3ebe61114af2f94f86b"}, {file = "ConfigArgParse-1.7.tar.gz", hash = "sha256:e7067471884de5478c58a511e529f0f9bd1c66bfef1dea90935438d6c23306d1"}, @@ -763,6 +850,8 @@ version = "1.3.0" description = "Python library for calculating contours of 2D quadrilateral grids" optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "(sys_platform == \"linux\" or extra == \"mani-skill\") and (python_version >= \"3.12\" or python_version <= \"3.11\") and (extra == \"stretch\" or extra == \"mani-skill\")" files = [ {file = "contourpy-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:880ea32e5c774634f9fcd46504bf9f080a41ad855f4fef54f5380f5133d343c7"}, {file = "contourpy-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:76c905ef940a4474a6289c71d53122a4f77766eef23c03cd57016ce19d0f7b42"}, @@ -847,6 +936,8 @@ version = "7.6.2" description = "Code coverage measurement for Python" optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"test\"" files = [ {file = "coverage-7.6.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c9df1950fb92d49970cce38100d7e7293c84ed3606eaa16ea0b6bc27175bb667"}, {file = "coverage-7.6.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:24500f4b0e03aab60ce575c85365beab64b44d4db837021e08339f61d1fbfe52"}, @@ -924,6 +1015,8 @@ version = "0.12.1" description = "Composable style cycles" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "(sys_platform == \"linux\" or extra == \"mani-skill\") and (python_version >= \"3.12\" or python_version <= \"3.11\") and (extra == \"stretch\" or extra == \"mani-skill\")" files = [ {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, @@ -933,12 +1026,30 @@ files = [ docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] tests = ["pytest", "pytest-cov", "pytest-xdist"] +[[package]] +name = "dacite" +version = "1.9.2" +description = "Simple creation of data classes from dictionaries." +optional = true +python-versions = ">=3.7" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"mani-skill\"" +files = [ + {file = "dacite-1.9.2-py3-none-any.whl", hash = "sha256:053f7c3f5128ca2e9aceb66892b1a3c8936d02c686e707bee96e19deef4bc4a0"}, + {file = "dacite-1.9.2.tar.gz", hash = "sha256:6ccc3b299727c7aa17582f0021f6ae14d5de47c7227932c47fec4cdfefd26f09"}, +] + +[package.extras] +dev = ["black", "coveralls", "mypy", "pre-commit", "pylint", "pytest (>=5)", "pytest-benchmark", "pytest-cov"] + [[package]] name = "dash" version = "2.9.3" description = "A Python framework for building reactive web-apps. Developed by Plotly." optional = true python-versions = ">=3.6" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "dash-2.9.3-py3-none-any.whl", hash = "sha256:a749ae1ea9de3fe7b785353a818ec9b629d39c6b7e02462954203bd1e296fd0e"}, {file = "dash-2.9.3.tar.gz", hash = "sha256:47392f8d6455dc989a697407eb5941f3bad80604df985ab1ac9d4244568ffb34"}, @@ -965,6 +1076,8 @@ version = "2.0.0" description = "Core component suite for Dash" optional = true python-versions = "*" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "dash_core_components-2.0.0-py3-none-any.whl", hash = "sha256:52b8e8cce13b18d0802ee3acbc5e888cb1248a04968f962d63d070400af2e346"}, {file = "dash_core_components-2.0.0.tar.gz", hash = "sha256:c6733874af975e552f95a1398a16c2ee7df14ce43fa60bb3718a3c6e0b63ffee"}, @@ -976,6 +1089,8 @@ version = "2.0.0" description = "Vanilla HTML components for Dash" optional = true python-versions = "*" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "dash_html_components-2.0.0-py3-none-any.whl", hash = "sha256:b42cc903713c9706af03b3f2548bda4be7307a7cf89b7d6eae3da872717d1b63"}, {file = "dash_html_components-2.0.0.tar.gz", hash = "sha256:8703a601080f02619a6390998e0b3da4a5daabe97a1fd7a9cebc09d015f26e50"}, @@ -987,6 +1102,8 @@ version = "5.0.0" description = "Dash table" optional = true python-versions = "*" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "dash_table-5.0.0-py3-none-any.whl", hash = "sha256:19036fa352bb1c11baf38068ec62d172f0515f73ca3276c79dee49b95ddc16c9"}, {file = "dash_table-5.0.0.tar.gz", hash = "sha256:18624d693d4c8ef2ddec99a6f167593437a7ea0bf153aa20f318c170c5bc7308"}, @@ -998,6 +1115,8 @@ version = "3.0.1" description = "HuggingFace community-driven open-source library of datasets" optional = false python-versions = ">=3.8.0" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "datasets-3.0.1-py3-none-any.whl", hash = "sha256:db080aab41c8cc68645117a0f172e5c6789cbc672f066de0aa5a08fc3eebc686"}, {file = "datasets-3.0.1.tar.gz", hash = "sha256:40d63b09e76a3066c32e746d6fdc36fd3f29ed2acd49bf5b1a2100da32936511"}, @@ -1040,6 +1159,8 @@ version = "1.8.7" description = "An implementation of the Debug Adapter Protocol for Python" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "(sys_platform == \"linux\" or extra == \"dev\") and (python_version >= \"3.12\" or python_version <= \"3.11\") and (extra == \"stretch\" or extra == \"dev\")" files = [ {file = "debugpy-1.8.7-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:95fe04a573b8b22896c404365e03f4eda0ce0ba135b7667a1e57bd079793b96b"}, {file = "debugpy-1.8.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:628a11f4b295ffb4141d8242a9bb52b77ad4a63a2ad19217a93be0f77f2c28c9"}, @@ -1075,6 +1196,8 @@ version = "5.1.1" description = "Decorators for Humans" optional = true python-versions = ">=3.5" +groups = ["main"] +markers = "(sys_platform == \"linux\" or extra == \"mani-skill\") and (python_version >= \"3.12\" or python_version <= \"3.11\") and (extra == \"stretch\" or extra == \"mani-skill\")" files = [ {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, @@ -1086,6 +1209,8 @@ version = "8.0.1" description = "Deep Difference and Search of any Python object/data. Recreate objects by adding adding deltas to each other." optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "deepdiff-8.0.1-py3-none-any.whl", hash = "sha256:42e99004ce603f9a53934c634a57b04ad5900e0d8ed0abb15e635767489cbc05"}, {file = "deepdiff-8.0.1.tar.gz", hash = "sha256:245599a4586ab59bb599ca3517a9c42f3318ff600ded5e80a3432693c8ec3c4b"}, @@ -1104,6 +1229,8 @@ version = "0.7.1" description = "XML bomb protection for Python stdlib modules" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, @@ -1115,6 +1242,8 @@ version = "0.30.3" description = "State-of-the-art diffusion in PyTorch and JAX." optional = false python-versions = ">=3.8.0" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "diffusers-0.30.3-py3-none-any.whl", hash = "sha256:1b70209e4d2c61223b96a7e13bc4d70869c8b0b68f54a35ce3a67fcf813edeee"}, {file = "diffusers-0.30.3.tar.gz", hash = "sha256:67c5eb25d5b50bf0742624ef43fe0f6d1e1604f64aad3e8558469cbe89ecf72f"}, @@ -1145,6 +1274,8 @@ version = "0.3.8" description = "serialize all of Python" optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, @@ -1160,6 +1291,8 @@ version = "0.3.9" description = "Distribution utilities" optional = true python-versions = "*" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"dev\"" files = [ {file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"}, {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"}, @@ -1171,6 +1304,8 @@ version = "1.0.14" description = "Continuous control environments and MuJoCo Python bindings." optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"aloha\"" files = [ {file = "dm_control-1.0.14-py3-none-any.whl", hash = "sha256:883c63244a7ebf598700a97564ed19fffd3479ca79efd090aed881609cdb9fc6"}, {file = "dm_control-1.0.14.tar.gz", hash = "sha256:def1ece747b6f175c581150826b50f1a6134086dab34f8f3fd2d088ea035cf3d"}, @@ -1202,6 +1337,8 @@ version = "1.6" description = "A Python interface for Reinforcement Learning environments." optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"aloha\"" files = [ {file = "dm-env-1.6.tar.gz", hash = "sha256:a436eb1c654c39e0c986a516cee218bea7140b510fceff63f97eb4fcff3d93de"}, {file = "dm_env-1.6-py3-none-any.whl", hash = "sha256:0eabb6759dd453b625e041032f7ae0c1e87d4eb61b6a96b9ca586483837abf29"}, @@ -1218,6 +1355,8 @@ version = "0.1.8" description = "Tree is a library for working with nested data structures." optional = true python-versions = "*" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"aloha\"" files = [ {file = "dm-tree-0.1.8.tar.gz", hash = "sha256:0fcaabbb14e7980377439e7140bd05552739ca5e515ecb3119f234acee4b9430"}, {file = "dm_tree-0.1.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:35cc164a79336bfcfafb47e5f297898359123bbd3330c1967f0c4994f9cf9f60"}, @@ -1273,6 +1412,8 @@ version = "0.4.0" description = "Python bindings for the docker credentials store API" optional = false python-versions = "*" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "docker-pycreds-0.4.0.tar.gz", hash = "sha256:6ce3270bcaf404cc4c3e27e4b6c70d3521deae82fb508767870fdbf772d584d4"}, {file = "docker_pycreds-0.4.0-py2.py3-none-any.whl", hash = "sha256:7266112468627868005106ec19cd0d722702d2b7d5912a28e19b826c3d37af49"}, @@ -1281,12 +1422,27 @@ files = [ [package.dependencies] six = ">=1.4.0" +[[package]] +name = "docstring-parser" +version = "0.16" +description = "Parse Python docstrings in reST, Google and Numpydoc format" +optional = true +python-versions = ">=3.6,<4.0" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"mani-skill\"" +files = [ + {file = "docstring_parser-0.16-py3-none-any.whl", hash = "sha256:bf0a1387354d3691d102edef7ec124f219ef639982d096e26e3b60aeffa90637"}, + {file = "docstring_parser-0.16.tar.gz", hash = "sha256:538beabd0af1e2db0146b6bd3caa526c35a34d61af9fd2887f3a8a27a739aa6e"}, +] + [[package]] name = "dora-rs" version = "0.3.6" description = "`dora` goal is to be a low latency, composable, and distributed data flow." optional = true python-versions = "*" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"dora\"" files = [ {file = "dora_rs-0.3.6-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:c036d2d0792d8d6e0e9db1936ab5fd4c6d19e097f3fc259058733e526f94253a"}, {file = "dora_rs-0.3.6-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:95036f6fcb5aeb7bba8a1f37d84c627eefe09af1db17e36bc19209e950652446"}, @@ -1294,6 +1450,10 @@ files = [ {file = "dora_rs-0.3.6-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:78656d3ae1282a142a5fed410ec3a6f725fdf8d9f9192ed673e336ea3b083e12"}, {file = "dora_rs-0.3.6-cp37-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:681e22c8ecb3b48d11cb9019f8a32d4ae1e353e20d4ce3a0f0eedd0ccbd95e5f"}, {file = "dora_rs-0.3.6-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4598572bab6f726ec41fabb43bf0f7e3cf8082ea0f6f8f4e57845a6c919f31b3"}, + {file = "dora_rs-0.3.6-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:157fc1fed50946646f09df75c6d52198735a5973e53d252199bbb1c65e1594d2"}, + {file = "dora_rs-0.3.6-cp37-abi3-manylinux_2_28_armv7l.whl", hash = "sha256:7ae2724c181be10692c24fb8d9ce2a99a9afc57237332c3658e2ea6f4f33c091"}, + {file = "dora_rs-0.3.6-cp37-abi3-manylinux_2_28_i686.whl", hash = "sha256:3d324835f292edd81b962f8c0df44f7f47c0a6f8fe6f7d081951aeb1f5ba57d2"}, + {file = "dora_rs-0.3.6-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:474c087b5e584293685a7d4837165b2ead96dc74fb435ae50d5fa0ac168a0de0"}, {file = "dora_rs-0.3.6-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:297350f05f5f87a0bf647a1e5b4446728e5f800788c6bb28b462bcd167f1de7f"}, {file = "dora_rs-0.3.6-cp37-abi3-musllinux_1_2_i686.whl", hash = "sha256:b1870a8e30f0ac298d17fd546224348d13a648bcfa0cbc51dba7e5136c1af928"}, {file = "dora_rs-0.3.6-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:182a189212d41be0c960fd3299bf6731af2e771f8858cfb1be7ebcc17d60a254"}, @@ -1309,6 +1469,8 @@ version = "0.72.5" description = "MATLAB-like drawnow" optional = true python-versions = "*" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "drawnow-0.72.5-py3-none-any.whl", hash = "sha256:4ff83a8b15f61a781edaaa2a3e6b71e2c8fd948960f188b870def701afcfa0d5"}, {file = "drawnow-0.72.5.tar.gz", hash = "sha256:9d1855605b2ec6ebc4e8a95201a7a0068eb1e2a5d1695cb1b7c462d660f32593"}, @@ -1323,6 +1485,8 @@ version = "3.7.31" description = "Dynamixel SDK 3. python package" optional = true python-versions = "*" +groups = ["main"] +markers = "(sys_platform == \"linux\" or extra == \"dynamixel\") and (python_version >= \"3.12\" or python_version <= \"3.11\") and (extra == \"stretch\" or extra == \"dynamixel\")" files = [ {file = "dynamixel_sdk-3.7.31-py3-none-any.whl", hash = "sha256:74e8c112ca6b0b869b196dd8c6a44ffd5dd5c1a3cb9fe2030e9933922406b466"}, ] @@ -1336,6 +1500,8 @@ version = "0.8.0" description = "A new flavour of deep learning operations" optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "einops-0.8.0-py3-none-any.whl", hash = "sha256:9572fb63046264a862693b0a87088af3bdc8c068fde03de63453cbbde245465f"}, {file = "einops-0.8.0.tar.gz", hash = "sha256:63486517fed345712a8385c100cb279108d9d47e6ae59099b07657e983deae85"}, @@ -1347,6 +1513,8 @@ version = "1.7.1" description = "Bindings to the Linux input handling subsystem" optional = true python-versions = ">=3.6" +groups = ["main"] +markers = "(extra == \"dynamixel\" or extra == \"feetech\" or extra == \"stretch\") and sys_platform in \"linux\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "evdev-1.7.1.tar.gz", hash = "sha256:0c72c370bda29d857e188d931019c32651a9c1ea977c08c8d939b1ced1637fde"}, ] @@ -1357,6 +1525,8 @@ version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "python_version < \"3.11\" and (extra == \"test\" or sys_platform == \"linux\" or extra == \"mani-skill\") and (extra == \"test\" or extra == \"stretch\" or extra == \"mani-skill\")" files = [ {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, @@ -1371,6 +1541,8 @@ version = "2.1.0" description = "Get the currently executing AST node of a frame, and other information" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "(sys_platform == \"linux\" or extra == \"mani-skill\") and (python_version >= \"3.12\" or python_version <= \"3.11\") and (extra == \"stretch\" or extra == \"mani-skill\")" files = [ {file = "executing-2.1.0-py2.py3-none-any.whl", hash = "sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf"}, {file = "executing-2.1.0.tar.gz", hash = "sha256:8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab"}, @@ -1385,17 +1557,37 @@ version = "0.0.4" description = "Notifications for all Farama Foundation maintained libraries." optional = false python-versions = "*" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "Farama-Notifications-0.0.4.tar.gz", hash = "sha256:13fceff2d14314cf80703c8266462ebf3733c7d165336eee998fc58e545efd18"}, {file = "Farama_Notifications-0.0.4-py3-none-any.whl", hash = "sha256:14de931035a41961f7c056361dc7f980762a143d05791ef5794a751a2caf05ae"}, ] +[[package]] +name = "fast-kinematics" +version = "0.2.2" +description = "A fast kinematics library for robotics" +optional = true +python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"mani-skill\" and platform_system == \"Linux\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" +files = [ + {file = "fast_kinematics-0.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:908f7ec94dfd947028170c0a37b326b3dde1b8c0a14417646e874f3e81b2cd71"}, + {file = "fast_kinematics-0.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2e24e736944aa7723f7445c8630d421eb61a6fcd2c23822e9bf4c6bc2d5bf69"}, + {file = "fast_kinematics-0.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0500a63494e69d1e51d9770f4fa429e1d50dbbe27e5c448f8daca32bc4e03bb6"}, + {file = "fast_kinematics-0.2.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c31be181899b0ad2600f00899810496a829b54819cc59d012c32ad0d0b32854"}, + {file = "fast_kinematics-0.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c01274f03fda3660c45816a86a5db820ec3d2ebc19abfac66a49451701a308f4"}, +] + [[package]] name = "fasteners" version = "0.19" description = "A python package that provides useful locks" optional = false python-versions = ">=3.6" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and sys_platform != \"emscripten\"" files = [ {file = "fasteners-0.19-py3-none-any.whl", hash = "sha256:758819cb5d94cdedf4e836988b74de396ceacb8e2794d21f82d131fd9ee77237"}, {file = "fasteners-0.19.tar.gz", hash = "sha256:b4f37c3ac52d8a445af3a66bce57b33b5e90b97c696b7b984f530cf8f0ded09c"}, @@ -1407,6 +1599,8 @@ version = "2.20.0" description = "Fastest Python implementation of JSON schema" optional = true python-versions = "*" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "fastjsonschema-2.20.0-py3-none-any.whl", hash = "sha256:5875f0b0fa7a0043a91e93a9b8f793bcbbba9691e7fd83dca95c28ba26d21f0a"}, {file = "fastjsonschema-2.20.0.tar.gz", hash = "sha256:3d48fc5300ee96f5d116f10fe6f28d938e6008f59a6a025c2649475b87f76a23"}, @@ -1421,6 +1615,8 @@ version = "1.0.0" description = "This is source code from official feetech repository" optional = true python-versions = "*" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"feetech\"" files = [ {file = "feetech-servo-sdk-1.0.0.tar.gz", hash = "sha256:d4d3832e4b1b22a8222133a414db9f868224c2fb639426a1b11d96ddfe84e69c"}, ] @@ -1434,6 +1630,8 @@ version = "3.16.1" description = "A platform independent file lock." optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0"}, {file = "filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435"}, @@ -1450,6 +1648,8 @@ version = "3.0.3" description = "A simple framework for building complex web applications." optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "flask-3.0.3-py3-none-any.whl", hash = "sha256:34e815dfaa43340d1d15a5c3a02b8476004037eb4840b34910c6e21679d288f3"}, {file = "flask-3.0.3.tar.gz", hash = "sha256:ceb27b0af3823ea2737928a4d99d125a06175b8512c445cbd9a9ce200ef76842"}, @@ -1472,6 +1672,8 @@ version = "4.54.1" description = "Tools to manipulate font files" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "(sys_platform == \"linux\" or extra == \"mani-skill\") and (python_version >= \"3.12\" or python_version <= \"3.11\") and (extra == \"stretch\" or extra == \"mani-skill\")" files = [ {file = "fonttools-4.54.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7ed7ee041ff7b34cc62f07545e55e1468808691dddfd315d51dd82a6b37ddef2"}, {file = "fonttools-4.54.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41bb0b250c8132b2fcac148e2e9198e62ff06f3cc472065dff839327945c5882"}, @@ -1543,6 +1745,8 @@ version = "1.5.1" description = "Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers" optional = true python-versions = ">=2.7, !=3.0, !=3.1, !=3.2, !=3.3, !=3.4, <4" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014"}, {file = "fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f"}, @@ -1554,6 +1758,8 @@ version = "2.5.1" description = "Freetype python bindings" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "freetype-py-2.5.1.zip", hash = "sha256:cfe2686a174d0dd3d71a9d8ee9bf6a2c23f5872385cf8ce9f24af83d076e2fbd"}, {file = "freetype_py-2.5.1-py3-none-macosx_10_9_universal2.whl", hash = "sha256:d01ded2557694f06aa0413f3400c0c0b2b5ebcaabeef7aaf3d756be44f51e90b"}, @@ -1570,6 +1776,8 @@ version = "1.4.1" description = "A list-like structure which implements collections.abc.MutableSequence" optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"}, {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"}, @@ -1656,6 +1864,8 @@ version = "2024.6.1" description = "File-system specification" optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "fsspec-2024.6.1-py3-none-any.whl", hash = "sha256:3cb443f8bcd2efb31295a5b9fdb02aee81d8452c80d28f97a6d0959e6cee101e"}, {file = "fsspec-2024.6.1.tar.gz", hash = "sha256:fad7d7e209dd4c1208e3bbfda706620e0da5142bebbd9c384afb95b07e798e49"}, @@ -1698,6 +1908,8 @@ version = "1.0.0" description = "Clean single-source support for Python 3 and 2" optional = true python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "future-1.0.0-py3-none-any.whl", hash = "sha256:929292d34f5872e70396626ef385ec22355a1fae8ad29e1a734c3e43f9fbc216"}, {file = "future-1.0.0.tar.gz", hash = "sha256:bd2968309307861edae1458a4f8a4f3598c03be43b97521076aebf5d94c07b05"}, @@ -1709,6 +1921,8 @@ version = "5.2.0" description = "Google Drive Public File/Folder Downloader" optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "gdown-5.2.0-py3-none-any.whl", hash = "sha256:33083832d82b1101bdd0e9df3edd0fbc0e1c5f14c9d8c38d2a35bf1683b526d6"}, {file = "gdown-5.2.0.tar.gz", hash = "sha256:2145165062d85520a3cd98b356c9ed522c5e7984d408535409fd46f94defc787"}, @@ -1729,6 +1943,8 @@ version = "4.0.11" description = "Git Object Database" optional = false python-versions = ">=3.7" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "gitdb-4.0.11-py3-none-any.whl", hash = "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4"}, {file = "gitdb-4.0.11.tar.gz", hash = "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"}, @@ -1743,6 +1959,8 @@ version = "3.1.43" description = "GitPython is a Python library used to interact with Git repositories" optional = false python-versions = ">=3.7" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "GitPython-3.1.43-py3-none-any.whl", hash = "sha256:eec7ec56b92aad751f9912a73404bc02ba212a23adb2c7098ee668417051a1ff"}, {file = "GitPython-3.1.43.tar.gz", hash = "sha256:35f314a9f878467f5453cc1fee295c3e18e52f1b99f10f6cf5b1682e968a9e7c"}, @@ -1761,6 +1979,8 @@ version = "2.7.0" description = "A ctypes-based wrapper for GLFW3." optional = true python-versions = "*" +groups = ["main"] +markers = "(extra == \"xarm\" or extra == \"aloha\") and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "glfw-2.7.0-py2.py27.py3.py30.py31.py32.py33.py34.py35.py36.py37.py38-none-macosx_10_6_intel.whl", hash = "sha256:bd82849edcceda4e262bd1227afaa74b94f9f0731c1197863cd25c15bfc613fc"}, {file = "glfw-2.7.0-py2.py27.py3.py30.py31.py32.py33.py34.py35.py36.py37.py38-none-macosx_11_0_arm64.whl", hash = "sha256:56ea163c964bb0bc336def2d6a6a1bd42f9db4b870ef834ac77d7b7ee68b8dfc"}, @@ -1776,12 +1996,83 @@ files = [ [package.extras] preview = ["glfw-preview"] +[[package]] +name = "grpcio" +version = "1.70.0" +description = "HTTP/2-based RPC framework" +optional = true +python-versions = ">=3.8" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"hilserl\"" +files = [ + {file = "grpcio-1.70.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:95469d1977429f45fe7df441f586521361e235982a0b39e33841549143ae2851"}, + {file = "grpcio-1.70.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:ed9718f17fbdb472e33b869c77a16d0b55e166b100ec57b016dc7de9c8d236bf"}, + {file = "grpcio-1.70.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:374d014f29f9dfdb40510b041792e0e2828a1389281eb590df066e1cc2b404e5"}, + {file = "grpcio-1.70.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2af68a6f5c8f78d56c145161544ad0febbd7479524a59c16b3e25053f39c87f"}, + {file = "grpcio-1.70.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce7df14b2dcd1102a2ec32f621cc9fab6695effef516efbc6b063ad749867295"}, + {file = "grpcio-1.70.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c78b339869f4dbf89881e0b6fbf376313e4f845a42840a7bdf42ee6caed4b11f"}, + {file = "grpcio-1.70.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:58ad9ba575b39edef71f4798fdb5c7b6d02ad36d47949cd381d4392a5c9cbcd3"}, + {file = "grpcio-1.70.0-cp310-cp310-win32.whl", hash = "sha256:2b0d02e4b25a5c1f9b6c7745d4fa06efc9fd6a611af0fb38d3ba956786b95199"}, + {file = "grpcio-1.70.0-cp310-cp310-win_amd64.whl", hash = "sha256:0de706c0a5bb9d841e353f6343a9defc9fc35ec61d6eb6111802f3aa9fef29e1"}, + {file = "grpcio-1.70.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:17325b0be0c068f35770f944124e8839ea3185d6d54862800fc28cc2ffad205a"}, + {file = "grpcio-1.70.0-cp311-cp311-macosx_10_14_universal2.whl", hash = "sha256:dbe41ad140df911e796d4463168e33ef80a24f5d21ef4d1e310553fcd2c4a386"}, + {file = "grpcio-1.70.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:5ea67c72101d687d44d9c56068328da39c9ccba634cabb336075fae2eab0d04b"}, + {file = "grpcio-1.70.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cb5277db254ab7586769e490b7b22f4ddab3876c490da0a1a9d7c695ccf0bf77"}, + {file = "grpcio-1.70.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7831a0fc1beeeb7759f737f5acd9fdcda520e955049512d68fda03d91186eea"}, + {file = "grpcio-1.70.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:27cc75e22c5dba1fbaf5a66c778e36ca9b8ce850bf58a9db887754593080d839"}, + {file = "grpcio-1.70.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d63764963412e22f0491d0d32833d71087288f4e24cbcddbae82476bfa1d81fd"}, + {file = "grpcio-1.70.0-cp311-cp311-win32.whl", hash = "sha256:bb491125103c800ec209d84c9b51f1c60ea456038e4734688004f377cfacc113"}, + {file = "grpcio-1.70.0-cp311-cp311-win_amd64.whl", hash = "sha256:d24035d49e026353eb042bf7b058fb831db3e06d52bee75c5f2f3ab453e71aca"}, + {file = "grpcio-1.70.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:ef4c14508299b1406c32bdbb9fb7b47612ab979b04cf2b27686ea31882387cff"}, + {file = "grpcio-1.70.0-cp312-cp312-macosx_10_14_universal2.whl", hash = "sha256:aa47688a65643afd8b166928a1da6247d3f46a2784d301e48ca1cc394d2ffb40"}, + {file = "grpcio-1.70.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:880bfb43b1bb8905701b926274eafce5c70a105bc6b99e25f62e98ad59cb278e"}, + {file = "grpcio-1.70.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e654c4b17d07eab259d392e12b149c3a134ec52b11ecdc6a515b39aceeec898"}, + {file = "grpcio-1.70.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2394e3381071045a706ee2eeb6e08962dd87e8999b90ac15c55f56fa5a8c9597"}, + {file = "grpcio-1.70.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:b3c76701428d2df01964bc6479422f20e62fcbc0a37d82ebd58050b86926ef8c"}, + {file = "grpcio-1.70.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ac073fe1c4cd856ebcf49e9ed6240f4f84d7a4e6ee95baa5d66ea05d3dd0df7f"}, + {file = "grpcio-1.70.0-cp312-cp312-win32.whl", hash = "sha256:cd24d2d9d380fbbee7a5ac86afe9787813f285e684b0271599f95a51bce33528"}, + {file = "grpcio-1.70.0-cp312-cp312-win_amd64.whl", hash = "sha256:0495c86a55a04a874c7627fd33e5beaee771917d92c0e6d9d797628ac40e7655"}, + {file = "grpcio-1.70.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:aa573896aeb7d7ce10b1fa425ba263e8dddd83d71530d1322fd3a16f31257b4a"}, + {file = "grpcio-1.70.0-cp313-cp313-macosx_10_14_universal2.whl", hash = "sha256:d405b005018fd516c9ac529f4b4122342f60ec1cee181788249372524e6db429"}, + {file = "grpcio-1.70.0-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:f32090238b720eb585248654db8e3afc87b48d26ac423c8dde8334a232ff53c9"}, + {file = "grpcio-1.70.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfa089a734f24ee5f6880c83d043e4f46bf812fcea5181dcb3a572db1e79e01c"}, + {file = "grpcio-1.70.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f19375f0300b96c0117aca118d400e76fede6db6e91f3c34b7b035822e06c35f"}, + {file = "grpcio-1.70.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:7c73c42102e4a5ec76608d9b60227d917cea46dff4d11d372f64cbeb56d259d0"}, + {file = "grpcio-1.70.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:0a5c78d5198a1f0aa60006cd6eb1c912b4a1520b6a3968e677dbcba215fabb40"}, + {file = "grpcio-1.70.0-cp313-cp313-win32.whl", hash = "sha256:fe9dbd916df3b60e865258a8c72ac98f3ac9e2a9542dcb72b7a34d236242a5ce"}, + {file = "grpcio-1.70.0-cp313-cp313-win_amd64.whl", hash = "sha256:4119fed8abb7ff6c32e3d2255301e59c316c22d31ab812b3fbcbaf3d0d87cc68"}, + {file = "grpcio-1.70.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:8058667a755f97407fca257c844018b80004ae8035565ebc2812cc550110718d"}, + {file = "grpcio-1.70.0-cp38-cp38-macosx_10_14_universal2.whl", hash = "sha256:879a61bf52ff8ccacbedf534665bb5478ec8e86ad483e76fe4f729aaef867cab"}, + {file = "grpcio-1.70.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:0ba0a173f4feacf90ee618fbc1a27956bfd21260cd31ced9bc707ef551ff7dc7"}, + {file = "grpcio-1.70.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:558c386ecb0148f4f99b1a65160f9d4b790ed3163e8610d11db47838d452512d"}, + {file = "grpcio-1.70.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:412faabcc787bbc826f51be261ae5fa996b21263de5368a55dc2cf824dc5090e"}, + {file = "grpcio-1.70.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3b0f01f6ed9994d7a0b27eeddea43ceac1b7e6f3f9d86aeec0f0064b8cf50fdb"}, + {file = "grpcio-1.70.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7385b1cb064734005204bc8994eed7dcb801ed6c2eda283f613ad8c6c75cf873"}, + {file = "grpcio-1.70.0-cp38-cp38-win32.whl", hash = "sha256:07269ff4940f6fb6710951116a04cd70284da86d0a4368fd5a3b552744511f5a"}, + {file = "grpcio-1.70.0-cp38-cp38-win_amd64.whl", hash = "sha256:aba19419aef9b254e15011b230a180e26e0f6864c90406fdbc255f01d83bc83c"}, + {file = "grpcio-1.70.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:4f1937f47c77392ccd555728f564a49128b6a197a05a5cd527b796d36f3387d0"}, + {file = "grpcio-1.70.0-cp39-cp39-macosx_10_14_universal2.whl", hash = "sha256:0cd430b9215a15c10b0e7d78f51e8a39d6cf2ea819fd635a7214fae600b1da27"}, + {file = "grpcio-1.70.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:e27585831aa6b57b9250abaf147003e126cd3a6c6ca0c531a01996f31709bed1"}, + {file = "grpcio-1.70.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c1af8e15b0f0fe0eac75195992a63df17579553b0c4af9f8362cc7cc99ccddf4"}, + {file = "grpcio-1.70.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbce24409beaee911c574a3d75d12ffb8c3e3dd1b813321b1d7a96bbcac46bf4"}, + {file = "grpcio-1.70.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ff4a8112a79464919bb21c18e956c54add43ec9a4850e3949da54f61c241a4a6"}, + {file = "grpcio-1.70.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5413549fdf0b14046c545e19cfc4eb1e37e9e1ebba0ca390a8d4e9963cab44d2"}, + {file = "grpcio-1.70.0-cp39-cp39-win32.whl", hash = "sha256:b745d2c41b27650095e81dea7091668c040457483c9bdb5d0d9de8f8eb25e59f"}, + {file = "grpcio-1.70.0-cp39-cp39-win_amd64.whl", hash = "sha256:a31d7e3b529c94e930a117b2175b2efd179d96eb3c7a21ccb0289a8ab05b645c"}, + {file = "grpcio-1.70.0.tar.gz", hash = "sha256:8d1584a68d5922330025881e63a6c1b54cc8117291d382e4fa69339b6d914c56"}, +] + +[package.extras] +protobuf = ["grpcio-tools (>=1.70.0)"] + [[package]] name = "gym-aloha" version = "0.1.1" description = "A gym environment for ALOHA" optional = true python-versions = "<4.0,>=3.10" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"aloha\"" files = [ {file = "gym_aloha-0.1.1-py3-none-any.whl", hash = "sha256:2698037246dbb106828f0bc229b61007b0a21d5967c72cc373f7bc1083203584"}, {file = "gym_aloha-0.1.1.tar.gz", hash = "sha256:614ae1cf116323e7b5ae2f0e9bd282c4f052aee15e839e5587ddce45995359bc"}, @@ -1803,6 +2094,8 @@ version = "0.1.0" description = "" optional = true python-versions = "^3.10" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"dora\"" files = [] develop = false @@ -1824,6 +2117,8 @@ version = "0.1.5" description = "A gymnasium environment for PushT." optional = true python-versions = "<4.0,>=3.10" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"pusht\"" files = [ {file = "gym_pusht-0.1.5-py3-none-any.whl", hash = "sha256:d9e3ba5f44916dc4a802d71764b08f4e7e09bda256e25af9dda16e9364dc777f"}, {file = "gym_pusht-0.1.5.tar.gz", hash = "sha256:981e135f6e0ca91e4ec63603e9551bc77cba989d06a2888ed31a1d68f7cbdae2"}, @@ -1847,6 +2142,8 @@ version = "0.1.1" description = "A gym environment for xArm" optional = true python-versions = "<4.0,>=3.10" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"xarm\"" files = [ {file = "gym_xarm-0.1.1-py3-none-any.whl", hash = "sha256:3bd7e3c1c5521ba80a56536f01a5e11321580704d72160355ce47a828a8808ad"}, {file = "gym_xarm-0.1.1.tar.gz", hash = "sha256:e455524561b02d06b92a4f7d524f448d84a7484d9a2dbc78600e3c66240e0fb7"}, @@ -1867,6 +2164,8 @@ version = "0.29.1" description = "A standard API for reinforcement learning and a diverse set of reference environments (formerly Gym)." optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "gymnasium-0.29.1-py3-none-any.whl", hash = "sha256:61c3384b5575985bb7f85e43213bcb40f36fcdff388cae6bc229304c71f2843e"}, {file = "gymnasium-0.29.1.tar.gz", hash = "sha256:1a532752efcb7590478b1cc7aa04f608eb7a2fdad5570cd217b66b6a35274bb1"}, @@ -1897,6 +2196,8 @@ version = "1.2.4" description = "Robotics environments for the Gymnasium repo." optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"xarm\"" files = [ {file = "gymnasium-robotics-1.2.4.tar.gz", hash = "sha256:d304192b066f8b800599dfbe3d9d90bba9b761ee884472bdc4d05968a8bc61cb"}, {file = "gymnasium_robotics-1.2.4-py3-none-any.whl", hash = "sha256:c2cb23e087ca0280ae6802837eb7b3a6d14e5bd24c00803ab09f015fcff3eef5"}, @@ -1920,6 +2221,8 @@ version = "0.14.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, @@ -1931,6 +2234,8 @@ version = "3.12.1" description = "Read and write HDF5 files from Python" optional = false python-versions = ">=3.9" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "h5py-3.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f0f1a382cbf494679c07b4371f90c70391dedb027d517ac94fa2c05299dacda"}, {file = "h5py-3.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cb65f619dfbdd15e662423e8d257780f9a66677eae5b4b3fc9dca70b5fd2d2a3"}, @@ -1969,6 +2274,8 @@ version = "0.7.27" description = "Stretch Body low level Python API" optional = true python-versions = "*" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "hello_robot_stretch_body-0.7.27-py3-none-any.whl", hash = "sha256:740e6abae4a0ba43b23ce7831129e3ef9356acd706ea73b5512873b04ba3c5f0"}, {file = "hello_robot_stretch_body-0.7.27.tar.gz", hash = "sha256:dd289ea95f9df7be1306cbc26ac75037946db04f4f22503fc6e2741a57c68732"}, @@ -2024,6 +2331,8 @@ version = "0.7.13" description = "Stretch Body Tools" optional = true python-versions = "*" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "hello_robot_stretch_body_tools-0.7.13-py3-none-any.whl", hash = "sha256:f12bd4ee40e48c11e68392e7fd91c3a752e87d44d864d1adb3998b30c0166e75"}, {file = "hello_robot_stretch_body_tools-0.7.13.tar.gz", hash = "sha256:9ce65bfc9a53444b7622c3479ab45c6aa9369618eb3bf102ef1172474d1873b7"}, @@ -2067,6 +2376,8 @@ version = "0.5.6" description = "Stretch Factory Tools" optional = true python-versions = "*" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "hello-robot-stretch-factory-0.5.6.tar.gz", hash = "sha256:e2b060daf5eda699781cde96faf608b7ed3c234ac5b22317f028a69f889846de"}, {file = "hello_robot_stretch_factory-0.5.6-py3-none-any.whl", hash = "sha256:09bb97bf1fc146855843af042684d1820d6b1775945dbc3e1cd44eff75be702f"}, @@ -2087,6 +2398,8 @@ version = "0.3.4" description = "Stretch end of arm tool interfaces" optional = true python-versions = "*" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "hello_robot_stretch_tool_share-0.3.4-py3-none-any.whl", hash = "sha256:230d24f88a84cc983c019078911c579882d9c2c9e24129e5acbe1c756189a1d1"}, {file = "hello_robot_stretch_tool_share-0.3.4.tar.gz", hash = "sha256:8e0a2cea088dcb50e41257aade5c6190964a0f1407f1f54f24d114ff31ecb2c6"}, @@ -2098,6 +2411,8 @@ version = "0.1.0" description = "Stretch URDF" optional = true python-versions = "*" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "hello_robot_stretch_urdf-0.1.0-py3-none-any.whl", hash = "sha256:324f5ce0834b45b343e84bb8e8f5cbdd02f1315c6954856f0c68badb2b03e026"}, {file = "hello_robot_stretch_urdf-0.1.0.tar.gz", hash = "sha256:51ed5984dbb6538e9f7cdc573b8a4a283118a13faaa06dc773c9bdda8bfe1034"}, @@ -2112,6 +2427,8 @@ version = "0.1.8" description = "Speed up file transfers with the Hugging Face Hub." optional = false python-versions = ">=3.7" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "hf_transfer-0.1.8-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:70858f9e94286738ed300484a45beb5cfee6a7ddac4c5886f9c6fce7823ac5ab"}, {file = "hf_transfer-0.1.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:38adc73f0a8526319d90f7cc5dc2d5e4bb66f487a513d94b98aa6725be732e4a"}, @@ -2176,6 +2493,8 @@ version = "1.0.6" description = "A minimal low-level HTTP client." optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "httpcore-1.0.6-py3-none-any.whl", hash = "sha256:27b59625743b85577a8c0e10e55b50b5368a4f2cfe8cc7bcfa9cf00829c2682f"}, {file = "httpcore-1.0.6.tar.gz", hash = "sha256:73f6dbd6eb8c21bbf7ef8efad555481853f5f6acdeaff1edb0694289269ee17f"}, @@ -2197,6 +2516,8 @@ version = "0.27.2" description = "The next generation HTTP client." optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "httpx-0.27.2-py3-none-any.whl", hash = "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0"}, {file = "httpx-0.27.2.tar.gz", hash = "sha256:f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2"}, @@ -2222,6 +2543,8 @@ version = "0.25.2" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = false python-versions = ">=3.8.0" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "huggingface_hub-0.25.2-py3-none-any.whl", hash = "sha256:1897caf88ce7f97fe0110603d8f66ac264e3ba6accdf30cd66cc0fed5282ad25"}, {file = "huggingface_hub-0.25.2.tar.gz", hash = "sha256:a1014ea111a5f40ccd23f7f7ba8ac46e20fa3b658ced1f86a00c75c06ec6423c"}, @@ -2258,6 +2581,8 @@ version = "1.3.2" description = "A framework for elegantly configuring complex applications" optional = false python-versions = "*" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "hydra-core-1.3.2.tar.gz", hash = "sha256:8a878ed67216997c3e9d88a8e72e7b4767e81af37afb4ea3334b269a4390a824"}, {file = "hydra_core-1.3.2-py3-none-any.whl", hash = "sha256:fa0238a9e31df3373b35b0bfb672c34cc92718d21f81311d8996a16de1141d8b"}, @@ -2274,6 +2599,8 @@ version = "2.6.1" description = "File identification library for Python" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"dev\"" files = [ {file = "identify-2.6.1-py2.py3-none-any.whl", hash = "sha256:53863bcac7caf8d2ed85bd20312ea5dcfc22226800f6d6881f232d861db5a8f0"}, {file = "identify-2.6.1.tar.gz", hash = "sha256:91478c5fb7c3aac5ff7bf9b4344f803843dc586832d5f110d672b19aa1984c98"}, @@ -2288,6 +2615,8 @@ version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, @@ -2302,6 +2631,8 @@ version = "2024.9.22" description = "Image transformation, compression, and decompression codecs" optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"umi\"" files = [ {file = "imagecodecs-2024.9.22-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:4cc21a59c6eb409bc3930dc642039eb1ff67a36b3f8d9e8c229eaede6b26557e"}, {file = "imagecodecs-2024.9.22-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:321ff2e6907820bdbf8350d20733f5068bf53513476d522028117aefab55fc03"}, @@ -2353,6 +2684,8 @@ version = "2.35.1" description = "Library for reading and writing a wide range of image, video, scientific, and volumetric data formats." optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "imageio-2.35.1-py3-none-any.whl", hash = "sha256:6eb2e5244e7a16b85c10b5c2fe0f7bf961b40fcb9f1a9fd1bd1d2c2f8fb3cd65"}, {file = "imageio-2.35.1.tar.gz", hash = "sha256:4952dfeef3c3947957f6d5dedb1f4ca31c6e509a476891062396834048aeed2a"}, @@ -2388,6 +2721,8 @@ version = "0.5.1" description = "FFMPEG wrapper for Python" optional = false python-versions = ">=3.5" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "imageio-ffmpeg-0.5.1.tar.gz", hash = "sha256:0ed7a9b31f560b0c9d929c5291cd430edeb9bed3ce9a497480e536dd4326484c"}, {file = "imageio_ffmpeg-0.5.1-py3-none-macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:1460e84712b9d06910c1f7bb524096b0341d4b7844cea6c20e099d0a24e795b1"}, @@ -2406,6 +2741,8 @@ version = "8.5.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b"}, {file = "importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7"}, @@ -2429,6 +2766,8 @@ version = "2.0.0" description = "brain-dead simple config-ini parsing" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"test\"" files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, @@ -2440,6 +2779,8 @@ version = "0.5" description = "Cross-platform Python support for keyboards, mice and gamepads." optional = true python-versions = "*" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "inputs-0.5-py2.py3-none-any.whl", hash = "sha256:13f894564e52134cf1e3862b1811da034875eb1f2b62e6021e3776e9669a96ec"}, {file = "inputs-0.5.tar.gz", hash = "sha256:a31d5b96a3525f1232f326be9e7ce8ccaf873c6b1fb84d9f3c9bc3d79b23eae4"}, @@ -2451,6 +2792,8 @@ version = "0.3.4" description = "Python port of Inquirer.js (A collection of common interactive command-line user interfaces)" optional = false python-versions = ">=3.7,<4.0" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "InquirerPy-0.3.4-py3-none-any.whl", hash = "sha256:c65fdfbac1fa00e3ee4fb10679f4d3ed7a012abf4833910e63c295827fe2a7d4"}, {file = "InquirerPy-0.3.4.tar.gz", hash = "sha256:89d2ada0111f337483cb41ae31073108b2ec1e618a49d7110b0d7ade89fc197e"}, @@ -2469,6 +2812,8 @@ version = "6.29.5" description = "IPython Kernel for Jupyter" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5"}, {file = "ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215"}, @@ -2502,12 +2847,15 @@ version = "8.28.0" description = "IPython: Productive Interactive Computing" optional = true python-versions = ">=3.10" +groups = ["main"] +markers = "(sys_platform == \"linux\" or extra == \"mani-skill\") and (python_version >= \"3.12\" or python_version <= \"3.11\") and (extra == \"stretch\" or extra == \"mani-skill\")" files = [ {file = "ipython-8.28.0-py3-none-any.whl", hash = "sha256:530ef1e7bb693724d3cdc37287c80b07ad9b25986c007a53aa1857272dac3f35"}, {file = "ipython-8.28.0.tar.gz", hash = "sha256:0d0d15ca1e01faeb868ef56bc7ee5a0de5bd66885735682e8a322ae289a13d1a"}, ] [package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} decorator = "*" exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} jedi = ">=0.16" @@ -2539,6 +2887,8 @@ version = "8.1.5" description = "Jupyter interactive widgets" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "ipywidgets-8.1.5-py3-none-any.whl", hash = "sha256:3290f526f87ae6e77655555baba4f36681c555b8bdbbff430b70e52c34c86245"}, {file = "ipywidgets-8.1.5.tar.gz", hash = "sha256:870e43b1a35656a80c18c9503bbf2d16802db1cb487eec6fab27d683381dde17"}, @@ -2560,6 +2910,8 @@ version = "20.11.0" description = "Operations with ISO 8601 durations" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042"}, {file = "isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9"}, @@ -2574,6 +2926,8 @@ version = "2.2.0" description = "Safely pass data to untrusted environments and back." optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef"}, {file = "itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173"}, @@ -2585,6 +2939,8 @@ version = "0.19.1" description = "An autocompletion tool for Python that can be used for text editors." optional = true python-versions = ">=3.6" +groups = ["main"] +markers = "(sys_platform == \"linux\" or extra == \"mani-skill\") and (python_version >= \"3.12\" or python_version <= \"3.11\") and (extra == \"stretch\" or extra == \"mani-skill\")" files = [ {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, @@ -2604,6 +2960,8 @@ version = "3.1.4" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, @@ -2621,6 +2979,8 @@ version = "0.9.25" description = "A Python implementation of the JSON5 data format." optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "json5-0.9.25-py3-none-any.whl", hash = "sha256:34ed7d834b1341a86987ed52f3f76cd8ee184394906b6e22a1e0deb9ab294e8f"}, {file = "json5-0.9.25.tar.gz", hash = "sha256:548e41b9be043f9426776f05df8635a00fe06104ea51ed24b67f908856e151ae"}, @@ -2632,6 +2992,8 @@ version = "4.0.0" description = "Library with helpers for the jsonlines file format" optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "jsonlines-4.0.0-py3-none-any.whl", hash = "sha256:185b334ff2ca5a91362993f42e83588a360cf95ce4b71a73548502bda52a7c55"}, {file = "jsonlines-4.0.0.tar.gz", hash = "sha256:0c6d2c09117550c089995247f605ae4cf77dd1533041d366351f6f298822ea74"}, @@ -2646,6 +3008,8 @@ version = "3.0.0" description = "Identify specific nodes in a JSON document (RFC 6901)" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, @@ -2657,6 +3021,8 @@ version = "4.23.0" description = "An implementation of JSON Schema validation for Python" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"}, {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"}, @@ -2686,6 +3052,8 @@ version = "2024.10.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf"}, {file = "jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272"}, @@ -2700,6 +3068,8 @@ version = "1.1.1" description = "Jupyter metapackage. Install all the Jupyter components in one go." optional = true python-versions = "*" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "jupyter-1.1.1-py2.py3-none-any.whl", hash = "sha256:7a59533c22af65439b24bbe60373a4e95af8f16ac65a6c00820ad378e3f7cc83"}, {file = "jupyter-1.1.1.tar.gz", hash = "sha256:d55467bceabdea49d7e3624af7e33d59c37fff53ed3a350e1ac957bed731de7a"}, @@ -2719,6 +3089,8 @@ version = "8.6.3" description = "Jupyter protocol implementation and client libraries" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f"}, {file = "jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419"}, @@ -2741,6 +3113,8 @@ version = "6.6.3" description = "Jupyter terminal console" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "jupyter_console-6.6.3-py3-none-any.whl", hash = "sha256:309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485"}, {file = "jupyter_console-6.6.3.tar.gz", hash = "sha256:566a4bf31c87adbfadf22cdf846e3069b59a71ed5da71d6ba4d8aaad14a53539"}, @@ -2765,6 +3139,8 @@ version = "5.7.2" description = "Jupyter core package. A base package on which Jupyter projects rely." optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409"}, {file = "jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9"}, @@ -2784,6 +3160,8 @@ version = "0.10.0" description = "Jupyter Event System library" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "jupyter_events-0.10.0-py3-none-any.whl", hash = "sha256:4b72130875e59d57716d327ea70d3ebc3af1944d3717e5a498b8a06c6c159960"}, {file = "jupyter_events-0.10.0.tar.gz", hash = "sha256:670b8229d3cc882ec782144ed22e0d29e1c2d639263f92ca8383e66682845e22"}, @@ -2809,6 +3187,8 @@ version = "2.2.5" description = "Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "jupyter-lsp-2.2.5.tar.gz", hash = "sha256:793147a05ad446f809fd53ef1cd19a9f5256fd0a2d6b7ce943a982cb4f545001"}, {file = "jupyter_lsp-2.2.5-py3-none-any.whl", hash = "sha256:45fbddbd505f3fbfb0b6cb2f1bc5e15e83ab7c79cd6e89416b248cb3c00c11da"}, @@ -2823,6 +3203,8 @@ version = "2.14.2" description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "jupyter_server-2.14.2-py3-none-any.whl", hash = "sha256:47ff506127c2f7851a17bf4713434208fc490955d0e8632e95014a9a9afbeefd"}, {file = "jupyter_server-2.14.2.tar.gz", hash = "sha256:66095021aa9638ced276c248b1d81862e4c50f292d575920bbe960de1c56b12b"}, @@ -2859,6 +3241,8 @@ version = "0.5.3" description = "A Jupyter Server Extension Providing Terminals." optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "jupyter_server_terminals-0.5.3-py3-none-any.whl", hash = "sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa"}, {file = "jupyter_server_terminals-0.5.3.tar.gz", hash = "sha256:5ae0295167220e9ace0edcfdb212afd2b01ee8d179fe6f23c899590e9b8a5269"}, @@ -2878,6 +3262,8 @@ version = "4.2.5" description = "JupyterLab computational environment" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "jupyterlab-4.2.5-py3-none-any.whl", hash = "sha256:73b6e0775d41a9fee7ee756c80f58a6bed4040869ccc21411dc559818874d321"}, {file = "jupyterlab-4.2.5.tar.gz", hash = "sha256:ae7f3a1b8cb88b4f55009ce79fa7c06f99d70cd63601ee4aa91815d054f46f75"}, @@ -2912,6 +3298,8 @@ version = "0.3.0" description = "Pygments theme using JupyterLab CSS variables" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780"}, {file = "jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d"}, @@ -2923,6 +3311,8 @@ version = "2.27.3" description = "A set of server components for JupyterLab and JupyterLab like applications." optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "jupyterlab_server-2.27.3-py3-none-any.whl", hash = "sha256:e697488f66c3db49df675158a77b3b017520d772c6e1548c7d9bcc5df7944ee4"}, {file = "jupyterlab_server-2.27.3.tar.gz", hash = "sha256:eb36caca59e74471988f0ae25c77945610b887f777255aa21f8065def9e51ed4"}, @@ -2948,6 +3338,8 @@ version = "3.0.13" description = "Jupyter interactive widgets for JupyterLab" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "jupyterlab_widgets-3.0.13-py3-none-any.whl", hash = "sha256:e3cda2c233ce144192f1e29914ad522b2f4c40e77214b0cc97377ca3d323db54"}, {file = "jupyterlab_widgets-3.0.13.tar.gz", hash = "sha256:a2966d385328c1942b683a8cd96b89b8dd82c8b8f81dda902bb2bc06d46f5bed"}, @@ -2959,6 +3351,8 @@ version = "1.4.7" description = "A fast implementation of the Cassowary constraint solver" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "(sys_platform == \"linux\" or extra == \"mani-skill\") and (python_version >= \"3.12\" or python_version <= \"3.11\") and (extra == \"stretch\" or extra == \"mani-skill\")" files = [ {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8a9c83f75223d5e48b0bc9cb1bf2776cf01563e00ade8775ffe13b0b6e1af3a6"}, {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:58370b1ffbd35407444d57057b57da5d6549d2d854fa30249771775c63b5fe17"}, @@ -3082,6 +3476,8 @@ version = "1.0.6" description = "LabMaze: DeepMind Lab's text maze generator." optional = true python-versions = "*" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"aloha\"" files = [ {file = "labmaze-1.0.6-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b2ddef976dfd8d992b19cfa6c633f2eba7576d759c2082da534e3f727479a84a"}, {file = "labmaze-1.0.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:157efaa93228c8ccce5cae337902dd652093e0fba9d3a0f6506e4bee272bb66f"}, @@ -3126,6 +3522,8 @@ version = "0.4" description = "Makes it easy to load subpackages and functions on demand." optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "(extra == \"pusht\" or extra == \"video-benchmark\" or sys_platform == \"linux\") and (extra == \"pusht\" or extra == \"video-benchmark\" or extra == \"stretch\") and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "lazy_loader-0.4-py3-none-any.whl", hash = "sha256:342aa8e14d543a154047afb4ba8ef17f5563baad3fc610d7b15b213b0f119efc"}, {file = "lazy_loader-0.4.tar.gz", hash = "sha256:47c75182589b91a4e1a85a136c074285a5ad4d9f39c63e0d7fb76391c4574cd1"}, @@ -3145,6 +3543,8 @@ version = "0.11.9" description = "Lightning toolbox for across the our ecosystem." optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"hilserl\"" files = [ {file = "lightning_utilities-0.11.9-py3-none-any.whl", hash = "sha256:ac6d4e9e28faf3ff4be997876750fee10dc604753dbc429bf3848a95c5d7e0d2"}, {file = "lightning_utilities-0.11.9.tar.gz", hash = "sha256:f5052b81344cc2684aa9afd74b7ce8819a8f49a858184ec04548a5a109dfd053"}, @@ -3166,6 +3566,8 @@ version = "0.43.0" description = "lightweight wrapper around basic LLVM functionality" optional = false python-versions = ">=3.9" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "llvmlite-0.43.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a289af9a1687c6cf463478f0fa8e8aa3b6fb813317b0d70bf1ed0759eab6f761"}, {file = "llvmlite-0.43.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6d4fd101f571a31acb1559ae1af30f30b1dc4b3186669f92ad780e17c81e91bc"}, @@ -3196,6 +3598,8 @@ version = "5.3.0" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." optional = true python-versions = ">=3.6" +groups = ["main"] +markers = "(sys_platform == \"linux\" or extra == \"aloha\" or extra == \"mani-skill\") and (python_version >= \"3.12\" or python_version <= \"3.11\") and (extra == \"stretch\" or extra == \"aloha\" or extra == \"mani-skill\")" files = [ {file = "lxml-5.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:dd36439be765e2dde7660212b5275641edbc813e7b24668831a5c8ac91180656"}, {file = "lxml-5.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ae5fe5c4b525aa82b8076c1a59d642c17b6e8739ecf852522c6321852178119d"}, @@ -3344,12 +3748,56 @@ html5 = ["html5lib"] htmlsoup = ["BeautifulSoup4"] source = ["Cython (>=3.0.11)"] +[[package]] +name = "mani-skill" +version = "3.0.0b18" +description = "ManiSkill3: A Unified Benchmark for Generalizable Manipulation Skills" +optional = true +python-versions = ">=3.9" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"mani-skill\"" +files = [ + {file = "mani_skill-3.0.0b18-py3-none-any.whl", hash = "sha256:bf968fc391e5acfc67cd1fb4fbaade6e796d088961500f28cc5ecc1de33618e6"}, + {file = "mani_skill-3.0.0b18.tar.gz", hash = "sha256:75a2cbfa8539b2f5d0422179a44b0d843ffe570c6e840331927ff2e8369acd07"}, +] + +[package.dependencies] +dacite = "*" +fast_kinematics = {version = "0.2.2", markers = "platform_system == \"Linux\""} +GitPython = "*" +gymnasium = "0.29.1" +h5py = "*" +huggingface_hub = "*" +imageio = [ + {version = "*"}, + {version = "*", extras = ["ffmpeg"]}, +] +IPython = "*" +mplib = {version = "0.1.1", markers = "platform_system == \"Linux\""} +numpy = ">=1.22,<2.0.0" +pynvml = "*" +pytorch_kinematics = "0.7.4" +pyyaml = "*" +sapien = "3.0.0.b1" +scipy = "*" +tabulate = "*" +tqdm = "*" +transforms3d = "*" +trimesh = "*" +tyro = ">=0.8.5" + +[package.extras] +dev = ["black", "build", "isort", "pre-commit", "pynvml", "pytest", "pytest-forked", "pytest-xdist[psutil]", "stable_baselines3", "twine"] +docs = ["myst-parser", "pydata_sphinx_theme", "sphinx (==6.2.1)", "sphinx-autobuild", "sphinx-autodoc-typehints", "sphinx-subfigure", "sphinx-togglebutton", "sphinx_copybutton", "sphinx_design", "sphinxcontrib-video", "sphinxcontrib.spelling"] + [[package]] name = "markdown-it-py" version = "3.0.0" description = "Python port of markdown-it. Markdown parsing, done right!" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "(sys_platform == \"linux\" or extra == \"mani-skill\") and (python_version >= \"3.12\" or python_version <= \"3.11\") and (extra == \"stretch\" or extra == \"mani-skill\")" files = [ {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, @@ -3374,6 +3822,8 @@ version = "3.0.1" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.9" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "MarkupSafe-3.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:db842712984e91707437461930e6011e60b39136c7331e971952bb30465bc1a1"}, {file = "MarkupSafe-3.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3ffb4a8e7d46ed96ae48805746755fadd0909fea2306f93d5d8233ba23dda12a"}, @@ -3444,6 +3894,8 @@ version = "3.9.2" description = "Python plotting package" optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "(sys_platform == \"linux\" or extra == \"mani-skill\") and (python_version >= \"3.12\" or python_version <= \"3.11\") and (extra == \"stretch\" or extra == \"mani-skill\")" files = [ {file = "matplotlib-3.9.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:9d78bbc0cbc891ad55b4f39a48c22182e9bdaea7fc0e5dbd364f49f729ca1bbb"}, {file = "matplotlib-3.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c375cc72229614632c87355366bdf2570c2dac01ac66b8ad048d2dabadf2d0d4"}, @@ -3507,6 +3959,8 @@ version = "0.1.7" description = "Inline Matplotlib backend for Jupyter" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "(sys_platform == \"linux\" or extra == \"mani-skill\") and (python_version >= \"3.12\" or python_version <= \"3.11\") and (extra == \"stretch\" or extra == \"mani-skill\")" files = [ {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, @@ -3521,6 +3975,8 @@ version = "0.1.2" description = "Markdown URL utilities" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "(sys_platform == \"linux\" or extra == \"mani-skill\") and (python_version >= \"3.12\" or python_version <= \"3.11\") and (extra == \"stretch\" or extra == \"mani-skill\")" files = [ {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, @@ -3532,6 +3988,8 @@ version = "5.3.5" description = "I/O for many mesh formats" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "meshio-5.3.5-py3-none-any.whl", hash = "sha256:0736c6e34ecc768f62f2cde5d8233a3529512a9399b25c68ea2ca0d5900cdc10"}, {file = "meshio-5.3.5.tar.gz", hash = "sha256:f21f01abd9f29ba06ea119304b3d39e610421cfe93b9dd23362834919f87586d"}, @@ -3550,17 +4008,43 @@ version = "3.0.2" description = "A sane and fast Markdown parser with useful plugins and renderers" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "mistune-3.0.2-py3-none-any.whl", hash = "sha256:71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205"}, {file = "mistune-3.0.2.tar.gz", hash = "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8"}, ] +[[package]] +name = "mplib" +version = "0.1.1" +description = "A lightweight motion planning library" +optional = true +python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"mani-skill\" and platform_system == \"Linux\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" +files = [ + {file = "mplib-0.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e320ec9e77b19ada2d4ae854fac16938916aaedbed3822f4e698adbcdb6a3e6"}, + {file = "mplib-0.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06c045092eb03c376cc75abc7c82fa583dc10757b9f0b6e863627aafe14d6d95"}, + {file = "mplib-0.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ee54fe2528bd468094b8344977dee351332d7cddafb6f42ffa1c288df889694"}, + {file = "mplib-0.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3035db7b16ffca685b547fbd56cffa3f93cf4ce63c9348f16c5c11d998cb1367"}, + {file = "mplib-0.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:064f769117d7b7503a9c69c99c5f1b5b061bb4bd1d6c5e2f4f920a095e7e9b11"}, + {file = "mplib-0.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a1cd6754421cd1274734bc8baa33b009aba55059869796592957c0a696e675f"}, +] + +[package.dependencies] +numpy = "*" +toppra = ">=0.4.0" +transforms3d = ">=0.3.1" + [[package]] name = "mpmath" version = "1.3.0" description = "Python library for arbitrary-precision floating-point arithmetic" optional = false python-versions = "*" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, @@ -3578,6 +4062,8 @@ version = "2.3.7" description = "MuJoCo Physics Simulator" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "(extra == \"xarm\" or extra == \"aloha\") and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "mujoco-2.3.7-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:e8714a5ff6a1561b364b7b4648d4c0c8d13e751874cf7401c309b9d23fa9598b"}, {file = "mujoco-2.3.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a934315f858a4e0c4b90a682fde519471cfdd7baa64435179da8cd20d4ae3f99"}, @@ -3618,6 +4104,8 @@ version = "6.1.0" description = "multidict implementation" optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60"}, {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1"}, @@ -3722,6 +4210,8 @@ version = "0.70.16" description = "better multiprocessing and multithreading in Python" optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "multiprocess-0.70.16-pp310-pypy310_pp73-macosx_10_13_x86_64.whl", hash = "sha256:476887be10e2f59ff183c006af746cb6f1fd0eadcfd4ef49e605cbe2659920ee"}, {file = "multiprocess-0.70.16-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d951bed82c8f73929ac82c61f01a7b5ce8f3e5ef40f5b52553b4f547ce2b08ec"}, @@ -3746,6 +4236,8 @@ version = "0.10.0" description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." optional = true python-versions = ">=3.8.0" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "nbclient-0.10.0-py3-none-any.whl", hash = "sha256:f13e3529332a1f1f81d82a53210322476a168bb7090a0289c795fe9cc11c9d3f"}, {file = "nbclient-0.10.0.tar.gz", hash = "sha256:4b3f1b7dba531e498449c4db4f53da339c91d449dc11e9af3a43b4eb5c5abb09"}, @@ -3768,6 +4260,8 @@ version = "7.16.4" description = "Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script. nbconvert can be used both as a Python library (`import nbconvert`) or as a command line tool (invoked as `jupyter nbconvert ...`)." optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "nbconvert-7.16.4-py3-none-any.whl", hash = "sha256:05873c620fe520b6322bf8a5ad562692343fe3452abda5765c7a34b7d1aa3eb3"}, {file = "nbconvert-7.16.4.tar.gz", hash = "sha256:86ca91ba266b0a448dc96fa6c5b9d98affabde2867b363258703536807f9f7f4"}, @@ -3805,6 +4299,8 @@ version = "5.10.4" description = "The Jupyter Notebook format" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b"}, {file = "nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a"}, @@ -3826,6 +4322,8 @@ version = "1.6.0" description = "Patch asyncio to allow nested event loops" optional = true python-versions = ">=3.5" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, @@ -3837,6 +4335,8 @@ version = "3.4" description = "Python package for creating and manipulating graphs and networks" optional = false python-versions = ">=3.10" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "networkx-3.4-py3-none-any.whl", hash = "sha256:46dad0ec74a825a968e2b36c37ef5b91faa3868f017b2283d9cbff33112222ce"}, {file = "networkx-3.4.tar.gz", hash = "sha256:1269b90f8f0d3a4095f016f49650f35ac169729f49b69d0572b2bb142748162b"}, @@ -3856,6 +4356,8 @@ version = "1.9.1" description = "Node.js virtual environment builder" optional = true python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"dev\"" files = [ {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, @@ -3867,6 +4369,8 @@ version = "1.3.7" description = "nose extends unittest to make testing easier" optional = true python-versions = "*" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "nose-1.3.7-py2-none-any.whl", hash = "sha256:dadcddc0aefbf99eea214e0f1232b94f2fa9bd98fa8353711dacb112bfcbbb2a"}, {file = "nose-1.3.7-py3-none-any.whl", hash = "sha256:9ff7c6cc443f8c51994b34a667bbcf45afd6d945be7477b52e97516fd17c53ac"}, @@ -3879,6 +4383,8 @@ version = "7.2.2" description = "Jupyter Notebook - A web-based notebook environment for interactive computing" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "notebook-7.2.2-py3-none-any.whl", hash = "sha256:c89264081f671bc02eec0ed470a627ed791b9156cad9285226b31611d3e9fe1c"}, {file = "notebook-7.2.2.tar.gz", hash = "sha256:2ef07d4220421623ad3fe88118d687bc0450055570cdd160814a59cf3a1c516e"}, @@ -3902,6 +4408,8 @@ version = "0.2.4" description = "A shim layer for notebook traits and config" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef"}, {file = "notebook_shim-0.2.4.tar.gz", hash = "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb"}, @@ -3919,6 +4427,8 @@ version = "0.60.0" description = "compiling Python code using LLVM" optional = false python-versions = ">=3.9" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "numba-0.60.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d761de835cd38fb400d2c26bb103a2726f548dc30368853121d66201672e651"}, {file = "numba-0.60.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:159e618ef213fba758837f9837fb402bbe65326e60ba0633dbe6c7f274d42c1b"}, @@ -3953,6 +4463,8 @@ version = "0.13.1" description = "A Python package providing buffer compression and transformation codecs for use in data storage and communication applications." optional = false python-versions = ">=3.10" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "numcodecs-0.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:96add4f783c5ce57cc7e650b6cac79dd101daf887c479a00a29bc1487ced180b"}, {file = "numcodecs-0.13.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:237b7171609e868a20fd313748494444458ccd696062f67e198f7f8f52000c15"}, @@ -3990,6 +4502,8 @@ version = "1.26.4" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.9" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, @@ -4035,6 +4549,8 @@ version = "3.1.2" description = "Library to make reading, writing and modifying both binary and ascii STL files easy." optional = true python-versions = ">3.6.0" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "numpy_stl-3.1.2-py3-none-any.whl", hash = "sha256:a55288340c837378bf44753a1c595c6823312995acda97f27ed04db4ff1d25f3"}, {file = "numpy_stl-3.1.2.tar.gz", hash = "sha256:72b46950dfa3642df1c7b873cfa78a548533724b907478c567db42fdf57ee3d2"}, @@ -4050,6 +4566,8 @@ version = "12.1.3.1" description = "CUBLAS native runtime libraries" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "nvidia_cublas_cu12-12.1.3.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:ee53ccca76a6fc08fb9701aa95b6ceb242cdaab118c3bb152af4e579af792728"}, {file = "nvidia_cublas_cu12-12.1.3.1-py3-none-win_amd64.whl", hash = "sha256:2b964d60e8cf11b5e1073d179d85fa340c120e99b3067558f3cf98dd69d02906"}, @@ -4061,6 +4579,8 @@ version = "12.1.105" description = "CUDA profiling tools runtime libs." optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "nvidia_cuda_cupti_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:e54fde3983165c624cb79254ae9818a456eb6e87a7fd4d56a2352c24ee542d7e"}, {file = "nvidia_cuda_cupti_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:bea8236d13a0ac7190bd2919c3e8e6ce1e402104276e6f9694479e48bb0eb2a4"}, @@ -4072,6 +4592,8 @@ version = "12.1.105" description = "NVRTC native runtime libraries" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:339b385f50c309763ca65456ec75e17bbefcbbf2893f462cb8b90584cd27a1c2"}, {file = "nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:0a98a522d9ff138b96c010a65e145dc1b4850e9ecb75a0172371793752fd46ed"}, @@ -4083,6 +4605,8 @@ version = "12.1.105" description = "CUDA Runtime native Libraries" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "nvidia_cuda_runtime_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:6e258468ddf5796e25f1dc591a31029fa317d97a0a94ed93468fc86301d61e40"}, {file = "nvidia_cuda_runtime_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:dfb46ef84d73fababab44cf03e3b83f80700d27ca300e537f85f636fac474344"}, @@ -4094,6 +4618,8 @@ version = "9.1.0.70" description = "cuDNN runtime libraries" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl", hash = "sha256:165764f44ef8c61fcdfdfdbe769d687e06374059fbb388b6c89ecb0e28793a6f"}, {file = "nvidia_cudnn_cu12-9.1.0.70-py3-none-win_amd64.whl", hash = "sha256:6278562929433d68365a07a4a1546c237ba2849852c0d4b2262a486e805b977a"}, @@ -4108,6 +4634,8 @@ version = "11.0.2.54" description = "CUFFT native runtime libraries" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "nvidia_cufft_cu12-11.0.2.54-py3-none-manylinux1_x86_64.whl", hash = "sha256:794e3948a1aa71fd817c3775866943936774d1c14e7628c74f6f7417224cdf56"}, {file = "nvidia_cufft_cu12-11.0.2.54-py3-none-win_amd64.whl", hash = "sha256:d9ac353f78ff89951da4af698f80870b1534ed69993f10a4cf1d96f21357e253"}, @@ -4119,6 +4647,8 @@ version = "10.3.2.106" description = "CURAND native runtime libraries" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "nvidia_curand_cu12-10.3.2.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:9d264c5036dde4e64f1de8c50ae753237c12e0b1348738169cd0f8a536c0e1e0"}, {file = "nvidia_curand_cu12-10.3.2.106-py3-none-win_amd64.whl", hash = "sha256:75b6b0c574c0037839121317e17fd01f8a69fd2ef8e25853d826fec30bdba74a"}, @@ -4130,6 +4660,8 @@ version = "11.4.5.107" description = "CUDA solver native runtime libraries" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl", hash = "sha256:8a7ec542f0412294b15072fa7dab71d31334014a69f953004ea7a118206fe0dd"}, {file = "nvidia_cusolver_cu12-11.4.5.107-py3-none-win_amd64.whl", hash = "sha256:74e0c3a24c78612192a74fcd90dd117f1cf21dea4822e66d89e8ea80e3cd2da5"}, @@ -4146,6 +4678,8 @@ version = "12.1.0.106" description = "CUSPARSE native runtime libraries" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:f3b50f42cf363f86ab21f720998517a659a48131e8d538dc02f8768237bd884c"}, {file = "nvidia_cusparse_cu12-12.1.0.106-py3-none-win_amd64.whl", hash = "sha256:b798237e81b9719373e8fae8d4f091b70a0cf09d9d85c95a557e11df2d8e9a5a"}, @@ -4154,12 +4688,27 @@ files = [ [package.dependencies] nvidia-nvjitlink-cu12 = "*" +[[package]] +name = "nvidia-ml-py" +version = "12.570.86" +description = "Python Bindings for the NVIDIA Management Library" +optional = true +python-versions = "*" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"mani-skill\"" +files = [ + {file = "nvidia_ml_py-12.570.86-py3-none-any.whl", hash = "sha256:58907de35a845abd13dcb227f18298f3b5dd94a72d04c9e594e77711e95c0b51"}, + {file = "nvidia_ml_py-12.570.86.tar.gz", hash = "sha256:0508d4a0c7b6d015cf574530b95a62ed4fc89da3b8b47e1aefe6777db170ec8b"}, +] + [[package]] name = "nvidia-nccl-cu12" version = "2.20.5" description = "NVIDIA Collective Communication Library (NCCL) Runtime" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1fc150d5c3250b170b29410ba682384b14581db722b2531b0d8d33c595f33d01"}, {file = "nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_x86_64.whl", hash = "sha256:057f6bf9685f75215d0c53bf3ac4a10b3e6578351de307abad9e18a99182af56"}, @@ -4171,6 +4720,8 @@ version = "12.6.77" description = "Nvidia JIT LTO Library" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "nvidia_nvjitlink_cu12-12.6.77-py3-none-manylinux2014_aarch64.whl", hash = "sha256:3bf10d85bb1801e9c894c6e197e44dd137d2a0a9e43f8450e9ad13f2df0dd52d"}, {file = "nvidia_nvjitlink_cu12-12.6.77-py3-none-manylinux2014_x86_64.whl", hash = "sha256:9ae346d16203ae4ea513be416495167a0101d33d2d14935aa9c1829a3fb45142"}, @@ -4183,6 +4734,8 @@ version = "12.1.105" description = "NVIDIA Tools Extension" optional = false python-versions = ">=3" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "nvidia_nvtx_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:dc21cf308ca5691e7c04d962e213f8a4aa9bbfa23d95412f452254c2caeb09e5"}, {file = "nvidia_nvtx_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:65f4d98982b31b60026e0e6de73fbdfc09d08a96f4656dd3665ca616a11e1e82"}, @@ -4194,6 +4747,8 @@ version = "2.3.0" description = "A flexible configuration library" optional = false python-versions = ">=3.6" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "omegaconf-2.3.0-py3-none-any.whl", hash = "sha256:7b4df175cdb08ba400f45cae3bdcae7ba8365db4d165fc65fd04b050ab63b46b"}, {file = "omegaconf-2.3.0.tar.gz", hash = "sha256:d5d4b6d29955cc50ad50c46dc269bcd92c6e00f5f90d23ab5fee7bfca4ba4cc7"}, @@ -4209,6 +4764,8 @@ version = "0.18.0" description = "Open3D: A Modern Library for 3D Data Processing." optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "open3d-0.18.0-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:48ee627a142a5453c4a2869b529310acb6f6b2507989cb9199c56e75796c575e"}, {file = "open3d-0.18.0-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:9f3df5e8e8fe514b8285d05e43a4a3d57243d42d5c1dc9212adf8f18b6ab59b4"}, @@ -4245,6 +4802,8 @@ version = "4.10.0.84" description = "Wrapper package for OpenCV python bindings." optional = true python-versions = ">=3.6" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "opencv-contrib-python-4.10.0.84.tar.gz", hash = "sha256:4a3eae0ed9cadf1abe9293a6938a25a540e2fd6d7fc308595caa5896c8b36a0c"}, {file = "opencv_contrib_python-4.10.0.84-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:ee4b0919026d8c533aeb69b16c6ec4a891a2f6844efaa14121bf68838753209c"}, @@ -4257,10 +4816,10 @@ files = [ [package.dependencies] numpy = [ + {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, + {version = ">=1.23.5", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, {version = ">=1.21.4", markers = "python_version >= \"3.10\" and platform_system == \"Darwin\" and python_version < \"3.11\""}, {version = ">=1.21.2", markers = "platform_system != \"Darwin\" and python_version >= \"3.10\" and python_version < \"3.11\""}, - {version = ">=1.23.5", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, - {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, ] [[package]] @@ -4269,6 +4828,8 @@ version = "4.10.0.84" description = "Wrapper package for OpenCV python bindings." optional = false python-versions = ">=3.6" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "opencv-python-4.10.0.84.tar.gz", hash = "sha256:72d234e4582e9658ffea8e9cae5b63d488ad06994ef12d81dc303b17472f3526"}, {file = "opencv_python-4.10.0.84-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:fc182f8f4cda51b45f01c64e4cbedfc2f00aff799debebc305d8d0210c43f251"}, @@ -4281,10 +4842,10 @@ files = [ [package.dependencies] numpy = [ + {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, + {version = ">=1.23.5", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, {version = ">=1.21.4", markers = "python_version >= \"3.10\" and platform_system == \"Darwin\" and python_version < \"3.11\""}, {version = ">=1.21.2", markers = "platform_system != \"Darwin\" and python_version >= \"3.10\" and python_version < \"3.11\""}, - {version = ">=1.23.5", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, - {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, ] [[package]] @@ -4293,6 +4854,8 @@ version = "5.2.2" description = "Orderly set" optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "orderly_set-5.2.2-py3-none-any.whl", hash = "sha256:f7a37c95a38c01cdfe41c3ffb62925a318a2286ea0a41790c057fc802aec54da"}, {file = "orderly_set-5.2.2.tar.gz", hash = "sha256:52a18b86aaf3f5d5a498bbdb27bf3253a4e5c57ab38e5b7a56fa00115cd28448"}, @@ -4304,6 +4867,8 @@ version = "7.7.0" description = "A decorator to automatically detect mismatch when overriding a method." optional = true python-versions = ">=3.6" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49"}, {file = "overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a"}, @@ -4315,6 +4880,8 @@ version = "24.1" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, @@ -4326,6 +4893,8 @@ version = "2.2.3" description = "Powerful data structures for data analysis, time series, and statistics" optional = false python-versions = ">=3.9" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "pandas-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5"}, {file = "pandas-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348"}, @@ -4373,9 +4942,9 @@ files = [ [package.dependencies] numpy = [ - {version = ">=1.22.4", markers = "python_version < \"3.11\""}, - {version = ">=1.23.2", markers = "python_version == \"3.11\""}, {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, + {version = ">=1.23.2", markers = "python_version == \"3.11\""}, + {version = ">=1.22.4", markers = "python_version < \"3.11\""}, ] python-dateutil = ">=2.8.2" pytz = ">=2020.1" @@ -4412,6 +4981,8 @@ version = "1.5.1" description = "Utilities for writing pandoc filters in python" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc"}, {file = "pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e"}, @@ -4423,6 +4994,8 @@ version = "0.8.4" description = "A Python Parser" optional = true python-versions = ">=3.6" +groups = ["main"] +markers = "(sys_platform == \"linux\" or extra == \"mani-skill\") and (python_version >= \"3.12\" or python_version <= \"3.11\") and (extra == \"stretch\" or extra == \"mani-skill\")" files = [ {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, @@ -4438,6 +5011,8 @@ version = "1.0.1" description = "Object-oriented filesystem paths" optional = true python-versions = "*" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "pathlib-1.0.1-py3-none-any.whl", hash = "sha256:f35f95ab8b0f59e6d354090350b44a80a80635d22efdedfa84c7ad1cf0a74147"}, {file = "pathlib-1.0.1.tar.gz", hash = "sha256:6940718dfc3eff4258203ad5021090933e5c04707d5ca8cc9e73c94a7894ea9f"}, @@ -4449,6 +5024,8 @@ version = "1.24.3" description = "Gymnasium for multi-agent reinforcement learning." optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"xarm\"" files = [ {file = "pettingzoo-1.24.3-py3-none-any.whl", hash = "sha256:23ed90517d2e8a7098bdaf5e31234b3a7f7b73ca578d70d1ca7b9d0cb0e37982"}, {file = "pettingzoo-1.24.3.tar.gz", hash = "sha256:91f9094f18e06fb74b98f4099cd22e8ae4396125e51719d50b30c9f1c7ab07e6"}, @@ -4474,6 +5051,8 @@ version = "4.9.0" description = "Pexpect allows easy control of interactive console applications." optional = true python-versions = "*" +groups = ["main"] +markers = "(extra == \"mani-skill\" or sys_platform == \"linux\") and (sys_platform != \"win32\" and sys_platform != \"emscripten\") and (python_version >= \"3.12\" or python_version <= \"3.11\") and (extra == \"stretch\" or extra == \"mani-skill\")" files = [ {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, @@ -4488,6 +5067,8 @@ version = "0.3.4" description = "Python port of the fzy fuzzy string matching algorithm" optional = false python-versions = ">=3.7,<4.0" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "pfzy-0.3.4-py3-none-any.whl", hash = "sha256:5f50d5b2b3207fa72e7ec0ef08372ef652685470974a107d0d4999fc5a903a96"}, {file = "pfzy-0.3.4.tar.gz", hash = "sha256:717ea765dd10b63618e7298b2d98efd819e0b30cd5905c9707223dceeb94b3f1"}, @@ -4502,6 +5083,8 @@ version = "10.4.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"}, {file = "pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d"}, @@ -4599,6 +5182,8 @@ version = "0.1.0" description = "respeaker series pixel ring library" optional = true python-versions = "*" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "pixel-ring-0.1.0.tar.gz", hash = "sha256:9480f23b58ccb912321b989d00e9d31f087f7bbcd8d970fca0fb319853d03270"}, {file = "pixel_ring-0.1.0-py2.py3-none-any.whl", hash = "sha256:c0fa51beb67be81b1f6ab058f651c489d69b47fb884d4361a0cf7594f093885b"}, @@ -4614,6 +5199,8 @@ version = "4.3.6" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, @@ -4630,6 +5217,8 @@ version = "5.24.1" description = "An open-source, interactive data visualization library for Python" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "plotly-5.24.1-py3-none-any.whl", hash = "sha256:f67073a1e637eb0dc3e46324d9d51e2fe76e9727c892dde64ddf1e1b51f29089"}, {file = "plotly-5.24.1.tar.gz", hash = "sha256:dbc8ac8339d248a4bcc36e08a5659bacfe1b079390b8953533f4eb22169b4bae"}, @@ -4645,6 +5234,8 @@ version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"test\"" files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, @@ -4660,6 +5251,8 @@ version = "4.0.1" description = "A framework for managing and maintaining multi-language pre-commit hooks." optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"dev\"" files = [ {file = "pre_commit-4.0.1-py2.py3-none-any.whl", hash = "sha256:efde913840816312445dc98787724647c65473daefe420785f885e8ed9a06878"}, {file = "pre_commit-4.0.1.tar.gz", hash = "sha256:80905ac375958c0444c65e9cebebd948b3cdb518f335a091a670a89d652139d2"}, @@ -4678,6 +5271,8 @@ version = "0.21.0" description = "Python client for the Prometheus monitoring system." optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "prometheus_client-0.21.0-py3-none-any.whl", hash = "sha256:4fa6b4dd0ac16d58bb587c04b1caae65b8c5043e85f778f42f5f632f6af2e166"}, {file = "prometheus_client-0.21.0.tar.gz", hash = "sha256:96c83c606b71ff2b0a433c98889d275f51ffec6c5e267de37c7a2b5c9aa9233e"}, @@ -4692,6 +5287,8 @@ version = "3.0.48" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.7.0" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "prompt_toolkit-3.0.48-py3-none-any.whl", hash = "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e"}, {file = "prompt_toolkit-3.0.48.tar.gz", hash = "sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90"}, @@ -4706,6 +5303,8 @@ version = "0.2.0" description = "Accelerated property cache" optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "propcache-0.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c5869b8fd70b81835a6f187c5fdbe67917a04d7e52b6e7cc4e5fe39d55c39d58"}, {file = "propcache-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:952e0d9d07609d9c5be361f33b0d6d650cd2bae393aabb11d9b719364521984b"}, @@ -4809,22 +5408,24 @@ files = [ [[package]] name = "protobuf" -version = "5.28.2" +version = "5.29.3" description = "" optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ - {file = "protobuf-5.28.2-cp310-abi3-win32.whl", hash = "sha256:eeea10f3dc0ac7e6b4933d32db20662902b4ab81bf28df12218aa389e9c2102d"}, - {file = "protobuf-5.28.2-cp310-abi3-win_amd64.whl", hash = "sha256:2c69461a7fcc8e24be697624c09a839976d82ae75062b11a0972e41fd2cd9132"}, - {file = "protobuf-5.28.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a8b9403fc70764b08d2f593ce44f1d2920c5077bf7d311fefec999f8c40f78b7"}, - {file = "protobuf-5.28.2-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:35cfcb15f213449af7ff6198d6eb5f739c37d7e4f1c09b5d0641babf2cc0c68f"}, - {file = "protobuf-5.28.2-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:5e8a95246d581eef20471b5d5ba010d55f66740942b95ba9b872d918c459452f"}, - {file = "protobuf-5.28.2-cp38-cp38-win32.whl", hash = "sha256:87317e9bcda04a32f2ee82089a204d3a2f0d3c8aeed16568c7daf4756e4f1fe0"}, - {file = "protobuf-5.28.2-cp38-cp38-win_amd64.whl", hash = "sha256:c0ea0123dac3399a2eeb1a1443d82b7afc9ff40241433296769f7da42d142ec3"}, - {file = "protobuf-5.28.2-cp39-cp39-win32.whl", hash = "sha256:ca53faf29896c526863366a52a8f4d88e69cd04ec9571ed6082fa117fac3ab36"}, - {file = "protobuf-5.28.2-cp39-cp39-win_amd64.whl", hash = "sha256:8ddc60bf374785fb7cb12510b267f59067fa10087325b8e1855b898a0d81d276"}, - {file = "protobuf-5.28.2-py3-none-any.whl", hash = "sha256:52235802093bd8a2811abbe8bf0ab9c5f54cca0a751fdd3f6ac2a21438bffece"}, - {file = "protobuf-5.28.2.tar.gz", hash = "sha256:59379674ff119717404f7454647913787034f03fe7049cbef1d74a97bb4593f0"}, + {file = "protobuf-5.29.3-cp310-abi3-win32.whl", hash = "sha256:3ea51771449e1035f26069c4c7fd51fba990d07bc55ba80701c78f886bf9c888"}, + {file = "protobuf-5.29.3-cp310-abi3-win_amd64.whl", hash = "sha256:a4fa6f80816a9a0678429e84973f2f98cbc218cca434abe8db2ad0bffc98503a"}, + {file = "protobuf-5.29.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a8434404bbf139aa9e1300dbf989667a83d42ddda9153d8ab76e0d5dcaca484e"}, + {file = "protobuf-5.29.3-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:daaf63f70f25e8689c072cfad4334ca0ac1d1e05a92fc15c54eb9cf23c3efd84"}, + {file = "protobuf-5.29.3-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:c027e08a08be10b67c06bf2370b99c811c466398c357e615ca88c91c07f0910f"}, + {file = "protobuf-5.29.3-cp38-cp38-win32.whl", hash = "sha256:84a57163a0ccef3f96e4b6a20516cedcf5bb3a95a657131c5c3ac62200d23252"}, + {file = "protobuf-5.29.3-cp38-cp38-win_amd64.whl", hash = "sha256:b89c115d877892a512f79a8114564fb435943b59067615894c3b13cd3e1fa107"}, + {file = "protobuf-5.29.3-cp39-cp39-win32.whl", hash = "sha256:0eb32bfa5219fc8d4111803e9a690658aa2e6366384fd0851064b963b6d1f2a7"}, + {file = "protobuf-5.29.3-cp39-cp39-win_amd64.whl", hash = "sha256:6ce8cc3389a20693bfde6c6562e03474c40851b44975c9b2bf6df7d8c4f864da"}, + {file = "protobuf-5.29.3-py3-none-any.whl", hash = "sha256:0a18ed4a24198528f2333802eb075e59dea9d679ab7a6c5efb017a59004d849f"}, + {file = "protobuf-5.29.3.tar.gz", hash = "sha256:5da0f41edaf117bde316404bad1a486cb4ededf8e4a54891296f648e8e076620"}, ] [[package]] @@ -4833,6 +5434,8 @@ version = "6.0.0" description = "Cross-platform lib for process and system monitoring in Python." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "psutil-6.0.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a021da3e881cd935e64a3d0a20983bda0bb4cf80e4f74fa9bfcb1bc5785360c6"}, {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:1287c2b95f1c0a364d23bc6f2ea2365a8d4d9b726a3be7294296ff7ba97c17f0"}, @@ -4862,6 +5465,8 @@ version = "0.7.0" description = "Run a subprocess in a pseudo terminal" optional = true python-versions = "*" +groups = ["main"] +markers = "(extra == \"mani-skill\" or sys_platform == \"linux\") and (sys_platform != \"win32\" and sys_platform != \"emscripten\") and (python_version >= \"3.12\" or python_version <= \"3.11\") and (extra == \"stretch\" or extra == \"mani-skill\")" files = [ {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, @@ -4873,6 +5478,8 @@ version = "0.2.3" description = "Safely evaluate AST nodes without side effects" optional = true python-versions = "*" +groups = ["main"] +markers = "(sys_platform == \"linux\" or extra == \"mani-skill\") and (python_version >= \"3.12\" or python_version <= \"3.11\") and (extra == \"stretch\" or extra == \"mani-skill\")" files = [ {file = "pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"}, {file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"}, @@ -4887,6 +5494,8 @@ version = "17.0.0" description = "Python library for Apache Arrow" optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "pyarrow-17.0.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:a5c8b238d47e48812ee577ee20c9a2779e6a5904f1708ae240f53ecbee7c9f07"}, {file = "pyarrow-17.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:db023dc4c6cae1015de9e198d41250688383c3f9af8f565370ab2b4cb5f62655"}, @@ -4938,6 +5547,8 @@ version = "0.2.14" description = "Cross-platform audio I/O with PortAudio" optional = true python-versions = "*" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "PyAudio-0.2.14-cp310-cp310-win32.whl", hash = "sha256:126065b5e82a1c03ba16e7c0404d8f54e17368836e7d2d92427358ad44fefe61"}, {file = "PyAudio-0.2.14-cp310-cp310-win_amd64.whl", hash = "sha256:2a166fc88d435a2779810dd2678354adc33499e9d4d7f937f28b20cc55893e83"}, @@ -4945,6 +5556,8 @@ files = [ {file = "PyAudio-0.2.14-cp311-cp311-win_amd64.whl", hash = "sha256:bbeb01d36a2f472ae5ee5e1451cacc42112986abe622f735bb870a5db77cf903"}, {file = "PyAudio-0.2.14-cp312-cp312-win32.whl", hash = "sha256:5fce4bcdd2e0e8c063d835dbe2860dac46437506af509353c7f8114d4bacbd5b"}, {file = "PyAudio-0.2.14-cp312-cp312-win_amd64.whl", hash = "sha256:12f2f1ba04e06ff95d80700a78967897a489c05e093e3bffa05a84ed9c0a7fa3"}, + {file = "PyAudio-0.2.14-cp313-cp313-win32.whl", hash = "sha256:95328285b4dab57ea8c52a4a996cb52be6d629353315be5bfda403d15932a497"}, + {file = "PyAudio-0.2.14-cp313-cp313-win_amd64.whl", hash = "sha256:692d8c1446f52ed2662120bcd9ddcb5aa2b71f38bda31e58b19fb4672fffba69"}, {file = "PyAudio-0.2.14-cp38-cp38-win32.whl", hash = "sha256:858caf35b05c26d8fc62f1efa2e8f53d5fa1a01164842bd622f70ddc41f55000"}, {file = "PyAudio-0.2.14-cp38-cp38-win_amd64.whl", hash = "sha256:2dac0d6d675fe7e181ba88f2de88d321059b69abd52e3f4934a8878e03a7a074"}, {file = "PyAudio-0.2.14-cp39-cp39-win32.whl", hash = "sha256:f745109634a7c19fa4d6b8b7d6967c3123d988c9ade0cd35d4295ee1acdb53e9"}, @@ -4961,6 +5574,8 @@ version = "13.1.0" description = "Pythonic bindings for FFmpeg's libraries." optional = false python-versions = ">=3.10" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "pyav-13.1.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:64a81022e60dfba7dee9767a6fd150f42293855ea127979b2f38a3fd86f908fd"}, {file = "pyav-13.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3971089334cc91e331c5014c8ea5fcbca0ccc82eb14952c128ce50570010a3cf"}, @@ -4996,6 +5611,8 @@ version = "0.8" description = "python library for reading and writing collada documents" optional = true python-versions = "*" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "pycollada-0.8.tar.gz", hash = "sha256:f3a3759cc4cec1d59e932aad74399dbcf541d18862aad903c770040da42af20e"}, ] @@ -5014,6 +5631,8 @@ version = "2.22" description = "C parser in Python" optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, @@ -5025,6 +5644,8 @@ version = "2.6.1" description = "Python Game Development" optional = true python-versions = ">=3.6" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"pusht\"" files = [ {file = "pygame-2.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9beeb647e555afb5657111fa83acb74b99ad88761108eaea66472e8b8547b55b"}, {file = "pygame-2.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:10e3d2a55f001f6c0a6eb44aa79ea7607091c9352b946692acedb2ac1482f1c9"}, @@ -5094,6 +5715,8 @@ version = "2.0.18" description = "pyglet is a cross-platform games and multimedia package." optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "pyglet-2.0.18-py3-none-any.whl", hash = "sha256:e592952ae0297e456c587b6486ed8c3e5f9d0c3519d517bb92dde5fdf4c26b41"}, {file = "pyglet-2.0.18.tar.gz", hash = "sha256:7cf9238d70082a2da282759679f8a011cc979753a32224a8ead8ed80e48f99dc"}, @@ -5105,6 +5728,8 @@ version = "2.18.0" description = "Pygments is a syntax highlighting package written in Python." optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "(sys_platform == \"linux\" or extra == \"mani-skill\") and (python_version >= \"3.12\" or python_version <= \"3.11\") and (extra == \"stretch\" or extra == \"mani-skill\")" files = [ {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, @@ -5119,6 +5744,8 @@ version = "6.8.1" description = "Pymunk is a easy-to-use pythonic 2D physics library" optional = false python-versions = ">=3.7" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "pymunk-6.8.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4203cb73ab1ecffbe6ff2c903542987828eec204acb012eba41592303a63a85c"}, {file = "pymunk-6.8.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aff5d00f05f78ab98f3cb699ba417db1eca1fe07ac88cb0f70a850d1f06d94bb"}, @@ -5192,6 +5819,8 @@ version = "1.7.7" description = "Monitor and control user input devices" optional = true python-versions = "*" +groups = ["main"] +markers = "(extra == \"dynamixel\" or extra == \"feetech\" or extra == \"stretch\") and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "pynput-1.7.7-py2.py3-none-any.whl", hash = "sha256:afc43f651684c98818de048abc76adf9f2d3d797083cb07c1f82be764a2d44cb"}, ] @@ -5203,12 +5832,33 @@ pyobjc-framework-Quartz = {version = ">=8.0", markers = "sys_platform == \"darwi python-xlib = {version = ">=0.17", markers = "sys_platform in \"linux\""} six = "*" +[[package]] +name = "pynvml" +version = "12.0.0" +description = "Python utilities for the NVIDIA Management Library" +optional = true +python-versions = ">=3.9" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"mani-skill\"" +files = [ + {file = "pynvml-12.0.0-py3-none-any.whl", hash = "sha256:fdff84b62a27dbe98e08e1a647eb77342bef1aebe0878bcd15e99a83fcbecb9e"}, + {file = "pynvml-12.0.0.tar.gz", hash = "sha256:299ce2451a6a17e6822d6faee750103e25b415f06f59abb8db65d30f794166f5"}, +] + +[package.dependencies] +nvidia-ml-py = ">=12.0.0,<13.0.0a0" + +[package.extras] +test = ["pytest (>=3.6)", "pytest-cov", "pytest-runner"] + [[package]] name = "pyobjc-core" version = "10.3.1" description = "Python<->ObjC Interoperability Module" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "(extra == \"dynamixel\" or extra == \"feetech\" or extra == \"stretch\") and sys_platform == \"darwin\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "pyobjc_core-10.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ea46d2cda17921e417085ac6286d43ae448113158afcf39e0abe484c58fb3d78"}, {file = "pyobjc_core-10.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:899d3c84d2933d292c808f385dc881a140cf08632907845043a333a9d7c899f9"}, @@ -5226,6 +5876,8 @@ version = "10.3.1" description = "Wrappers for the framework ApplicationServices on macOS" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "(extra == \"dynamixel\" or extra == \"feetech\" or extra == \"stretch\") and sys_platform == \"darwin\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "pyobjc_framework_ApplicationServices-10.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b694260d423c470cb90c3a7009cfde93e332ea6fb4b9b9526ad3acbd33460e3d"}, {file = "pyobjc_framework_ApplicationServices-10.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d886ba1f65df47b77ff7546f3fc9bc7d08cfb6b3c04433b719f6b0689a2c0d1f"}, @@ -5249,6 +5901,8 @@ version = "10.3.1" description = "Wrappers for the Cocoa frameworks on macOS" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "(extra == \"dynamixel\" or extra == \"feetech\" or extra == \"stretch\") and sys_platform == \"darwin\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "pyobjc_framework_Cocoa-10.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4cb4f8491ab4d9b59f5187e42383f819f7a46306a4fa25b84f126776305291d1"}, {file = "pyobjc_framework_Cocoa-10.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5f31021f4f8fdf873b57a97ee1f3c1620dbe285e0b4eaed73dd0005eb72fd773"}, @@ -5269,6 +5923,8 @@ version = "10.3.1" description = "Wrappers for the framework CoreText on macOS" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "(extra == \"dynamixel\" or extra == \"feetech\" or extra == \"stretch\") and sys_platform == \"darwin\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "pyobjc_framework_CoreText-10.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:dd6123cfccc38e32be884d1a13fb62bd636ecb192b9e8ae2b8011c977dec229e"}, {file = "pyobjc_framework_CoreText-10.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:834142a14235bd80edaef8d3a28d1e203ed3c988810a9b78005df7c561390288"}, @@ -5291,6 +5947,8 @@ version = "10.3.1" description = "Wrappers for the Quartz frameworks on macOS" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "(extra == \"dynamixel\" or extra == \"feetech\" or extra == \"stretch\") and sys_platform == \"darwin\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "pyobjc_framework_Quartz-10.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5ef4fd315ed2bc42ef77fdeb2bae28a88ec986bd7b8079a87ba3b3475348f96e"}, {file = "pyobjc_framework_Quartz-10.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:96578d4a3e70164efe44ad7dc320ecd4e211758ffcde5dcd694de1bbdfe090a4"}, @@ -5312,6 +5970,8 @@ version = "3.1.7" description = "Standard OpenGL bindings for Python" optional = true python-versions = "*" +groups = ["main"] +markers = "(extra == \"xarm\" or extra == \"aloha\" or sys_platform == \"linux\") and (extra == \"xarm\" or extra == \"aloha\" or extra == \"stretch\") and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "PyOpenGL-3.1.7-py3-none-any.whl", hash = "sha256:a6ab19cf290df6101aaf7470843a9c46207789855746399d0af92521a0a92b7a"}, {file = "PyOpenGL-3.1.7.tar.gz", hash = "sha256:eef31a3888e6984fd4d8e6c9961b184c9813ca82604d37fe3da80eb000a76c86"}, @@ -5323,6 +5983,8 @@ version = "3.1.4" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = true python-versions = ">=3.6.8" +groups = ["main"] +markers = "(sys_platform == \"linux\" or extra == \"mani-skill\" or extra == \"aloha\") and (python_version >= \"3.12\" or python_version <= \"3.11\") and (extra == \"stretch\" or extra == \"mani-skill\" or extra == \"aloha\")" files = [ {file = "pyparsing-3.1.4-py3-none-any.whl", hash = "sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c"}, {file = "pyparsing-3.1.4.tar.gz", hash = "sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032"}, @@ -5331,12 +5993,26 @@ files = [ [package.extras] diagrams = ["jinja2", "railroad-diagrams"] +[[package]] +name = "pyperclip" +version = "1.9.0" +description = "A cross-platform clipboard module for Python. (Only handles plain text for now.)" +optional = true +python-versions = "*" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"mani-skill\"" +files = [ + {file = "pyperclip-1.9.0.tar.gz", hash = "sha256:b7de0142ddc81bfc5c7507eea19da920b92252b548b96186caf94a5e2527d310"}, +] + [[package]] name = "pyrealsense2" version = "2.55.1.6486" description = "Python Wrapper for Intel Realsense SDK 2.0." optional = true python-versions = "*" +groups = ["main"] +markers = "(extra == \"intelrealsense\" or extra == \"stretch\") and sys_platform != \"darwin\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "pyrealsense2-2.55.1.6486-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:882613808289c602b23f2e19bf1fbadd63fb3af9be9c2997cc4ea74741a65136"}, {file = "pyrealsense2-2.55.1.6486-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:686320811ef30c162c7240cb619e9b152420c0a32337a137139276c87f213336"}, @@ -5360,6 +6036,8 @@ version = "0.1.45" description = "Easy-to-use Python renderer for 3D visualization" optional = true python-versions = "*" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [] develop = false @@ -5391,6 +6069,8 @@ version = "0.1.46" description = "Easy-to-use Python renderer for 3D visualization" optional = true python-versions = "*" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "pyribbit-0.1.46-py3-none-any.whl", hash = "sha256:0d4943f7cc6903f20ef42787e9357d7bb25c95f2c04da9dfa1a8021bdf9e0ab6"}, {file = "pyribbit-0.1.46.tar.gz", hash = "sha256:3bb7a31841549ed74c50e31415738d2494b720df825cf387501f17102299940b"}, @@ -5418,6 +6098,8 @@ version = "3.5" description = "Python Serial Port Extension" optional = true python-versions = "*" +groups = ["main"] +markers = "(sys_platform == \"linux\" or extra == \"dynamixel\" or extra == \"feetech\" or extra == \"test\") and (python_version >= \"3.12\" or python_version <= \"3.11\") and (extra == \"stretch\" or extra == \"dynamixel\" or extra == \"feetech\" or extra == \"test\")" files = [ {file = "pyserial-3.5-py2.py3-none-any.whl", hash = "sha256:c4451db6ba391ca6ca299fb3ec7bae67a5c55dde170964c7a14ceefec02f2cf0"}, {file = "pyserial-3.5.tar.gz", hash = "sha256:3c77e014170dfffbd816e6ffc205e9842efb10be9f58ec16d3e8675b4925cddb"}, @@ -5432,6 +6114,8 @@ version = "1.7.1" description = "A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information." optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "PySocks-1.7.1-py27-none-any.whl", hash = "sha256:08e69f092cc6dbe92a0fdd16eeb9b9ffbc13cadfe5ca4c7bd92ffb078b293299"}, {file = "PySocks-1.7.1-py3-none-any.whl", hash = "sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5"}, @@ -5444,6 +6128,8 @@ version = "8.3.3" description = "pytest: simple powerful testing with Python" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"test\"" files = [ {file = "pytest-8.3.3-py3-none-any.whl", hash = "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2"}, {file = "pytest-8.3.3.tar.gz", hash = "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181"}, @@ -5466,6 +6152,8 @@ version = "5.0.0" description = "Pytest plugin for measuring coverage." optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"test\"" files = [ {file = "pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857"}, {file = "pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652"}, @@ -5484,6 +6172,8 @@ version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, @@ -5498,6 +6188,8 @@ version = "2.0.7" description = "A python library adding a json log formatter" optional = true python-versions = ">=3.6" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "python-json-logger-2.0.7.tar.gz", hash = "sha256:23e7ec02d34237c5aa1e29a070193a4ea87583bb4e7f8fd06d3de8264c4b2e1c"}, {file = "python_json_logger-2.0.7-py3-none-any.whl", hash = "sha256:f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd"}, @@ -5509,6 +6201,8 @@ version = "3.9.0" description = "Python Utils is a module with some convenient utilities not included with the standard Python install" optional = true python-versions = ">3.9.0" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "python_utils-3.9.0-py2.py3-none-any.whl", hash = "sha256:a7719a5ef4bae7360d2a15c13b08c4e3c3e39b9df19bd16f119ff8d0cfeaafb7"}, {file = "python_utils-3.9.0.tar.gz", hash = "sha256:3689556884e3ae53aec5a4c9f17b36e752a3e93a7ba2768c6553fc4dd6fa70ef"}, @@ -5528,6 +6222,8 @@ version = "0.33" description = "Python X Library" optional = true python-versions = "*" +groups = ["main"] +markers = "(extra == \"dynamixel\" or extra == \"feetech\" or extra == \"stretch\") and sys_platform in \"linux\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "python-xlib-0.33.tar.gz", hash = "sha256:55af7906a2c75ce6cb280a584776080602444f75815a7aff4d287bb2d7018b32"}, {file = "python_xlib-0.33-py2.py3-none-any.whl", hash = "sha256:c3534038d42e0df2f1392a1b30a15a4ff5fdc2b86cfa94f072bf11b10a164398"}, @@ -5536,12 +6232,60 @@ files = [ [package.dependencies] six = ">=1.10.0" +[[package]] +name = "pytorch-kinematics" +version = "0.7.4" +description = "Robot kinematics implemented in pytorch" +optional = true +python-versions = ">=3.6" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"mani-skill\"" +files = [ + {file = "pytorch_kinematics-0.7.4-py3-none-any.whl", hash = "sha256:753fb81091d0692d763fef960305f6a0d5a343ec714da8d630f8479ab04f47aa"}, + {file = "pytorch_kinematics-0.7.4.tar.gz", hash = "sha256:34d45b51c1ead384b0a420a49d5bb92c2d838aa9a76cfc239369485bdcd65bd1"}, +] + +[package.dependencies] +absl-py = "*" +arm-pytorch-utilities = "*" +lxml = "*" +matplotlib = "*" +numpy = "<2" +pytorch-seed = "*" +pyyaml = "*" +torch = "*" + +[package.extras] +test = ["pybullet", "pytest"] + +[[package]] +name = "pytorch-seed" +version = "0.2.0" +description = "RNG seeding and context management for pytorch" +optional = true +python-versions = ">=3.6" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"mani-skill\"" +files = [ + {file = "pytorch_seed-0.2.0-py3-none-any.whl", hash = "sha256:50a1ee2f62e55f88c20069849aa12265a007aeaea6893f3d23ad4e40173c5c89"}, + {file = "pytorch_seed-0.2.0.tar.gz", hash = "sha256:096edd3404f8a00f3df2bab41024945806baf1f64b05678c82373b780458e1a3"}, +] + +[package.dependencies] +numpy = "*" +torch = "*" + +[package.extras] +test = ["pytest"] + [[package]] name = "pytz" version = "2024.2" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725"}, {file = "pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a"}, @@ -5553,6 +6297,8 @@ version = "1.2.1" description = "Python USB access module" optional = true python-versions = ">=3.6.0" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "pyusb-1.2.1-py3-none-any.whl", hash = "sha256:2b4c7cb86dbadf044dfb9d3a4ff69fd217013dbe78a792177a3feb172449ea36"}, {file = "pyusb-1.2.1.tar.gz", hash = "sha256:a4cc7404a203144754164b8b40994e2849fde1cfff06b08492f12fff9d9de7b9"}, @@ -5564,6 +6310,8 @@ version = "2.0.13" description = "Pseudo terminal support for Windows from Python." optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and os_name == \"nt\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "pywinpty-2.0.13-cp310-none-win_amd64.whl", hash = "sha256:697bff211fb5a6508fee2dc6ff174ce03f34a9a233df9d8b5fe9c8ce4d5eaf56"}, {file = "pywinpty-2.0.13-cp311-none-win_amd64.whl", hash = "sha256:b96fb14698db1284db84ca38c79f15b4cfdc3172065b5137383910567591fa99"}, @@ -5579,6 +6327,8 @@ version = "6.0.2" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, @@ -5641,6 +6391,8 @@ version = "26.2.0" description = "Python bindings for 0MQ" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "pyzmq-26.2.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:ddf33d97d2f52d89f6e6e7ae66ee35a4d9ca6f36eda89c24591b0c40205a3629"}, {file = "pyzmq-26.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dacd995031a01d16eec825bf30802fceb2c3791ef24bcce48fa98ce40918c27b"}, @@ -5762,6 +6514,8 @@ version = "0.35.1" description = "JSON Referencing + Python" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "referencing-0.35.1-py3-none-any.whl", hash = "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de"}, {file = "referencing-0.35.1.tar.gz", hash = "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c"}, @@ -5777,6 +6531,8 @@ version = "2024.9.11" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "regex-2024.9.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1494fa8725c285a81d01dc8c06b55287a1ee5e0e382d8413adc0a9197aac6408"}, {file = "regex-2024.9.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0e12c481ad92d129c78f13a2a3662317e46ee7ef96c94fd332e1c29131875b7d"}, @@ -5880,6 +6636,8 @@ version = "2022.1.5" description = "Wrapper package for OpenCV with Inference Engine python bindings, but compiled under another namespace to prevent conflicts with the default OpenCV python packages" optional = true python-versions = "*" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "renamed_opencv_python_inference_engine-2022.1.5-py3-none-manylinux1_x86_64.whl", hash = "sha256:c92666acfd75f8b29b9f1aa566d4ad3851387fcea3992f113f72adf449477523"}, ] @@ -5893,6 +6651,8 @@ version = "2.32.3" description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, @@ -5915,6 +6675,8 @@ version = "0.18.2" description = "The Rerun Logging SDK" optional = false python-versions = "<3.13,>=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "rerun_sdk-0.18.2-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bc4e73275f428e4e9feb8e85f88db7a9fd18b997b1570de62f949a926978f1b2"}, {file = "rerun_sdk-0.18.2-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:efbba40a59710ae83607cb0dc140398a35979c2d2acf5190c9def2ac4697f6a8"}, @@ -5940,6 +6702,8 @@ version = "0.1.4" description = "A pure python RFC3339 validator" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa"}, {file = "rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b"}, @@ -5954,6 +6718,8 @@ version = "0.1.1" description = "Pure python rfc3986 validator" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9"}, {file = "rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055"}, @@ -5965,6 +6731,8 @@ version = "13.9.2" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = true python-versions = ">=3.8.0" +groups = ["main"] +markers = "(sys_platform == \"linux\" or extra == \"mani-skill\") and (python_version >= \"3.12\" or python_version <= \"3.11\") and (extra == \"stretch\" or extra == \"mani-skill\")" files = [ {file = "rich-13.9.2-py3-none-any.whl", hash = "sha256:8c82a3d3f8dcfe9e734771313e606b39d8247bb6b826e196f4914b333b743cf1"}, {file = "rich-13.9.2.tar.gz", hash = "sha256:51a2c62057461aaf7152b4d611168f93a9fc73068f8ded2790f29fe2b5366d0c"}, @@ -5984,6 +6752,8 @@ version = "0.20.0" description = "Python bindings to Rust's persistent data structures (rpds)" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "rpds_py-0.20.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3ad0fda1635f8439cde85c700f964b23ed5fc2d28016b32b9ee5fe30da5c84e2"}, {file = "rpds_py-0.20.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9bb4a0d90fdb03437c109a17eade42dfbf6190408f29b2744114d11586611d6f"}, @@ -6096,6 +6866,8 @@ version = "0.9.5" description = "Simple and lightweight module for working with RPLidar laser scanners" optional = true python-versions = "*" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "rplidar-roboticia-0.9.5.tar.gz", hash = "sha256:709e9143f7701d69e8439231b065e676f7d5a6086cd2922113b055bedf99f0e3"}, ] @@ -6109,6 +6881,8 @@ version = "0.4.5" description = "" optional = false python-versions = ">=3.7" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "safetensors-0.4.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a63eaccd22243c67e4f2b1c3e258b257effc4acd78f3b9d397edc8cf8f1298a7"}, {file = "safetensors-0.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:23fc9b4ec7b602915cbb4ec1a7c1ad96d2743c322f20ab709e2c35d1b66dad27"}, @@ -6235,12 +7009,44 @@ tensorflow = ["safetensors[numpy]", "tensorflow (>=2.11.0)"] testing = ["h5py (>=3.7.0)", "huggingface-hub (>=0.12.1)", "hypothesis (>=6.70.2)", "pytest (>=7.2.0)", "pytest-benchmark (>=4.0.0)", "safetensors[numpy]", "setuptools-rust (>=1.5.2)"] torch = ["safetensors[numpy]", "torch (>=1.10)"] +[[package]] +name = "sapien" +version = "3.0.0b1" +description = "['SAPIEN: A SimulAted Parted based Interactive ENvironment']" +optional = true +python-versions = ">=3.7" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"mani-skill\"" +files = [ + {file = "sapien-3.0.0b1-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:9763215d52374e48db16d8c2e89fb385a5625690c0c88cf2c636c1abe99aef6c"}, + {file = "sapien-3.0.0b1-cp310-cp310-win_amd64.whl", hash = "sha256:b050bf7c7cbd2d825e0a62a40262de474596bc1df653f8e1aa9fd99aaec42962"}, + {file = "sapien-3.0.0b1-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:d9497375c9dc26f07b82ba08f347f7ff5df063c057d2744aec0521568ffeb096"}, + {file = "sapien-3.0.0b1-cp311-cp311-win_amd64.whl", hash = "sha256:6357d3cf6c062cf9a5799252887c37dd29100ecbe8d052566da77b7c4d25d486"}, + {file = "sapien-3.0.0b1-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:a064c4e3e33140c38464163155942bd710923cc3f9365f78c6ac5d58a97433a1"}, + {file = "sapien-3.0.0b1-cp312-cp312-win_amd64.whl", hash = "sha256:293ec283ef3f790f13569cff9b54fda92e278bae943e214b7dad4f0579c6bd84"}, + {file = "sapien-3.0.0b1-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:64bcab386cac14b827356c7d8f77986142e8142d903d6625c1c4a06fd915a550"}, + {file = "sapien-3.0.0b1-cp38-cp38-win_amd64.whl", hash = "sha256:0f8101a10e6db3a4ca8bf54c197ff5eefcd5e5aa7e74e5f9948c3e379a197702"}, + {file = "sapien-3.0.0b1-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:c77f7a5877dde8edc40bb9faaf5ff9420f064e04bb899b73600cd910d762c18d"}, + {file = "sapien-3.0.0b1-cp39-cp39-win_amd64.whl", hash = "sha256:28f858831c11c6f9f5c80f873c9de1ff23bd7c14f6477bbf82dbba3b77a4da26"}, +] + +[package.dependencies] +lxml = "*" +networkx = "*" +numpy = ">=1.17" +opencv-python = ">=4.0" +pyperclip = "*" +requests = ">=2.22" +transforms3d = ">=0.3" + [[package]] name = "scikit-image" version = "0.24.0" description = "Image processing in Python" optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "(extra == \"pusht\" or extra == \"video-benchmark\" or sys_platform == \"linux\") and (extra == \"pusht\" or extra == \"video-benchmark\" or extra == \"stretch\") and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "scikit_image-0.24.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cb3bc0264b6ab30b43c4179ee6156bc18b4861e78bb329dd8d16537b7bbf827a"}, {file = "scikit_image-0.24.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:9c7a52e20cdd760738da38564ba1fed7942b623c0317489af1a598a8dedf088b"}, @@ -6289,6 +7095,8 @@ version = "1.14.1" description = "Fundamental algorithms for scientific computing in Python" optional = true python-versions = ">=3.10" +groups = ["main"] +markers = "(extra == \"pusht\" or extra == \"video-benchmark\" or sys_platform == \"linux\" or extra == \"aloha\" or extra == \"mani-skill\") and (python_version >= \"3.12\" or python_version <= \"3.11\") and (extra == \"pusht\" or extra == \"video-benchmark\" or extra == \"stretch\" or extra == \"aloha\" or extra == \"mani-skill\")" files = [ {file = "scipy-1.14.1-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:b28d2ca4add7ac16ae8bb6632a3c86e4b9e4d52d3e34267f6e1b0c1f8d87e389"}, {file = "scipy-1.14.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:d0d2821003174de06b69e58cef2316a6622b60ee613121199cb2852a873f8cf3"}, @@ -6339,6 +7147,8 @@ version = "1.8.3" description = "Send file to trash natively under Mac OS X, Windows and Linux" optional = true python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "Send2Trash-1.8.3-py3-none-any.whl", hash = "sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9"}, {file = "Send2Trash-1.8.3.tar.gz", hash = "sha256:b18e7a3966d99871aefeb00cfbcfdced55ce4871194810fc71f4aa484b953abf"}, @@ -6355,6 +7165,8 @@ version = "2.16.0" description = "Python client for Sentry (https://sentry.io)" optional = false python-versions = ">=3.6" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "sentry_sdk-2.16.0-py2.py3-none-any.whl", hash = "sha256:49139c31ebcd398f4f6396b18910610a0c1602f6e67083240c33019d1f6aa30c"}, {file = "sentry_sdk-2.16.0.tar.gz", hash = "sha256:90f733b32e15dfc1999e6b7aca67a38688a567329de4d6e184154a73f96c6892"}, @@ -6407,6 +7219,8 @@ version = "1.3.3" description = "A Python module to customize the process title" optional = false python-versions = ">=3.7" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "setproctitle-1.3.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:897a73208da48db41e687225f355ce993167079eda1260ba5e13c4e53be7f754"}, {file = "setproctitle-1.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8c331e91a14ba4076f88c29c777ad6b58639530ed5b24b5564b5ed2fd7a95452"}, @@ -6507,6 +7321,8 @@ version = "75.1.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "setuptools-75.1.0-py3-none-any.whl", hash = "sha256:35ab7fd3bcd95e6b7fd704e4a1539513edad446c097797f2985e0e4b960772f2"}, {file = "setuptools-75.1.0.tar.gz", hash = "sha256:d59a21b17a275fb872a9c3dae73963160ae079f1049ed956880cd7c09b120538"}, @@ -6527,6 +7343,8 @@ version = "2.1.0" description = "Python subprocess replacement" optional = true python-versions = "<4.0,>=3.8.1" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "sh-2.1.0-py3-none-any.whl", hash = "sha256:bf5e44178dd96a542126c2774e9b7ab1d89bfe0e2ef84d92e6d0ed7358d63d01"}, {file = "sh-2.1.0.tar.gz", hash = "sha256:7e27301c574bec8ca5bf6f211851357526455ee97cd27a7c4c6cc5e2375399cb"}, @@ -6538,6 +7356,8 @@ version = "2.0.6" description = "Manipulation and analysis of geometric objects" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"pusht\"" files = [ {file = "shapely-2.0.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29a34e068da2d321e926b5073539fd2a1d4429a2c656bd63f0bd4c8f5b236d0b"}, {file = "shapely-2.0.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c84c3f53144febf6af909d6b581bc05e8785d57e27f35ebaa5c1ab9baba13b"}, @@ -6590,12 +7410,30 @@ numpy = ">=1.14,<3" docs = ["matplotlib", "numpydoc (==1.1.*)", "sphinx", "sphinx-book-theme", "sphinx-remove-toctrees"] test = ["pytest", "pytest-cov"] +[[package]] +name = "shtab" +version = "1.7.1" +description = "Automagic shell tab completion for Python CLI applications" +optional = true +python-versions = ">=3.7" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"mani-skill\"" +files = [ + {file = "shtab-1.7.1-py3-none-any.whl", hash = "sha256:32d3d2ff9022d4c77a62492b6ec875527883891e33c6b479ba4d41a51e259983"}, + {file = "shtab-1.7.1.tar.gz", hash = "sha256:4e4bcb02eeb82ec45920a5d0add92eac9c9b63b2804c9196c1f1fdc2d039243c"}, +] + +[package.extras] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout"] + [[package]] name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, @@ -6607,6 +7445,8 @@ version = "5.0.1" description = "A pure Python implementation of a sliding window memory map manager" optional = false python-versions = ">=3.7" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"}, {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"}, @@ -6618,6 +7458,8 @@ version = "2.2.0" description = "A web-based viewer for Python profiler output" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "snakeviz-2.2.0-py2.py3-none-any.whl", hash = "sha256:569e2d71c47f80a886aa6e70d6405cb6d30aa3520969ad956b06f824c5f02b8e"}, {file = "snakeviz-2.2.0.tar.gz", hash = "sha256:7bfd00be7ae147eb4a170a471578e1cd3f41f803238958b6b8efcf2c698a6aa9"}, @@ -6632,6 +7474,8 @@ version = "1.3.1" description = "Sniff out which async library your code is running under" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, @@ -6643,6 +7487,8 @@ version = "2.6" description = "A modern CSS selector implementation for Beautiful Soup." optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9"}, {file = "soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb"}, @@ -6654,6 +7500,8 @@ version = "3.10.4" description = "Library for performing speech recognition, with support for several engines and APIs, online and offline." optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "SpeechRecognition-3.10.4-py2.py3-none-any.whl", hash = "sha256:723b8155692a8ed11a30013f15f89a3e57c5dc8bc73c8cb024bf9bd14c21fba5"}, {file = "speechrecognition-3.10.4.tar.gz", hash = "sha256:986bafcf61f14625c2f3cea6a471838edd379ed68aeed7b8f3c0fb41e21f1125"}, @@ -6674,6 +7522,8 @@ version = "3.6" description = "Python bindings for Linux SPI access through spidev" optional = true python-versions = "*" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "spidev-3.6-cp39-cp39-linux_armv7l.whl", hash = "sha256:280abc00a1ef7780ef62c3f294f52a2527b6c47d8c269fea98664970bcaf6da5"}, {file = "spidev-3.6.tar.gz", hash = "sha256:14dbc37594a4aaef85403ab617985d3c3ef464d62bc9b769ef552db53701115b"}, @@ -6685,6 +7535,8 @@ version = "0.6.3" description = "Extract data from python stack frames and tracebacks for informative displays" optional = true python-versions = "*" +groups = ["main"] +markers = "(sys_platform == \"linux\" or extra == \"mani-skill\") and (python_version >= \"3.12\" or python_version <= \"3.11\") and (extra == \"stretch\" or extra == \"mani-skill\")" files = [ {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, @@ -6704,6 +7556,8 @@ version = "1.13.3" description = "Computer algebra system (CAS) in Python" optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "sympy-1.13.3-py3-none-any.whl", hash = "sha256:54612cf55a62755ee71824ce692986f23c88ffa77207b30c1368eda4a7060f73"}, {file = "sympy-1.13.3.tar.gz", hash = "sha256:b27fd2c6530e0ab39e275fc9b683895367e51d5da91baa8d3d64db2565fec4d9"}, @@ -6721,6 +7575,8 @@ version = "0.9.0" description = "Pretty-print tabular data" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "(sys_platform == \"linux\" or extra == \"mani-skill\") and (python_version >= \"3.12\" or python_version <= \"3.11\") and (extra == \"stretch\" or extra == \"mani-skill\")" files = [ {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, @@ -6735,6 +7591,8 @@ version = "9.0.0" description = "Retry code until it succeeds" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "tenacity-9.0.0-py3-none-any.whl", hash = "sha256:93de0c98785b27fcf659856aa9f54bfbd399e29969b0621bc7f762bd441b4539"}, {file = "tenacity-9.0.0.tar.gz", hash = "sha256:807f37ca97d62aa361264d497b0e31e92b8027044942bfa756160d908320d73b"}, @@ -6750,6 +7608,8 @@ version = "2.5.0" description = "ANSI color formatting for output in terminal" optional = false python-versions = ">=3.9" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "termcolor-2.5.0-py3-none-any.whl", hash = "sha256:37b17b5fc1e604945c2642c872a3764b5d547a48009871aea3edd3afa180afb8"}, {file = "termcolor-2.5.0.tar.gz", hash = "sha256:998d8d27da6d48442e8e1f016119076b690d962507531df4890fcd2db2ef8a6f"}, @@ -6764,6 +7624,8 @@ version = "0.18.1" description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0"}, {file = "terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e"}, @@ -6785,6 +7647,8 @@ version = "2024.9.20" description = "Read and write TIFF files" optional = true python-versions = ">=3.10" +groups = ["main"] +markers = "(extra == \"pusht\" or extra == \"video-benchmark\" or sys_platform == \"linux\") and (extra == \"pusht\" or extra == \"video-benchmark\" or extra == \"stretch\") and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "tifffile-2024.9.20-py3-none-any.whl", hash = "sha256:c54dc85bc1065d972cb8a6ffb3181389d597876aa80177933459733e4ed243dd"}, {file = "tifffile-2024.9.20.tar.gz", hash = "sha256:3fbf3be2f995a7051a8ae05a4be70c96fc0789f22ed6f1c4104c973cf68a640b"}, @@ -6807,6 +7671,8 @@ version = "1.3.0" description = "A tiny CSS parser" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "tinycss2-1.3.0-py3-none-any.whl", hash = "sha256:54a8dbdffb334d536851be0226030e9505965bb2f30f21a4a82c55fb2a80fae7"}, {file = "tinycss2-1.3.0.tar.gz", hash = "sha256:152f9acabd296a8375fbca5b84c961ff95971fcfc32e79550c8df8e29118c54d"}, @@ -6825,6 +7691,8 @@ version = "0.21.0" description = "" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"hilserl\"" files = [ {file = "tokenizers-0.21.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:3c4c93eae637e7d2aaae3d376f06085164e1660f89304c0ab2b1d08a406636b2"}, {file = "tokenizers-0.21.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:f53ea537c925422a2e0e92a24cce96f6bc5046bbef24a1652a5edc8ba975f62e"}, @@ -6857,17 +7725,53 @@ version = "2.0.2" description = "A lil' TOML parser" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "python_version < \"3.11\" and (extra == \"test\" or sys_platform == \"linux\") and (extra == \"test\" or extra == \"stretch\")" files = [ {file = "tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38"}, {file = "tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"}, ] +[[package]] +name = "toppra" +version = "0.6.0" +description = "toppra: time-optimal parametrization of trajectories for robots subject to constraints." +optional = true +python-versions = "*" +groups = ["main"] +markers = "extra == \"mani-skill\" and platform_system == \"Linux\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" +files = [ + {file = "toppra-0.6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fdb86ff990b9043649de7421225702be336905631ac63705b346f80474202068"}, + {file = "toppra-0.6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:251acba452e4093e5552048f1a7abd8b77033281889e15420ef7058cd8dc139b"}, + {file = "toppra-0.6.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9ebad7f1323d48e971c7c58dda97cb06b2aa97e1b102d4074a6877995c7a4e51"}, + {file = "toppra-0.6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8f86b6b9d4f6205a6adb38849a3e81e4de8e4c30a8e60c37c3f7fd4daea6e7e9"}, + {file = "toppra-0.6.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fec5a4b8fdbd3b0017425d85c989a4457905c963368f127cefe7a4287c5a9dd4"}, + {file = "toppra-0.6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:73ac5b0e6d7aa58a59c339afe547adc769964dfceb6b5aa18b3ba958fd1bb01e"}, + {file = "toppra-0.6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7aaae509d3dd99b9d3487109a418563988ef422e8cd2027043b9f2d76fea3816"}, + {file = "toppra-0.6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:429e4f40a7676e6ed07b3703ebc14cc0866a8d437c84e6fac77dbfa490a5f484"}, + {file = "toppra-0.6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:af412ecdeaf6e4cf29fb89d296b3fe5351e61190cb5d9101720bf2dab1387581"}, + {file = "toppra-0.6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c50713044c7b76e215311100d9a8895940dfb22b779057d83d8710ce940622a9"}, + {file = "toppra-0.6.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:02683c04ea64326045ff6ac01a19ab0e9113d7fc22ef98bd60fb6c4ba3666c76"}, + {file = "toppra-0.6.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1280ad9988bb224574b36b3af62db14b7d023685f574ea37a9c8a3039e973923"}, + {file = "toppra-0.6.0.tar.gz", hash = "sha256:7822e802c809ba3bc3525857985c9fd1577d49a95a5531baabb739aa3d7fc5c4"}, +] + +[package.dependencies] +matplotlib = "*" +numpy = "*" +scipy = ">0.18" + +[package.extras] +dev = ["PyYAML (<=5.3.1)", "cvxopt", "cvxpy", "cython", "invoke", "ipdb", "ipython", "msgpack (<=1.0.1)", "mypy", "numpy", "pandas", "pylint", "pytest", "strip-hints", "tabulate"] + [[package]] name = "torch" version = "2.4.1" description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" optional = false python-versions = ">=3.8.0" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "torch-2.4.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:362f82e23a4cd46341daabb76fba08f04cd646df9bfaf5da50af97cb60ca4971"}, {file = "torch-2.4.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:e8ac1985c3ff0f60d85b991954cfc2cc25f79c84545aead422763148ed2759e3"}, @@ -6922,6 +7826,8 @@ version = "1.6.0" description = "PyTorch native Metrics" optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"hilserl\"" files = [ {file = "torchmetrics-1.6.0-py3-none-any.whl", hash = "sha256:a508cdd87766cedaaf55a419812bf9f493aff8fffc02cc19df5a8e2e7ccb942a"}, {file = "torchmetrics-1.6.0.tar.gz", hash = "sha256:aebba248708fb90def20cccba6f55bddd134a58de43fb22b0c5ca0f3a89fa984"}, @@ -6950,6 +7856,8 @@ version = "0.19.1" description = "image and video datasets and models for torch deep learning" optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "torchvision-0.19.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:54e8513099e6f586356c70f809d34f391af71ad182fe071cc328a28af2c40608"}, {file = "torchvision-0.19.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:20a1f5e02bfdad7714e55fa3fa698347c11d829fa65e11e5a84df07d93350eed"}, @@ -6988,6 +7896,8 @@ version = "6.4.1" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8"}, {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14"}, @@ -7008,6 +7918,8 @@ version = "4.66.5" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "tqdm-4.66.5-py3-none-any.whl", hash = "sha256:90279a3770753eafc9194a0364852159802111925aa30eb3f9d85b0e805ac7cd"}, {file = "tqdm-4.66.5.tar.gz", hash = "sha256:e1020aef2e5096702d8a025ac7d16b1577279c9d63f8375b63083e9a5f0fcbad"}, @@ -7028,6 +7940,8 @@ version = "5.14.3" description = "Traitlets Python configuration system" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "(sys_platform == \"linux\" or extra == \"mani-skill\") and (python_version >= \"3.12\" or python_version <= \"3.11\") and (extra == \"stretch\" or extra == \"mani-skill\")" files = [ {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, @@ -7043,6 +7957,8 @@ version = "4.47.0" description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow" optional = true python-versions = ">=3.9.0" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"hilserl\"" files = [ {file = "transformers-4.47.0-py3-none-any.whl", hash = "sha256:a8e1bafdaae69abdda3cad638fe392e37c86d2ce0ecfcae11d60abb8f949ff4d"}, {file = "transformers-4.47.0.tar.gz", hash = "sha256:f8ead7a5a4f6937bb507e66508e5e002dc5930f7b6122a9259c37b099d0f3b19"}, @@ -7112,6 +8028,8 @@ version = "0.4.2" description = "Functions for 3D coordinate transformations" optional = true python-versions = ">=3.6" +groups = ["main"] +markers = "(sys_platform == \"linux\" or extra == \"mani-skill\") and (python_version >= \"3.12\" or python_version <= \"3.11\") and (extra == \"stretch\" or extra == \"mani-skill\")" files = [ {file = "transforms3d-0.4.2-py3-none-any.whl", hash = "sha256:1c70399d9e9473ecc23311fd947f727f7c69ed0b063244828c383aa1aefa5941"}, {file = "transforms3d-0.4.2.tar.gz", hash = "sha256:e8b5df30eaedbee556e81c6938e55aab5365894e47d0a17615d7db7fd2393680"}, @@ -7126,6 +8044,8 @@ version = "4.4.7" description = "Import, export, process, analyze and view triangular meshes." optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "(sys_platform == \"linux\" or extra == \"mani-skill\") and (python_version >= \"3.12\" or python_version <= \"3.11\") and (extra == \"stretch\" or extra == \"mani-skill\")" files = [ {file = "trimesh-4.4.7-py3-none-any.whl", hash = "sha256:6df98f3f5b971945b416f567b7ff6ee0c51b70f01b80a16a990fdcceb8dbd114"}, {file = "trimesh-4.4.7.tar.gz", hash = "sha256:e6619c70c99006d41f175bd5e1ba2c8c3dfdb00c2b41d65059917942e2f6971a"}, @@ -7147,6 +8067,8 @@ version = "3.0.0" description = "A language and compiler for custom Deep Learning operations" optional = false python-versions = "*" +groups = ["main"] +markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "triton-3.0.0-1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e1efef76935b2febc365bfadf74bcb65a6f959a9872e5bddf44cc9e0adce1e1a"}, {file = "triton-3.0.0-1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5ce8520437c602fb633f1324cc3871c47bee3b67acf9756c1a66309b60e3216c"}, @@ -7163,12 +8085,34 @@ build = ["cmake (>=3.20)", "lit"] tests = ["autopep8", "flake8", "isort", "llnl-hatchet", "numpy", "pytest", "scipy (>=1.7.1)"] tutorials = ["matplotlib", "pandas", "tabulate"] +[[package]] +name = "typeguard" +version = "4.4.1" +description = "Run-time type checker for Python" +optional = true +python-versions = ">=3.9" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"mani-skill\"" +files = [ + {file = "typeguard-4.4.1-py3-none-any.whl", hash = "sha256:9324ec07a27ec67fc54a9c063020ca4c0ae6abad5e9f0f9804ca59aee68c6e21"}, + {file = "typeguard-4.4.1.tar.gz", hash = "sha256:0d22a89d00b453b47c49875f42b6601b961757541a2e1e0ef517b6e24213c21b"}, +] + +[package.dependencies] +typing-extensions = ">=4.10.0" + +[package.extras] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme (>=1.3.0)"] +test = ["coverage[toml] (>=7)", "mypy (>=1.2.0)", "pytest (>=7)"] + [[package]] name = "types-python-dateutil" version = "2.9.0.20241003" description = "Typing stubs for python-dateutil" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "types-python-dateutil-2.9.0.20241003.tar.gz", hash = "sha256:58cb85449b2a56d6684e41aeefb4c4280631246a0da1a719bdbe6f3fb0317446"}, {file = "types_python_dateutil-2.9.0.20241003-py3-none-any.whl", hash = "sha256:250e1d8e80e7bbc3a6c99b907762711d1a1cdd00e978ad39cb5940f6f0a87f3d"}, @@ -7180,17 +8124,45 @@ version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] +[[package]] +name = "tyro" +version = "0.9.14" +description = "CLI interfaces & config objects, from types" +optional = true +python-versions = ">=3.7" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"mani-skill\"" +files = [ + {file = "tyro-0.9.14-py3-none-any.whl", hash = "sha256:043a65306137b72b87f1a3e906874b25d0cf2f36add520d12b82a9c93dc5234c"}, + {file = "tyro-0.9.14.tar.gz", hash = "sha256:9addf4caaefbe00c2059178151ca003f3ae07b90cc8e777c16f6e5a21ef16ef1"}, +] + +[package.dependencies] +colorama = {version = ">=0.4.0", markers = "platform_system == \"Windows\""} +docstring-parser = ">=0.15" +rich = ">=11.1.0" +shtab = ">=1.5.6" +typeguard = ">=4.0.0" +typing-extensions = {version = ">=4.9.0", markers = "python_version >= \"3.8\""} + +[package.extras] +dev = ["attrs (>=21.4.0)", "coverage[toml] (>=6.5.0)", "eval-type-backport (>=0.1.3)", "flax (>=0.6.9)", "mypy (>=1.4.1)", "numpy (>=1.20.0)", "omegaconf (>=2.2.2)", "pydantic (>=2.5.2,!=2.10.0)", "pyright (>=1.1.349,!=1.1.379)", "pytest (>=7.1.2)", "pytest-cov (>=3.0.0)", "pyyaml (>=6.0)", "ruff (>=0.1.13)", "torch (>=1.10.0)"] + [[package]] name = "tzdata" version = "2024.2" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"}, {file = "tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc"}, @@ -7202,6 +8174,8 @@ version = "0.0.27" description = "URDF parser and manipulator for Python" optional = true python-versions = "*" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "urchin-0.0.27-py3-none-any.whl", hash = "sha256:e4cf43c8f52a44e0075e1778b76c203922085dd1fb9340cd703bf54188208611"}, {file = "urchin-0.0.27.tar.gz", hash = "sha256:bda308ed7d2b80eb1e097dc3963fabe9e00a6cbd89a1f6be6f063c2a065d3671"}, @@ -7228,6 +8202,8 @@ version = "0.0.4" description = "This package contains a python parser for the Unified Robot Description Format (URDF), which is an XML format for representing a robot model." optional = true python-versions = "*" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "urdf_parser_py-0.0.4.tar.gz", hash = "sha256:e983f637145fded67bcff6a542302069bb975b2edf1b18318c093abba1b794cc"}, ] @@ -7242,6 +8218,8 @@ version = "1.3.0" description = "RFC 6570 URI Template Processor" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7"}, {file = "uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363"}, @@ -7256,6 +8234,8 @@ version = "2.2.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, @@ -7273,6 +8253,8 @@ version = "20.26.6" description = "Virtual Python Environment builder" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "(python_version >= \"3.12\" or python_version <= \"3.11\") and extra == \"dev\"" files = [ {file = "virtualenv-20.26.6-py3-none-any.whl", hash = "sha256:7345cc5b25405607a624d8418154577459c3e0277f5466dd79c49d5e492995f2"}, {file = "virtualenv-20.26.6.tar.gz", hash = "sha256:280aede09a2a5c317e409a00102e7077c6432c5a38f0ef938e643805a7ad2c48"}, @@ -7293,6 +8275,8 @@ version = "0.18.3" description = "A CLI and library for interacting with the Weights & Biases API." optional = false python-versions = ">=3.7" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "wandb-0.18.3-py3-none-any.whl", hash = "sha256:7da64f7da0ff7572439de10bfd45534e8811e71e78ac2ccc3b818f1c0f3a9aef"}, {file = "wandb-0.18.3-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:6674d8a5c40c79065b9c7eb765136756d5ebc9457a5f9abc820a660fb23f8b67"}, @@ -7338,6 +8322,8 @@ version = "0.2.13" description = "Measures the displayed width of unicode strings in a terminal" optional = false python-versions = "*" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, @@ -7349,6 +8335,8 @@ version = "24.8.0" description = "A library for working with the color formats defined by HTML and CSS." optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "webcolors-24.8.0-py3-none-any.whl", hash = "sha256:fc4c3b59358ada164552084a8ebee637c221e4059267d0f8325b3b560f6c7f0a"}, {file = "webcolors-24.8.0.tar.gz", hash = "sha256:08b07af286a01bcd30d583a7acadf629583d1f79bfef27dd2c2c5c263817277d"}, @@ -7364,6 +8352,8 @@ version = "0.5.1" description = "Character encoding aliases for legacy web content" optional = true python-versions = "*" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, @@ -7375,6 +8365,8 @@ version = "1.8.0" description = "WebSocket client for Python with low level API options" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526"}, {file = "websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da"}, @@ -7391,6 +8383,8 @@ version = "3.1.1" description = "The comprehensive WSGI web application library." optional = false python-versions = ">=3.9" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "werkzeug-3.1.1-py3-none-any.whl", hash = "sha256:a71124d1ef06008baafa3d266c02f56e1836a5984afd6dd6c9230669d60d9fb5"}, {file = "werkzeug-3.1.1.tar.gz", hash = "sha256:8cd39dfbdfc1e051965f156163e2974e52c210f130810e9ad36858f0fd3edad4"}, @@ -7408,6 +8402,8 @@ version = "4.0.13" description = "Jupyter interactive widgets for Jupyter Notebook" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "widgetsnbextension-4.0.13-py3-none-any.whl", hash = "sha256:74b2692e8500525cc38c2b877236ba51d34541e6385eeed5aec15a70f88a6c71"}, {file = "widgetsnbextension-4.0.13.tar.gz", hash = "sha256:ffcb67bc9febd10234a362795f643927f4e0c05d9342c727b65d2384f8feacb6"}, @@ -7419,6 +8415,8 @@ version = "0.14.1" description = "Makes working with XML feel like you are working with JSON" optional = true python-versions = ">=3.6" +groups = ["main"] +markers = "sys_platform == \"linux\" and extra == \"stretch\" and (python_version >= \"3.12\" or python_version <= \"3.11\")" files = [ {file = "xmltodict-0.14.1-py2.py3-none-any.whl", hash = "sha256:3ef4a7b71c08f19047fcbea572e1d7f4207ab269da1565b5d40e9823d3894e63"}, {file = "xmltodict-0.14.1.tar.gz", hash = "sha256:338c8431e4fc554517651972d62f06958718f6262b04316917008e8fd677a6b0"}, @@ -7430,6 +8428,8 @@ version = "3.5.0" description = "Python binding for xxHash" optional = false python-versions = ">=3.7" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "xxhash-3.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ece616532c499ee9afbb83078b1b952beffef121d989841f7f4b3dc5ac0fd212"}, {file = "xxhash-3.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3171f693dbc2cef6477054a665dc255d996646b4023fe56cb4db80e26f4cc520"}, @@ -7562,6 +8562,8 @@ version = "1.14.0" description = "Yet another URL library" optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "yarl-1.14.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1bfc25aa6a7c99cf86564210f79a0b7d4484159c67e01232b116e445b3036547"}, {file = "yarl-1.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0cf21f46a15d445417de8fc89f2568852cf57fe8ca1ab3d19ddb24d45c0383ae"}, @@ -7668,6 +8670,8 @@ version = "2.18.3" description = "An implementation of chunked, compressed, N-dimensional arrays for Python" optional = false python-versions = ">=3.10" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "zarr-2.18.3-py3-none-any.whl", hash = "sha256:b1f7dfd2496f436745cdd4c7bcf8d3b4bc1dceef5fdd0d589c87130d842496dd"}, {file = "zarr-2.18.3.tar.gz", hash = "sha256:2580d8cb6dd84621771a10d31c4d777dca8a27706a1a89b29f42d2d37e2df5ce"}, @@ -7689,6 +8693,8 @@ version = "3.20.2" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "python_version >= \"3.12\" or python_version <= \"3.11\"" files = [ {file = "zipp-3.20.2-py3-none-any.whl", hash = "sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350"}, {file = "zipp-3.20.2.tar.gz", hash = "sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29"}, @@ -7708,8 +8714,9 @@ dev = ["debugpy", "pre-commit"] dora = ["gym-dora"] dynamixel = ["dynamixel-sdk", "pynput"] feetech = ["feetech-servo-sdk", "pynput"] -hilserl = ["torchmetrics", "transformers"] +hilserl = ["grpcio", "protobuf", "torchmetrics", "transformers"] intelrealsense = ["pyrealsense2"] +mani-skill = ["mani-skill"] pusht = ["gym-pusht"] stretch = ["hello-robot-stretch-body", "pynput", "pyrealsense2", "pyrender"] test = ["pyserial", "pytest", "pytest-cov"] @@ -7718,6 +8725,6 @@ video-benchmark = ["pandas", "scikit-image"] xarm = ["gym-xarm"] [metadata] -lock-version = "2.0" +lock-version = "2.1" python-versions = ">=3.10,<3.13" -content-hash = "44c74163e398e8ff16973957f69a47bb09b789e92ac4d8fb3ab268defab96427" +content-hash = "6170a86166e0bbfa618505bca966b87dec439707c5de339883a49d77edbf8c2c" diff --git a/pyproject.toml b/pyproject.toml index 054676e5..f6c9f6f6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -57,6 +57,9 @@ dependencies = [ "zarr>=2.17.0", "transformers>=4.47.0", "torchmetrics>=1.6.0" + "grpcio>=1.70.0", + "protobuf>=5.29.3", + "mani-skill>=3.0.0b18", ] [project.optional-dependencies] @@ -110,6 +113,8 @@ exclude = [ "dist", "node_modules", "venv", + "*_pb2.py", + "*_pb2_grpc.py", ] diff --git a/ruff.toml b/ruff.toml new file mode 100644 index 00000000..e8694401 --- /dev/null +++ b/ruff.toml @@ -0,0 +1,11 @@ + # Exclude files/directories from Ruff +exclude = [ + "*_pb2.py", # Ignore all protobuf generated files + "*_pb2_grpc.py", # Ignore all gRPC generated files + "lerobot/scripts/server/hilserl_pb2.py", # Ignore specific file + ".git", + ".env", + ".venv", + "build", + "dist" +]